{"id":45723,"date":"2026-07-29T15:31:00","date_gmt":"2026-07-29T07:31:00","guid":{"rendered":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/?page_id=45723"},"modified":"2026-09-08T17:27:33","modified_gmt":"2026-09-08T09:27:33","slug":"renovation-cost-singapore","status":"publish","type":"page","link":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/renovation-cost-singapore\/","title":{"rendered":"Renovation Cost Calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"45723\" class=\"elementor elementor-45723\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-section elementor-top-section elementor-element elementor-element-662c6ca elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"662c6ca\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b61e274\" data-id=\"b61e274\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-da8265d elementor-widget elementor-widget-html\" data-id=\"da8265d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- =============================================================\n     ZENITH ARC  \/renovation-cost-singapore\/\n     Page copy, rebuild v2, July 2026.\n\n     WHAT CHANGED FROM v1 (and why the page broke)\n     =============================================\n     v1 wrapped everything in a <main> element, then told you to\n     split it across several Elementor widgets. Those two things\n     cannot both be true: the opening tag lands in one widget and\n     the closing tag in another, so the browser auto closes it\n     wherever it likes and every widget after it gets nested\n     inside a broken container. That is what made the copy vanish\n     and took the calculator with it.\n\n     v2 has no wrapper. Every section is self contained and\n     balanced, so no widget can break another one.\n\n     v1 also set white space nowrap on table cells, which forces\n     horizontal overflow on a narrow screen. That is the separate\n     mobile fault. Tables now wrap and scroll instead.\n\n     HOW TO PASTE THIS  RECOMMENDED PATH\n     ===================================\n     Two Elementor HTML widgets, in this order:\n\n       Widget 1  HTML widget  the calculator block\n       Widget 2  HTML widget  everything in this file from\n                              \"BLOCK A\" down to the end\n\n     Use HTML widgets, not Text Editor widgets. Text Editor runs\n     TinyMCE, which strips style and script tags and rewrites\n     markup it does not recognise.\n\n     That is the whole job. One widget for the tool, one for the\n     copy. Nothing can get split, so nothing can break.\n\n     IF YOU WANT THE HEADINGS EDITABLE IN THE ELEMENTOR UI\n     =====================================================\n     Optional, more work, more ways to go wrong. Each numbered\n     SECTION below is independently valid HTML, so you can put\n     each one in its own HTML widget. Do not split a section in\n     half, and do not move the style block out of the top.\n     ============================================================= -->\n\n\n<!-- =============================================================\n     META  for Rank Math or Yoast, not for the page body\n     Slug   \/renovation-cost-singapore\/\n     Title  Renovation Cost Singapore 2026 | Free Calculator  (49 chars)\n     Desc   How much does renovation cost in Singapore? See 2026 costs\n            for HDB, condo, landed and commercial projects, and get an\n            instant estimate for your property.  (152 chars)\n     ============================================================= -->\n\n\n<!-- ################ BLOCK A  STYLE  keep at the top ################ -->\n<style>\n.za-copy{max-width:100%;overflow-wrap:break-word;}\n.za-copy .za-tw{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:1.5em 0;}\n.za-copy table{width:100%;border-collapse:collapse;font-size:.95em;}\n.za-copy th,.za-copy td{text-align:left;padding:.7em .8em;vertical-align:top;\n  border-bottom:1px solid rgba(128,128,128,.25);}\n.za-copy th{font-weight:600;}\n.za-copy td+td,.za-copy th+th{text-align:right;}\n.za-copy caption{caption-side:bottom;text-align:left;font-size:.82em;opacity:.72;padding-top:.6em;}\n.za-copy ul{margin:1em 0;padding-left:1.25em;}\n.za-copy li{margin-bottom:.5em;}\n@media (max-width:600px){\n  .za-copy table{font-size:.84em;}\n  .za-copy th,.za-copy td{padding:.5em .4em;}\n}\n<\/style>\n\n\n<!-- ################ SECTION 0  ABOVE THE FOLD ################ -->\n<section class=\"za-copy\">\n  <h1>How Much Does Renovation Cost in Singapore?<\/h1>\n  <p>Answer six questions and get an indicative cost range for your property in under a minute &mdash; HDB, condominium, landed or commercial. No obligation, no phone call required to see the figure.<\/p>\n  <p><strong>CaseTrust accredited &middot; BCA registered &middot; HDB licensed &middot; 10,000+ projects completed<\/strong><\/p>\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3f5a76a elementor-widget elementor-widget-html\" data-id=\"3f5a76a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ============================================================\n     ZENITH ARC \u2014 RENOVATION COST CALCULATOR\n     Paste this entire block into an Elementor \"HTML\" widget.\n     Self-contained: no external files, no dependencies.\n\n     REVISION \u2014 July 2026 cost-engine audit. Changes vs the previous block:\n       1. HDB bands rebased to sit inside the ID-led market, not below it\n       2. Condo psf rebased down, plus an area taper for larger units\n       3. Commercial: per-type uplift, F&B and clinic trimmed, industrial\n          moved to consultation, trade split corrected to 2026 weightings\n       4. Landed: bungalow raised, A&A widened downward,\n          GCB A&A now returns \"By consultation\" (was returning a bad range)\n       5. Lead tier thresholds re-tuned to the new numbers\n\n     Markup, CSS and the Zapier\/CAPI payload are unchanged.\n     Webhook and thank-you URL are already connected in the CONFIG block.\n     ============================================================ -->\n\n<div id=\"za-calc\" role=\"region\" aria-label=\"Renovation cost calculator\">\n\n  <!-- Step indicator -->\n  <ol class=\"za-steps\" aria-label=\"Progress\">\n    <li class=\"za-step is-active\" data-step=\"1\"><span class=\"za-step-num\">1<\/span><span class=\"za-step-label\">Your property<\/span><\/li>\n    <li class=\"za-step\" data-step=\"2\"><span class=\"za-step-num\">2<\/span><span class=\"za-step-label\">Scope<\/span><\/li>\n    <li class=\"za-step\" data-step=\"3\"><span class=\"za-step-num\">3<\/span><span class=\"za-step-label\">Your estimate<\/span><\/li>\n  <\/ol>\n\n  <div class=\"za-panel\">\n\n    <!-- ---------- STEP 1 ---------- -->\n    <section class=\"za-screen is-current\" data-screen=\"1\" aria-label=\"Step 1: your property\">\n\n      <p class=\"za-q\">What are you renovating?<\/p>\n      <div class=\"za-cards za-cards-4\" role=\"radiogroup\" aria-label=\"Property type\" data-field=\"property_type\">\n        <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"HDB\"><span class=\"za-card-t\">HDB<\/span><span class=\"za-card-s\">Flat<\/span><\/button>\n        <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Condo\"><span class=\"za-card-t\">Condo<\/span><span class=\"za-card-s\">Private apartment<\/span><\/button>\n        <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Landed\"><span class=\"za-card-t\">Landed<\/span><span class=\"za-card-s\">House<\/span><\/button>\n        <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Commercial\"><span class=\"za-card-t\">Commercial<\/span><span class=\"za-card-s\">Business space<\/span><\/button>\n      <\/div>\n\n      <!-- Sub-type: HDB -->\n      <div class=\"za-sub\" data-show-when=\"property_type=HDB\" hidden>\n        <p class=\"za-q\">Which flat type?<\/p>\n        <div class=\"za-cards za-cards-4\" role=\"radiogroup\" aria-label=\"Flat type\" data-field=\"hdb_type\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"2-room\"><span class=\"za-card-t\">2-room Flexi<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"3-room\"><span class=\"za-card-t\">3-room<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"4-room\"><span class=\"za-card-t\">4-room<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"5-room\"><span class=\"za-card-t\">5-room<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"3Gen\"><span class=\"za-card-t\">3-Gen<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"EA\"><span class=\"za-card-t\">Executive Apt<\/span><span class=\"za-card-s\">Resale only<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Maisonette\"><span class=\"za-card-t\">Maisonette<\/span><span class=\"za-card-s\">Resale only<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Jumbo\"><span class=\"za-card-t\">Jumbo<\/span><span class=\"za-card-s\">Resale only<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <!-- Sub-type: Condo -->\n      <div class=\"za-sub\" data-show-when=\"property_type=Condo\" hidden>\n        <p class=\"za-q\">How many bedrooms?<\/p>\n        <div class=\"za-cards za-cards-4\" role=\"radiogroup\" aria-label=\"Bedrooms\" data-field=\"condo_beds\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Studio\/1\"><span class=\"za-card-t\">Studio \/ 1<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"2\"><span class=\"za-card-t\">2<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"3\"><span class=\"za-card-t\">3<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"4+\"><span class=\"za-card-t\">4+<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Penthouse\"><span class=\"za-card-t\">Penthouse<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"za-sub\" data-show-when=\"property_type=Condo\" hidden>\n        <p class=\"za-q\">Private condo or EC?<\/p>\n        <div class=\"za-cards za-cards-2\" role=\"radiogroup\" aria-label=\"Condo class\" data-field=\"condo_class\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Private\"><span class=\"za-card-t\">Private condo<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"EC\"><span class=\"za-card-t\">Executive Condo (EC)<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <!-- Sub-type: Landed -->\n      <div class=\"za-sub\" data-show-when=\"property_type=Landed\" hidden>\n        <p class=\"za-q\">What type of house?<\/p>\n        <div class=\"za-cards za-cards-3\" role=\"radiogroup\" aria-label=\"House type\" data-field=\"landed_type\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Terrace\"><span class=\"za-card-t\">Terrace<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Semi-detached\"><span class=\"za-card-t\">Semi-detached<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Bungalow\"><span class=\"za-card-t\">Bungalow<\/span><span class=\"za-card-s\">Detached, non-GCB<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Cluster\"><span class=\"za-card-t\">Cluster \/ strata<\/span><span class=\"za-card-s\">Strata landed<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"GCB\"><span class=\"za-card-t\">Good Class Bungalow<\/span><span class=\"za-card-s\">GCB area<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Shophouse\"><span class=\"za-card-t\">Shophouse<\/span><span class=\"za-card-s\">URA conservation<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <!-- Sub-type: Commercial -->\n      <div class=\"za-sub\" data-show-when=\"property_type=Commercial\" hidden>\n        <p class=\"za-q\">What kind of space?<\/p>\n        <div class=\"za-cards za-cards-4\" role=\"radiogroup\" aria-label=\"Space type\" data-field=\"comm_type\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Office\"><span class=\"za-card-t\">Office<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Retail\"><span class=\"za-card-t\">Retail<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"F&amp;B\"><span class=\"za-card-t\">F&amp;B<\/span><span class=\"za-card-s\">Cafe, restaurant<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Clinic\"><span class=\"za-card-t\">Clinic<\/span><span class=\"za-card-s\">Medical<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Industrial\"><span class=\"za-card-t\">Industrial<\/span><span class=\"za-card-s\">B1 \/ B2, warehouse<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Childcare\"><span class=\"za-card-t\">Childcare<\/span><span class=\"za-card-s\">Preschool, education<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Wellness\"><span class=\"za-card-t\">Gym \/ beauty<\/span><span class=\"za-card-s\">Salon, spa, studio<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <!-- Tenure \/ condition -->\n      <div class=\"za-sub\" data-block=\"tenure\" data-show-when=\"property_type=HDB|Condo\" hidden>\n        <p class=\"za-q\">Is it a new or resale unit?<\/p>\n        <div class=\"za-cards za-cards-2\" role=\"radiogroup\" aria-label=\"Tenure\" data-field=\"tenure\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"New\"><span class=\"za-card-t\">New<\/span><span class=\"za-card-s\">BTO or new launch<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Resale\"><span class=\"za-card-t\">Resale<\/span><span class=\"za-card-s\">Previously occupied<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"za-sub\" data-show-when=\"property_type=Landed\" hidden>\n        <p class=\"za-q\">What's the scope?<\/p>\n        <div class=\"za-cards za-cards-2\" role=\"radiogroup\" aria-label=\"Scope\" data-field=\"landed_scope\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Interior\"><span class=\"za-card-t\">Interior renovation<\/span><span class=\"za-card-s\">Existing structure stays<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"A&amp;A\"><span class=\"za-card-t\">A&amp;A or rebuild<\/span><span class=\"za-card-s\">Structural works<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"za-sub\" data-show-when=\"property_type=Commercial\" hidden>\n        <p class=\"za-q\">What condition is the unit in?<\/p>\n        <div class=\"za-cards za-cards-2\" role=\"radiogroup\" aria-label=\"Condition\" data-field=\"comm_condition\">\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Bare\"><span class=\"za-card-t\">Bare or new<\/span><span class=\"za-card-s\">Nothing to strip out<\/span><\/button>\n          <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Existing\"><span class=\"za-card-t\">Existing fit-out<\/span><span class=\"za-card-s\">Needs reinstatement<\/span><\/button>\n        <\/div>\n      <\/div>\n\n      <!-- Size -->\n      <div class=\"za-sub\" data-show-when=\"property_type=HDB|Condo|Landed|Commercial\" hidden>\n        <p class=\"za-q\">How big is the space? <span class=\"za-opt\" data-size-opt>(optional)<\/span><\/p>\n        <div class=\"za-sizerow\">\n          <input type=\"number\" id=\"za-size\" class=\"za-input za-size-input\" min=\"1\" step=\"1\" inputmode=\"numeric\" placeholder=\"e.g. 1,100\" aria-label=\"Property size\">\n          <div class=\"za-unit\" role=\"radiogroup\" aria-label=\"Unit\" data-field=\"size_unit\">\n            <button type=\"button\" class=\"za-unit-btn is-on\" role=\"radio\" aria-checked=\"true\" data-value=\"sqft\">sq ft<\/button>\n            <button type=\"button\" class=\"za-unit-btn\" role=\"radio\" aria-checked=\"false\" data-value=\"sqm\">m&sup2;<\/button>\n          <\/div>\n        <\/div>\n        <p class=\"za-hint\" data-size-hint><\/p>\n      <\/div>\n\n      <p class=\"za-err\" data-err hidden><\/p>\n      <div class=\"za-nav\">\n        <span><\/span>\n        <button type=\"button\" class=\"za-btn za-btn-primary\" data-next=\"2\">Continue<\/button>\n      <\/div>\n    <\/section>\n\n    <!-- ---------- STEP 2 ---------- -->\n    <section class=\"za-screen\" data-screen=\"2\" hidden aria-label=\"Step 2: scope\">\n      <p class=\"za-q\">What level of renovation are you planning?<\/p>\n      <div class=\"za-cards za-cards-3 za-cards-tall\" role=\"radiogroup\" aria-label=\"Renovation level\" data-field=\"spec_level\">\n        <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Light\">\n          <span class=\"za-card-t\">Light refresh<\/span>\n          <span class=\"za-card-s\">Paint, flooring, minimal carpentry. Layout stays as it is.<\/span>\n        <\/button>\n        <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Standard\">\n          <span class=\"za-card-t\">Standard<\/span>\n          <span class=\"za-card-s\">Full renovation with built-in carpentry, new kitchen and bathrooms.<\/span>\n        <\/button>\n        <button type=\"button\" class=\"za-card\" role=\"radio\" aria-checked=\"false\" data-value=\"Premium\">\n          <span class=\"za-card-t\">Premium<\/span>\n          <span class=\"za-card-s\">Designer-led, bespoke joinery, high-specification finishes.<\/span>\n        <\/button>\n      <\/div>\n\n      <p class=\"za-err\" data-err hidden><\/p>\n      <div class=\"za-nav\">\n        <button type=\"button\" class=\"za-btn za-btn-ghost\" data-back=\"1\">Back<\/button>\n        <button type=\"button\" class=\"za-btn za-btn-primary\" data-next=\"3\">See my estimate<\/button>\n      <\/div>\n    <\/section>\n\n    <!-- ---------- STEP 3 ---------- -->\n    <section class=\"za-screen\" data-screen=\"3\" hidden aria-label=\"Step 3: your estimate\">\n\n      <div class=\"za-result\">\n        <p class=\"za-result-eyebrow\" data-result-eyebrow>Indicative renovation cost<\/p>\n        <p class=\"za-result-range\" data-result-range aria-live=\"polite\">&mdash;<\/p>\n        <p class=\"za-result-config\" data-result-config><\/p>\n\n        <!-- Signature element: the range band -->\n        <div class=\"za-band\" aria-hidden=\"true\">\n          <div class=\"za-band-track\"><div class=\"za-band-fill\" data-band-fill><\/div><\/div>\n          <div class=\"za-band-scale\">\n            <span class=\"za-band-tag za-band-tag-lo\" data-band-lo>&nbsp;<\/span>\n            <span class=\"za-band-tag za-band-tag-hi\" data-band-hi>&nbsp;<\/span>\n          <\/div>\n        <\/div>\n\n        <p class=\"za-result-note\" data-result-note><\/p>\n      <\/div>\n\n      <div class=\"za-gate\">\n        <p class=\"za-gate-h\">Get the full cost breakdown<\/p>\n        <p class=\"za-gate-p\">See where every dollar goes, trade by trade &mdash; plus a free consultation with a Zenith Arc designer. No obligation.<\/p>\n\n        <div class=\"za-fields\">\n          <label class=\"za-label\" for=\"za-name\">Name<\/label>\n          <input type=\"text\" id=\"za-name\" class=\"za-input\" autocomplete=\"name\" placeholder=\"Your name\">\n\n          <label class=\"za-label\" for=\"za-email\">Email<\/label>\n          <input type=\"email\" id=\"za-email\" class=\"za-input\" autocomplete=\"email\" placeholder=\"you@example.com\">\n\n          <label class=\"za-label\" for=\"za-phone\">Mobile<\/label>\n          <input type=\"tel\" id=\"za-phone\" class=\"za-input\" autocomplete=\"tel\" inputmode=\"numeric\" placeholder=\"9123 4567\">\n\n          <label class=\"za-label\" for=\"za-msg\">Anything we should know? <span class=\"za-opt\">(optional)<\/span><\/label>\n          <textarea id=\"za-msg\" class=\"za-input za-textarea\" rows=\"2\" placeholder=\"Timeline, must-haves, questions\"><\/textarea>\n        <\/div>\n\n        <input type=\"text\" id=\"za-hp\" class=\"za-hp\" tabindex=\"-1\" autocomplete=\"off\" aria-hidden=\"true\">\n\n        <label class=\"za-consent\">\n          <input type=\"checkbox\" id=\"za-pdpa\">\n          <span>I agree to Zenith Arc contacting me about my renovation enquiry by phone, email or WhatsApp.<\/span>\n        <\/label>\n\n        <p class=\"za-err\" data-err hidden><\/p>\n        <div class=\"za-nav\">\n          <button type=\"button\" class=\"za-btn za-btn-ghost\" data-back=\"2\">Back<\/button>\n          <button type=\"button\" class=\"za-btn za-btn-primary\" data-submit>Send me the breakdown<\/button>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <!-- ---------- INLINE BREAKDOWN (only if REDIRECT_ON_SUBMIT = false) ---------- -->\n    <section class=\"za-screen\" data-screen=\"4\" hidden aria-label=\"Your cost breakdown\">\n      <div class=\"za-result\">\n        <p class=\"za-result-eyebrow\">Your estimated renovation cost<\/p>\n        <p class=\"za-result-range\" data-final-range>&mdash;<\/p>\n      <\/div>\n      <p class=\"za-q\">Where the budget goes<\/p>\n      <ul class=\"za-breakdown\" data-breakdown><\/ul>\n      <p class=\"za-hint\">Indicative allocation based on 2026 Singapore market benchmarks. Your actual quotation follows a site survey.<\/p>\n      <div class=\"za-nav\">\n        <span><\/span>\n        <a class=\"za-btn za-btn-primary\" href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/contact-us\/\">Book a free consultation<\/a>\n      <\/div>\n    <\/section>\n\n  <\/div>\n\n  <p class=\"za-disclaimer\">Estimates are indicative ranges based on 2026 Singapore renovation cost benchmarks, last reviewed July 2026, and are not a quotation. Final pricing depends on a site survey, scope and material selection.<\/p>\n<\/div>\n\n<style>\n\/* ============================================================\n   THEME \u2014 Zenith Arc dark site. Edit these seven values only.\n\n   Using this on a LIGHT background instead? Swap in:\n     --za-ink:#16191C;  --za-muted:#6B7278;  --za-line:#E2E5E8;\n     --za-surface:#FFFFFF;  --za-tint:#F6F7F8;\n     --za-accent:#B4884A;  --za-accent-ink:#FFFFFF;\n   ============================================================ *\/\n#za-calc{\n  --za-ink:#EDEEF0;\n  --za-muted:#9BA1A8;\n  --za-line:#31353A;\n  --za-surface:#1A1D21;\n  --za-tint:#121417;\n  --za-accent:#BE9A5C;\n  --za-accent-ink:#141619;\n  --za-accent-soft:rgba(190,154,92,.12);\n\n  --za-radius:10px;\n  --za-gap:14px;\n\n  font-family:inherit!important;\n  font-size:16px;\n  line-height:1.5;\n  color:var(--za-ink)!important;\n  max-width:820px;\n  margin:0 auto;\n  -webkit-font-smoothing:antialiased;\n}\n#za-calc *,#za-calc *::before,#za-calc *::after{box-sizing:border-box;}\n#za-calc h3,#za-calc p,#za-calc ul,#za-calc ol,#za-calc li,#za-calc span,#za-calc label{\n  margin:0;padding:0;font-family:inherit!important;text-transform:none!important;\n  letter-spacing:normal!important;color:inherit;}\n#za-calc ul,#za-calc ol{list-style:none!important;}\n#za-calc button,#za-calc input,#za-calc textarea{font-family:inherit!important;}\n\n#za-calc .za-steps{display:flex!important;gap:6px;margin:0 0 18px!important;}\n#za-calc .za-step{flex:1;display:flex!important;align-items:center;gap:8px;padding:0 0 10px!important;\n  border-bottom:2px solid var(--za-line)!important;color:var(--za-muted)!important;font-size:.82rem;\n  transition:border-color .25s,color .25s;}\n#za-calc .za-step.is-active,#za-calc .za-step.is-done{border-bottom-color:var(--za-accent)!important;color:var(--za-ink)!important;}\n#za-calc .za-step-num{flex:0 0 22px;height:22px;border-radius:50%;border:1px solid var(--za-line);\n  display:grid;place-items:center;font-size:.72rem;font-variant-numeric:tabular-nums;color:inherit;}\n#za-calc .za-step.is-active .za-step-num,#za-calc .za-step.is-done .za-step-num{\n  background:var(--za-accent)!important;border-color:var(--za-accent)!important;color:var(--za-accent-ink)!important;}\n#za-calc .za-step-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\n\n#za-calc .za-panel{background:var(--za-tint)!important;border:1px solid var(--za-line)!important;\n  border-radius:var(--za-radius);padding:26px!important;}\n#za-calc .za-screen{animation:za-in .28s ease both;}\n@keyframes za-in{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}\n\n#za-calc .za-q{font-size:1.02rem!important;font-weight:600!important;line-height:1.4!important;\n  margin:0 0 12px!important;color:var(--za-ink)!important;}\n#za-calc .za-sub{margin-top:26px;}\n#za-calc .za-opt{font-weight:400!important;color:var(--za-muted)!important;font-size:.86em!important;}\n\n#za-calc .za-cards{display:grid!important;gap:var(--za-gap);max-width:100%;}\n\/* Grid items must be allowed to shrink, and theme rules must not force nowrap *\/\n#za-calc .za-cards > *{min-width:0!important;}\n#za-calc .za-cards-2{grid-template-columns:repeat(2,1fr);}\n#za-calc .za-cards-3{grid-template-columns:repeat(3,1fr);}\n#za-calc .za-cards-4{grid-template-columns:repeat(4,1fr);}\n#za-calc .za-card{appearance:none;-webkit-appearance:none;font-size:1rem;text-align:left!important;cursor:pointer;\n  background:var(--za-surface)!important;border:1px solid var(--za-line)!important;border-radius:var(--za-radius)!important;\n  padding:14px!important;margin:0!important;display:flex!important;flex-direction:column;gap:3px;width:100%;\n  box-shadow:none;text-transform:none!important;letter-spacing:normal!important;\n  white-space:normal!important;overflow-wrap:break-word;min-width:0!important;\n  transition:border-color .18s,background .18s,transform .18s;}\n#za-calc .za-cards-tall .za-card{min-height:112px;}\n#za-calc .za-card:hover{border-color:var(--za-accent)!important;transform:translateY(-1px);background:var(--za-surface)!important;}\n#za-calc .za-card:focus-visible{outline:2px solid var(--za-accent);outline-offset:2px;}\n#za-calc .za-card[aria-checked=\"true\"]{border-color:var(--za-accent)!important;background:var(--za-accent-soft)!important;\n  box-shadow:inset 0 0 0 1px var(--za-accent);}\n#za-calc .za-card-t,#za-calc .za-card-s{white-space:normal!important;overflow-wrap:break-word;display:block;}\n#za-calc .za-card-t{font-weight:600!important;font-size:.95rem!important;line-height:1.3!important;color:var(--za-ink)!important;}\n#za-calc .za-card-s{font-size:.8rem!important;color:var(--za-muted)!important;line-height:1.45!important;font-weight:400!important;}\n\n#za-calc .za-sizerow{display:flex!important;gap:10px;align-items:stretch;max-width:100%;}\n#za-calc .za-size-input{flex:1;min-width:0;}\n#za-calc .za-unit{display:flex!important;background:var(--za-surface)!important;border:1px solid var(--za-line)!important;\n  border-radius:var(--za-radius);overflow:hidden;flex:0 0 auto;}\n#za-calc .za-unit-btn{appearance:none;-webkit-appearance:none;font-size:.86rem!important;cursor:pointer;\n  background:transparent!important;border:0!important;padding:0 16px!important;margin:0!important;\n  color:var(--za-muted)!important;text-transform:none!important;letter-spacing:normal!important;\n  transition:background .18s,color .18s;}\n#za-calc .za-unit-btn.is-on{background:var(--za-accent)!important;color:var(--za-accent-ink)!important;}\n#za-calc .za-unit-btn:focus-visible{outline:2px solid var(--za-accent);outline-offset:-2px;}\n\n#za-calc .za-input{width:100%!important;font-size:.95rem!important;color:var(--za-ink)!important;\n  background:var(--za-surface)!important;border:1px solid var(--za-line)!important;border-radius:var(--za-radius)!important;\n  padding:11px 13px!important;margin:0!important;box-shadow:none!important;transition:border-color .18s;}\n#za-calc .za-input::placeholder{color:var(--za-muted)!important;opacity:.75;}\n#za-calc .za-input:focus{outline:none;border-color:var(--za-accent)!important;box-shadow:0 0 0 3px rgba(190,154,92,.18)!important;}\n#za-calc .za-input.is-bad{border-color:#E05B4B!important;}\n#za-calc .za-textarea{resize:vertical;}\n#za-calc .za-label{display:block!important;font-size:.82rem!important;font-weight:600!important;\n  margin:14px 0 5px!important;color:var(--za-ink)!important;}\n#za-calc .za-fields .za-label:first-child{margin-top:0!important;}\n#za-calc .za-hint{font-size:.78rem!important;color:var(--za-muted)!important;margin-top:7px!important;line-height:1.5!important;}\n#za-calc .za-hp{position:absolute!important;left:-9999px!important;width:1px!important;height:1px!important;\n  opacity:0!important;pointer-events:none;}\n\n#za-calc .za-result{background:var(--za-surface)!important;border:1px solid var(--za-line)!important;\n  border-radius:var(--za-radius);padding:22px!important;text-align:center!important;}\n#za-calc .za-result-eyebrow{font-size:.74rem!important;letter-spacing:.09em!important;text-transform:uppercase!important;\n  color:var(--za-muted)!important;}\n#za-calc .za-result-range{font-size:clamp(1.45rem,4.6vw,2.1rem)!important;font-weight:700!important;line-height:1.2!important;\n  margin-top:8px!important;font-variant-numeric:tabular-nums;letter-spacing:-.01em!important;color:var(--za-ink)!important;}\n#za-calc .za-result-config{font-size:.78rem!important;color:var(--za-accent)!important;margin-top:6px!important;\n  letter-spacing:.03em!important;font-weight:600!important;}\n#za-calc .za-result-note{font-size:.82rem!important;color:var(--za-muted)!important;line-height:1.55!important;margin-top:10px!important;}\n\n#za-calc .za-band{margin-top:16px;}\n#za-calc .za-band-track{height:7px;border-radius:99px;background:var(--za-line)!important;position:relative;overflow:hidden;}\n#za-calc .za-band-fill{position:absolute;top:0;bottom:0;left:0;width:0;background:var(--za-accent)!important;\n  border-radius:99px;transition:left .55s cubic-bezier(.22,1,.36,1),width .55s cubic-bezier(.22,1,.36,1);}\n#za-calc .za-band-scale{position:relative;height:16px;margin-top:6px;font-size:.7rem;color:var(--za-muted)!important;\n  font-variant-numeric:tabular-nums;}\n#za-calc .za-band-tag{position:absolute;top:0;white-space:nowrap;transform:translateX(-50%);color:var(--za-muted)!important;\n  transition:left .55s cubic-bezier(.22,1,.36,1);}\n\n#za-calc .za-gate{margin-top:24px;}\n#za-calc .za-gate-h{font-size:1.02rem!important;font-weight:600!important;color:var(--za-ink)!important;}\n#za-calc .za-gate-p{font-size:.86rem!important;color:var(--za-muted)!important;line-height:1.55!important;margin-top:5px!important;}\n#za-calc .za-fields{margin-top:16px;}\n#za-calc .za-consent{display:flex!important;gap:9px;align-items:flex-start;margin-top:16px!important;\n  font-size:.8rem!important;color:var(--za-muted)!important;line-height:1.5!important;cursor:pointer;font-weight:400!important;}\n#za-calc .za-consent input{margin-top:2px!important;flex:0 0 auto;accent-color:var(--za-accent);width:16px;height:16px;}\n\n#za-calc .za-breakdown{margin:0 0 4px!important;}\n#za-calc .za-breakdown li{display:flex!important;justify-content:space-between;gap:14px;padding:11px 0!important;\n  border-bottom:1px solid var(--za-line)!important;font-size:.88rem!important;color:var(--za-ink)!important;}\n#za-calc .za-breakdown li:last-child{border-bottom:0!important;}\n#za-calc .za-breakdown b{font-weight:600!important;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--za-ink)!important;}\n\n#za-calc .za-nav{flex-wrap:wrap;display:flex!important;justify-content:space-between;align-items:center;gap:12px;margin-top:26px;}\n#za-calc .za-btn{appearance:none;-webkit-appearance:none;font-size:.92rem!important;font-weight:600!important;cursor:pointer;\n  border-radius:var(--za-radius)!important;padding:12px 26px!important;margin:0!important;border:1px solid transparent!important;\n  text-decoration:none!important;display:inline-block;text-transform:none!important;letter-spacing:normal!important;\n  box-shadow:none!important;transition:opacity .18s,background .18s,color .18s;}\n#za-calc .za-btn-primary{background:var(--za-accent)!important;color:var(--za-accent-ink)!important;}\n#za-calc .za-btn-primary:hover{opacity:.88;background:var(--za-accent)!important;color:var(--za-accent-ink)!important;}\n#za-calc .za-btn-primary[disabled]{opacity:.55;cursor:progress;}\n#za-calc .za-btn-ghost{background:transparent!important;color:var(--za-muted)!important;border-color:var(--za-line)!important;}\n#za-calc .za-btn-ghost:hover{color:var(--za-ink)!important;border-color:var(--za-muted)!important;background:transparent!important;}\n#za-calc .za-btn:focus-visible{outline:2px solid var(--za-accent);outline-offset:2px;}\n\n#za-calc .za-err{color:#E05B4B!important;font-size:.82rem!important;margin-top:16px!important;line-height:1.5!important;}\n#za-calc .za-disclaimer{font-size:.72rem!important;color:var(--za-muted)!important;line-height:1.6!important;\n  margin-top:14px!important;text-align:center!important;}\n\n@media (max-width:680px){\n  #za-calc .za-panel{padding:18px!important;}\n  #za-calc .za-cards-3,#za-calc .za-cards-4{grid-template-columns:repeat(2,1fr);}\n  #za-calc .za-cards-tall .za-card{min-height:0;}\n  #za-calc .za-step-label{display:none;}\n  #za-calc .za-step{flex:0 0 auto;}\n  #za-calc .za-steps{gap:10px;}\n  #za-calc .za-nav .za-btn{flex:1;text-align:center!important;padding:13px 16px!important;}\n}\n@media (prefers-reduced-motion:reduce){\n  #za-calc *,#za-calc .za-band-fill{animation:none!important;transition:none!important;}\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  \/* ============================================================\n     CONFIG \u2014 edit these\n     ============================================================ *\/\n  var CFG = {\n    \/\/ 1. Paste your Zapier Catch Hook URL here:\n    WEBHOOK_URL: \"https:\/\/hooks.zapier.com\/hooks\/catch\/25251938\/44x82le\/\",\n\n    \/\/ 2. Where leads go after submitting (your Lead event fires here):\n    THANK_YOU_URL: \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/thank-you-quote\/\",\n\n    \/\/ true  = redirect to the thank-you page (keeps your existing Lead event working)\n    \/\/ false = show the breakdown inline instead, no redirect (useful for testing)\n    REDIRECT_ON_SUBMIT: true\n  };\n\n  \/* ============================================================\n     COST ENGINE \u2014 2026 Singapore benchmarks (SGD), reviewed July 2026\n\n     Basis for the residential bands: HomeMatch's 2026 bottom-up cost model\n     sets the floor, Qanvast's 2026 medians (341 BTO + 449 resale projects)\n     set the ID-led ceiling. Zenith Arc sells into the ID-led end, so the\n     Standard band spans the two rather than tracking the cheaper one.\n\n     Swap these for Zenith Arc's own project data when ready.\n     ============================================================ *\/\n  var SPEC_MULT = { Light: 0.75, Standard: 1.00, Premium: 1.40 };\n\n  \/\/ Whole-flat bands at Standard spec. EA \/ Maisonette \/ Jumbo are resale-only stock.\n  var HDB = {\n    \"2-room\":     { New: [18000, 32000],  Resale: [28000, 42000] },\n    \"3-room\":     { New: [36000, 53000],  Resale: [48000, 68000] },\n    \"4-room\":     { New: [44000, 62000],  Resale: [62000, 82000] },\n    \"5-room\":     { New: [52000, 77000],  Resale: [72000, 99000] },\n    \"3Gen\":       { New: [73000, 104000], Resale: [83000, 115000] },\n    \"EA\":         { New: [84000, 118000], Resale: [84000, 118000] },\n    \"Maisonette\": { New: [91000, 135000], Resale: [91000, 135000] },\n    \"Jumbo\":      { New: [101000, 156000], Resale: [101000, 156000] }\n  };\n  var HDB_RESALE_ONLY = [\"EA\", \"Maisonette\", \"Jumbo\"];\n\n  \/\/ Condo is priced per square foot. Standard sits inside the $80-120 psf\n  \/\/ corridor the 2026 market quotes; new units are far cheaper because the\n  \/\/ developer already fitted flooring, kitchen, wardrobes and bathrooms.\n  var CONDO_PSF = {\n    Light:    { New: [28, 45],  Resale: [52, 78] },\n    Standard: { New: [42, 62],  Resale: [75, 110] },\n    Premium:  { New: [68, 105], Resale: [120, 185] }\n  };\n\n  \/\/ Larger floorplates spread fixed costs and attract volume pricing, so the\n  \/\/ rate per square foot tapers as the unit gets bigger. Without this, a\n  \/\/ 4-bedroom quote compounds area against the bedroom factor and overshoots.\n  function areaTaper(a) {\n    if (a >= 2500) return 0.88;\n    if (a >= 1800) return 0.92;\n    if (a >= 1200) return 0.96;\n    return 1;\n  }\n\n  \/\/ Commercial runs the opposite way at the small end: a 1,200 sq ft office\n  \/\/ carries the same mobilisation and design effort as a 3,000 sq ft one.\n  function commTaper(a) {\n    if (a >= 10000) return 0.88;\n    if (a >= 5000) return 0.93;\n    if (a >= 2000) return 1;\n    return 1.08;\n  }\n\n  var COMM_PSF = {\n    \"Office\": { Light: [50, 90],   Standard: [90, 160],  Premium: [160, 280] },\n    \"Retail\": { Light: [100, 150], Standard: [150, 250], Premium: [240, 360] },\n    \"F&B\":    { Light: [150, 240], Standard: [240, 380], Premium: [380, 560] },\n    \"Clinic\": { Light: [150, 220], Standard: [220, 350], Premium: [360, 600] }\n  };\n\n  \/\/ Office bands are published as build cost, so they carry an allowance for\n  \/\/ design fees, BCA and SCDF permits, project management and contingency.\n  \/\/ Retail, F&B and clinic bands are already quoted all-in \u2014 no uplift, or\n  \/\/ the allowance gets counted twice.\n  var COMM_UPLIFT = { \"Office\": 1.12, \"Retail\": 1.00, \"F&B\": 1.00, \"Clinic\": 1.00 };\n  var COMM_EXISTING_UPLIFT = 1.08;\n\n  \/\/ No reliable published benchmark \u2014 these are scoped in consultation.\n  \/\/ Industrial joined this list in the July 2026 review: cost swings too far\n  \/\/ on the office-to-warehouse ratio to publish a range. To put it back,\n  \/\/ remove \"Industrial\" here and restore { Light:[30,60], Standard:[60,110],\n  \/\/ Premium:[110,180] } to COMM_PSF above.\n  var COMM_CONSULT = [\"Childcare\", \"Wellness\", \"Industrial\"];\n  var COMM_CONSULT_NOTE = {\n    \"Childcare\": \"Childcare and education fit-outs are shaped by ECDA licensing, SCDF requirements and playground safety standards \\u2014 the cost depends heavily on your licence class and layout, so we scope these individually.\",\n    \"Wellness\": \"Gym, salon and spa fit-outs vary enormously with plumbing runs, treatment rooms and ventilation \\u2014 we scope these individually rather than quote a range.\",\n    \"Industrial\": \"Industrial fit-out cost swings on how much of the unit is office versus warehouse, plus any floor-loading, power or ACMV upgrades \\u2014 too far for a published range to be useful, so we scope these on site.\"\n  };\n\n  var LANDED = {\n    \"Terrace\":       [120000, 200000],\n    \"Semi-detached\": [180000, 350000],\n    \"Bungalow\":      [350000, 650000],\n    \"Cluster\":       [130000, 240000],\n    \"GCB\":           [680000, 1700000]\n  };\n  var LANDED_SPEC = { Light: 0.65, Standard: 1.00, Premium: 1.60 };\n\n  \/\/ \"A&A or rebuild\" covers both a structural alteration that keeps the shell\n  \/\/ and a full reconstruction, so the band spans the two. GCB is deliberately\n  \/\/ absent \u2014 it falls through to consultation below.\n  var LANDED_AA = {\n    \"Terrace\":       [450000, 1300000],\n    \"Semi-detached\": [900000, 3000000],\n    \"Bungalow\":      [1500000, 5000000]\n  };\n  \/\/ Conservation shophouses are priced per sq ft, not by house band, and don't\n  \/\/ taper \u2014 heritage work is bespoke element by element, so scale saves little.\n  var SHOPHOUSE_PSF = { Light: [200, 300], Standard: [300, 500], Premium: [500, 1000] };\n\n  var SPLIT_NEW = [\n    [\"Carpentry\", 38], [\"Masonry, tiling &amp; flooring\", 22], [\"Electrical &amp; lighting\", 10],\n    [\"Plumbing &amp; sanitary\", 7], [\"Ceiling &amp; partition\", 7], [\"Hacking &amp; demolition\", 5],\n    [\"Painting\", 5], [\"Windows, doors &amp; grilles\", 4], [\"Cleaning &amp; disposal\", 2]\n  ];\n  var SPLIT_RESALE = [\n    [\"Carpentry\", 35], [\"Masonry, tiling &amp; flooring\", 22], [\"Electrical &amp; lighting\", 10],\n    [\"Plumbing &amp; sanitary\", 7], [\"Ceiling &amp; partition\", 7], [\"Hacking &amp; demolition\", 8],\n    [\"Painting\", 5], [\"Windows, doors &amp; grilles\", 4], [\"Cleaning &amp; disposal\", 2]\n  ];\n  \/\/ Rebalanced July 2026 to published commercial trade weightings. The previous\n  \/\/ split was carpentry-heavy, which reads as residential to a commercial client.\n  var SPLIT_COMM = [\n    [\"M&amp;E (electrical, data, ACMV, fire)\", 23], [\"Partitions &amp; doors\", 21],\n    [\"Ceiling &amp; lighting\", 16], [\"Flooring &amp; finishes\", 12],\n    [\"Carpentry &amp; joinery\", 12], [\"Painting &amp; finishing\", 4],\n    [\"Permits &amp; compliance\", 5], [\"Project management &amp; contingency\", 7]\n  ];\n\n  var MIN_FLOOR = 15000;\n  var SQM_TO_SQFT = 10.7639;\n\n  \/* Typical size fallbacks (sq ft) when the user leaves size blank *\/\n  var TYPICAL_SQFT = {\n    HDB: { \"2-room\": 450, \"3-room\": 700, \"4-room\": 960, \"5-room\": 1180,\n           \"3Gen\": 1200, \"EA\": 1500, \"Maisonette\": 1600, \"Jumbo\": 1800 },\n    Condo: { \"Studio\/1\": 550, \"2\": 800, \"3\": 1100, \"4+\": 1500, \"Penthouse\": 2500 },\n    Landed: { \"Terrace\": 2500, \"Semi-detached\": 3500, \"Bungalow\": 5000,\n              \"Cluster\": 3000, \"GCB\": 10000, \"Shophouse\": 3000 }\n  };\n\n  \/\/ For a given floor area, more bedrooms means more wardrobes, doors, wet areas\n  \/\/ and electrical points \\u2014 so the cost per square foot rises with room density.\n  \/\/ Compressed July 2026: the old spread double-counted size, which already\n  \/\/ enters the sum through floor area.\n  var BEDS_FACTOR = {\n    \"Studio\/1\": 0.92, \"2\": 0.97, \"3\": 1.00, \"4+\": 1.04, \"Penthouse\": 1.08\n  };\n\n  \/* ============================================================\n     STATE + HELPERS\n     ============================================================ *\/\n  var root = document.getElementById(\"za-calc\");\n  if (!root) return;\n  \/\/ If the block was pasted more than once, only the first is wired up. Warn loudly.\n  if (document.querySelectorAll(\"#za-calc\").length > 1) {\n    console.warn(\"[Zenith Arc calculator] This block appears on the page more than once. \" +\n      \"Only the first copy will work \\u2014 remove the duplicate.\");\n  }\n  if (root.getAttribute(\"data-za-ready\") === \"1\") return;\n  root.setAttribute(\"data-za-ready\", \"1\");\n\n  var S = { size_unit: \"sqft\" };\n  var current = 1;\n\n  function $(sel, ctx) { return (ctx || root).querySelector(sel); }\n  function $$(sel, ctx) { return Array.prototype.slice.call((ctx || root).querySelectorAll(sel)); }\n  function round1k(n) { return Math.max(0, Math.round(n \/ 1000) * 1000); }\n  function money(n) { return \"S$\" + Math.round(n).toLocaleString(\"en-SG\"); }\n  function moneyShort(n) {\n    if (n >= 1000000) return \"S$\" + (n \/ 1000000).toFixed(n % 1000000 === 0 ? 0 : 1) + \"M\";\n    return \"S$\" + Math.round(n \/ 1000) + \"k\";\n  }\n\n  function typicalSqft() {\n    var t = TYPICAL_SQFT[S.property_type];\n    if (!t) return 0;\n    var key = S.property_type === \"HDB\" ? S.hdb_type\n            : S.property_type === \"Landed\" ? S.landed_type\n            : S.condo_beds;\n    return t[key] || 0;\n  }\n\n  function sqft() {\n    var v = parseFloat(S.size_value);\n    if (!v || v <= 0) return typicalSqft();\n    return S.size_unit === \"sqm\" ? v * SQM_TO_SQFT : v;\n  }\n\n  \/\/ Band-priced types (HDB, landed) still respond to size: scale against the\n  \/\/ typical footprint for that type, clamped so an odd entry can't distort it.\n  function sizeFactor() {\n    var v = parseFloat(S.size_value);\n    if (!(v > 0)) return 1;\n    var typ = typicalSqft();\n    if (!typ) return 1;\n    var f = (S.size_unit === \"sqm\" ? v * SQM_TO_SQFT : v) \/ typ;\n    return Math.min(1.3, Math.max(0.8, f));\n  }\n\n  \/* ============================================================\n     THE CALCULATION\n     ============================================================ *\/\n  function estimate() {\n    var t = S.property_type, spec = S.spec_level, lo = 0, hi = 0, note = \"\", split = SPLIT_NEW, aa = false;\n\n    if (t === \"HDB\") {\n      var ten = isResaleOnly() ? \"Resale\" : S.tenure;\n      var b = HDB[S.hdb_type] && HDB[S.hdb_type][ten];\n      if (!b) return null;\n      var hf = SPEC_MULT[spec] * sizeFactor();\n      lo = b[0] * hf; hi = b[1] * hf;\n      split = ten === \"Resale\" ? SPLIT_RESALE : SPLIT_NEW;\n      if (S.hdb_type === \"Maisonette\") {\n        note = \"Maisonettes span two storeys \\u2014 the internal staircase, extra wet areas and longer electrical runs all add to the cost.\";\n      } else if (ten === \"Resale\") {\n        note = \"Resale flats carry extra cost for hacking, rewiring and waterproofing.\";\n      }\n\n    } else if (t === \"Condo\") {\n      var p = CONDO_PSF[spec] && CONDO_PSF[spec][S.tenure];\n      if (!p) return null;\n      var a = sqft();\n      if (!a) return null;\n      var bf = (BEDS_FACTOR[S.condo_beds] || 1) * areaTaper(a);\n      lo = p[0] * a * bf; hi = p[1] * a * bf;\n      split = S.tenure === \"Resale\" ? SPLIT_RESALE : SPLIT_NEW;\n      note = S.condo_beds === \"Penthouse\"\n        ? \"Penthouses often involve double-volume spaces, feature staircases and private roof terraces \\u2014 worth a site visit before you fix a budget.\"\n        : (S.tenure === \"New\"\n          ? \"New condos arrive with flooring, kitchen and wardrobes already in, so much of this budget goes to replacing rather than building from bare.\"\n          : \"Condo projects also carry MCST restrictions on working hours and protection works.\");\n\n    } else if (t === \"Landed\") {\n      if (S.landed_type === \"Shophouse\") {\n        var sa = sqft();\n        if (!sa) return null;\n        var sp = SHOPHOUSE_PSF[spec];\n        lo = sp[0] * sa; hi = sp[1] * sa;\n        split = SPLIT_RESALE;\n        note = \"Conservation shophouses need URA Conservation Permission, heritage-compliant materials and specialist trades \\u2014 we'd scope this properly with you on site.\";\n        if (S.landed_scope === \"A&A\") return { consult: true, note: note, tier: \"Hot\" };\n\n      } else if (S.landed_scope === \"A&A\") {\n        var aab = LANDED_AA[S.landed_type];\n        if (!aab) {\n          return { consult: true, tier: \"Hot\", note: S.landed_type === \"GCB\"\n            ? \"GCB reconstruction sits in its own bracket \\u2014 plot size, basement, pool and finish level move the number too far for a published range to mean anything. We scope these individually.\"\n            : \"Strata landed A&A works are constrained by the MCST and estate rules \\u2014 these need scoping with your designer.\" };\n        }\n        lo = aab[0]; hi = aab[1]; aa = true;\n        note = \"A&A and rebuild projects vary widely with structure, URA and BCA approvals. This is an indicative construction-cost band only \\u2014 your designer will scope it properly with you.\";\n\n      } else {\n        var lb = LANDED[S.landed_type];\n        if (!lb) return null;\n        var lf = LANDED_SPEC[spec] * sizeFactor();\n        lo = lb[0] * lf; hi = lb[1] * lf;\n        split = SPLIT_NEW;\n        if (S.landed_type === \"GCB\") {\n          note = \"GCB interiors involve luxury specification, bespoke joinery and landscaping. Expect a 15\\u201320% contingency on top.\";\n        } else if (S.landed_type === \"Cluster\") {\n          note = \"Strata landed homes sit under an MCST, so working hours, hoisting and protection works are restricted.\";\n        } else {\n          note = \"Structural alterations require a Qualified Person and BCA or URA approval, which sits outside this estimate.\";\n        }\n      }\n\n    } else if (t === \"Commercial\") {\n      if (COMM_CONSULT.indexOf(S.comm_type) > -1) {\n        return { consult: true, tier: \"Hot\", note: COMM_CONSULT_NOTE[S.comm_type] || \"\" };\n      }\n      var cp = COMM_PSF[S.comm_type] && COMM_PSF[S.comm_type][spec];\n      if (!cp) return null;\n      var ca = sqft();\n      if (!ca) return null;\n      var up = (COMM_UPLIFT[S.comm_type] || 1)\n             * (S.comm_condition === \"Existing\" ? COMM_EXISTING_UPLIFT : 1)\n             * commTaper(ca);\n      lo = cp[0] * ca * up; hi = cp[1] * ca * up;\n      split = SPLIT_COMM;\n      note = \"Includes an allowance for design fees, BCA and SCDF permits, project management and contingency.\";\n      if (S.comm_type === \"F&B\" || S.comm_type === \"Clinic\") {\n        note = \"F&B and medical fit-outs carry heavy M&E, ventilation and compliance requirements \\u2014 we'd recommend a site visit before you budget firmly.\";\n      } else if (S.comm_type === \"Retail\") {\n        note = \"Mall units add landlord design-manual compliance, protection works and night-work windows on top of the fit-out itself.\";\n      }\n    } else {\n      return null;\n    }\n\n    lo = Math.max(round1k(lo), MIN_FLOOR);\n    hi = Math.max(round1k(hi), lo + 1000);\n    return { lo: lo, hi: hi, note: note, split: split, aa: aa };\n  }\n\n  function isResaleOnly() {\n    return S.property_type === \"HDB\" && HDB_RESALE_ONLY.indexOf(S.hdb_type) > -1;\n  }\n\n  \/\/ Human-readable summary of exactly what the figure was calculated from\n  var LABELS = {\n    \"2-room\": \"2-room Flexi\", \"3Gen\": \"3-Gen\", \"EA\": \"Executive Apartment\",\n    \"Studio\/1\": \"Studio \/ 1-bed\", \"2\": \"2-bed\", \"3\": \"3-bed\", \"4+\": \"4-bed+\",\n    \"Cluster\": \"Cluster \/ strata\", \"GCB\": \"Good Class Bungalow\",\n    \"Industrial\": \"Industrial\", \"Childcare\": \"Childcare \/ education\", \"Wellness\": \"Gym \/ beauty\",\n    \"A&A\": \"A&A \/ rebuild\", \"Interior\": \"Interior renovation\",\n    \"Bare\": \"Bare unit\", \"Existing\": \"Existing fit-out\", \"EC\": \"EC\"\n  };\n  function lbl(v) { return LABELS[v] || v; }\n\n  function configSummary() {\n    var bits = [];\n    var sub = S.hdb_type || S.condo_beds || S.landed_type || S.comm_type;\n    if (sub) bits.push(lbl(sub));\n    if (S.property_type === \"Condo\" && S.condo_class === \"EC\") bits.push(\"EC\");\n    if (S.property_type === \"HDB\" || S.property_type === \"Condo\") {\n      bits.push(isResaleOnly() ? \"resale\" : (S.tenure || \"\").toLowerCase());\n    }\n    if (S.landed_scope) bits.push(lbl(S.landed_scope));\n    if (S.comm_condition) bits.push(lbl(S.comm_condition));\n    var a = Math.round(sqft());\n    if (a && (S.property_type === \"Condo\" || S.property_type === \"Commercial\" || S.landed_type === \"Shophouse\")) {\n      bits.push(a.toLocaleString(\"en-SG\") + \" sq ft\");\n    }\n    if (S.spec_level) bits.push(S.spec_level.toLowerCase() + \" spec\");\n    return bits.filter(Boolean).join(\"  \\u00b7  \");\n  }\n\n  \/\/ Thresholds re-tuned July 2026 to the rebased bands: an ID-led 4-room BTO\n  \/\/ now lands mid-50s and should still route as a real lead, not a nurture.\n  function leadTier(e) {\n    if (!e) return \"Nurture\";\n    if (e.consult) return \"Hot\";\n    if (S.landed_type === \"GCB\" || S.landed_type === \"Shophouse\") return \"Hot\";\n    var mid = (e.lo + e.hi) \/ 2;\n    if (e.aa || S.comm_type === \"F&B\" || S.comm_type === \"Clinic\" || mid >= 120000) return \"Hot\";\n    if (mid >= 50000) return \"Warm\";\n    return \"Nurture\";\n  }\n\n  \/* ============================================================\n     RENDERING\n     ============================================================ *\/\n  function paintResult() {\n    var e = estimate();\n    if (!e) return;\n    var cfg = $(\"[data-result-config]\");\n    var band = $(\".za-band\");\n\n    if (e.consult) {\n      $(\"[data-result-range]\").textContent = \"By consultation\";\n      $(\"[data-result-eyebrow]\").textContent = \"Scoped individually\";\n      $(\"[data-result-note]\").textContent = e.note;\n      if (cfg) cfg.textContent = configSummary();\n      if (band) band.style.display = \"none\";\n      return;\n    }\n    if (band) band.style.display = \"\";\n\n    $(\"[data-result-range]\").textContent = money(e.lo) + \" \\u2013 \" + money(e.hi);\n    $(\"[data-result-note]\").textContent = e.note;\n    $(\"[data-result-eyebrow]\").textContent = e.aa\n      ? \"Indicative construction cost\"\n      : \"Indicative renovation cost\";\n    if (cfg) cfg.textContent = configSummary();\n\n    var axis = e.hi * 1.2;\n    var pLo = e.lo \/ axis * 100, pHi = e.hi \/ axis * 100;\n    var fill = $(\"[data-band-fill]\");\n    fill.style.left = pLo + \"%\";\n    fill.style.width = (pHi - pLo) + \"%\";\n\n    var lo = $(\"[data-band-lo]\"), hi = $(\"[data-band-hi]\");\n    lo.textContent = moneyShort(e.lo);\n    hi.textContent = moneyShort(e.hi);\n    lo.style.left = Math.max(6, pLo) + \"%\";\n    hi.style.left = Math.min(94, pHi) + \"%\";\n  }\n\n  function paintBreakdown() {\n    var e = estimate();\n    if (!e) return;\n    var ul = $(\"[data-breakdown]\");\n    if (e.consult) {\n      $(\"[data-final-range]\").textContent = \"By consultation\";\n      ul.innerHTML = \"<li><span>\" + e.note + \"<\/span><\/li>\";\n      return;\n    }\n    $(\"[data-final-range]\").textContent = money(e.lo) + \" \\u2013 \" + money(e.hi);\n    if (e.aa) {\n      ul.innerHTML = \"<li><span>A&amp;A and rebuild projects are scoped individually.<\/span>\"\n        + \"<b>By consultation<\/b><\/li>\";\n      return;\n    }\n    ul.innerHTML = e.split.map(function (row) {\n      var a = round1k(e.lo * row[1] \/ 100), b = round1k(e.hi * row[1] \/ 100);\n      return \"<li><span>\" + row[0] + \"<\/span><b>\" + money(a) + \" \\u2013 \" + money(b) + \"<\/b><\/li>\";\n    }).join(\"\");\n  }\n\n  function refreshConditionals() {\n    $$(\"[data-show-when]\").forEach(function (el) {\n      var parts = el.getAttribute(\"data-show-when\").split(\"=\");\n      var vals = parts[1].split(\"|\");\n      el.hidden = vals.indexOf(S[parts[0]]) === -1;\n    });\n    \/\/ Resale-only HDB stock: skip the tenure question entirely\n    var tenureBlock = $('[data-block=\"tenure\"]');\n    if (tenureBlock && isResaleOnly()) { tenureBlock.hidden = true; S.tenure = \"Resale\"; }\n\n    \/\/ Size is required wherever we price per square foot. Consultation-only\n    \/\/ commercial types don't need it \u2014 nothing is calculated from it.\n    var needsSize = S.property_type === \"Condo\"\n                    || (S.property_type === \"Commercial\" && COMM_CONSULT.indexOf(S.comm_type) === -1)\n                    || S.landed_type === \"Shophouse\";\n    var opt = $(\"[data-size-opt]\");\n    if (opt) opt.hidden = needsSize;\n    var hint = $(\"[data-size-hint]\");\n    if (hint) {\n      hint.textContent = needsSize\n        ? \"We price this space type per square foot, so the size matters.\"\n        : \"Optional, but it sharpens the estimate. Leave blank and we'll assume a typical size for your property.\";\n    }\n  }\n\n  function goto(n) {\n    $$(\".za-screen\").forEach(function (s) {\n      s.hidden = Number(s.getAttribute(\"data-screen\")) !== n;\n    });\n    $$(\".za-step\").forEach(function (s) {\n      var i = Number(s.getAttribute(\"data-step\"));\n      s.classList.toggle(\"is-active\", i === n);\n      s.classList.toggle(\"is-done\", i < n);\n    });\n    current = n;\n    if (n === 3) paintResult();\n    if (n === 4) paintBreakdown();\n    try {\n      var top = root.getBoundingClientRect().top + window.pageYOffset - 80;\n      window.scrollTo({ top: top, behavior: \"smooth\" });\n    } catch (err) { \/* older browsers *\/ }\n  }\n\n  function showErr(screen, msg) {\n    var el = $('[data-screen=\"' + screen + '\"] [data-err]');\n    if (!el) return;\n    el.textContent = msg || \"\";\n    el.hidden = !msg;\n  }\n\n  \/* ============================================================\n     VALIDATION\n     ============================================================ *\/\n  function validate1() {\n    if (!S.property_type) return \"Please choose what you're renovating.\";\n    var t = S.property_type;\n    if (t === \"HDB\" && !S.hdb_type) return \"Please choose your flat type.\";\n    if (t === \"Condo\" && !S.condo_beds) return \"Please choose the number of bedrooms.\";\n    if (t === \"Condo\" && !S.condo_class) return \"Please tell us if it's a private condo or an EC.\";\n    if (t === \"Landed\" && !S.landed_type) return \"Please choose your house type.\";\n    if (t === \"Commercial\" && !S.comm_type) return \"Please choose the type of space.\";\n    if ((t === \"HDB\" || t === \"Condo\") && !S.tenure && !isResaleOnly()) return \"Please tell us if it's a new or resale unit.\";\n    if (t === \"Landed\" && !S.landed_scope) return \"Please choose the scope of works.\";\n    if (t === \"Commercial\" && !S.comm_condition) return \"Please tell us the condition of the unit.\";\n    var needsSize = t === \"Condo\"\n                    || (t === \"Commercial\" && COMM_CONSULT.indexOf(S.comm_type) === -1)\n                    || S.landed_type === \"Shophouse\";\n    if (needsSize && !(parseFloat(S.size_value) > 0)) {\n      return \"Please enter the size of the space \\u2014 we price this property type per square foot.\";\n    }\n    return null;\n  }\n\n  function validate3() {\n    var bad = [];\n    var name = $(\"#za-name\").value.trim();\n    var email = $(\"#za-email\").value.trim();\n    var phone = $(\"#za-phone\").value.replace(\/\\D\/g, \"\");\n    if (!name) bad.push(\"#za-name\");\n    if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(email)) bad.push(\"#za-email\");\n    if (phone.length < 8) bad.push(\"#za-phone\");\n    $$(\".za-input\").forEach(function (i) { i.classList.remove(\"is-bad\"); });\n    bad.forEach(function (sel) { $(sel).classList.add(\"is-bad\"); });\n    if (bad.length) return \"Please check your name, email and mobile number.\";\n    if (!$(\"#za-pdpa\").checked) return \"Please tick the consent box so we can get back to you.\";\n    return null;\n  }\n\n  \/* ============================================================\n     TRACKING IDENTIFIERS (captured on load, sent with the lead)\n     ============================================================ *\/\n  function cookie(n) {\n    var m = document.cookie.match(\"(^|;)\\\\s*\" + n + \"\\\\s*=\\\\s*([^;]+)\");\n    return m ? m.pop() : \"\";\n  }\n  function param(n) {\n    try { return new URLSearchParams(location.search).get(n) || \"\"; } catch (e) { return \"\"; }\n  }\n  function uuid() {\n    if (window.crypto && crypto.randomUUID) return crypto.randomUUID();\n    return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(\/[xy]\/g, function (c) {\n      var r = Math.random() * 16 | 0, v = c === \"x\" ? r : (r & 0x3 | 0x8);\n      return v.toString(16);\n    });\n  }\n\n  var fbclid = param(\"fbclid\");\n  var TRACK = {\n    fbp: cookie(\"_fbp\"),\n    fbc: cookie(\"_fbc\") || (fbclid ? \"fb.1.\" + Date.now() + \".\" + fbclid : \"\"),\n    fbclid: fbclid,\n    gclid: param(\"gclid\"),\n    utm_source: param(\"utm_source\"),\n    utm_medium: param(\"utm_medium\"),\n    utm_campaign: param(\"utm_campaign\"),\n    utm_term: param(\"utm_term\"),\n    utm_content: param(\"utm_content\"),\n    page_url: location.href,\n    referrer: document.referrer || \"\",\n    event_id: uuid()\n  };\n\n  \/* ============================================================\n     SUBMIT\n     ============================================================ *\/\n  var LOADED_AT = Date.now();\n\n  function submit(btn) {\n    \/\/ Honeypot: bots fill this hidden field, people never see it.\n    if ($(\"#za-hp\").value) { goto(4); return; }\n\n    var err = validate3();\n    if (err) { showErr(3, err); return; }\n    showErr(3, \"\");\n\n    var e = estimate();\n    var payload = {\n      name: $(\"#za-name\").value.trim(),\n      email: $(\"#za-email\").value.trim().toLowerCase(),\n      phone: $(\"#za-phone\").value.trim(),\n      message: $(\"#za-msg\").value.trim(),\n\n      property_type: S.property_type || \"\",\n      sub_type: S.hdb_type || S.condo_beds || S.landed_type || S.comm_type || \"\",\n      tenure: S.tenure || S.landed_scope || S.comm_condition || \"\",\n      condo_class: S.condo_class || \"\",\n      spec_level: S.spec_level || \"\",\n      config_summary: configSummary(),\n      size_value: S.size_value || \"\",\n      size_unit: S.size_unit || \"\",\n      size_sqft: Math.round(sqft()) || \"\",\n\n      estimate_min: (e && !e.consult) ? e.lo : \"\",\n      estimate_max: (e && !e.consult) ? e.hi : \"\",\n      estimate_mid: (e && !e.consult) ? Math.round((e.lo + e.hi) \/ 2) : \"\",\n      consultation_only: (e && e.consult) ? \"yes\" : \"\",\n      currency: \"SGD\",\n      lead_tier: leadTier(e),\n      source: \"renovation_calculator\",\n      pricing_version: \"2026-07\",\n      spam_flag: (Date.now() - LOADED_AT < 5000) ? \"fast_submit\" : \"\",\n      submitted_at: new Date().toISOString()\n    };\n    Object.keys(TRACK).forEach(function (k) { payload[k] = TRACK[k]; });\n\n    btn.disabled = true;\n    btn.textContent = \"Sending\\u2026\";\n\n    var body = Object.keys(payload).map(function (k) {\n      return encodeURIComponent(k) + \"=\" + encodeURIComponent(payload[k]);\n    }).join(\"&\");\n\n    function done() {\n      if (CFG.REDIRECT_ON_SUBMIT && CFG.THANK_YOU_URL) {\n        var q = \"eid=\" + encodeURIComponent(TRACK.event_id)\n              + \"&type=\" + encodeURIComponent(payload.property_type)\n              + \"&sub=\" + encodeURIComponent(payload.sub_type)\n              + \"&tenure=\" + encodeURIComponent(payload.tenure)\n              + \"&spec=\" + encodeURIComponent(payload.spec_level)\n              + \"&min=\" + payload.estimate_min\n              + \"&max=\" + payload.estimate_max\n              + \"&cfg=\" + encodeURIComponent(payload.config_summary)\n              + \"&tier=\" + encodeURIComponent(payload.lead_tier);\n        window.location.href = CFG.THANK_YOU_URL\n          + (CFG.THANK_YOU_URL.indexOf(\"?\") > -1 ? \"&\" : \"?\") + q;\n      } else {\n        goto(4);\n      }\n    }\n\n    if (!CFG.WEBHOOK_URL || CFG.WEBHOOK_URL.indexOf(\"PASTE_\") === 0) {\n      console.warn(\"[Zenith Arc calculator] No webhook URL set. Lead payload:\", payload);\n      done();\n      return;\n    }\n\n    var t = setTimeout(done, 4000); \/\/ never trap the visitor if the network stalls\n    fetch(CFG.WEBHOOK_URL, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/x-www-form-urlencoded\" },\n      body: body,\n      keepalive: true\n    }).then(function () { clearTimeout(t); done(); })\n      .catch(function () { clearTimeout(t); done(); });\n  }\n\n  \/* ============================================================\n     WIRING\n     ============================================================ *\/\n  $$(\"[data-field]\").forEach(function (group) {\n    var field = group.getAttribute(\"data-field\");\n    group.addEventListener(\"click\", function (ev) {\n      var card = ev.target.closest(\"[role='radio']\");\n      if (!card || !group.contains(card)) return;\n      $$(\"[role='radio']\", group).forEach(function (c) {\n        c.setAttribute(\"aria-checked\", \"false\");\n        c.classList.remove(\"is-on\");\n      });\n      card.setAttribute(\"aria-checked\", \"true\");\n      if (card.classList.contains(\"za-unit-btn\")) card.classList.add(\"is-on\");\n\n      S[field] = card.getAttribute(\"data-value\");\n\n      \/\/ Changing property type invalidates the dependent answers\n      if (field === \"property_type\") {\n        [\"hdb_type\", \"condo_beds\", \"condo_class\", \"landed_type\", \"comm_type\", \"tenure\", \"landed_scope\", \"comm_condition\"]\n          .forEach(function (k) { delete S[k]; });\n        $$(\"[data-show-when] [role='radio']\").forEach(function (c) { c.setAttribute(\"aria-checked\", \"false\"); });\n      }\n      if (field === \"hdb_type\" && isResaleOnly()) { S.tenure = \"Resale\"; }\n      refreshConditionals();\n      showErr(current, \"\");\n    });\n  });\n\n  $(\"#za-size\").addEventListener(\"input\", function () {\n    S.size_value = this.value;\n    showErr(1, \"\");\n  });\n\n  $$(\"[data-next]\").forEach(function (b) {\n    b.addEventListener(\"click\", function () {\n      var to = Number(b.getAttribute(\"data-next\"));\n      if (to === 2) {\n        var e1 = validate1();\n        if (e1) { showErr(1, e1); return; }\n        showErr(1, \"\");\n      }\n      if (to === 3) {\n        if (!S.spec_level) { showErr(2, \"Please choose a renovation level.\"); return; }\n        showErr(2, \"\");\n      }\n      goto(to);\n    });\n  });\n\n  $$(\"[data-back]\").forEach(function (b) {\n    b.addEventListener(\"click\", function () { goto(Number(b.getAttribute(\"data-back\"))); });\n  });\n\n  $(\"[data-submit]\").addEventListener(\"click\", function () { submit(this); });\n\n  refreshConditionals();\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-877d813 elementor-widget elementor-widget-html\" data-id=\"877d813\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n.za-copy{max-width:100%;overflow-wrap:break-word;}\n.za-copy .za-tw{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:1.5em 0;}\n.za-copy table{width:100%;border-collapse:collapse;font-size:.95em;}\n.za-copy th,.za-copy td{text-align:left;padding:.7em .8em;vertical-align:top;\n  border-bottom:1px solid rgba(128,128,128,.25);}\n.za-copy th{font-weight:600;}\n.za-copy td+td,.za-copy th+th{text-align:right;}\n.za-copy caption{caption-side:bottom;text-align:left;font-size:.82em;opacity:.72;padding-top:.6em;}\n.za-copy ul{margin:1em 0;padding-left:1.25em;}\n.za-copy li{margin-bottom:.5em;}\n@media (max-width:600px){\n  .za-copy table{font-size:.84em;}\n  .za-copy th,.za-copy td{padding:.5em .4em;}\n}\n<\/style>\n\n<!-- ################ SECTION 1  THE SHORT ANSWER ################ -->\n<section class=\"za-copy\">\n  <h2>How much does renovation cost in Singapore in 2026?<\/h2>\n\n  <p>Most homeowners spend between S$44,000 and S$99,000 renovating an HDB flat in 2026. A new four-room BTO typically costs S$44,000 to S$62,000, while the same flat bought resale runs S$62,000 to S$82,000. Condominiums are priced per square foot &mdash; roughly S$42 to S$62 for a new unit, S$75 to S$110 for resale. Landed interiors start around S$120,000.<\/p>\n\n  <p>Two things move that number more than anything else: whether the property is new or resale, and how much of the budget goes to carpentry.<\/p>\n\n  <div class=\"za-tw\">\n    <table>\n      <thead><tr><th>Property type<\/th><th>New \/ BTO<\/th><th>Resale<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td>3-room HDB<\/td><td>S$36,000 &ndash; S$53,000<\/td><td>S$48,000 &ndash; S$68,000<\/td><\/tr>\n        <tr><td>4-room HDB<\/td><td>S$44,000 &ndash; S$62,000<\/td><td>S$62,000 &ndash; S$82,000<\/td><\/tr>\n        <tr><td>5-room HDB<\/td><td>S$52,000 &ndash; S$77,000<\/td><td>S$72,000 &ndash; S$99,000<\/td><\/tr>\n        <tr><td>Executive, maisonette, jumbo<\/td><td>Resale stock only<\/td><td>S$84,000 &ndash; S$156,000<\/td><\/tr>\n        <tr><td>Condominium<\/td><td>S$42 &ndash; S$62 psf<\/td><td>S$75 &ndash; S$110 psf<\/td><\/tr>\n        <tr><td>Landed (interior)<\/td><td colspan=\"2\">From S$120,000<\/td><\/tr>\n        <tr><td>Commercial<\/td><td colspan=\"2\">S$90 &ndash; S$380 psf by use<\/td><\/tr>\n      <\/tbody>\n      <caption>Indicative ranges at standard specification, Singapore, 2026.<\/caption>\n    <\/table>\n  <\/div>\n\n  <p>These are indicative ranges for a standard renovation &mdash; full carpentry, new kitchen, new bathrooms. They reflect 2026 Singapore market benchmarks and are consistent with what we see <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/projects\/\">across our own completed projects<\/a>. A light refresh sits below them; designer-led work with bespoke joinery sits above. Use the calculator above for a figure matched to your property.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 2  HDB ################ -->\n<section class=\"za-copy\">\n  <h2>HDB renovation cost by flat type<\/h2>\n\n  <p>HDB flats account for roughly eight in ten homes in Singapore, and they are where renovation costs are most predictable &mdash; the layouts are standardised, the sizes are known, and the work is largely the same from unit to unit.<\/p>\n\n  <p>The single largest variable is tenure. A resale flat costs 25% to 40% more to renovate than the equivalent BTO, and the reason is not that the design is more ambitious. It is that you are paying to undo someone else's renovation before you begin your own. It is also the largest budget surprise for <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/condo-to-hdb-renovation-singapore\/\">buyers moving from private property into an HDB resale flat<\/a>, who tend to budget against a condominium handover standard rather than a two-decade-old unit.<\/p>\n\n  <p>In a BTO, the walls are bare and square, the wiring is new, and the bathrooms have an intact waterproofing membrane. In a resale flat, the old carpentry has to come out, the tiles come off, the wiring is often two decades old and no longer sized for the number of appliances a modern household runs, and once the bathroom tiles are hacked the waterproofing has to be reinstated and pass a water ponding test before tiling can start. Hacking and demolition alone typically rise from around 5% of a BTO budget to 8% of a resale one, and every trade downstream is affected by what the hacking uncovers.<\/p>\n\n  <p>The three-day rule bites harder on resale, too. HDB confines noisy works &mdash; hacking, drilling, demolition &mdash; to weekday daytime hours and requires them to be finished within three consecutive days, regardless of how much there is to remove. A BTO has almost nothing to clear. A resale flat may have two decades of carpentry, tiling and floor finishes to strip out against the same three-day clock, which means a larger demolition crew and more disposal runs rather than a longer schedule. Overall, both aim for a twelve-week programme, with resale more often running past it than under it.<\/p>\n\n  <div class=\"za-tw\">\n    <table>\n      <thead><tr><th>Flat type<\/th><th>New \/ BTO<\/th><th>Resale<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td>2-room Flexi<\/td><td>S$18,000 &ndash; S$32,000<\/td><td>S$28,000 &ndash; S$42,000<\/td><\/tr>\n        <tr><td>3-room<\/td><td>S$36,000 &ndash; S$53,000<\/td><td>S$48,000 &ndash; S$68,000<\/td><\/tr>\n        <tr><td>4-room<\/td><td>S$44,000 &ndash; S$62,000<\/td><td>S$62,000 &ndash; S$82,000<\/td><\/tr>\n        <tr><td>5-room<\/td><td>S$52,000 &ndash; S$77,000<\/td><td>S$72,000 &ndash; S$99,000<\/td><\/tr>\n        <tr><td>3-Gen<\/td><td>S$73,000 &ndash; S$104,000<\/td><td>S$83,000 &ndash; S$115,000<\/td><\/tr>\n        <tr><td>Executive Apartment<\/td><td>&mdash;<\/td><td>S$84,000 &ndash; S$118,000<\/td><\/tr>\n        <tr><td>Executive Maisonette<\/td><td>&mdash;<\/td><td>S$91,000 &ndash; S$135,000<\/td><\/tr>\n        <tr><td>Jumbo<\/td><td>&mdash;<\/td><td>S$101,000 &ndash; S$156,000<\/td><\/tr>\n      <\/tbody>\n      <caption>Standard specification. Light refresh sits below these bands, designer-led work above.<\/caption>\n    <\/table>\n  <\/div>\n\n  <p>Executive apartments, maisonettes and jumbo flats exist only as resale stock &mdash; HDB no longer builds them &mdash; so there is no BTO column for those. Maisonettes carry a further premium beyond their floor area, because two storeys means an internal staircase, additional wet areas, and considerably longer electrical and plumbing runs. Scope and inclusions by flat type are set out on our <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/hdb-renovation-singapore\/\">HDB renovation service<\/a> page, with package-level pricing for the <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/hdb-3-room-package\/\">3-room<\/a>, <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/hdb-4-room-package\/\">4-room<\/a> and <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/hdb-5-room-package\/\">5-room renovation packages<\/a>.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 3  CONDO ################ -->\n<section class=\"za-copy\">\n  <h2>Condominium renovation cost<\/h2>\n\n  <p>Condominiums are priced per square foot rather than by unit type, because floor area varies enormously for the same bedroom count &mdash; a three-bedroom unit can be 900 square feet or 1,600. We quote condominium work on the same basis &mdash; see our <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/condo-renovation-singapore\/\">condominium renovation service<\/a> for what a full scope covers.<\/p>\n\n  <div class=\"za-tw\">\n    <table>\n      <thead><tr><th>Specification<\/th><th>New launch<\/th><th>Resale<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td>Light refresh<\/td><td>S$28 &ndash; S$45 psf<\/td><td>S$52 &ndash; S$78 psf<\/td><\/tr>\n        <tr><td>Standard<\/td><td>S$42 &ndash; S$62 psf<\/td><td>S$75 &ndash; S$110 psf<\/td><\/tr>\n        <tr><td>Premium<\/td><td>S$68 &ndash; S$105 psf<\/td><td>S$120 &ndash; S$185 psf<\/td><\/tr>\n      <\/tbody>\n      <caption>Larger units attract a lower rate per square foot. Executive condominiums price the same as private units.<\/caption>\n    <\/table>\n  <\/div>\n\n  <p>The gap between new and resale is far wider here than it is in HDB flats, and for a straightforward reason: a developer hands over a new condominium with flooring laid, kitchen carcasses installed, wardrobes fitted, sanitary ware in place and often air-conditioning already running. Renovating a new unit is mostly additive &mdash; extra carpentry, a feature wall, upgrading finishes you don't like. Renovating a resale unit means removing all of that first, then building again. You are paying twice for the same square footage. What a fixed <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/condominium-renovation\/\">condo renovation package<\/a> includes &mdash; and what comes back later as a variation &mdash; is set out separately.<\/p>\n\n  <h3>What the MCST controls, and what it costs you<\/h3>\n\n  <p>Strata-titled properties require written approval from the MCST before works begin, and where structural works are involved that approval must be in hand before a BCA submission can even be made &mdash; it is sequential, not parallel.<\/p>\n\n  <p>Most estates hold a refundable deposit against damage to common property &mdash; commonly S$1,000 to S$3,000, though larger scopes can run to S$10,000, with a separate non-refundable administration fee of roughly S$200 to S$500 on top. It is released after a joint inspection confirms no damage and that debris has been cleared, so treat it as cash tied up for the full length of the project rather than a fee.<\/p>\n\n  <p>Working hours are tighter than HDB's and they are a permit condition, not a courtesy. The common pattern is 9am to 5pm on weekdays and 9am to 1pm on Saturdays, with nothing on Sundays or public holidays, and most estates impose a lunchtime quiet period as well. Every development sets its own by-laws under the Building Maintenance and Strata Management Act, so there is no universal condo rulebook &mdash; the figures above are the shape, not the rule. Approval itself typically takes five to ten working days, but a submission that needs revision adds two to three weeks per cycle, which is why incomplete drawings are the most expensive corner anyone cuts on a condo project.<\/p>\n\n  <p>Then there is access. Materials go up a booked service lift on a schedule, common corridors and lift lobbies must be protected, and debris usually has to leave the site daily because skips are rarely permitted on the grounds. None of this changes the specification. All of it consumes labour hours, and labour hours are what you are actually buying.<\/p>\n\n  <p>One more thing worth knowing: relocating a bathroom or kitchen is often restricted, because the waterproofing liability runs downwards to the unit below.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 4  LANDED ################ -->\n<section class=\"za-copy\">\n  <h2>Landed property renovation cost<\/h2>\n\n  <p>\"Landed renovation\" covers two projects that share almost nothing. An <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/landed-interior-design-singapore\/\">interior renovation<\/a> leaves the structure alone and behaves like a very large condominium job. An <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/additional-alteration-reconstruction-works\/\">A&amp;A or reconstruction<\/a> touches the structure, the building envelope or the gross floor area &mdash; and costs roughly ten times more.<\/p>\n\n  <div class=\"za-tw\">\n    <table>\n      <thead><tr><th>House type<\/th><th>Interior renovation<\/th><th>A&amp;A or reconstruction<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td>Terrace<\/td><td>S$120,000 &ndash; S$200,000<\/td><td>S$450,000 &ndash; S$1.3m<\/td><\/tr>\n        <tr><td>Semi-detached<\/td><td>S$180,000 &ndash; S$350,000<\/td><td>S$900,000 &ndash; S$3m<\/td><\/tr>\n        <tr><td>Cluster \/ strata landed<\/td><td>S$130,000 &ndash; S$240,000<\/td><td>By consultation<\/td><\/tr>\n        <tr><td>Bungalow<\/td><td>S$350,000 &ndash; S$650,000<\/td><td>S$1.5m &ndash; S$5m<\/td><\/tr>\n        <tr><td>Good Class Bungalow<\/td><td>S$680,000 &ndash; S$1.7m<\/td><td>By consultation<\/td><\/tr>\n        <tr><td>Conservation shophouse<\/td><td>S$300 &ndash; S$500 psf<\/td><td>By consultation<\/td><\/tr>\n      <\/tbody>\n      <caption>Interior figures at standard specification. A&amp;A bands are indicative construction cost only.<\/caption>\n    <\/table>\n  <\/div>\n\n  <p>The moment a project crosses into the second category, the regulatory path becomes the schedule. Building plans must be submitted to BCA through a Qualified Person &mdash; a registered architect or professional engineer holding a valid practising certificate &mdash; and that QP must obtain written permission from URA before applying for building plan approval. The two approvals run in sequence, not alongside each other.<\/p>\n\n  <p>Realistically: URA written permission takes six to eight weeks for a straightforward landed submission, longer for conservation properties or Good Class Bungalows. BCA's first plan-check response takes fourteen to twenty-eight working days, and roughly 60% of submissions receive a rejection letter on the first round, with each further round adding another fourteen to twenty-eight working days. Most landed schemes clear in two to three rounds. From planning submission to Permit to Commence Building Works, twelve to twenty weeks is normal, and conservation or GCB projects routinely exceed twenty.<\/p>\n\n  <p>That window is the cost item nobody budgets. You may be servicing a loan on an empty house, or renting elsewhere, for four or five months before a single wall comes down &mdash; and it rarely appears anywhere in a renovation quotation.<\/p>\n\n  <p>One distinction worth settling before you fall in love with a design: URA and BCA do not assess proposals as \"minor\" or \"major\". They assess thresholds &mdash; approved gross floor area, the extent of wall replacement, structural reconstruction, site controls and conservation status. A scheme that feels like an ambitious renovation can cross into reconstruction in substance, which changes both the approval route and the entire cost base.<\/p>\n\n  <p>The appointment sits with you, not with your contractor. The QP carries personal statutory liability for what is submitted, which is why the Building Control Act puts the responsibility on the owner &mdash; the submission has to be made in your name. Zenith Arc works alongside your QP throughout: coordinating drawings, aligning the design with what URA and BCA will accept, and sequencing the submission so site works start the week the permit lands rather than a month after it. That coordination is part of our <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/landed-house-renovation-singapore\/\">landed house renovation and rebuild service<\/a>.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 5  COMMERCIAL ################ -->\n<section class=\"za-copy\">\n  <h2>Commercial fit-out cost<\/h2>\n\n  <div class=\"za-tw\">\n    <table>\n      <thead><tr><th>Space type<\/th><th>Light<\/th><th>Standard<\/th><th>Premium<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td>Office<\/td><td>S$50 &ndash; S$90<\/td><td>S$90 &ndash; S$160<\/td><td>S$160 &ndash; S$280<\/td><\/tr>\n        <tr><td>Retail<\/td><td>S$100 &ndash; S$150<\/td><td>S$150 &ndash; S$250<\/td><td>S$240 &ndash; S$360<\/td><\/tr>\n        <tr><td>F&amp;B<\/td><td>S$150 &ndash; S$240<\/td><td>S$240 &ndash; S$380<\/td><td>S$380 &ndash; S$560<\/td><\/tr>\n        <tr><td>Clinic<\/td><td>S$150 &ndash; S$220<\/td><td>S$220 &ndash; S$350<\/td><td>S$360 &ndash; S$600<\/td><\/tr>\n        <tr><td>Industrial, childcare, gym &amp; beauty<\/td><td colspan=\"3\">Scoped individually<\/td><\/tr>\n      <\/tbody>\n      <caption>Per square foot. Office figures carry a further allowance for design fees, permits and project management. Existing fit-outs needing strip-out add roughly 8%.<\/caption>\n    <\/table>\n  <\/div>\n\n  <p>The spread across use types is wider than any other property category, because the phrase covers very different buildings. An office is partitions, ceiling, power and data. An F&amp;B unit is grease traps, exhaust ductwork, gas, floor waterproofing and a kitchen that costs more per square foot than the dining room it serves. We have delivered <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/commercial-interior-design-singapore\/\">commercial interior design and fit-out work<\/a> across office, retail and F&amp;B units in Singapore.<\/p>\n\n  <h3>Three approvals that decide the programme<\/h3>\n\n  <p><strong>Landlord or MCST consent<\/strong> comes first, before any authority submission. Expect house rules, a fit-out deposit, insurance requirements and &mdash; in most managed buildings &mdash; a list of nominated contractors you must use for M&amp;E work, whether or not they are competitive.<\/p>\n\n  <p><strong>SCDF<\/strong> is triggered by more than people expect. Even minor fit-out works can require submission if they affect means of escape, fire compartmentation or fire protection systems. Adding a partition to an existing office may go through a Minor Addition and Alteration route, but a change of use &mdash; or partitioning works for a restaurant &mdash; requires a full building plan submission and an inspection by an SCDF Registered Inspector. Budget two to four weeks for this on affected projects.<\/p>\n\n  <p><strong>URA change of use<\/strong> must be settled before anything else moves. BCA will not process a building plan that conflicts with the approved use classification. This is what catches tenants who sign a lease assuming an office can become a clinic, a showroom or a caf&eacute;.<\/p>\n\n  <h3>How long each use actually takes<\/h3>\n\n  <p>An F&amp;B outlet needs roughly 16 to 32 weeks once kitchen services, SFA licensing, exhaust, drainage and fire safety coordination are in play. A clinic runs 14 to 32 weeks under HCSA licensing. Childcare and preschool premises run 18 to 40 weeks. Industrial and warehouse sits at 9 to 26 weeks. These clocks start when the brief is genuinely settled &mdash; if the menu, the medical services or the room count are still moving, the programme has not started.<\/p>\n\n  <p>The F&amp;B sequence catches people hardest. SFA issues an In-Principle Approval, and only then may renovation proceed &mdash; and the documents required for that approval include URA's change of use. SFA also reviews the scaled kitchen layout as part of the licence, which means your kitchen plan is a licensing document before it is a design. PUB governs sanitary plumbing and grease traps, NEA covers kitchen exhaust and ventilation, and regulated electrical work must go through a Licensed Electrical Worker.<\/p>\n\n  <p>A one-month rent-free fitting period does not mean the unit can open in a month.<\/p>\n\n  <h3>The cost almost nobody prices<\/h3>\n\n  <p>Reinstatement typically runs S$8 to S$25 per square foot depending on how much has to come out &mdash; roughly 10% to 15% of what the original fit-out cost. Bare-shell handovers and technical premises run well above that.<\/p>\n\n  <p>But the per-square-foot framing is misleading, and it is worth understanding why. The price is driven by what was installed and by the landlord's reinstatement schedule for what must be removed &mdash; floor area is almost irrelevant. Two 3,000 square foot offices, one with drywall partitions and a basic ceiling, the other with floor-to-ceiling glass, raised access flooring and a server room, produce entirely different quotations.<\/p>\n\n  <p>The practical consequence: the more bespoke your fit-out, the larger the bill you are writing yourself for the end of the lease. That belongs in the conversation on day one, not year three.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 6  TRADE SPLIT ################ -->\n<section class=\"za-copy\">\n  <h2>Where the renovation budget actually goes<\/h2>\n\n  <div class=\"za-tw\">\n    <table>\n      <thead><tr><th>Trade<\/th><th>New \/ BTO<\/th><th>Resale<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td>Carpentry<\/td><td>38%<\/td><td>35%<\/td><\/tr>\n        <tr><td>Masonry, tiling &amp; flooring<\/td><td>22%<\/td><td>22%<\/td><\/tr>\n        <tr><td>Electrical &amp; lighting<\/td><td>10%<\/td><td>10%<\/td><\/tr>\n        <tr><td>Plumbing &amp; sanitary<\/td><td>7%<\/td><td>7%<\/td><\/tr>\n        <tr><td>Ceiling &amp; partition<\/td><td>7%<\/td><td>7%<\/td><\/tr>\n        <tr><td>Hacking &amp; demolition<\/td><td>5%<\/td><td>8%<\/td><\/tr>\n        <tr><td>Painting<\/td><td>5%<\/td><td>5%<\/td><\/tr>\n        <tr><td>Windows, doors &amp; grilles<\/td><td>4%<\/td><td>4%<\/td><\/tr>\n        <tr><td>Cleaning &amp; disposal<\/td><td>2%<\/td><td>2%<\/td><\/tr>\n      <\/tbody>\n      <caption>Typical allocation for a residential renovation, Singapore, 2026.<\/caption>\n    <\/table>\n  <\/div>\n\n  <p>Two lines account for roughly 60% of a residential renovation: carpentry at 35&ndash;38%, and masonry, tiling and flooring at 22%. Everything else &mdash; electrical, plumbing, ceiling, painting, doors, disposal &mdash; divides the remaining 40% between nine trades.<\/p>\n\n  <p>This matters because of where people look for savings. Most homeowners negotiate hardest on tile prices and paint brands, which together move perhaps 5% of the total. The carpentry run moves a third of it. A wall of full-height built-in wardrobes and a wall of freestanding ones can differ by five figures on a four-room flat, and no amount of tile negotiation closes that gap. Our cost guide goes further into <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/interior-cost-guide-singapore\/\">what designer-led work and premium finishes actually cost<\/a>, including carpentry priced per foot run.<\/p>\n\n  <p>Resale flats shift the balance slightly: hacking and demolition rises from 5% to 8%, and carpentry falls proportionally &mdash; not because there is less of it, but because the total is larger.<\/p>\n\n  <p>Commercial fit-outs invert the picture entirely. Mechanical and electrical leads at around 23%, with partitions and doors at 21% and ceiling and lighting at 16%. Carpentry, the dominant line in a home, drops to about 12%. If you are budgeting an office the same way you budgeted your flat, you will get it wrong.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 7  COST DRIVERS ################ -->\n<section class=\"za-copy\">\n  <h2>The five decisions that move your budget most<\/h2>\n\n  <h3>1. How much built-in carpentry<\/h3>\n  <p>The largest single line, and the most elastic. Full-height, wall-to-wall, custom internals sits at one end; a shorter run with standard internals and some freestanding furniture sits at the other.<\/p>\n\n  <h3>2. Whether you move walls<\/h3>\n  <p>Hacking is cheap. What follows is not &mdash; new partitions, relocated power and lighting points, a reworked ceiling, patching and repainting the affected rooms. One wall rarely stays one line item.<\/p>\n\n  <h3>3. Whether you move wet areas<\/h3>\n  <p>The most expensive thing you can do per square foot. Relocating a bathroom or kitchen means new drainage falls, fresh waterproofing, a water ponding test, and &mdash; in a condominium &mdash; a liability conversation with the unit below. If the budget is tight, this is the first thing to give up.<\/p>\n\n  <h3>4. Tile and stone selection<\/h3>\n  <p>Not just the material price. Large-format tiles cost more to lay because they need flatter substrates and more careful handling, and wastage rises with format. The laying cost can exceed the tile cost.<\/p>\n\n  <h3>5. Ceiling and lighting complexity<\/h3>\n  <p>Cove lighting, bulkheads and dropped ceilings are individually modest and collectively significant, and they touch three trades &mdash; carpentry, electrical and painting &mdash; every time you add one.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 8  EXCLUSIONS ################ -->\n<section class=\"za-copy\">\n  <h2>What this estimate does not include<\/h2>\n\n  <p>An indicative range covers construction. It does not cover:<\/p>\n\n  <ul>\n    <li><strong>Furniture, curtains and loose fittings<\/strong> &mdash; often 10&ndash;20% of the construction budget again<\/li>\n    <li><strong>Appliances and sanitary ware<\/strong> &mdash; frequently carried as a provisional sum, meaning the figure moves when you choose<\/li>\n    <li><strong>Design fees<\/strong>, where charged separately from the build<\/li>\n    <li><strong>QP and submission fees<\/strong> on landed and commercial projects<\/li>\n    <li><strong>MCST or HDB deposits<\/strong> &mdash; refundable, but tied up for the whole project<\/li>\n    <li><strong>Contingency<\/strong> &mdash; allow 10&ndash;15%, more on resale and landed, where what you find behind a wall changes the plan<\/li>\n    <li><strong>Living costs during works<\/strong> &mdash; rent elsewhere, storage, or the loan on an empty property<\/li>\n  <\/ul>\n\n  <p>A quotation that leaves these out is not cheaper than one that includes them. It is less complete, and the difference shows up later.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 9  FAQ ################ -->\n<section class=\"za-copy\">\n  <h2>Frequently asked questions<\/h2>\n\n  <h3>How much does it cost to renovate a four-room HDB flat?<\/h3>\n  <p>S$44,000 to S$62,000 for a BTO and S$62,000 to S$82,000 for a resale flat at standard specification in 2026. A light refresh sits below; designer-led work with bespoke joinery sits above.<\/p>\n\n  <h3>How long does a renovation take?<\/h3>\n  <p>Around twelve weeks is the working standard for both new and resale, though scope moves it in either direction. Resale flats more often run past twelve weeks than under, because there is more to remove before anything can be built.<\/p>\n\n  <h3>Why does a resale flat cost more than a BTO?<\/h3>\n  <p>You pay to undo the previous renovation before starting your own &mdash; hacking, rewiring, reinstating waterproofing and passing a water ponding test before tiling can begin.<\/p>\n\n  <h3>How much deposit should I pay?<\/h3>\n  <p>With a CaseTrust-accredited firm, the deposit is capped at 20% of the total contract value. That cap is one of the more concrete protections accreditation gives you.<\/p>\n\n  <h3>Can I use CPF to pay for renovation?<\/h3>\n  <p>No. CPF savings cannot be used for renovation costs. Most homeowners use cash or a bank renovation loan.<\/p>\n\n  <h3>Do I need a permit to renovate?<\/h3>\n  <p>For HDB flats, yes, for a wide range of works &mdash; and the contractor must be on HDB's registered directory. For condominiums, written MCST approval. For landed structural works, URA written permission and BCA building plan approval through a Qualified Person.<\/p>\n\n  <h3>Is renovation cost negotiable?<\/h3>\n  <p>The scope is. Ask what comes out of the quotation to reach a lower number, rather than asking for the same scope at a lower price &mdash; the second question tends to be answered with thinner materials you won't see until later.<\/p>\n\n  <h3>When should I start looking for a renovation firm?<\/h3>\n  <p>Once your keys are confirmed. For landed A&amp;A or commercial fit-outs, considerably earlier &mdash; approvals alone can run three to five months before site works begin.<\/p>\n<\/section>\n\n\n<!-- ################ SECTION 10  CTA ################ -->\n<section class=\"za-copy\">\n  <h2>Get a figure for your property<\/h2>\n\n  <p>The calculator above gives you an indicative range in under a minute. For a firm number, we survey the property, walk the scope with you and quote against what is actually there &mdash; no obligation, and no charge for the consultation.<\/p>\n\n  <p>CaseTrust accredited, BCA registered, HDB licensed. Over 10,000 projects completed across HDB, condominium, landed and commercial properties in Singapore. Read <a href=\"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/reviews\/\">what our clients say<\/a>.<\/p>\n\n  <p><small>Estimates on this page are indicative ranges based on 2026 Singapore renovation cost benchmarks, last reviewed July 2026, and are not a quotation. Final pricing depends on a site survey, scope and material selection.<\/small><\/p>\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-01c6b2f elementor-widget elementor-widget-html\" data-id=\"01c6b2f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@graph\": [\n    {\n      \"@type\": \"WebApplication\",\n      \"@id\": \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/renovation-cost-singapore\/#calculator\",\n      \"name\": \"Zenith Arc Renovation Cost Calculator\",\n      \"url\": \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/renovation-cost-singapore\/\",\n      \"applicationCategory\": \"BusinessApplication\",\n      \"operatingSystem\": \"Any\",\n      \"browserRequirements\": \"Requires JavaScript\",\n      \"description\": \"Estimate renovation costs in Singapore for HDB, condominium, landed and commercial properties using 2026 market benchmarks.\",\n      \"isAccessibleForFree\": true,\n      \"offers\": {\n        \"@type\": \"Offer\",\n        \"price\": \"0\",\n        \"priceCurrency\": \"SGD\"\n      },\n      \"publisher\": {\n        \"@id\": \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/#organization\"\n      },\n      \"isPartOf\": {\n        \"@id\": \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/renovation-cost-singapore\/#webpage\"\n      }\n    },\n    {\n      \"@type\": \"FAQPage\",\n      \"@id\": \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/renovation-cost-singapore\/#faq\",\n      \"url\": \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/renovation-cost-singapore\/\",\n      \"isPartOf\": {\n        \"@id\": \"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/renovation-cost-singapore\/#webpage\"\n      },\n      \"mainEntity\": [\n        {\n          \"@type\": \"Question\",\n          \"name\": \"How much does it cost to renovate a four-room HDB flat?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"S$44,000 to S$62,000 for a BTO and S$62,000 to S$82,000 for a resale flat at standard specification in 2026. A light refresh sits below; designer-led work with bespoke joinery sits above.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"How long does a renovation take?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Around twelve weeks is the working standard for both new and resale, though scope moves it in either direction. Resale flats more often run past twelve weeks than under, because there is more to remove before anything can be built.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Why does a resale flat cost more than a BTO?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"You pay to undo the previous renovation before starting your own \u2014 hacking, rewiring, reinstating waterproofing and passing a water ponding test before tiling can begin.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"How much deposit should I pay?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"With a CaseTrust-accredited firm, the deposit is capped at 20% of the total contract value. That cap is one of the more concrete protections accreditation gives you.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Can I use CPF to pay for renovation?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"No. CPF savings cannot be used for renovation costs. Most homeowners use cash or a bank renovation loan.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Do I need a permit to renovate?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"For HDB flats, yes, for a wide range of works \u2014 and the contractor must be on HDB's registered directory. For condominiums, written MCST approval. For landed structural works, URA written permission and BCA building plan approval through a Qualified Person.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Is renovation cost negotiable?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"The scope is. Ask what comes out of the quotation to reach a lower number, rather than asking for the same scope at a lower price \u2014 the second question tends to be answered with thinner materials you won't see until later.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"When should I start looking for a renovation firm?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Once your keys are confirmed. For landed A&A or commercial fit-outs, considerably earlier \u2014 approvals alone can run three to five months before site works begin.\"\n          }\n        }\n      ]\n    }\n  ]\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>How Much Does Renovation Cost in Singapore? Answer six questions and get an indicative cost range for your property in under a minute &mdash; HDB, condominium, landed or commercial. No obligation, no phone call required to see the figure. CaseTrust accredited &middot; BCA registered &middot; HDB licensed &middot; 10,000+ projects completed 1Your property 2Scope 3Your [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_thinkrank_schema_form_data":"","_thinkrank_selected_schema_type":"","_thinkrank_additional_schemas":"","_thinkrank_canonical_url":"","_thinkrank_og_title":"","_thinkrank_og_description":"","_thinkrank_og_image":"","_thinkrank_twitter_title":"","_thinkrank_twitter_description":"","_thinkrank_twitter_image":"","_thinkrank_imported_from":"seopress","_thinkrank_focus_keywords":[],"_thinkrank_focus_keyword":"","_thinkrank_robots_meta_enabled":0,"_thinkrank_robots_meta":"","_thinkrank_advanced_robots_meta":"","_thinkrank_primary_category":0,"footnotes":""},"class_list":["post-45723","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/pages\/45723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/comments?post=45723"}],"version-history":[{"count":3,"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/pages\/45723\/revisions"}],"predecessor-version":[{"id":46469,"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/pages\/45723\/revisions\/46469"}],"wp:attachment":[{"href":"https:\/\/glutenfreepleasure.com\/__proxy_domain\/zenitharc.com.sg\/wp-json\/wp\/v2\/media?parent=45723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}