{"id":34104,"date":"2026-08-12T17:16:50","date_gmt":"2026-08-12T17:16:50","guid":{"rendered":"https:\/\/francortesarquitectos.com\/tools\/construction-cost\/"},"modified":"2026-08-17T21:44:04","modified_gmt":"2026-08-17T21:44:04","slug":"construction-cost","status":"publish","type":"page","link":"https:\/\/francortesarquitectos.com\/en\/tools\/construction-cost\/","title":{"rendered":"How much does it cost to build a house in Madrid"},"content":{"rendered":"\n<style>\n.fca{\n  --plane:#f9f9f7; --surface:#fcfcfb; --ink:#0b0b0b; --ink2:#52514e; --muted:#898781;\n  --grid:#e1e0d9; --axis:#c3c2b7; --ring:rgba(11,11,11,0.10); --band:#f0efec;\n  --acc:#2a78d6; --good:#0ca30c; --warn:#fab219; --crit:#d03b3b;\n  color-scheme:light;\n  font-family:system-ui,-apple-system,\"Segoe UI\",sans-serif;\n  color:var(--ink); background:var(--plane); font-size:15px; line-height:1.55;\n  max-width:1020px; margin:0 auto; padding:72px 22px 64px; box-sizing:border-box;\n}\n\/* El tema lleva cabecera fija: sin este margen, el H1 queda debajo del men\u00fa. *\/\n.fca > h1:first-child{ margin-top:0; scroll-margin-top:120px }\n.fca *{box-sizing:border-box}\n.fca h1{font-size:27px; letter-spacing:-0.02em; margin:0 0 6px; font-weight:650; line-height:1.2}\n.fca .sub{color:var(--ink2); margin:0 0 6px; font-size:16px}\n.fca .ans{background:var(--surface); border:1px solid var(--ring); border-left:3px solid var(--acc);\n  border-radius:8px; padding:14px 16px; margin:18px 0 26px; font-size:15.5px}\n.fca h2{font-size:21px; letter-spacing:-0.015em; margin:38px 0 10px; font-weight:650; line-height:1.25}\n.fca h3{font-size:14px; margin:0 0 12px; font-weight:640; text-transform:uppercase; letter-spacing:.07em; color:var(--muted)}\n.fca .art{margin-top:14px; max-width:78ch}\n.fca .art h3{font-size:16px; text-transform:none; letter-spacing:-0.01em; color:var(--ink); margin:22px 0 6px}\n.fca .art table{margin:14px 0 20px}\n.fca .art ul{margin:0 0 14px; padding-left:20px}\n.fca .art li{margin:6px 0}\n.fca p{margin:0 0 12px}\n.fca a{color:var(--acc); text-decoration:none; border-bottom:1px solid transparent}\n.fca a:hover{border-bottom-color:currentColor}\n\n.fca .grid{display:grid; grid-template-columns:0.8fr 1.2fr; gap:26px; align-items:start}\n.fca .panel{background:var(--surface); border:1px solid var(--ring); border-radius:10px; padding:20px}\n.fca .f{margin-bottom:15px}\n.fca label{display:block; font-size:13px; font-weight:600; margin-bottom:6px}\n.fca .hint{font-size:12px; color:var(--muted); margin-top:5px; line-height:1.4}\n.fca select,.fca input[type=number],.fca input[type=text],.fca input[type=email]{\n  width:100%; padding:9px 11px; font:inherit; font-size:14.5px; color:var(--ink);\n  background:var(--plane); border:1px solid var(--axis); border-radius:6px; appearance:none}\n.fca select:focus,.fca input:focus{outline:2px solid var(--acc); outline-offset:1px; border-color:var(--acc)}\n.fca .two{display:grid; grid-template-columns:1fr 1fr; gap:12px}\n.fca .seg{display:flex; border:1px solid var(--axis); border-radius:6px; overflow:hidden}\n.fca .seg button{flex:1; padding:8px 6px; font:inherit; font-size:13.5px; background:var(--plane);\n  border:0; border-right:1px solid var(--axis); cursor:pointer; color:var(--ink2)}\n.fca .seg button:last-child{border-right:0}\n.fca .seg button[aria-pressed=\"true\"]{background:var(--ink); color:#fff; font-weight:600}\n\n.fca .heroes{display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:14px}\n.fca .hero{background:var(--ink); color:#fff; border-radius:10px; padding:18px 20px}\n.fca .hero.alt{background:#232322}\n.fca .hero .k{font-size:11px; text-transform:uppercase; letter-spacing:.09em; opacity:.68; margin-bottom:7px}\n.fca .hero .v{font-size:26px; font-weight:650; letter-spacing:-0.025em; line-height:1.05}\n.fca .hero .d{font-size:12px; opacity:.75; margin-top:7px; line-height:1.4}\n\n.fca .bars{display:flex; height:11px; border-radius:3px; overflow:hidden; margin:16px 0 9px; background:var(--band)}\n.fca .bars i{display:block; height:100%; border-right:2px solid var(--surface)}\n.fca .bars i:last-child{border-right:0}\n.fca .leg{display:flex; flex-wrap:wrap; gap:13px; font-size:12px; color:var(--ink2); margin-bottom:6px}\n.fca .leg span{display:flex; align-items:center; gap:6px}\n.fca .sw{width:9px; height:9px; border-radius:2px}\n\n.fca table{width:100%; border-collapse:collapse; font-size:13.5px; margin:0}\n.fca th{text-align:left; font-size:11px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted);\n  border-bottom:1px solid var(--axis); padding:7px 4px 6px; font-weight:620}\n.fca td{border-bottom:1px solid var(--grid); padding:8px 4px; vertical-align:top}\n.fca td.n,.fca th.n{text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap}\n.fca tr.tot td{border-bottom:0; border-top:1.5px solid var(--axis); font-weight:660; padding-top:11px; font-size:15px}\n.fca tr.z td{color:var(--muted)}\n.fca .note{font-size:12.5px; color:var(--ink2); background:var(--band); border-radius:7px; padding:11px 13px; margin:14px 0; line-height:1.5}\n.fca .note.w{border-left:3px solid var(--warn)}\n.fca .note.g{border-left:3px solid var(--good)}\n.fca .note.c{border-left:3px solid var(--crit)}\n.fca details{border-top:1px solid var(--grid); padding:12px 0 0; margin-top:12px}\n.fca summary{cursor:pointer; font-size:13.5px; font-weight:600; color:var(--ink2)}\n.fca summary:hover{color:var(--ink)}\n.fca details .body{font-size:13px; color:var(--ink2); padding-top:10px; line-height:1.55}\n.fca .cta{background:var(--surface); border:1px solid var(--ring); border-radius:10px; padding:20px; margin-top:22px}\n.fca .btn{display:inline-block; background:var(--ink); color:#fff; border:0; border-radius:6px;\n  padding:11px 20px; font:inherit; font-size:14.5px; font-weight:600; cursor:pointer}\n.fca .btn:hover{opacity:.88}\n.fca .ok{color:var(--good); font-size:14px; font-weight:600; margin-top:10px}\n.fca .legal{font-size:11.5px; color:var(--muted); line-height:1.5; margin-top:26px; border-top:1px solid var(--grid); padding-top:14px}\n@media(max-width:840px){ .fca .grid,.fca .heroes{grid-template-columns:1fr; gap:14px} .fca{padding:44px 16px 48px} }\n<\/style>\n<div class=\"fca\">\n\n<h1>How much does it cost to build a house in Madrid?<\/h1>\n<p class=\"sub\">The only calculator that adds up every real cost: construction, professional fees, your specific town hall\u2019s taxes, associated costs and the land.<\/p>\n\n<div class=\"note w\" style=\"margin:0 0 18px\"><strong>This is a guide figure, not a quotation.<\/strong> Without real measurements, the characteristics of the plot, the position of the utility connections, a chosen construction system and defined finishes, there is no exact price. This is here to give you the order of magnitude and to show you which items you cannot afford to forget.<\/div>\n<div class=\"ans\">\n  <strong>Short answer:<\/strong> a house designed by this studio, to a good standard, runs at about <strong>1.800 \u20ac\/m\u00b2<\/strong> for construction; with interior design and luxury finishes, <strong>desde 2.500 \u20ac\/m\u00b2<\/strong>. But that is only the house. Once you add VAT, the professional team, the municipal taxes, the off-plot works and a sensible contingency, <strong>the real cost ends up 35 % to 50 % higher<\/strong>. And that is without the land. Below you can work it out with your own figures and the town hall that applies to you, which is no small detail: the municipality takes between 3 % and 7 %. <strong>The figures you will see are final, with VAT already included<\/strong>: there is nothing to add on top.\n<\/div>\n\n<div class=\"grid\">\n  <!-- ============ ENTRADA ============ -->\n  <div class=\"panel\">\n    <h3>Your project<\/h3>\n\n    <div class=\"f\">\n      <label for=\"mun\">Municipality<\/label>\n      <select id=\"mun\"><\/select>\n    <\/div>\n\n    <div class=\"two\">\n      <div class=\"f\"><label for=\"m2\">House (m\u00b2)<\/label><input type=\"number\" id=\"m2\" value=\"220\" min=\"40\" max=\"1500\" step=\"5\"><\/div>\n      <div class=\"f\"><label for=\"m2sot\">Basement (m\u00b2)<\/label><input type=\"number\" id=\"m2sot\" value=\"0\" min=\"0\" max=\"800\" step=\"5\"><\/div>\n    <\/div>\n    <div class=\"two\">\n      <div class=\"f\"><label for=\"m2por\">Covered porch (m\u00b2)<\/label><input type=\"number\" id=\"m2por\" value=\"20\" min=\"0\" max=\"500\" step=\"5\"><\/div>\n      <div class=\"f\"><label for=\"m2ter\">Open terrace (m\u00b2)<\/label><input type=\"number\" id=\"m2ter\" value=\"0\" min=\"0\" max=\"500\" step=\"5\"><\/div>\n    <\/div>\n\n    <div class=\"f\">\n      <label>What is the basement for?<\/label>\n      <div class=\"seg\" id=\"sot\">\n        <button type=\"button\" data-v=\"tec\" aria-pressed=\"true\">Garage or storage<\/button>\n        <button type=\"button\" data-v=\"hab\" aria-pressed=\"false\">Habitable<\/button>\n      <\/div>\n      <div class=\"hint\">A plant-and-storage basement costs around 60 % of the house\u2019s \u20ac\/m\u00b2. If it has windows, a lightwell and is fitted out to live in, it costs practically the same as the house.<\/div>\n    <\/div>\n\n    <div class=\"two\">\n      <div class=\"f\"><label for=\"urb\">Off-plot works (\u20ac)<\/label><input type=\"number\" id=\"urb\" value=\"10000\" min=\"0\" step=\"1000\">\n        <div class=\"hint\">Includes utility connections. From 0 to 20,000 \u20ac depending on how ready the plot is.<\/div><\/div>\n      <div class=\"f\"><label for=\"urbint\">On-plot works (\u20ac)<\/label><input type=\"number\" id=\"urbint\" value=\"30000\" min=\"0\" step=\"1000\">\n        <div class=\"hint\">Paving, walls, earthworks. On a sloping plot this can exceed 100,000 \u20ac.<\/div><\/div>\n    <\/div>\n\n    <div class=\"f\">\n      <label>Will you live in it?<\/label>\n      <div class=\"seg\" id=\"hab\">\n        <button type=\"button\" data-v=\"si\" aria-pressed=\"true\">Yes<\/button>\n        <button type=\"button\" data-v=\"no\" aria-pressed=\"false\">No<\/button>\n      <\/div>\n      <div class=\"hint\">If it is your main home, the construction work is taxed at 10 % VAT. If not, at 21 %. That is tens of thousands of euros of difference.<\/div>\n    <\/div>\n\n    <div class=\"f\">\n      <label>Extras<\/label>\n      <div class=\"seg\" id=\"pis\" style=\"margin-bottom:8px\">\n        <button type=\"button\" data-v=\"no\" aria-pressed=\"true\">No pool<\/button>\n        <button type=\"button\" data-v=\"si\" aria-pressed=\"false\">With pool<\/button>\n      <\/div>\n      <div class=\"seg\" id=\"coc\">\n        <button type=\"button\" data-v=\"no\" aria-pressed=\"true\">No kitchen<\/button>\n        <button type=\"button\" data-v=\"media\" aria-pressed=\"false\">Mid<\/button>\n        <button type=\"button\" data-v=\"alta\" aria-pressed=\"false\">High<\/button>\n        <button type=\"button\" data-v=\"premium\" aria-pressed=\"false\">Premium<\/button>\n      <\/div>\n      <div class=\"hint\">The kitchen always includes units, worktop and appliances: 15,000 \u20ac mid, 25,000 \u20ac high and 40,000 \u20ac premium.<\/div>\n    <\/div>\n\n    <div class=\"f\">\n      <label for=\"suelo\">Price of the plot (\u20ac)<\/label>\n      <input type=\"number\" id=\"suelo\" value=\"0\" min=\"0\" step=\"5000\">\n      <div class=\"hint\">Leave it at 0 if you already own it. To find out what yours is worth, check the reference value at the <a href=\"https:\/\/www.sedecatastro.gob.es\/\" target=\"_blank\" rel=\"noopener\">Spanish Land Registry (Catastro) portal<\/a>.<\/div>\n    <\/div>\n\n    <div class=\"f\" id=\"f-comp\">\n      <label>You are buying the plot from\u2026<\/label>\n      <div class=\"seg\" id=\"comp\">\n        <button type=\"button\" data-v=\"part\" aria-pressed=\"true\">A private seller<\/button>\n        <button type=\"button\" data-v=\"emp\" aria-pressed=\"false\">A company<\/button>\n      <\/div>\n      <div class=\"hint\">From a private seller you pay 6 % transfer tax in the Madrid region. From a company, 21 % VAT plus stamp duty.<\/div>\n    <\/div>\n  <\/div>\n\n  <!-- ============ SALIDA ============ -->\n  <div>\n    <div class=\"heroes\">\n      <div class=\"hero\">\n        <div class=\"k\">House, good standard<\/div>\n        <div class=\"v\" id=\"o-med\">\u2014<\/div>\n        <div class=\"d\">VAT included \u00b7 final price<\/div>\n      <\/div>\n      <div class=\"hero alt\">\n        <div class=\"k\">House, high standard + interior design<\/div>\n        <div class=\"v\" id=\"o-alt\">\u2014<\/div>\n        <div class=\"d\">VAT included \u00b7 final price<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"panel\">\n      <div class=\"leg\" id=\"o-leg\"><\/div>\n      <div class=\"bars\" id=\"o-bars\"><\/div>\n\n      <table>\n        <thead><tr><th>Item<br><span style=\"font-weight:400;text-transform:none;letter-spacing:0;font-size:11px;opacity:.75\">Each amount, with its VAT<\/span><\/th><th class=\"n\">Good standard<\/th><th class=\"n\">High standard + interior design<\/th><\/tr><\/thead>\n        <tbody id=\"o-rows\"><\/tbody>\n      <\/table>\n\n      <div class=\"note g\" id=\"o-mun\"><\/div>\n      <div class=\"note w\" id=\"o-iva\"><\/div>\n\n      <details open>\n        <summary>How this is worked out<\/summary>\n        <div class=\"body\" id=\"o-metodo\"><\/div>\n      <\/details>\n      <details>\n        <summary>What is NOT included<\/summary>\n        <div class=\"body\">\n          <p><strong>The interest on a self-build mortgage<\/strong> during the months of construction. The money is released against progress certificates, and that interest is real money.<\/p>\n          <p><strong>Stamp duty<\/strong> on the new-build deed and on the declaration of completed works.<\/p>\n          <p><strong>The first-occupation permit<\/strong>, which runs from 32 \u20ac in Pozuelo de Alarc\u00f3n to more than 1,500 \u20ac in Las Rozas for the same budget. Yes, that is the real spread between two neighbouring municipalities.<\/p>\n          <p><strong>The extra cost of a difficult plot:<\/strong> steep slopes, rock, a high water table or retaining walls. The soil survey shows this, which is why it is done before anyone designs.<\/p>\n        <\/div>\n      <\/details>\n    <\/div>\n\n    <div class=\"cta\">\n      <h3 style=\"margin-bottom:8px\">We will send you the breakdown as a PDF<\/h3>\n      <p style=\"font-size:14px; margin-bottom:14px\">And if you give us the land registry reference of your plot, we will tell you how many square metres you may build on it and whether anything is going to cause problems \u2014 before you spend a euro on a design.<\/p>\n      <form id=\"fca-lead\">\n        <div style=\"position:absolute;left:-9999px\" aria-hidden=\"true\"><label>Do not fill in<input type=\"text\" id=\"l-hp\" tabindex=\"-1\" autocomplete=\"off\"><\/label><\/div>\n        <div class=\"two\">\n          <div class=\"f\"><label for=\"l-nom\">Name<\/label><input type=\"text\" id=\"l-nom\" placeholder=\"C\u00f3mo te llamas\"><\/div>\n          <div class=\"f\"><label for=\"l-email\">Email<\/label><input type=\"email\" id=\"l-email\" required placeholder=\"tu@email.com\"><\/div>\n        <\/div>\n        <div class=\"two\">\n          <div class=\"f\"><label for=\"l-tel\">Phone <span style=\"font-weight:400;color:var(--muted)\">(optional)<\/span><\/label><input type=\"text\" id=\"l-tel\" placeholder=\"600 000 000\"><\/div>\n          <div class=\"f\"><label for=\"l-cat\">Land registry ref. <span style=\"font-weight:400;color:var(--muted)\">(optional)<\/span><\/label><input type=\"text\" id=\"l-cat\" placeholder=\"20 caracteres\"><\/div>\n        <\/div>\n\n        <div class=\"two\">\n          <div class=\"f\">\n            <label for=\"l-parcela\">Do you already have the plot?<\/label>\n            <select id=\"l-parcela\">\n              <option value=\"\">Rather not say<\/option>\n              <option value=\"si\">Yes, I own it<\/option>\n              <option value=\"negociando\">I am negotiating for it<\/option>\n              <option value=\"buscando\">Still looking<\/option>\n              <option value=\"no\">No, just looking into it<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"f\">\n            <label for=\"l-plazo\">When would you like to start?<\/label>\n            <select id=\"l-plazo\">\n              <option value=\"\">Rather not say<\/option>\n              <option value=\"0-6\">Within 6 months<\/option>\n              <option value=\"6-12\">In 6 to 12 months<\/option>\n              <option value=\"12+\">More than a year away<\/option>\n              <option value=\"sinfecha\">No date yet<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n\n        <div class=\"f\">\n          <label for=\"l-presu\">Budget you have in mind for the whole thing<\/label>\n          <select id=\"l-presu\">\n            <option value=\"\">Rather not say<\/option>\n            <option value=\"&lt;400\">Under 400,000 \u20ac<\/option>\n            <option value=\"400-600\">400,000 to 600,000 \u20ac<\/option>\n            <option value=\"600-900\">600,000 to 900,000 \u20ac<\/option>\n            <option value=\"900-1500\">900,000 to 1,500,000 \u20ac<\/option>\n            <option value=\"&gt;1500\">Over 1,500,000 \u20ac<\/option>\n          <\/select>\n          <div class=\"hint\">Including the plot if you do not have it yet. It lets us tell you honestly whether what you have in mind fits, instead of wasting your time.<\/div>\n        <\/div>\n\n        <div class=\"f\">\n          <label>Are you also interested in interior design?<\/label>\n          <div class=\"seg\" id=\"int\">\n            <button type=\"button\" data-v=\"no\" aria-pressed=\"true\">No<\/button>\n            <button type=\"button\" data-v=\"quiza\" aria-pressed=\"false\">Maybe<\/button>\n            <button type=\"button\" data-v=\"si\" aria-pressed=\"false\">Yes<\/button>\n          <\/div>\n        <\/div>\n        <label style=\"display:flex;align-items:flex-start;gap:9px;font-size:12.5px;color:var(--ink2);margin-bottom:12px;cursor:pointer\">\n          <input type=\"checkbox\" id=\"l-rgpd\" required style=\"margin-top:3px;accent-color:var(--acc);width:16px;height:16px\">\n          <span>I have read and accept the <a href=\"https:\/\/francortesarquitectos.com\/en\/privacy-policy\/\">privacy policy<\/a>.<\/span>\n        <\/label>\n        <button class=\"btn\" type=\"submit\">Send me the breakdown<\/button>\n        <div class=\"ok\" id=\"l-ok\" style=\"display:none\">Got it. The PDF will reach you in a few minutes.<\/div>\n      <\/form>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"art\">\n\n<h2>Why the construction budget is never the final cost<\/h2>\n<p>When someone asks what it costs to build a house, the answer they get is almost always the price of the construction work. For a designed house to a good standard that is around 1.800 \u20ac\/m\u00b2; with interior design and luxury finishes, from 2.500 \u20ac\/m\u00b2. That figure is true, and it is half the answer.<\/p>\n<p>The other half is six blocks that do not appear in that figure: VAT, the professional team, what the town hall takes, the off-plot works, the works inside the plot and the contingency. On a 300 m\u00b2 house in Las Rozas that means <strong>540,000 \u20ac of construction that ends up well above 800,000 \u20ac<\/strong> with a pool and a kitchen. Nobody gets that shock on purpose: they get it because nobody told them at the start.<\/p>\n\n<h2>What your town hall takes is not the same in every municipality<\/h2>\n<p>This is the item that surprises people most, because it can double between two towns fifteen minutes apart. ICIO \u2014 the tax on construction, installations and works \u2014 has a legal maximum of 4 %, but each town hall sets its own, and many add a permit fee on top.<\/p>\n<table>\n<thead><tr><th>Municipality<\/th><th class=\"n\">ICIO<\/th><th class=\"n\">Permit fee<\/th><th class=\"n\">Total on the construction budget<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>Galapagar<\/td><td class=\"n\">3,5 %<\/td><td class=\"n\">1,8 %<\/td><td class=\"n\">5,3 %<\/td><\/tr>\n<tr><td>Madrid capital<\/td><td class=\"n\">3,75 %<\/td><td class=\"n\">\u2014<\/td><td class=\"n\">3,75 %<\/td><\/tr>\n<tr><td>Las Rozas de Madrid<\/td><td class=\"n\">4 %<\/td><td class=\"n\">0,84 %<\/td><td class=\"n\">4,84 %<\/td><\/tr>\n<tr><td>Boadilla del Monte<\/td><td class=\"n\">4 %<\/td><td class=\"n\">1,5 %<\/td><td class=\"n\">5,5 %<\/td><\/tr>\n<tr><td>Alcobendas<\/td><td class=\"n\">4 %<\/td><td class=\"n\">\u22481,5 %<\/td><td class=\"n\">\u22485,5 %<\/td><\/tr>\n<tr><td>Pozuelo de Alarc\u00f3n<\/td><td class=\"n\">4 %<\/td><td class=\"n\">2 %<\/td><td class=\"n\">6 %<\/td><\/tr>\n<tr><td><strong>Majadahonda<\/strong><\/td><td class=\"n\">4 %<\/td><td class=\"n\">3 %<\/td><td class=\"n\"><strong>7 %<\/strong><\/td><\/tr>\n<\/tbody>\n<\/table>\n<p>On a construction budget of 500,000 \u20ac, building in Majadahonda instead of the city of Madrid is <strong>16,250 \u20ac more<\/strong> in municipal taxes alone. It is no reason to choose where you live, but it is a reason to know before you fix your numbers.<\/p>\n<p>A technical detail almost no calculator gets right: the ICIO base is the bare construction cost and, under article 102.1 of the Local Finance Act, it <strong>excludes VAT, fees, professional fees and the contractor\u2019s profit<\/strong>. Applying it to the budget including overheads inflates it by 19 %. And ICIO is a tax: there is no VAT on top of it.<\/p>\n\n<h2>The five mistakes that cost the most<\/h2>\n<h3>1 \u00b7 Buying the materials yourself<\/h3>\n<p>Construction work on a home is taxed at 10 % VAT. Materials you buy yourself are taxed at 21 %. With materials making up about half the budget, saving the builder\u2019s margin by buying them yourself costs you around 11 points of VAT on that half. On a 500,000 \u20ac job that is <strong>around 27,500 \u20ac thrown away<\/strong>.<\/p>\n<h3>2 \u00b7 Forgetting the off-plot works<\/h3>\n<p>Boundary walls, access, paving, landscaping and retaining walls are not in the house\u2019s \u20ac\/m\u00b2. On an ordinary plot they run 15,000 to 40,000 \u20ac; on a sloping one, considerably more.<\/p>\n<h3>3 \u00b7 Assuming utility connections and site works are free<\/h3>\n<p>This is the most variable item in the whole budget. Two plots on the same street can differ tenfold depending on the distance to the existing mains. That is why the calculator leaves it blank: any default value would be a lie.<\/p>\n<h3>4 \u00b7 Setting aside 5 % of the wrong number<\/h3>\n<p>Almost everyone sets aside 5 %\u2026 of the construction cost. But the real budget includes fees, taxes and site works, so that 5 % works out at 2 % of the total: half of what you need when the unexpected turns up. A sensible contingency is 10 % of the construction cost, which is around 7 % of the full budget.<\/p>\n<h3>5 \u00b7 Buying the plot before knowing what may be built on it<\/h3>\n<p>The buildable floor area, the maximum footprint, the setbacks and the eaves height are set by the municipal plan, not by the seller. It is the most expensive mistake on this list because there is no fixing it: if the plot will not take what you wanted, you have already bought it.<\/p>\n\n<h2>And how long does it take?<\/h2>\n<p>It is the second question everyone asks, and the honest answer includes the months nobody counts:<\/p>\n<ul>\n<li><strong>Concept and outline design:<\/strong> 1 to 3 months.<\/li>\n<li><strong>Building permit:<\/strong> 3 to 8 months depending on the town hall. This is the stretch that throws everyone, and it does not depend on the architect.<\/li>\n<li><strong>Detailed design:<\/strong> overlaps with the permit.<\/li>\n<li><strong>Construction:<\/strong> 10 to 16 months for a detached house.<\/li>\n<li><strong>First occupation and utilities:<\/strong> 1 to 2 months.<\/li>\n<\/ul>\n<p>In total, <strong>18 to 27 months<\/strong> from commissioning the design to moving in. Anyone promising much less is either not counting the permit or has never applied for one.<\/p>\n\n<h2>Frequently asked questions<\/h2>\n<h3>Is building cheaper than buying?<\/h3>\n<p>It depends almost entirely on the land. If you already own the plot, building usually works out better per m\u00b2 and you get a house made for you. If you have to buy it, the land can be 30-50 % of the total and the sums get tight.<\/p>\n<h3>Is ten-year structural insurance compulsory?<\/h3>\n<p>Not if you are an individual self-builder of a single home for your own use: that is set out in the second additional provision of Law 38\/1999. But if you sell within ten years you will have to take it out retroactively, and the Land Registry will not register the sale without it. Taking it out afterwards, with no technical supervision from the start of the works, is far more expensive and sometimes simply impossible.<\/p>\n<h3>What does the bank ask for on a self-build mortgage?<\/h3>\n<p>Banks lend against the bare construction cost, not against the finished value of the house, and they release the money against progress certificates. Which means you need savings for the land and for the early stages. That is the main difference from an ordinary mortgage, and it is worth being clear about before signing anything.<\/p>\n<h3>What is the \u201cpresupuesto de ejecuci\u00f3n material\u201d?<\/h3>\n<p>The cost of materials and labour, without overheads, without contractor\u2019s profit and without VAT. It is the figure ICIO, the permit fees and the professional fees are calculated on, and the one this calculator uses. It is not the same as a \u201cturnkey\u201d price, which is usually 30-40 % higher because it includes different things.<\/p>\n\n<\/div>\n\n<div class=\"legal\">\n  <strong>Notice.<\/strong> This is a <strong>guide estimate<\/strong>, not a quotation and not a binding offer. The \u20ac\/m\u00b2 figures are this studio\u2019s construction prices for detached houses in the Madrid region in 2026 and refer to the bare construction cost: they are not comparable with the \u201cturnkey\u201d figures on other websites, which include different things. The professional team amount is an <strong>estimate of all the professional services the works require<\/strong> \u2014 design, site supervision, works execution supervision, health and safety coordination and the professional body\u2019s stamp \u2014 and is not a tariff or a scale: there have been no official fee scales in Spain since 1997 (Law 7\/1997 and Competition Act 15\/2007). Every project is quoted separately.<br><br>\n  <strong>Sources.<\/strong> ICIO rates and permit fees: municipal tax ordinances in force, verified one by one. Where a fee could not be verified, the tool says so and does not calculate it. ICIO tax base: art. 102.1 of the consolidated Local Finance Act, which excludes VAT, fees, professional fees, overheads and the contractor\u2019s profit. VAT: art. 91.Uno.3.1\u00ba of Law 37\/1992 (10 % on construction work for housing; 21 % on services and on supply of goods). Ten-year insurance: <a href=\"https:\/\/www.boe.es\/buscar\/act.php?id=BOE-A-1999-21567\" target=\"_blank\" rel=\"noopener\">Law 38\/1999, second additional provision<\/a> \u2014 not required of an individual self-builder of a single home for their own use, unless it is sold within ten years.<br><br>\n  Last reviewed: August 2026. Municipal rates are reviewed every January.\n<\/div>\n\n<\/div>\n\n<script>\n(function(){\n  \"use strict\";\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     LO \u00daNICO QUE HAY QUE TOCAR PARA QUE LOS LEADS EMPIECEN A LLEGAR:\n     pegar aqu\u00ed la URL del webhook entrante de GoHighLevel.\n     Mientras est\u00e9 vac\u00edo, el formulario avisa por consola y NO env\u00eda nada.\n     GHL \u2192 Automatizaci\u00f3n \u2192 Workflows \u2192 Trigger \u00abInbound Webhook\u00bb \u2192 copiar URL.\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  const WEBHOOK = 'https:\/\/services.leadconnectorhq.com\/hooks\/FFMeqQLGzi2B5JfCsVap\/webhook-trigger\/41b813fe-03aa-4b37-b944-1e70bbb13705';\n\n  \/* Receptor propio en el WordPress del estudio. Guarda el lead y avisa por\n     correo aunque GoHighLevel est\u00e9 ca\u00eddo o sin configurar. No tocar. *\/\n  const ENDPOINT_WP = '\/wp-json\/fca\/v1\/lead';\n\n  const CONFIG = {\n    \/\/ \u20ac\/m\u00b2 de construcci\u00f3n (PEM) \u2014 datos del estudio\n    \/\/ \u20ac\/m\u00b2 de construcci\u00f3n (PEM). Datos del estudio, 15-08-2026.\n    \/\/ Fran: \u00abEliminar 1.500 \/ 1.750 como referencia principal FCA\u00bb y no introducir\n    \/\/ una opci\u00f3n barata que atraiga a un cliente que no encaja.\n    m2: { fca: 1800, lujo: 2500 },   \/\/ precio de CONTRATA: ya lleva gastos generales y beneficio industrial\n    ggbi: 0.19,             \/\/ gastos generales 13 % + beneficio industrial 6 %\n    moduloDefecto: 1000,    \/\/ \u20ac\/m\u00b2: valor m\u00ednimo que suelen admitir los ayuntamientos como base del ICIO\n    \/\/ Proporciones sobre el \u20ac\/m\u00b2 de vivienda, confirmadas por el estudio.\n    ratioSotanoTecnico: 0.60,    \/\/ garaje, trasteros, cuartos t\u00e9cnicos\n    ratioSotanoHabitable: 1.00,  \/\/ con ventanas, patio ingl\u00e9s y acondicionado\n    ratioPorche: 0.45,           \/\/ porche cubierto\n    ratioTerraza: 0.175,         \/\/ terraza descubierta: rango 15-20 %\n\n    \/\/ Soil survey: horquillas del documento del estudio (agosto 2026).\n    \/\/ C-0\/T-1 (sin s\u00f3tano y menos de 300 m\u00b2): 700-900 \u20ac + IVA  \u2192 punto medio 800\n    \/\/ C-1\/T-1 (con s\u00f3tano o 300 m\u00b2 o m\u00e1s):  1.200-1.600 \u20ac + IVA \u2192 punto medio 1400\n    geotecnicoC0: 800,\n    geotecnicoC1: 1400,\n    topografico: 500,       \/\/ rango habitual del estudio: 500-600 \u20ac\n    notaria: 1500,          \/\/ + 21 % = 1.815 \u20ac\n    decenal: 3500,          \/\/ exento de IVA\n    avales: 1100,           \/\/ residuos 500 + urbanizaci\u00f3n 600; el ayuntamiento los devuelve\n    piscina: 25000,         \/\/ piscina est\u00e1ndar, sin fijar dimensiones\n    \/\/ Cocina con todo incluido: mobiliario + encimera + electrodom\u00e9sticos\n    cocina: { media: 15000, alta: 25000, premium: 40000 },\n\n    \/\/ Equipo t\u00e9cnico. Fran, 15-08-2026: publicar \u00fanicamente el m\u00ednimo de entrada.\n    \/\/ Nada de curva, tabla por m\u00b2 ni desglose por fases: ser\u00eda falsa precisi\u00f3n.\n    tecnicoMinimo: 26000,\n\n    \/\/ Fran, 15-08-2026: \u00ab10 % del coste de construcci\u00f3n de la vivienda. Sin aplicar\n    \/\/ el porcentaje al resto de gastos, honorarios, tasas, urbanizaci\u00f3n, etc.\u00bb\n    imprevistos: 0.10,\n    itpParticular: 0.06,\n    ivaEmpresa: 0.21,\n    ivaObraHabitual: 0.10,\n    ivaObraNoHabitual: 0.21,\n    ivaServicios: 0.21,\n    ivaBienes: 0.21\n  };\n\n  \/\/ ICIO y tasa de licencia por municipio. tasa:null = no verificada \u2192 no se calcula.\n  const MUNICIPIOS = {\n    \/* Verificados uno a uno contra la ordenanza fiscal del propio ayuntamiento\n       o su anuncio en el BOCM, en agosto de 2026. Detalle y fuentes en\n       \/guias\/icio-y-licencia-de-obra\/\n\n       tasa admite cinco formas:\n         null                    no verificada, no se calcula\n         0.019                   tanto por uno plano\n         {esc:[[techo,tipo]\u2026]}   tipo \u00daNICO seg\u00fan el tramo donde cae el PEM\n         {fija:[[techo,cuota]\u2026]} cuota fija por tramos\n         {m2:{...}}              cuota por metros construidos (Madrid)\n         {mas:{fijo,desde,pct}}  cuota fija m\u00e1s un porcentaje sobre el exceso\n       mod: m\u00f3dulo m\u00ednimo en \u20ac\/m\u00b2 que sustituye al PEM como base del ICIO\n            cuando el proyecto queda por debajo. *\/\n    madrid:       {n:\"Madrid capital\", icio:0.0375,\n                   tasa:{m2:{base:1011.70, hasta:500, extra:161.90, cada:100}},\n                   nota:\"The lowest ICIO in the metropolitan area: 3,75 %, cut from 4 % in 2024. The permit fee is charged on built square metres, not on the budget. There is a 95 % ICIO discount for installing solar self-consumption.\"},\n    alcala:       {n:\"Alcal\u00e1 de Henares\", icio:0.04,\n                   tasa:{fija:[[2499.99,25],[48999.99,500],[84999.99,845],[149999.99,1390],[259999.99,2250],[454999.99,3600],[914999.99,6300],[1799999.99,11300],[3499999.99,19300],[7299999.99,33000],[Infinity,45000]]},\n                   nota:\"4 % ICIO and a flat fee in bands. The ICIO base is never below the regional reference costs.\"},\n    alcobendas:   {n:\"Alcobendas\", icio:0.04,\n                   tasa:{fija:[[12020.24,241.45],[120202.42,1678.35],[180303.63,2416.40],[240404.84,3356.15],[300506.05,4698.55],[601012.10,8054.80],[Infinity,8054.80]]},\n                   nota:\"\u26a0 The fee is a flat amount in bands and the jumps are sharp: crossing a threshold takes the effective rate straight from 1,57 % to 2,30 %.\"},\n    alcorcon:     {n:\"Alcorc\u00f3n\", icio:0.04, tasa:0.025,\n                   nota:\"The highest percentage fee we verified: 2,5 %. In exchange, it discounts 95 % of the ICIO for residential solar self-consumption.\"},\n    arganda:      {n:\"Arganda del Rey\", icio:0.04, tasa:null,\n                   nota:\"Its ordinance sets 4 % ICIO and a 1,337 % fee, but we could not confirm they are still in force in 2026 because its online portal does not respond. Check with the town hall.\"},\n    boadilla:     {n:\"Boadilla del Monte\", icio:0.04, tasa:0.015,\n                   nota:\"4 % ICIO and a 1,5 % fee. First occupation adds another 0,5 % of the budget.\"},\n    brunete:      {n:\"Brunete\", icio:0.04, tasa:0.02,\n                   nota:\"4 % ICIO and a 2 % fee, with a 150 \u20ac minimum.\"},\n    villalba:     {n:\"Collado Villalba\", icio:0.04,\n                   tasa:{esc:[[30050,0.010],[120200,0.011],[Infinity,0.012]]},\n                   nota:\"The fee rises in bands: 1 % up to 30.050 \u20ac, 1,1 % up to 120.200 \u20ac and 1,2 % above that.\"},\n    colmenar:     {n:\"Colmenar Viejo\", icio:0.035, tasa:0.0047, mod:602.60,\n                   nota:\"3,5 % ICIO and the lowest fee we verified, 0,47 %. Watch the minimum module: the ICIO base does not go below 602,60 \u20ac\/m\u00b2 for a detached house.\"},\n    galapagar:    {n:\"Galapagar\", icio:0.035, tasa:0.018,\n                   nota:\"3,5 % ICIO, below the legal maximum, plus a 1,8 % fee with a 150 \u20ac minimum.\"},\n    getafe:       {n:\"Getafe\", icio:0.04, tasa:{fija:[[Infinity,411]]},\n                   nota:\"The cheapest fee of the whole set for a detached house: a flat 411 \u20ac for up to two dwellings, whatever the budget.\"},\n    guadarrama:   {n:\"Guadarrama\", icio:0.034, tasa:0.0071,\n                   nota:\"The lowest verified ICIO, 3,4 %, and a 0,71 % fee on major works. Up to 95 % discount for solar, but only on what exceeds the building-code minimum.\"},\n    hoyo:         {n:\"Hoyo de Manzanares\", icio:0.04, tasa:null,\n                   nota:\"Its ordinance sets 4 % ICIO and a 1,3 % fee, plus 0,5 % if an outline design is submitted, but the texts are from 2001-2008 and we could not confirm they are still in force. Check with the town hall.\"},\n    lasrozas:     {n:\"Las Rozas de Madrid\", icio:0.04,\n                   tasa:{esc:[[60000,0.0105],[120000,0.010],[180000,0.0095],[240000,0.0090],[Infinity,0.0084]]},\n                   nota:\"The fee is a single-rate descending scale: the 0,84 % only applies above a 240.000 \u20ac budget. First occupation is separate, from 0,73 % down to 0,53 %.\"},\n    leganes:      {n:\"Legan\u00e9s\", icio:0.04, tasa:0.01,\n                   nota:\"4 % ICIO and a 1 % fee. First occupation is taxed separately, another 1 %.\"},\n    majadahonda:  {n:\"Majadahonda\", icio:0.04, tasa:0.03,\n                   nota:\"\u26a0 The highest municipal charge in the region: 4 % ICIO plus a 3 % fee. Seven per cent of the construction budget stays with the town hall.\"},\n    moralzarzal:  {n:\"Moralzarzal\", icio:null, tasa:null,\n                   nota:\"We could not verify either the ICIO or the fee: its tax-ordinance portal is empty and its online office returns an error. Ask the town hall before budgeting.\"},\n    mostoles:     {n:\"M\u00f3stoles\", icio:0.037, tasa:0.0268,\n                   nota:\"3,7 % ICIO but a 2,68 % fee: taken together, one of the most expensive.\"},\n    navalcarnero: {n:\"Navalcarnero\", icio:0.04, tasa:0.017, mod:677.31,\n                   nota:\"4 % ICIO and a 1,7 % fee. Minimum module of 677,31 \u20ac\/m\u00b2 for a detached house, which on a mid-sized house usually exceeds the design budget.\"},\n    pozuelo:      {n:\"Pozuelo de Alarc\u00f3n\", icio:0.04, tasa:0.02,\n                   nota:\"4 % ICIO plus a 2 % fee. On the other hand the first-occupation permit is only 32 \u20ac per dwelling.\"},\n    rivas:        {n:\"Rivas-Vaciamadrid\", icio:0.04, tasa:0.014, mod:511.00,\n                   nota:\"4 % ICIO and a 1,4 % fee. The base is the higher of the budget and the regional modules weighted by 1,15: 444,35 \u20ac\/m\u00b2 for a detached house, about 511 \u20ac once weighted.\"},\n    escorial:     {n:\"San Lorenzo de El Escorial\", icio:0.04,\n                   tasa:{mas:{fijo:60.49, desde:601.01, pct:0.02}},\n                   nota:\"4 % ICIO and a fee of 60,49 \u20ac plus 2 % on anything above 601,01 \u20ac. The base is set by the municipal architect and may be higher than the stamped budget.\"},\n    ssreyes:      {n:\"San Sebasti\u00e1n de los Reyes\", icio:0.04, tasa:0.0185,\n                   nota:\"4 % ICIO and a 1,85 % fee, with a 250 \u20ac minimum. Note: the fee structure changed in 2026; it used to be a flat amount in bands.\"},\n    sevillanueva: {n:\"Sevilla la Nueva\", icio:0.04,\n                   tasa:{fija:[[6010.12,40],[30050.61,160.01],[60101.21,400.66],[120202.42,800.07],[300506.05,1593.88],[601012.10,2806.49],[1202024.21,6013.01],[Infinity,10019.59]]},\n                   nota:\"Flat fee in bands. The ordinance text is old and its bands overlap: it is worth confirming the exact amount with the town hall.\"},\n    torrelodones: {n:\"Torrelodones\", icio:0.04, tasa:0.019, mod:1100.00,\n                   nota:\"\u26a0 The highest module in the region: 1.100 \u20ac\/m\u00b2 above ground. On a 300 m\u00b2 house the ICIO is charged on 330.000 \u20ac even if the design says less. The 1,9 % fee, by contrast, does use the design budget.\"},\n    trescantos:   {n:\"Tres Cantos\", icio:0.04, tasa:0.006,\n                   nota:\"4 % ICIO and one of the lowest fees, 0,60 %, with a 176,17 \u20ac minimum where there is a technical design.\"},\n    valdemorillo: {n:\"Valdemorillo\", icio:0.03, tasa:0.0075,\n                   nota:\"The cheapest municipality we verified: 3 % ICIO and a 0,75 % fee. Careful: the PDF the town hall still has online says 4 % and 1 %, but it was repealed in 2020.\"},\n    vcanada:      {n:\"Villanueva de la Ca\u00f1ada\", icio:0.04, tasa:0.006,\n                   nota:\"4 % ICIO and a 0,60 % fee. Fifty per cent ICIO discount for solar use.\"},\n    vpardillo:    {n:\"Villanueva del Pardillo\", icio:0.04, tasa:0.015,\n                   nota:\"4 % ICIO and a 1,5 % fee, with a 60 \u20ac minimum. First occupation is separate, at 0,75 %.\"},\n    villaviciosa: {n:\"Villaviciosa de Od\u00f3n\", icio:0.04, tasa:0.0175,\n                   nota:\"4 % ICIO and a 1,75 % fee. The fee is not calculated on the design budget but on the regional reference costs.\"},\n    otro:         {n:\"Another municipality in Madrid\", icio:0.04, tasa:null,\n                   nota:\"We apply 4 %, the legal maximum, as a conservative reference. But some municipalities charge 3 % and others add fees of up to 3 %: it is worth checking your town hall\u2019s ordinance.\"}\n  };\n\n  \/* Resuelve la tasa de licencia seg\u00fan la forma que tenga en MUNICIPIOS.\n     Devuelve null si el municipio no est\u00e1 verificado. *\/\n  function tasaDe(M, pem, m2){\n    const t = M.tasa;\n    if (t === null || t === undefined) return null;\n    if (typeof t === 'number') return pem * t;\n    if (t.esc){                       \/\/ tipo \u00fanico seg\u00fan el tramo del PEM\n      for (const [techo, tipo] of t.esc) if (pem <= techo) return pem * tipo;\n      return pem * t.esc[t.esc.length-1][1];\n    }\n    if (t.fija){                      \/\/ cuota fija por tramos\n      for (const [techo, cuota] of t.fija) if (pem <= techo) return cuota;\n      return t.fija[t.fija.length-1][1];\n    }\n    if (t.m2){                        \/\/ por metros construidos (Madrid)\n      const e = Math.max(0, m2 - t.m2.hasta);\n      return t.m2.base + Math.ceil(e \/ t.m2.cada) * t.m2.extra;\n    }\n    if (t.mas){                       \/\/ cuota fija m\u00e1s porcentaje sobre el exceso\n      return t.mas.fijo + Math.max(0, pem - t.mas.desde) * t.mas.pct;\n    }\n    return null;\n  }\n\n  \/* Base del ICIO y de la tasa.\n     NO es el precio de contrata. Los \u20ac\/m\u00b2 de esta calculadora son precio de\n     contrata: incluyen gastos generales y beneficio industrial, y el art\u00edculo\n     102.1 de la Ley de Haciendas Locales excluye los dos de la base.\n     En la pr\u00e1ctica el proyecto se visa por el valor m\u00ednimo que admite el\n     ayuntamiento \u2014en torno a 1.000 \u20ac\/m\u00b2, y el publicado donde lo hay\u2014 y es\n     sobre ese n\u00famero sobre el que se liquida. *\/\n  function baseIcioDe(M, m2eq){\n    return m2eq * (M.mod || CONFIG.moduloDefecto);\n  }\n\n  const $ = id => document.getElementById(id);\n  const NF = new Intl.NumberFormat('es-ES',{maximumFractionDigits:0, useGrouping:'always'});\n  const eur = n => NF.format(Math.round(n)) + ' \u20ac';\n  const pct = n => (n*100).toLocaleString('es-ES',{maximumFractionDigits:2}) + ' %';\n\n  let S = { hab:'si', pis:'no', coc:'no', comp:'part', sot:'tec', int:'no' };\n\n  $('mun').innerHTML = Object.entries(MUNICIPIOS)\n    .map(([k,v])=>`<option value=\"${k}\">${v.n}<\/option>`).join('');\n\n  function seg(id, key){\n    $(id).addEventListener('click', e => {\n      const b = e.target.closest('button[data-v]'); if(!b) return;\n      S[key] = b.dataset.v;\n      [...$(id).children].forEach(x => x.setAttribute('aria-pressed', x===b));\n      calcular();\n    });\n  }\n  seg('hab','hab'); seg('pis','pis'); seg('coc','coc'); seg('comp','comp'); seg('sot','sot');\n  seg('int','int');\n\n  function presupuesto(precio_m2){\n    const M   = MUNICIPIOS[$('mun').value];\n    const m2  = Math.max(0,+$('m2').value||0);\n    const sot = Math.max(0,+$('m2sot').value||0);\n    const por = Math.max(0,+$('m2por').value||0);\n    const ter = Math.max(0,+$('m2ter').value||0);\n    const urb = Math.max(0,+$('urb').value||0);\n    const uin = Math.max(0,+$('urbint').value||0);\n    const sue = Math.max(0,+$('suelo').value||0);\n\n    const ivaObra = S.hab==='si' ? CONFIG.ivaObraHabitual : CONFIG.ivaObraNoHabitual;\n\n    \/\/ PEM. El s\u00f3tano cuesta distinto seg\u00fan sea t\u00e9cnico o habitable.\n    const rSot = S.sot==='hab' ? CONFIG.ratioSotanoHabitable : CONFIG.ratioSotanoTecnico;\n    const pem = m2*precio_m2\n              + sot*precio_m2*rSot\n              + por*precio_m2*CONFIG.ratioPorche\n              + ter*precio_m2*CONFIG.ratioTerraza;\n\n    \/\/ Equipo t\u00e9cnico: solo el m\u00ednimo de entrada del estudio. Sin curva.\n    const tecnico = CONFIG.tecnicoMinimo;\n\n    \/* Superficie equivalente: los mismos metros que ponderan el PEC, para que\n       el m\u00f3dulo se aplique con el mismo criterio de s\u00f3tano, porche y terraza. *\/\n    const m2eq = precio_m2 > 0 ? pem \/ precio_m2 : 0;\n    const baseIcio = baseIcioDe(M, m2eq);\n    const pemReal = pem \/ (1 + CONFIG.ggbi);   \/* contrata \u2192 ejecuci\u00f3n material *\/\n    const icio = M.icio === null ? 0 : baseIcio * M.icio;\n    const tasaCalc = tasaDe(M, baseIcio, m2);\n    const tasa = tasaCalc === null ? 0 : tasaCalc;\n\n    const piscina = S.pis==='si' ? CONFIG.piscina : 0;\n    const mobili  = S.coc==='no' ? 0 : CONFIG.cocina[S.coc];\n\n    \/\/ Categor\u00eda del CTE: con s\u00f3tano o a partir de 300 m\u00b2 construidos la campa\u00f1a\n    \/\/ geot\u00e9cnica pasa de C-0 a C-1 y exige al menos un sondeo mec\u00e1nico.\n    const esC1 = sot > 0 || (m2 + sot) >= 300;\n    const geotec = esC1 ? CONFIG.geotecnicoC1 : CONFIG.geotecnicoC0;\n\n    \/\/ Fran: la reserva se calcula solo sobre el coste de construcci\u00f3n de la vivienda.\n    const imprev = pem * CONFIG.imprevistos;\n\n    const L = [];\n    const add = (nombre, base, tipo, nota) => {\n      L.push({nombre, base, tipo, total: base*(1+tipo), nota});\n      return base*(1+tipo);\n    };\n\n    if(sue>0){\n      add('Land', sue, S.comp==='part' ? CONFIG.itpParticular : CONFIG.ivaEmpresa,\n          S.comp==='part' ? 'With 6 % transfer tax' : 'With 21 % VAT; stamp duty is separate');\n      add('Notary, land registry and paperwork', CONFIG.notaria, CONFIG.ivaServicios);\n    }\n    add('Soil survey', geotec, CONFIG.ivaServicios,\n        esC1 ? 'Category C-1: with a basement, or from 300 m\u00b2 up, the building code requires at least one mechanical borehole'\n             : 'Category C-0 on favourable ground: penetrometers and a trial pit, no mechanical borehole');\n    add('Topographic survey', CONFIG.topografico, CONFIG.ivaServicios);\n    add('Building the house', pem, ivaObra,\n        `${m2} m\u00b2 of house`\n        + (sot?` \u00b7 ${sot} m\u00b2 of ${S.sot==='hab'?'habitable':'plant and storage'} basement`:'')\n        + (por?` \u00b7 ${por} m\u00b2 of porch`:'')\n        + (ter?` \u00b7 ${ter} m\u00b2 of terrace`:''));\n    add('Off-plot works', urb, ivaObra,\n        'Plot frontage, utility connections, kerb crossings and street lighting. Can be 0 \u20ac if the plot is already serviced');\n    if(uin>0) add('On-plot works', uin, ivaObra,\n        'Paving, hard landscaping, retaining walls and earthworks inside the plot');\n    if(piscina) add('Swimming pool', piscina, ivaObra, 'Standard pool. Varies a great deal with size and system');\n    add('Professional team (from)', tecnico, CONFIG.ivaServicios,\n        'This studio\u2019s minimum for the full commission: outline design, detailed design, site supervision and works execution supervision. It grows with floor area and complexity');\n    if(M.icio !== null) add('ICIO', icio, 0,\n      `${pct(M.icio)} on ${eur(baseIcio)}, the municipal minimum `\n      + `(${eur(M.mod || CONFIG.moduloDefecto)}\/m\u00b2) \u00b7 no VAT`);\n    if(tasaCalc !== null) add('Permit fee', tasa, 0,\n      `${typeof M.tasa === 'number' ? pct(M.tasa) + ' on the same base as the ICIO'\n        : 'as set out in the municipal ordinance'} \u00b7 no VAT`);\n    add('Ten-year structural insurance', CONFIG.decenal, 0,\n        'VAT exempt \u00b7 not compulsory for a self-builder, but the bank will require it if you finance the works');\n    add('Municipal bonds', CONFIG.avales, 0,\n        'Waste management and site works bonds \u00b7 the town hall returns them when the works finish');\n    if(mobili) add('Kitchen and appliances', mobili, CONFIG.ivaBienes,\n        'Units, worktop and appliances \u00b7 supply of goods: 21 %');\n    add('Contingency', imprev, ivaObra,\n        `${pct(CONFIG.imprevistos)} of the cost of building the house`);\n\n    const total = L.reduce((a,l)=>a+l.total,0);\n    return {L, total, pem, m2, sue, M, ivaObra, baseIcio, tasaCalc,\n            grupos: {\n              obra: L.filter(l=>['Building the house','Off-plot works','On-plot works','Piscina','Contingency'].includes(l.nombre)).reduce((a,l)=>a+l.total,0),\n              tecnicos: L.filter(l=>['Professional team (from)','Soil survey','Topographic survey','Seguro decenal','Avales municipales'].includes(l.nombre)).reduce((a,l)=>a+l.total,0),\n              impuestos: L.filter(l=>['ICIO','Permit fee'].includes(l.nombre)).reduce((a,l)=>a+l.total,0),\n              otros: L.filter(l=>['Parcela','Notary, land registry and paperwork','Kitchen and appliances'].includes(l.nombre)).reduce((a,l)=>a+l.total,0)\n            }};\n  }\n\n  function calcular(){\n    $('f-comp').style.display = (+$('suelo').value||0) > 0 ? '' : 'none';\n\n    const A = presupuesto(CONFIG.m2.fca);\n    const B = presupuesto(CONFIG.m2.lujo);\n    const M = B.M;\n\n    $('o-med').textContent = eur(A.total);\n    $('o-alt').textContent = eur(B.total);\n    \/* El \u00ab\u20ac\/m\u00b2 construido\u00bb se retir\u00f3 a petici\u00f3n del estudio: divid\u00eda el total\n       \u2014con impuestos, t\u00e9cnicos, urbanizaci\u00f3n y extras\u2014 entre los metros, as\u00ed que\n       daba una cifra muy por encima de los \u20ac\/m\u00b2 de construcci\u00f3n que anuncia la\n       propia p\u00e1gina, y sin explicaci\u00f3n se lee como una contradicci\u00f3n. *\/\n\n    \/\/ tabla emparejada por nombre\n    const nombres = B.L.map(l=>l.nombre);\n    const mapA = Object.fromEntries(A.L.map(l=>[l.nombre,l]));\n    $('o-rows').innerHTML = nombres.map(n=>{\n      const a = mapA[n], b = B.L.find(l=>l.nombre===n);\n      const nota = b.nota ? `<br><span style=\"color:var(--muted);font-size:11.5px\">${b.nota}<\/span>` : '';\n      return `<tr><td>${n}${nota}<\/td><td class=\"n\">${eur(a?a.total:0)}<\/td><td class=\"n\">${eur(b.total)}<\/td><\/tr>`;\n    }).join('') + `<tr class=\"tot\"><td>Total<\/td><td class=\"n\">${eur(A.total)}<\/td><td class=\"n\">${eur(B.total)}<\/td><\/tr>`;\n\n    \/\/ composici\u00f3n (calidad alta)\n    const parts = [\n      ['Construction', B.grupos.obra,      '#2a78d6'],\n      ['Fees',         B.grupos.tecnicos,  '#eb6834'],\n      ['Taxes',        B.grupos.impuestos, '#1baf7a'],\n      ['Other',        B.grupos.otros,     '#898781']\n    ].filter(p=>p[1]>0);\n    const sum = parts.reduce((a,p)=>a+p[1],0);\n    $('o-bars').innerHTML = parts.map(p=>`<i style=\"width:${p[1]\/sum*100}%;background:${p[2]}\"><\/i>`).join('');\n    $('o-leg').innerHTML  = parts.map(p=>`<span><i class=\"sw\" style=\"background:${p[2]}\"><\/i>${p[0]} \u00b7 ${Math.round(p[1]\/sum*100)} %<\/span>`).join('');\n\n    $('o-mun').innerHTML = `<strong>${M.n}.<\/strong> ${M.nota}` +\n      (M.tasa===null ? ` <strong>We could not verify this municipality\u2019s permit fee in its ordinance, so we do not calculate it:<\/strong> we would rather leave the gap than invent a number. Ask the town hall and add it in.` : '') +\n      ` <strong>About the municipal taxes:<\/strong> ICIO and the permit fee are not calculated on the contract price but on the budget that gets stamped, which is set to the minimum ${M.n} will accept${M.mod ? ` \u2014 ${eur(M.mod)}\/m\u00b2, publicado en su ordenanza` : ` \u2014 en torno a ${eur(CONFIG.moduloDefecto)}\/m\u00b2`}. Here that works out at ${eur(B.baseIcio)}. One thing to watch: the final assessment, once the works are finished, is based on the real cost actually incurred, not on the module, so the town hall may issue an adjustment. We explain it in <a href=\"https:\/\/francortesarquitectos.com\/en\/guides\/icio-building-permit-tax\/\">the ICIO guide<\/a>.`;\n\n    const ahorro = B.pem*0.5*0.11;\n    $('o-iva').innerHTML = `<strong>The advice on this page that saves the most money:<\/strong> contract the whole job to one builder. Construction work on a home is taxed at <strong>10 % VAT<\/strong>, but materials you buy yourself are taxed at <strong>21 %<\/strong>. With materials making up about half the budget, buying them separately costs you roughly <strong>${eur(ahorro)}<\/strong> more in tax and gains you nothing.`;\n\n    const sobre = B.pem>0 ? Math.round(((B.total - (B.sue?B.L[0].total+B.L[1].total:0)) \/ B.pem - 1)*100) : 0;\n    $('o-metodo').innerHTML = `\n      <p><strong>1 \u00b7 The house.<\/strong> ${B.m2} m\u00b2 at ${eur(CONFIG.m2.fca)}\/m\u00b2 for a good-standard design by the studio, or ${eur(CONFIG.m2.lujo)}\/m\u00b2 with interior design and luxury finishes. A basement counts at ${pct(CONFIG.ratioSotanoTecnico)} if it is a garage or store and at ${pct(CONFIG.ratioSotanoHabitable)} if it is habitable; a covered porch at ${pct(CONFIG.ratioPorche)} and an open terrace at ${pct(CONFIG.ratioTerraza)}. VAT of ${pct(B.ivaObra)} is applied to the construction work.<\/p>\n      <p><strong>2 \u00b7 The professional team.<\/strong> A detached house needs an outline design, a detailed design, site supervision, works execution supervision and health and safety coordination. The last three are <em>required by law<\/em>, not an extra you can drop. The figure here is <strong>the studio\u2019s minimum for the full commission: 26.000 \u20ac + VAT<\/strong>. It is not a per-metre tariff: it grows with floor area, complexity and scope, and the real amount is quoted case by case.<\/p>\n      <p><strong>3 \u00b7 The town hall.<\/strong> ${M.icio!==null?`The ICIO in ${M.n} is ${pct(M.icio)}`:`We could not verify the ICIO for ${M.n}`}${B.tasaCalc!==null?`, plus a permit fee of ${eur(B.tasaCalc)}`:''}. The rates for all thirty municipalities, each with its ordinance and article, are in <a href=\"https:\/\/francortesarquitectos.com\/en\/guides\/icio-building-permit-tax\/\">the ICIO guide<\/a>. One detail almost no calculator gets right: <strong>the ICIO base is the bare construction cost<\/strong> and, under article 102.1 of the Local Finance Act, it excludes VAT, fees, professional fees and the contractor\u2019s profit. Applying it to the budget including overheads inflates it by 19 %. And ICIO is a tax: <strong>there is no VAT on top of it<\/strong>.<\/p>\n      <p><strong>4 \u00b7 The contingency.<\/strong> ${pct(CONFIG.imprevistos)} of the cost of building the house. That is a generous cushion for an initial estimate, and it is not applied to the other items. Jobs that finish exactly on budget are the exception.<\/p>\n      <p><strong>5 \u00b7 What we deliberately leave open.<\/strong> The plot has no default value, and that is on purpose: the Spanish government\u2019s official land price for the Madrid region swung between 557 and 850 \u20ac\/m\u00b2 across four consecutive quarters of 2025, so publishing that average as if it were your case would be an official figure and still misleading. Utility connections sit inside the off-plot works, but their real cost depends on the distance to the mains: two plots on the same street can differ tenfold.<\/p>\n      <p style=\"border-top:1px solid var(--grid);padding-top:10px\"><strong>In short:<\/strong> on a construction budget of ${eur(B.pem)}, everything else adds <strong>${sobre} %<\/strong> on top. That is what almost nobody tells you at the start.<\/p>`;\n  }\n\n  ['mun','m2','m2sot','m2por','m2ter','urb','urbint','suelo'].forEach(id=>{\n    $(id).addEventListener('input', calcular);\n    $(id).addEventListener('change', calcular);\n  });\n\n  $('fca-lead').addEventListener('submit', function(e){\n    e.preventDefault();\n    \/\/ Temperatura del contacto. No se ense\u00f1a al usuario: viaja con el lead para\n    \/\/ que el estudio sepa a qui\u00e9n llamar primero. Criterio de Fran: lo que\n    \/\/ importa es capacidad de inversi\u00f3n y decisi\u00f3n, no el tama\u00f1o de la casa.\n    function temperatura(){\n      var p = $('l-presu').value, pl = $('l-plazo').value, pa = $('l-parcela').value;\n      var n = 0;\n      if (p==='600-900') n += 2; else if (p==='900-1500' || p==='>1500') n += 3;\n      else if (p==='400-600') n += 1; else if (p==='<400') n -= 2;\n      if (pl==='0-6') n += 2; else if (pl==='6-12') n += 1;\n      else if (pl==='12+' || pl==='sinfecha') n -= 1;\n      if (pa==='si') n += 2; else if (pa==='negociando') n += 1;\n      else if (pa==='no') n -= 1;\n      if (S.int==='si') n += 1;\n      if ($('l-tel').value.trim()) n += 1;\n      if ($('l-cat').value.trim()) n += 1;\n      return n >= 6 ? 'caliente' : (n >= 3 ? 'templado' : 'frio');\n    }\n\n    const payload = {\n      herramienta:'calculadora-coste-construccion-en', version:5,\n      nombre:$('l-nom').value,\n      email:$('l-email').value, telefono:$('l-tel').value, referencia_catastral:$('l-cat').value,\n      tiene_parcela:$('l-parcela').value, plazo:$('l-plazo').value,\n      presupuesto:$('l-presu').value, interiorismo:S.int,\n      temperatura: temperatura(),\n      municipio: MUNICIPIOS[$('mun').value].n,\n      m2_vivienda:$('m2').value, m2_sotano:$('m2sot').value, tipo_sotano:S.sot,\n      m2_porche:$('m2por').value, m2_terraza:$('m2ter').value,\n      urbanizacion_exterior:$('urb').value, urbanizacion_interior:$('urbint').value,\n      suelo:$('suelo').value,\n      vivienda_habitual:S.hab, piscina:S.pis, cocina:S.coc, compra_a:S.comp,\n      total_media:$('o-med').textContent, total_alta:$('o-alt').textContent,\n      website: $('l-hp') ? $('l-hp').value : '',\n      url:location.href, fecha:new Date().toISOString()\n    };\n\n    \/\/ Evento para GA4 v\u00eda Google Tag Manager. Ya activo.\n    window.dataLayer = window.dataLayer || [];\n    window.dataLayer.push({\n      event: 'calculadora_completada',\n      herramienta: 'coste-construccion-en',\n      municipio: payload.municipio,\n      m2: payload.m2_vivienda,\n      valor_estimado: payload.total_alta,\n      presupuesto: payload.presupuesto,\n      plazo: payload.plazo,\n      tiene_parcela: payload.tiene_parcela,\n      temperatura: payload.temperatura\n    });\n\n    var envio = {method:'POST', headers:{'Content-Type':'application\/json'}, body: JSON.stringify(payload)};\n\n    \/\/ 1 \u00b7 Receptor propio en WordPress. Guarda el lead y avisa por correo.\n    \/\/     Funciona siempre y no depende de nadie.\n    fetch(ENDPOINT_WP, envio)\n      .catch(function(e){ console.error('[FCA] failed to save the lead in WordPress:', e); });\n\n    \/\/ 2 \u00b7 GoHighLevel, en paralelo. Si el workflow todav\u00eda no est\u00e1 publicado\n    \/\/     esto no hace nada, pero tampoco molesta.\n    if (WEBHOOK) {\n      fetch(WEBHOOK, envio)\n        .catch(function(e){ console.error('[FCA] failed to send the lead to GHL:', e); });\n    }\n\n    this.querySelector('.btn').style.display='none';\n    $('l-ok').style.display='block';\n  });\n\n  calcular();\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>How much does it cost to build a house in Madrid? The only calculator that adds up every real cost: construction, professional fees, your specific town hall\u2019s taxes, associated costs and the land. This is a guide figure, not a quotation. Without real measurements, the characteristics of the plot, the position of the utility connections, [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":34103,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"rank_math_title":"Cost of building a house in Madrid \u00b7 free calculator","rank_math_description":"Work out the real cost of building a detached house in the Madrid region: construction, professional fees, your town hall\u2019s taxes, site works and contingency. A guide estimate.","rank_math_focus_keyword":"cost of building a house in madrid","rank_math_canonical_url":"","rank_math_robots":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"","rank_math_twitter_use_facebook":"","footnotes":""},"class_list":["post-34104","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/pages\/34104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/comments?post=34104"}],"version-history":[{"count":2,"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/pages\/34104\/revisions"}],"predecessor-version":[{"id":34106,"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/pages\/34104\/revisions\/34106"}],"up":[{"embeddable":true,"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/pages\/34103"}],"wp:attachment":[{"href":"https:\/\/francortesarquitectos.com\/en\/wp-json\/wp\/v2\/media?parent=34104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}