{"id":3445,"date":"2026-03-06T01:42:05","date_gmt":"2026-03-06T01:42:05","guid":{"rendered":"https:\/\/housefly1stg.wpenginepowered.com\/?page_id=3445"},"modified":"2026-07-08T03:19:45","modified_gmt":"2026-07-08T03:19:45","slug":"plumbing","status":"publish","type":"page","link":"https:\/\/housefly.com\/es\/services\/plumbing\/","title":{"rendered":"Plomer\u00eda"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3445\" class=\"elementor elementor-3445\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-04293a9 e-con-full e-flex e-con e-parent\" data-id=\"04293a9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d0eaa92 elementor-widget elementor-widget-html\" data-id=\"d0eaa92\" 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<!-- ================= HOUSE FLY \u2014 SMOKE SPLIT HERO + GLASS BOOKING CELL (production template, 2026-07-16) =================\n     Left: header + smoke service pills. Right: frosted-glass booking cell (live check-zip pricing, Book -> autobook -> cart).\n     Generated per page from pc-memory\/smoke-hero-template.html \u2014 edit the template, regenerate, redeploy. -->\n<style>\n@keyframes hfHeroKenBurns{0%{transform:scale(1) translate(0%,0%)}50%{transform:scale(1.06) translate(-1.5%,0.5%)}100%{transform:scale(1.10) translate(1.5%,-0.5%)}}\n@media (prefers-reduced-motion: reduce){.hfsk-hero::before{animation:none !important}}\nbody{overflow-x:hidden}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-04293a9,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-04293a9::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-04293a9::after{\n  max-height:none !important;min-height:0 !important;height:auto !important;\n  background-image:none !important;background-color:transparent !important;\n  flex-direction:column !important;align-items:stretch !important;justify-content:flex-start !important;\n  padding:0 !important;overflow:visible !important;border-radius:0 !important;box-shadow:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-04293a9::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-04293a9::after{display:none !important;background:transparent !important;content:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-d0eaa92 .elementor-widget-container{display:block !important;width:100% !important}\n.hfsk-root{display:block;width:100%}\n.hfsk-root,.hfsk-root *{box-sizing:border-box}\n\/* ===== hero: full-bleed smoke split ===== *\/\n.hfsk-hero{position:relative;background:#10161f;overflow:hidden;isolation:isolate;color:#fff;\n  width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);\n  margin-top:calc(-1 * var(--hf-header-h, 88px));\n  padding:calc(56px + var(--hf-header-h, 88px)) 40px 72px;\n  font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif}\n.hfsk-hero::before{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:url('https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-plumbing-1-1536x864.webp') center\/cover no-repeat;opacity:.45;animation:hfHeroKenBurns 28s ease-in-out infinite alternate;will-change:transform;z-index:-2}\n.hfsk-hero::after{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(115deg,rgba(13,20,31,.92) 0%,rgba(13,20,31,.72) 45%,rgba(13,20,31,.55) 100%);z-index:-1;pointer-events:none}\n@media (max-width:1024px){.hfsk-hero::before{background-image:url('https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-plumbing-1-1024x576.webp')}}\n.hfsk-cols{position:relative;z-index:2;max-width:1220px;margin:0 auto;display:grid;grid-template-columns:1.05fr 1fr;gap:56px;align-items:center}\n.hfsk-left{text-align:left}\n.hfsk-ey{font-size:clamp(16px,1.6vw,21px);font-weight:800;letter-spacing:.22em;color:#40C9F3;text-transform:uppercase;margin:0 0 12px;line-height:1.2}\n.hfsk-h1{font-size:clamp(34px,4.4vw,56px);font-weight:900;line-height:1.05;letter-spacing:-1.5px;margin:0 0 12px;color:#fff}\n.hfsk-h1 span{background:linear-gradient(90deg,#40C9F3,#2ED87A);-webkit-background-clip:text;background-clip:text;color:transparent}\n.hfsk-sub{color:rgba(201,214,230,.82);font-size:16.5px;font-weight:300;line-height:1.55;max-width:460px;margin:0 0 30px}\n.hfsk-rowlabel{font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.85);margin:0 0 12px}\n.hfsk-pills{display:flex;flex-wrap:wrap;gap:10px}\n#hfskCats{margin-bottom:24px}\n.hfsk-pill{display:inline-flex;align-items:center;font-family:inherit;font-size:14px;font-weight:700;color:#dfe9f5;\n  background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02));border:1.5px solid rgba(255,255,255,.2);\n  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-radius:999px;padding:11px 19px;cursor:pointer;transition:all .16s}\n.hfsk-pill:hover:not(.on){border-color:rgba(255,255,255,.48)}\n.hfsk-pill.on{border-color:#40C9F3;background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09));color:#fff;box-shadow:0 0 0 4px rgba(35,210,255,.14),0 12px 30px -12px rgba(35,210,255,.5)}\n.hfsk-pill:focus{outline:none}\n.hfsk-pill:focus-visible{outline:2px solid #40C9F3;outline-offset:2px}\n.hfsk-divider{max-width:420px;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.18),transparent);margin:2px 0 20px}\n#hfskSubs{display:flex;flex-direction:column;gap:10px}\n.hfsk-pills.fixedrow{flex-wrap:nowrap}\n.hfsk-pills.fixedrow .hfsk-pill{min-width:0;justify-content:center;white-space:nowrap}\n@media (max-width:480px){.hfsk-pills.fixedrow .hfsk-pill{flex:1 1 0;font-size:clamp(9.5px,2.9vw,12.5px);padding:9px 4px;min-height:33px}}\n@media (max-width:480px){.hfsk-pills.fixedrow.compact .hfsk-pill{white-space:nowrap;font-size:clamp(9px,2.55vw,12.5px);padding:9px 2px;min-height:33px}}\n\/* ===== glass booking cell ===== *\/\n.hfsk-glass{background:rgba(20,29,43,.62);border:1px solid rgba(255,255,255,.16);border-radius:22px;\n  backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);\n  box-shadow:0 40px 110px -30px rgba(0,0,0,.8),inset 0 1px 0 rgba(255,255,255,.09);\n  padding:24px 26px 22px;max-width:520px;margin-left:auto;color:#fff;text-align:left;font-family:'Inter',-apple-system,sans-serif}\n.hfsk-glass *{box-sizing:border-box}\n.g-top{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:16px}\n.g-top h3{font-size:23px;font-weight:800;letter-spacing:-.5px;color:#fff;margin:0;font-family:inherit}\n.g-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;color:#7FE3FF;background:rgba(35,210,255,.14);border:1px solid rgba(35,210,255,.3);padding:4px 10px;border-radius:99px;margin-top:8px}\n.g-zip{flex:none;width:150px;text-align:left}\n.g-zip label{display:block;font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#8fb3d0;margin-bottom:6px;padding-left:2px}\n.g-zipbox{position:relative;display:flex;align-items:center;height:42px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);border-radius:12px;padding:0 12px;transition:border-color .15s}\n.g-zipbox:focus-within{border-color:#40C9F3}.g-zipbox.bad{border-color:#ff8f8f}\n.g-zipbox .pin{position:absolute;left:12px;font-size:14px;line-height:1}\n.g-zipbox input{width:100%;height:100%;padding:0;margin:0;text-align:center;border:none;background:transparent;font-family:inherit;font-size:16px;font-weight:800;color:#fff;outline:none;letter-spacing:2px;line-height:normal;box-shadow:none}\n.g-inc{border:1px solid rgba(255,255,255,.14);border-radius:13px;overflow:hidden;margin-bottom:15px;background:rgba(255,255,255,.03)}\n.g-inc>button{width:100%;display:flex;align-items:center;justify-content:space-between;background:transparent;border:none;padding:11px 14px;font-family:inherit;font-size:12.5px;font-weight:800;color:#dfe9f5;cursor:pointer;letter-spacing:.04em}\n.g-inc .car{transition:transform .2s;color:#40C9F3}.g-inc.open .car{transform:rotate(180deg)}\n.g-inc ul{list-style:none;max-height:0;overflow:hidden;transition:max-height .28s;padding:0 16px;margin:0}\n.g-inc.open ul{max-height:420px;padding:2px 16px 12px}\n.g-inc li{font-size:12.5px;color:rgba(223,233,245,.92);padding:4px 0 4px 20px;position:relative;line-height:1.5}\n.g-inc li::before{content:\"\";position:absolute;left:2px;top:11px;width:6px;height:6px;border-radius:50%;background:#2ED87A}\n.g-inc li.you::before{background:#40C9F3}\n.g-inc li.na::before{background:#ff9b9b}\n.g-inc li b{color:#fff;font-weight:800}\n.g-q{margin-bottom:14px}.g-q:last-child{margin-bottom:0}\n.g-q>label{display:block;font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#8fa6c0;margin-bottom:8px}\n.g-seg{display:flex;flex-wrap:wrap;gap:7px}\n.g-seg button{flex:1 1 0;min-width:0;font-family:inherit;font-size:13px;font-weight:700;color:#fff;background:rgba(255,255,255,.05);border:1.5px solid rgba(255,255,255,.18);border-radius:10px;padding:10px 8px;cursor:pointer;transition:all .15s;white-space:nowrap}\n.g-seg button.on{border-color:#40C9F3;background:rgba(35,210,255,.12);color:#7FE3FF;box-shadow:0 0 0 3px rgba(35,210,255,.12)}\n.g-seg.four button{flex:1 1 46%}\n.g-step{display:flex;align-items:center;gap:8px}\n.g-step button{width:42px;height:40px;flex:none;border-radius:10px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);color:#40C9F3;font-size:21px;font-weight:700;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center;transition:all .15s}\n.g-step button:hover:not(:disabled){border-color:#40C9F3}.g-step button:disabled{opacity:.3;cursor:not-allowed}\n.g-step .val{flex:1;text-align:center;height:40px;display:flex;align-items:center;justify-content:center;border:1.5px solid rgba(64,201,243,.55);background:rgba(35,210,255,.09);border-radius:10px;font-size:14.5px;font-weight:800;color:#7FE3FF;letter-spacing:.2px}\n.g-step .val span{font-size:11px;font-weight:600;color:#8fa6c0;margin-left:5px}\n.g-rooms{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}\n.g-rooms.two{grid-template-columns:repeat(2,minmax(0,1fr))}\n.g-rc{background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.13);border-radius:12px;padding:10px 8px;text-align:center}\n.g-rc .rl{font-size:16.5px;font-weight:700;color:#fff;line-height:1.2;min-height:26px;display:flex;align-items:center;justify-content:center}\n.g-rc .rs{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:6px}\n.g-rc .rs button{width:28px;height:28px;border-radius:8px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-rc .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-rc .rs .v{font-size:24px;line-height:1;font-weight:800;color:#fff;min-width:20px}\n.g-itemhead{display:flex;justify-content:space-between;font-size:10px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:#6d8199;padding:0 2px 7px}\n.g-item .lbl{min-width:0}\n.g-item{display:flex;align-items:center;justify-content:space-between;gap:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);border-radius:13px;padding:10px 13px;margin-bottom:8px;transition:all .15s}\n.g-item:last-child{margin-bottom:0}\n.g-item.picked{border-color:rgba(64,201,243,.6);background:rgba(35,210,255,.09)}\n.g-item .lbl{font-size:13.5px;font-weight:700;color:#fff;line-height:1.3}\n.g-item .rs{display:flex;align-items:center;gap:9px;flex:none}\n.g-item .rs button{width:30px;height:30px;border-radius:9px;border:1.5px solid rgba(255,255,255,.25);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-item .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-item .rs .v{font-size:16px;font-weight:800;color:#fff;min-width:16px;text-align:center}\n.g-note{font-size:11px;color:#8fa6c0;margin-top:8px;line-height:1.5}\n.g-foot{margin-top:16px;padding-top:15px;border-top:1px solid rgba(255,255,255,.12)}\n.g-row{display:flex;align-items:center;justify-content:space-between;gap:14px}\n.g-pr{text-align:left}\n.g-price{font-size:32px;font-weight:900;letter-spacing:-1.2px;color:#2ED87A;line-height:1}\n.g-price.na{font-size:15px;color:#ff9b9b;font-weight:700;letter-spacing:0}\n.g-est{font-size:11.5px;color:#8fa6c0;margin-top:5px}\n.g-book{flex:none;background:#23D2FF;color:#0F1923;border:none;border-radius:13px;padding:15px 26px;font-family:inherit;font-size:15.5px;font-weight:800;cursor:pointer;box-shadow:0 14px 34px -12px rgba(35,210,255,.6);transition:filter .15s;white-space:nowrap}\n.g-book:hover,.g-book:focus,.g-book:active{background:#23D2FF !important;color:#0F1923 !important;filter:brightness(1.06);outline:none}\n.g-book:disabled{opacity:.45;cursor:not-allowed}\n\/* WP theme sets a red\/pink global button:hover \u2014 pin every control in this block to our palette *\/\n.hfsk-root button:hover,.hfsk-root button:focus,.hfsk-root button:active{color:inherit}\n.hfsk-pill:hover,.hfsk-pill:focus,.hfsk-pill:active{background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02)) !important;color:#dfe9f5 !important}\n.hfsk-pill.on:hover,.hfsk-pill.on:focus,.hfsk-pill.on:active{background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09)) !important;color:#fff !important}\n.g-seg button:hover,.g-seg button:focus,.g-seg button:active{background:rgba(255,255,255,.08) !important;color:#fff !important;outline:none}\n.g-seg button.on:hover,.g-seg button.on:focus,.g-seg button.on:active{background:rgba(35,210,255,.12) !important;color:#7FE3FF !important}\n.g-step button:hover,.g-step button:focus,.g-step button:active{background:rgba(255,255,255,.1) !important;color:#40C9F3 !important;outline:none}\n.g-item .rs button:hover,.g-item .rs button:focus,.g-item .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-rc .rs button:hover,.g-rc .rs button:focus,.g-rc .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-inc>button:hover,.g-inc>button:focus,.g-inc>button:active{background:rgba(255,255,255,.04) !important;color:#dfe9f5 !important;outline:none}\n.g-fine{font-size:10.5px;color:#6d8199;margin-top:12px;text-align:center}\n\/* flooring extras: pattern preview, stain picker *\/\n.g-flprev{display:flex;align-items:center;gap:10px;margin-top:9px}\n.g-flprev img{width:96px;height:64px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.18);background:#fff}\n.g-flprev span{font-size:12px;color:#8fa6c0}\n.g-flstain{display:flex;align-items:center;gap:10px;margin-top:2px}\n.g-flstain img{width:44px;height:44px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.22);flex:none}\n.g-select{flex:1;min-width:0;height:42px;padding:0 12px;border-radius:10px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);color:#fff;font-family:inherit;font-size:13.5px;font-weight:600;outline:none;appearance:auto;-webkit-appearance:menulist}\n.g-select:focus{border-color:#40C9F3}\n.g-select option{color:#0F1923;background:#fff}\n@media (max-width:980px){\n  .hfsk-hero{padding:calc(34px + var(--hf-header-h, 88px)) 18px 56px}\n  \/* minmax(0,1fr): a bare 1fr track grows to the cell's min-content and the\n     hero's overflow:hidden clips it off the right edge of small phones *\/\n  .hfsk-cols{grid-template-columns:minmax(0,1fr);gap:32px}\n  .hfsk-cols>*{min-width:0;max-width:100%}\n  .hfsk-glass{margin:0 auto;width:100%;max-width:520px}\n  .hfsk-sub{margin-bottom:22px}\n  .hfsk-pills{gap:8px}\n  .hfsk-pill{font-size:12.5px;padding:9px 14px}\n}\n@media (max-width:480px){\n  .hfsk-glass{padding:20px 18px 18px}\n  .g-price{font-size:26px}\n  .g-book{padding:13px 18px;font-size:14px}\n  .g-row{gap:10px}\n  .g-zip{width:132px}\n  .g-top h3{font-size:20px}\n  \/* compress-only-when-needed: identical at 390px+, shrinks on smaller phones *\/\n  .g-seg button{white-space:normal}\n  .hfsk-pills.fixedrow .hfsk-pill{white-space:normal;text-align:center;line-height:1.15}\n  .g-rc{padding:10px 5px}\n  .g-rc .rl{font-size:clamp(13px,4.2vw,16.5px)}\n  .g-rc .rs{gap:5px}\n  .g-rc .rs button{width:26px;height:26px}\n  .g-rc .rs .v{min-width:16px;font-size:22px}\n}\n<\/style>\n\n<div class=\"hfsk-root\">\n<section class=\"hfsk-hero\">\n  <div class=\"hfsk-cols\">\n    <div class=\"hfsk-left\">\n      <div class=\"hfsk-ey\">Plumbing Services<\/div>\n      <h1 class=\"hfsk-h1\">Book Trusted <span>Plumbers<\/span><\/h1>\n      <p class=\"hfsk-sub\">Pick a service, set the details, and book for the price you see. Upfront pricing, real availability, done in a few taps.<\/p>\n      <div class=\"hfsk-rowlabel\">Choose a service<\/div>\n      <div class=\"hfsk-pills\" id=\"hfskCats\" style=\"display:none\"><\/div>\n      <div class=\"hfsk-divider\" id=\"hfskDiv\" style=\"display:none\"><\/div>\n      <div id=\"hfskSubs\"><\/div>\n    <\/div>\n    <div><div id=\"hfskMount\"><\/div><\/div>\n  <\/div>\n<\/section>\n<\/div>\n\n<script data-no-defer=\"1\" data-no-optimize=\"1\" data-no-minify=\"1\">\n(function(){\n  var APP = '\/account';\n  var CHECKZIP = APP + '\/customer\/booking-assistant\/check-zip';\n  var BOOK = APP + '\/customer\/booking-assistant';\n  var SQ_HOUSE=['Up to 1,000 sq ft','1,001 - 2,000','2,001 - 3,000','3,001 - 4,000','4,001 - 5,000'];\n  var SQ_APT=['Up to 1,000 sq ft','1,001 - 2,000','2,001 - 3,000'];\n  var PROPS=['House \/ Townhouse','Apartment \/ Condo'];\n  var STORIES=['1 Story','2 Story','3 Story'];\n  var HW_TIER_MAX=[1000,1500,2000,2500,3000,3500,4000,4500,5000];\n  var HW_TIER_NAMES=['Up to 1,000','1,001 - 1,500','1,501 - 2,000','2,001 - 2,500','2,501 - 3,000','3,001 - 3,500','3,501 - 4,000','4,001 - 4,500','4,501 - 5,000'];\n  function hwCat(st){ if(st.indexOf('3')>=0)return '730'; if(st.indexOf('2')>=0)return '729'; return '728'; }\n  var PA_SQFT=['Under 1,000','1,000-1,499','1,500-1,999','2,000-2,499','2,500-2,999','3,000-3,499','3,500-3,999','4,000-4,499','4,500-4,999'];\n  var PA_CEILINGS=['Up to 9 ft ceiling','Between 9 and 12 ft ceiling'];\n  var PA_SIDINGS=['Wood','Brick','Stucco \/ Hardie Board','Vinyl'];\n  var PA_STORIES=['1 Story','2 Story','3 Story'];\n  var PA_GAR=['No Garage','Attached','Detached'];\n  var PA_GARSIZE=['Single Car','Two Car','Three Car'];\n  var PA_EXT_CATS={'Wood':['133','136','139'],'Brick':['134','137','140'],'Stucco \/ Hardie Board':['135','138','141'],'Vinyl':['142','143','144']};\n  var GZIP='70124';\n\n  var SERVICE='Plumbing';\n  var SHOWCATS=false;\n  var CATS=[];\n  var CARDS = [\n    { key:'plkitchen', row:1, grp:'pl', title:'Kitchen Fixtures', sub:'Kitchen Fixture Replacement', badge:'\ud83d\udd27 Per-fixture pricing', cat:'146', flow:'items', book:'Book This Job',\n      q:'Select the number of each kitchen fixture you need replaced.', colL:'Fixture Type', colR:'Number',\n      inc:[['Included','Remove existing, install new fixture'],['Customer provides','All fixtures'],['Additional costs','All hoses (water supply, drain, gas), P-Trap, and angle stops']],\n      items:['Sink Faucet','Garbage Disposal','Dishwasher','Gas Stove','Refrigerator Water Line'] },\n    { key:'plbath', row:1, grp:'pl', title:'Bath \/ Utility Fixtures', sub:'Bath \/ Utility Fixture', badge:'\ud83d\udebf Per-fixture pricing', cat:'695', flow:'items', book:'Book This Job',\n      q:'Select the number of each bath or utility fixture you need replaced.', colL:'Fixture Type', colR:'Number',\n      inc:[['Included','Remove existing, install new fixture'],['Customer provides','All fixtures'],['Additional costs','Hoses, wire connectors, toilet tank parts and seal ring, P-Trap, and angle stops']],\n      items:['Washer\/Dryer','Toilet','Sink Faucet','Shower Head'] },\n    { key:'plvanity', row:1, grp:'pl', title:'Vanity \/ Utility Sink', sub:'Vanity \/ Utility Sink', badge:'\ud83e\ude9e Priced by vanity size', cat:'696', flow:'items', book:'Book This Job',\n      q:'Select the number of each vanity or utility sink you need replaced.', colL:'Vanity or Utility Sink Size', colR:'Number',\n      inc:[['Included','Remove and install, water supply lines and P-Trap'],['Customer provides','Vanity, sink, faucet, drain kit'],['Additional costs','Large vanities may need a second plumber; replacing angle stops or relocating drain and water lines']],\n      items:['Single Sink Up to 36\" Wide','Single Sink Up to 72\" Wide','Double Sink Up to 72\" Wide','Double Sink Up to 90\" Wide'] },\n    { key:'pltoilet', row:1, grp:'pl', title:'Toilet Repair', sub:'Toilet Diagnostic & Repair', badge:'\ud83d\udebd 1 hour diagnostic', cat:'697', flow:'flat', book:'Book This Job',\n      inc:[['Included','Evaluate and repair faulty toilet'],['Duration','Up to 1 hour diagnostic'],['Additional costs','Water supply line, angle stop, tank parts, and seal ring']],\n      note:'Flat-rate visit: your pro diagnoses the issue and makes the repair on site.' },\n    { key:'plleak', row:2, grp:'pl', title:'Leaky Faucet Repair', sub:'Leaky Faucet Repair', badge:'\ud83d\udca7 Fixed-price repair', cat:'149', flow:'flat', pick:'Leaky Faucet', book:'Book This Job',\n      inc:[['Included','Replace cylinder, cartridge, washer, or O-ring']],\n      note:'Covers one leaking faucet. Your pro replaces the faulty internal part.' },\n    { key:'pldrain', row:2, grp:'pl', title:'Drain Clog Removal', sub:'Drain Clog Removal', badge:'\ud83c\udf00 Priced per drain', cat:'149', flow:'items', book:'Book This Job',\n      q:'Select the number of each clogged drain you need cleared.', colL:'Drain Location', colR:'Number',\n      inc:[['Included','Break up and flush buildup to restore flow'],['Additional costs','Repairing or replacing the drain']],\n      items:['Sink','Bath \/ Shower','Toilet','Dishwasher'] },\n    { key:'plcamera', row:2, grp:'pl', title:'Camera Inspection', sub:'Camera Inspection', badge:'\ud83d\udcf7 Full sewer line', cat:'147', flow:'flat', book:'Book This Job',\n      inc:[['Included','Complete sewer line inspection with camera']],\n      note:'A full camera inspection of your sewer line to locate blockages and damage.' },\n    { key:'plhydro', row:2, grp:'pl', title:'Hydro Clean', sub:'Hydro Clean', badge:'\ud83d\udca6 High-pressure line cleaning', cat:'148', flow:'flat', book:'Book This Job',\n      inc:[['Included','High-pressure sewer line cleaning']],\n      note:'High-pressure water jetting clears grease and buildup from the sewer line.' }\n  ];\n\n  function isApt(p){ return p.indexOf('Apartment')>=0||p.indexOf('Condo')>=0; }\n  function fmt(n){ return '$'+Number(n).toLocaleString('en-US',{minimumFractionDigits:2,maximumFractionDigits:2}); }\n  function fmtDur(min){ min=Math.round(min); var d=Math.floor(min\/480),r=min%480,h=Math.floor(r\/60),m=r%60,p=[]; if(d)p.push(d+' day'+(d>1?'s':'')); if(h)p.push(h+' hr'); if(m)p.push(m+' min'); if(!p.length)p.push('0 min'); return p.join(' '); }\n  function findRow(items, needle){ items=items||[]; for(var i=0;i<items.length;i++){ if(items[i].title && items[i].title.indexOf(needle)>=0) return items[i]; } return null; }\n  function norm(s){ return (''+s).replace(\/\\s+\/g,' ').trim().toLowerCase(); }\n  function normRow(items, label){ items=items||[]; var n=norm(label); for(var i=0;i<items.length;i++){ if(norm(items[i].title)===n) return items[i]; } return null; }\n  function applyFee(raw, tiers){ tiers=tiers||[]; for(var t=0;t<tiers.length;t++){ if(tiers[t].max===null||raw<=tiers[t].max){ var p=tiers[t].pct||0; return p>0?Math.round(raw*(1+p\/100)*100)\/100:raw; } } return raw; }\n  function sqMeta(s,a){ if(s.indexOf('Up to')>=0)return{p:0.8,s:a?10:0}; if(s.indexOf('1,001')>=0)return{p:0.9,s:a?15:0}; if(s.indexOf('2,001')>=0)return{p:1.0,s:a?15:0}; if(s.indexOf('3,001')>=0)return{p:1.1,s:0}; if(s.indexOf('4,001')>=0)return{p:1.2,s:0}; return{p:1.0,s:0}; }\n  \/\/ Clean visual pricing: round UP to the next $X4.99\/$X9.99 (matches booking chat).\n  function roundClean(p){ p=Math.round(p*100)\/100; return Math.ceil(Math.round((p+0.01)*100)\/500)*5-0.01; }\n  \/\/ SP per-unit durations (\"45 MIN\", \"1 HR 15 MIN\") need fractional hours: never ceil here.\n  function fracHours(str){ if(!str)return 0; var s=(''+str).toUpperCase(); var h=s.match(\/(\\d+)\\s*H(?:OU)?R\/), m=s.match(\/(\\d+)\\s*MIN\/); return (h?parseInt(h[1]):0)+(m?parseInt(m[1])\/60:0); }\n  \/\/ Chat's parseDurationString: whole hours, days=8hr, missing=2, min 1.\n  function pdsHours(str){ if(!str)return 2; var s=(''+str).toUpperCase(); var dm=s.match(\/(\\d+)\\s*-?\\s*DAY\/); if(dm)return parseInt(dm[1])*8; var h=fracHours(s); return Math.max(1,Math.ceil(h||2)); }\n  \/\/ Painting helpers: mirror the booking chat's matchPricingItem \/ paint \/ garage lookups.\n  function paDurH(str){ if(!str)return 2; var s=(''+str).toUpperCase(); var dm=s.match(\/(\\d+)\\s*-?\\s*DAY\/); if(dm)return parseInt(dm[1])*8; var hr=fracHours(s); return Math.max(1,Math.ceil(hr||2)); }\n  function paCat(c,s){ if(c.kind==='whole')return s.ceil===1?'127':'126'; if(c.kind==='rooms')return s.ceil===1?'129':'128'; if(c.kind==='walls')return '124'; if(c.kind==='dry')return '125'; return PA_EXT_CATS[PA_SIDINGS[s.siding]][s.story]; }\n  \/\/ Flooring category resolution \u2014 mirrors the chat's getLastCategoryId Flooring branch.\n  function flCat(c,s){\n    if(c.kind==='new'){\n      var m=FL_MATS[s.mat];\n      if(m==='Wood') return FL_WOOD_CATS[FL_WOOD_PATS[s.wpat]];\n      if(m==='Tile') return FL_TILE_CATS[FL_TILE_PATS[s.tpat]];\n      if(m==='Vinyl') return FL_VINYL_CATS[FL_VINYL_PATS[s.vpat]];\n      return '352';\n    }\n    if(c.kind==='sand') return '342';\n    if(c.kind==='sub') return '757';\n    return '346';\n  }\n  function paMain(rows, terms){\n    var cand=[], i;\n    for(i=0;i<rows.length;i++){ var r=rows[i]; var pp=((r.parent||'')+'').toLowerCase(); if(pp.indexOf('garage')>=0)continue;\n      var fid=parseInt(r.filed_id,10); if(fid===10||fid===11)continue;\n      var rawP=(r.price||'').toString().trim(); if(!rawP||rawP==='$'||rawP.indexOf('%')>=0||parseFloat(rawP)===0)continue;\n      if(fid===1||fid===6||fid===8||fid===12||fid===21||fid===39||fid===52)continue;\n      cand.push(r); }\n    if(!cand.length)return null; if(cand.length===1)return cand[0];\n    for(i=0;i<cand.length;i++){ var t=(cand[i].title||'').toLowerCase().replace(\/,\/g,'');\n      for(var j=0;j<terms.length;j++){ var tm=terms[j].toLowerCase().replace(\/,\/g,''); if(t.indexOf(tm)>=0)return cand[i]; } }\n    return cand[0];\n  }\n  function paPaint(rows, sqft){\n    for(var i=0;i<rows.length;i++){ if(parseInt(rows[i].filed_id,10)===11)return rows[i]; }\n    if(!sqft)return null; var n=sqft.toLowerCase().replace(\/,\/g,'');\n    for(var j=0;j<rows.length;j++){ if(parseInt(rows[j].filed_id,10)!==10)continue; var t=(rows[j].title||'').toLowerCase().replace(\/,\/g,'').trim(); if(!t)continue; if(t.indexOf(n)>=0||n.indexOf(t)>=0)return rows[j]; }\n    for(var k=0;k<rows.length;k++){ if(parseInt(rows[k].filed_id,10)===10&&parseFloat(rows[k].price)>0)return rows[k]; }\n    return null;\n  }\n  function paGarage(rows,type,count){ var tn=type.toLowerCase(),cn=count.toLowerCase();\n    for(var i=0;i<rows.length;i++){ var pp=((rows[i].parent||'')+'').toLowerCase(); if(pp.indexOf('garage')<0)continue; if(pp.indexOf(tn)<0)continue; if(((rows[i].title||'')+'').toLowerCase().indexOf(cn)<0)continue; return rows[i]; } return null; }\n  function paGaragePaint(rows,type,count){ var cn=count.toLowerCase(); var det=type.toLowerCase().indexOf('detached')>=0; var mi=0;\n    for(var i=0;i<rows.length;i++){ if(parseInt(rows[i].filed_id,10)!==52)continue; if(((rows[i].title||'')+'').toLowerCase().indexOf(cn)<0)continue; if(det&&mi===0){mi++;continue;} return rows[i]; } return null; }\n\n  function priceFor(c,s){\n    var d=s.data; if(!d||!d.available) return null;\n    var final=function(raw){ return roundClean(Math.max(d.min||0, applyFee(raw,d.tiers))); };\n    if(c.flow==='hourly'){\n      var row=findRow((d.pricing||{})['439'], s.cleaners===2?'2 Cleaner':'1 Cleaner');\n      var rate=row?parseFloat(row.price):(d.hourly_rate||30);\n      return { price:final(rate*s.hours), dur:s.hours*60 };\n    }\n    if(c.flow==='housewash'){\n      var rows=(d.pricing||{})[hwCat(s.stories)]||[];\n      var rr=findRow(rows,'Per Square Foot'); if(!rr) return null;\n      var hwRate=parseFloat(rr.price)||0;\n      var ti=HW_TIER_MAX.length-1; for(var i=0;i<HW_TIER_MAX.length;i++){ if(s.sqft<=HW_TIER_MAX[i]){ti=i;break;} }\n      var tRow=findRow(rows,HW_TIER_NAMES[ti]);\n      var hrs=tRow?fracHours(tRow.price):0; if(!hrs)hrs=4;\n      return { price:final(hwRate*s.sqft), dur:hrs*60 };\n    }\n    if(c.flow==='pwarea'){\n      var items=(d.pricing||{})[c.cat]||[];\n      var pr=null; for(var j=0;j<items.length;j++){ if(parseFloat(items[j].price)>0){ pr=items[j]; break; } }\n      if(!pr) return null;\n      var uRate=parseFloat(pr.price)||0;\n      var uDur=fracHours(pr.duration); if(!uDur)uDur=0.25;\n      return { price:final(uRate*s.area), dur:uDur*(s.area\/c.unitSize)*60 };\n    }\n    if(c.flow==='loads'){\n      var lItems=(d.pricing||{})[c.cat]||[];\n      var lRow=null; for(var li=0;li<lItems.length;li++){ if(parseFloat(lItems[li].price)>0){ lRow=lItems[li]; break; } }\n      if(!lRow) return null;\n      return { price:final((parseFloat(lRow.price)||0)*s.loads), dur:s.loads*60 };\n    }\n    if(c.flow==='flat'){\n      \/\/ Fixed-price service: match the chat's single-flow path \u2014 pick the named\n      \/\/ row if given, else the first usable priced row in the category.\n      var flRows=(d.pricing||{})[c.cat]||[];\n      var flRow=c.pick?normRow(flRows,c.pick):null;\n      if(!flRow){ for(var fl=0;fl<flRows.length;fl++){ if(parseFloat(flRows[fl].price)>0){ flRow=flRows[fl]; break; } } }\n      if(!flRow) return null;\n      var flDur=fracHours(flRow.duration); if(!flDur)flDur=2;\n      return { price:final(parseFloat(flRow.price)||0), dur:flDur*60 };\n    }\n    if(c.flow==='fl'){\n      \/\/ Flooring: per-sqft rate x sqft; duration is per 100 sq ft (chat parity).\n      \/\/ Skip percentage rows (fid-21 volume-discount tiers are display-only in the chat too).\n      var fcat=flCat(c,s); var frows=((d.pricing||{})[fcat]||[]).filter(function(r){ return ((r.price||'')+'').indexOf('%')<0 && parseFloat(r.price)>0; });\n      if(!frows.length) return null;\n      var frow=null;\n      if(c.kind==='new'){\n        var fmat=FL_MATS[s.mat];\n        if(fmat==='Wood') frow=normRow(frows, FL_INSTALLS[s.inst]);\n        else if(fmat==='Tile') frow=normRow(frows, FL_TMATS[s.tmat]);\n        else frow=frows[0];\n      } else if(c.kind==='rem'){\n        frow=normRow(frows, FL_REMTYPES[s.rt]);\n      } else {\n        frow=frows[0];\n      }\n      if(!frow) return null;\n      var fsq=parseInt(FL_SQFTS[s.sq],10);\n      var fhrs=Math.max(1, Math.ceil(fracHours(frow.duration)*(fsq\/100)));\n      return { price:final((parseFloat(frow.price)||0)*fsq), dur:fhrs*60 };\n    }\n    if(c.flow==='hi'){\n      \/\/ Home Inspection: fid-3 base row by sqft range + house-only surcharges\n      \/\/ (fid-39 raised\/multi-family, fid-12 extra AC\/50yr) \u2014 chat parity.\n      var hRows=(d.pricing||{})[s.prop===0?'37':'38']||[];\n      var hList=s.prop===0?HI_SQFT_HOUSE:HI_SQFT_APT;\n      var hTerm=norm(hList[s.hsq]).replace(\/,\/g,'');\n      var hBase=null, hFirst=null;\n      for(var hb=0;hb<hRows.length;hb++){ var hr=hRows[hb];\n        if(parseInt(hr.filed_id,10)!==3) continue;\n        var ht=norm(hr.title).replace(\/,\/g,'');\n        if(!ht||ht==='sq. feet'||!(parseFloat(hr.price)>0)) continue;\n        if(!hFirst) hFirst=hr;\n        if(ht.indexOf(hTerm)>=0){ hBase=hr; break; }\n        var hn=hTerm.replace(\/[^0-9]\/g,' ').trim(), tn=ht.replace(\/[^0-9]\/g,' ').trim();\n        if(hn&&tn&&hn===tn){ hBase=hr; break; }\n      }\n      if(!hBase) hBase=hFirst;\n      if(!hBase) return null;\n      var hRaw=parseFloat(hBase.price)||0;\n      var hDur=pdsHours(hBase.duration);\n      if(s.prop===0){\n        if(s.raised===0){ for(var h1=0;h1<hRows.length;h1++){ if(parseInt(hRows[h1].filed_id,10)===39&&norm(hRows[h1].title).indexOf('raised')>=0){ hRaw+=parseFloat(hRows[h1].price)||0; hDur+=fracHours(hRows[h1].duration); break; } } }\n        if(s.multi>0){ var hU=[0,2,3,4][s.multi]; for(var h2=0;h2<hRows.length;h2++){ if(parseInt(hRows[h2].filed_id,10)===39&&norm(hRows[h2].title).indexOf('multi')>=0){ hRaw+=(parseFloat(hRows[h2].price)||0)*(hU-1); hDur+=fracHours(hRows[h2].duration)*(hU-1); break; } } }\n        if(s.hvac>0){ for(var h3=0;h3<hRows.length;h3++){ if(parseInt(hRows[h3].filed_id,10)===12&&norm(hRows[h3].title).indexOf('ac')>=0){ hRaw+=(parseFloat(hRows[h3].price)||0)*s.hvac; break; } } }\n        if(s.age===1){ for(var h4=0;h4<hRows.length;h4++){ if(parseInt(hRows[h4].filed_id,10)===12&&norm(hRows[h4].title).indexOf('50')>=0){ hRaw+=parseFloat(hRows[h4].price)||0; break; } } }\n      }\n      return { price:final(hRaw), dur:hDur*60 };\n    }\n    if(c.flow==='pm'){\n      \/\/ Photo & Marketing: flat row matched by photo count or sqft range,\n      \/\/ contains-match in row order, else first candidate \u2014 chat parity.\n      var pRows=((d.pricing||{})[c.cat]||[]).filter(function(r){ return ((r.price||'')+'').indexOf('%')<0 && parseFloat(r.price)>0; });\n      if(!pRows.length) return null;\n      var pTerm=c.kind==='photo' ? PM_COUNTS[s.n].replace(\/\\s*photos?\/i,'') : PM_SQFT[s.n];\n      var pRow=null; var pt=norm(pTerm).replace(\/,\/g,'');\n      for(var p1=0;p1<pRows.length;p1++){ if(norm(pRows[p1].title).replace(\/,\/g,'').indexOf(pt)>=0){ pRow=pRows[p1]; break; } }\n      if(!pRow) pRow=pRows[0];\n      return { price:final(parseFloat(pRow.price)||0), dur:pdsHours(pRow.duration||pRow.title)*60 };\n    }\n    if(c.flow==='items'){\n      var rows2=(d.pricing||{})[c.cat]||[];\n      var total=0, durH=0, n=0;\n      for(var k=0;k<c.items.length;k++){\n        var qy=s.qty[k]||0; if(!qy) continue;\n        var rw=normRow(rows2, c.items[k]);\n        if(!rw) continue;\n        total+=qy*(parseFloat(rw.price)||0);\n        durH+=qy*fracHours(rw.duration);\n        n+=qy;\n      }\n      if(!n) return { none:true };\n      \/\/ booking chat: duration = max(1, ceil(sum)) whole hours\n      return { price:final(total), dur:Math.max(1,Math.ceil(durH))*60 };\n    }\n    if(c.flow==='pa'){\n      var cat=paCat(c,s); var rows=(d.pricing||{})[cat]||[]; if(!rows.length)return null;\n      if(c.kind==='dry'){\n        var tot=0, dh=0, cnt=0;\n        for(var di=0;di<c.items.length;di++){ var qy=s.qty[di]||0; if(!qy)continue; var rw=normRow(rows, c.items[di]); if(!rw)continue;\n          tot+=qy*(parseFloat(rw.price)||0); dh+=qy*fracHours(rw.duration); cnt+=qy; }\n        if(!cnt) return { none:true };\n        return { price:final(tot), dur:Math.max(1,Math.ceil(dh))*60 };\n      }\n      var pq=1; if(c.kind==='rooms'||c.kind==='walls')pq=s.n;\n      var terms=[]; if(c.kind==='whole'||c.kind==='ext'){ terms.push(PA_SQFT[s.sq]); if(c.kind==='whole')terms.push(PA_CEILINGS[s.ceil]); }\n      var main=paMain(rows,terms); if(!main)return null;\n      var durH=paDurH(main.duration||main.title); if(c.kind==='rooms'||c.kind==='walls')durH*=pq;\n      var totP=(parseFloat(main.price)||0)*pq;\n      if(s.paint===1){ var pr=paPaint(rows,(c.kind==='whole'||c.kind==='ext')?PA_SQFT[s.sq]:null); if(pr){ var ppv=parseFloat(pr.price)||0; if(parseInt(pr.filed_id,10)===11)ppv*=pq; totP+=ppv; } }\n      if(c.kind==='ext'&&s.gar>0){ var gt=s.gar===1?'Attached':'Detached', gc=PA_GARSIZE[s.gsize];\n        var g=paGarage(rows,gt,gc); if(g){ totP+=parseFloat(g.price)||0; durH+=paDurH(g.duration); }\n        if(s.paint===1){ var gp=paGaragePaint(rows,gt,gc); if(gp)totP+=parseFloat(gp.price)||0; } }\n      return { price:final(totP), dur:durH*60 };\n    }\n    var spRow=findRow((d.pricing||{})[c.cat], 'Service Price');\n    var rate2=spRow?parseFloat(spRow.price):(d.hourly_rate||30);\n    var m=c.mults, mm=sqMeta(s.sqft,isApt(s.prop));\n    var raw2=(rate2*m.K+rate2*m.B+rate2*m.F)*mm.p+(s.beds-1)*rate2*m.B+(s.full-1)*rate2*m.F+s.half*rate2*m.H+mm.s;\n    var dur=c.kitchen+s.beds*15+s.full*15+s.half*15; if(s.sqft.indexOf('Up to')>=0)dur-=30; else if(s.sqft.indexOf('1,001')>=0)dur-=15; else if(s.sqft.indexOf('3,001')>=0)dur+=15; else if(s.sqft.indexOf('4,001')>=0)dur+=30;\n    return { price:final(raw2), dur:dur };\n  }\n\n  \/\/ GA4 funnel events \u2014 same conventions + host gate as booking-chat's _hfPush.\n  \/\/ GTM 'Custom Event - Booking Funnel Events' trigger already whitelists these.\n  var _hfSeenCards={}, _hfSeenZips={};\n  function _hfHeroPush(eventName, payload){\n    try{\n      var hosts=['housefly.com','www.housefly.com'];\n      var force=false; try{ force=(new URLSearchParams(window.location.search)).get('hf_force_track')==='1'; }catch(_e){}\n      if(!force && hosts.indexOf(window.location.hostname||'')===-1) return;\n      window.dataLayer=window.dataLayer||[];\n      if(eventName.indexOf('hf_')!==0) window.dataLayer.push({ecommerce:null});\n      var o={event:eventName};\n      if(payload && typeof payload==='object'){\n        if(eventName.indexOf('hf_')===0){ for(var k in payload) if(Object.prototype.hasOwnProperty.call(payload,k)) o[k]=payload[k]; }\n        else { o.ecommerce=payload; }\n      }\n      window.dataLayer.push(o);\n    }catch(err){}\n  }\n\n  function incLi(x){\n    if(Object.prototype.toString.call(x)==='[object Array]'){\n      var you=(x[0].indexOf('Customer')>=0||x[0]==='Note')?' class=\"you\"':'';\n      return '<li'+you+'><b>'+x[0]+':<\/b> '+x[1]+'<\/li>';\n    }\n    return '<li'+(x.indexOf('not include')>=0?' class=\"na\"':'')+'>'+x+'<\/li>';\n  }\n\n  function cardHTML(c){\n    var s=stateFor(c);\n    var recBlock = c.recurring\n      ? '<div class=\"g-q\"><label>How often?<\/label><div class=\"g-seg\" id=\"rec_'+c.key+'\"><\/div><\/div>'+\n        '<div class=\"g-q\" id=\"freqq_'+c.key+'\" style=\"display:none\"><label>Frequency<\/label><div class=\"g-seg\" id=\"freq_'+c.key+'\"><\/div><\/div>'\n      : '';\n    var flow;\n    if(c.flow==='hourly'){\n      flow = recBlock+'<div class=\"g-q\"><label>How many cleaners?<\/label><div class=\"g-seg\" id=\"cl_'+c.key+'\"><\/div><\/div>'+\n        '<div class=\"g-q\"><label>How many hours?<\/label><div class=\"g-step\"><button data-a=\"hr-\">&minus;<\/button><div class=\"val\" id=\"hr_'+c.key+'\">2 <span>hours<\/span><\/div><button data-a=\"hr+\">+<\/button><\/div><\/div>';\n    } else if(c.flow==='housewash'){\n      flow = '<div class=\"g-q\"><label>How many stories?<\/label><div class=\"g-seg\" id=\"st_'+c.key+'\"><\/div><\/div>'+\n        '<div class=\"g-q\"><label>How many square feet is the home?<\/label><div class=\"g-step\"><button data-a=\"hsq-\">&minus;<\/button><div class=\"val\" id=\"hsq_'+c.key+'\">1,500<span>sq ft<\/span><\/div><button data-a=\"hsq+\">+<\/button><\/div>'+\n        '<div class=\"g-note\">'+c.note+'<\/div><\/div>';\n    } else if(c.flow==='pwarea'){\n      var qLabel = c.key==='fw' ? 'Approximate linear feet to wash?' : 'Approximate area to wash?';\n      flow = '<div class=\"g-q\"><label>'+qLabel+'<\/label><div class=\"g-step\"><button data-a=\"pwa-\">&minus;<\/button><div class=\"val\" id=\"pwa_'+c.key+'\">'+c.aDef.toLocaleString()+'<span>'+c.unit+'<\/span><\/div><button data-a=\"pwa+\">+<\/button><\/div>'+\n        '<div class=\"g-note\">'+c.note+'<\/div><\/div>';\n    } else if(c.flow==='loads'){\n      flow = '<div class=\"g-q\"><label>How many truckloads?<\/label><div class=\"g-step\"><button data-a=\"ld-\">&minus;<\/button><div class=\"val\" id=\"ld_'+c.key+'\">1<span>truckload<\/span><\/div><button data-a=\"ld+\">+<\/button><\/div>'+\n        '<div class=\"g-note\">'+c.note+'<\/div><\/div>';\n    } else if(c.flow==='pa'){\n      flow = '<div id=\"paq_'+c.key+'\"><\/div>';\n    } else if(c.flow==='flat'){\n      flow = c.note ? '<div class=\"g-q\"><div class=\"g-note\">'+c.note+'<\/div><\/div>' : '';\n    } else if(c.flow==='fl'){\n      flow = '<div id=\"flq_'+c.key+'\"><\/div>';\n    } else if(c.flow==='hi'||c.flow==='pm'){\n      flow = '<div id=\"dq_'+c.key+'\"><\/div>';\n    } else if(c.flow==='items'){\n      flow = '<div class=\"g-q\"><label>'+c.q+'<\/label>'+\n        '<div class=\"g-itemhead\"><span>'+c.colL+'<\/span><span>'+c.colR+'<\/span><\/div>'+\n        '<div id=\"rows_'+c.key+'\"><\/div>'+\n        '<div class=\"g-note\">Add every item you need. The price and duration update as you go.<\/div><\/div>';\n    } else {\n      flow = recBlock+'<div class=\"g-q\"><label>What type of property?<\/label><div class=\"g-seg\" id=\"pr_'+c.key+'\"><\/div><\/div>'+\n        '<div class=\"g-q\"><label>How many square feet?<\/label><div class=\"g-step\"><button data-a=\"sq-\">&minus;<\/button><div class=\"val\" id=\"sq_'+c.key+'\">1,001 - 2,000<span>sq ft<\/span><\/div><button data-a=\"sq+\">+<\/button><\/div><\/div>'+\n        '<div class=\"g-q\"><label>Bedrooms &amp; bathrooms<\/label><div class=\"g-rooms\">'+\n          ['beds','full','half'].map(function(k){var lbl=k==='beds'?'Bedrooms':(k==='full'?'Full Baths':'Half Baths');return '<div class=\"g-rc\"><div class=\"rl\">'+lbl+'<\/div><div class=\"rs\"><button data-a=\"'+k+'-\">&minus;<\/button><span class=\"v\" id=\"'+k+'_'+c.key+'\">'+(k==='beds'?1:(k==='full'?1:0))+'<\/span><button data-a=\"'+k+'+\">+<\/button><\/div><\/div>';}).join('')+\n        '<\/div><\/div>';\n    }\n    return '<div class=\"hfsk-glass\" data-key=\"'+c.key+'\">'+\n      '<div class=\"g-top\"><div><h3>'+c.title+'<\/h3><span class=\"g-badge\">'+c.badge+'<\/span><\/div>'+\n        '<div class=\"g-zip\"><label>Your ZIP code<\/label><div class=\"g-zipbox\" id=\"zb_'+c.key+'\"><span class=\"pin\">\ud83d\udccd<\/span>'+\n        '<input id=\"z_'+c.key+'\" type=\"text\" inputmode=\"numeric\" maxlength=\"5\" value=\"'+GZIP+'\" aria-label=\"ZIP code\"><\/div><\/div><\/div>'+\n      '<div class=\"g-inc'+(c.expand?' open':'')+'\" id=\"inc_'+c.key+'\"><button data-a=\"inc\">SERVICE INCLUDES <span class=\"car\">\u25be<\/span><\/button><ul>'+\n        c.inc.map(incLi).join('')+'<\/ul><\/div>'+\n      flow+\n      '<div class=\"g-foot\"><div class=\"g-row\"><div class=\"g-pr\"><div class=\"g-price\" id=\"pv_'+c.key+'\">&hellip;<\/div><div class=\"g-est\" id=\"est_'+c.key+'\"><\/div><\/div>'+\n        '<button class=\"g-book\" id=\"bk_'+c.key+'\">'+(c.book||'Book This Clean')+'<\/button><\/div>'+\n        '<div class=\"g-fine\">Upfront price &middot; free cancellation up to 24 hours before service<\/div><\/div>'+\n    '<\/div>';\n  }\n\n  var ST={};\n  function stateFor(c){\n    if(!ST[c.key]){\n      if(c.flow==='hourly') ST[c.key]={zip:GZIP,recurring:'One Time',frequency:'Weekly',cleaners:1,hours:2,data:null};\n      else if(c.flow==='housewash') ST[c.key]={zip:GZIP,stories:'1 Story',sqft:1500,data:null};\n      else if(c.flow==='pwarea') ST[c.key]={zip:GZIP,area:c.aDef,data:null};\n      else if(c.flow==='loads') ST[c.key]={zip:GZIP,loads:1,data:null};\n      else if(c.flow==='flat') ST[c.key]={zip:GZIP,data:null};\n      else if(c.flow==='fl'){\n        if(c.kind==='new') ST[c.key]={zip:GZIP,mat:0,wpat:0,tpat:0,vpat:0,tmat:0,inst:0,sq:4,data:null};\n        else if(c.kind==='rem') ST[c.key]={zip:GZIP,rt:0,sq:4,data:null};\n        else if(c.kind==='sand') ST[c.key]={zip:GZIP,sq:4,stain:FL_STAIN_SKIP,data:null};\n        else ST[c.key]={zip:GZIP,sq:4,data:null};\n      }\n      else if(c.flow==='hi') ST[c.key]={zip:GZIP,prop:0,hsq:2,raised:1,multi:0,hvac:0,age:0,data:null};\n      else if(c.flow==='pm') ST[c.key]={zip:GZIP,n:(c.kind==='photo'?3:1),data:null};\n      else if(c.flow==='items') ST[c.key]={zip:GZIP,qty:c.items.map(function(_,i){return i===0?1:0;}),data:null};\n      else if(c.flow==='pa'){\n        if(c.kind==='whole') ST[c.key]={zip:GZIP,ceil:0,sq:1,paint:0,data:null};\n        else if(c.kind==='rooms') ST[c.key]={zip:GZIP,ceil:0,n:1,paint:0,data:null};\n        else if(c.kind==='walls') ST[c.key]={zip:GZIP,n:1,paint:0,data:null};\n        else if(c.kind==='dry') ST[c.key]={zip:GZIP,qty:c.items.map(function(_,i){return i===0?1:0;}),data:null};\n        else ST[c.key]={zip:GZIP,siding:0,story:0,sq:1,gar:0,gsize:0,paint:0,data:null};\n      }\n      else ST[c.key]={zip:GZIP,recurring:'One Time',frequency:'Weekly',prop:'House \/ Townhouse',sqft:'1,001 - 2,000',beds:1,full:1,half:0,data:null};\n    }\n    return ST[c.key];\n  }\n\n  function renderDynamic(c){\n    var s=ST[c.key];\n    if(c.recurring){\n      var rc=document.getElementById('rec_'+c.key); rc.innerHTML='';\n      ['One Time','Recurring'].forEach(function(o){var b=document.createElement('button');b.textContent=o;if(o===s.recurring)b.className='on';b.onclick=function(){s.recurring=o; if(o==='Recurring'&&c.flow==='hourly'&&s.hours>4)s.hours=4; renderDynamic(c);update(c);};rc.appendChild(b);});\n      var fqW=document.getElementById('freqq_'+c.key), fq=document.getElementById('freq_'+c.key);\n      if(s.recurring==='Recurring'){ fqW.style.display=''; fq.innerHTML=''; ['Weekly','Bi-Weekly','Monthly'].forEach(function(o){var b=document.createElement('button');b.textContent=o;if(o===s.frequency)b.className='on';b.onclick=function(){s.frequency=o;renderDynamic(c);update(c);};fq.appendChild(b);}); }\n      else { fqW.style.display='none'; }\n    }\n    if(c.flow==='hourly'){\n      var cl=document.getElementById('cl_'+c.key); cl.innerHTML='';\n      ['1 Cleaner','2 Cleaners'].forEach(function(lbl,i){var n=i+1;var b=document.createElement('button');b.textContent=lbl;if(n===s.cleaners)b.className='on';b.onclick=function(){s.cleaners=n;renderDynamic(c);update(c);};cl.appendChild(b);});\n      document.getElementById('hr_'+c.key).innerHTML=s.hours+' <span>'+(s.hours===1?'hour':'hours')+'<\/span>';\n    } else if(c.flow==='housewash'){\n      var stEl=document.getElementById('st_'+c.key); stEl.innerHTML='';\n      STORIES.forEach(function(o){var b=document.createElement('button');b.textContent=o;if(o===s.stories)b.className='on';b.onclick=function(){s.stories=o;renderDynamic(c);update(c);};stEl.appendChild(b);});\n      document.getElementById('hsq_'+c.key).innerHTML=s.sqft.toLocaleString()+'<span>sq ft<\/span>';\n    } else if(c.flow==='pwarea'){\n      document.getElementById('pwa_'+c.key).innerHTML=s.area.toLocaleString()+'<span>'+c.unit+'<\/span>';\n    } else if(c.flow==='loads'){\n      document.getElementById('ld_'+c.key).innerHTML=s.loads+'<span>truckload'+(s.loads>1?'s':'')+'<\/span>';\n        } else if(c.flow==='pa'){\n      var seg=function(k,opts,sel,four){ return '<div class=\"g-seg'+(four?' four':'')+'\">'+opts.map(function(o,i){return '<button data-a=\"paseg\" data-k=\"'+k+'\" data-i=\"'+i+'\" class=\"'+(i===sel?'on':'')+'\">'+o+'<\/button>';}).join('')+'<\/div>'; };\n      var stp=function(k,txt,unit,atMin,atMax){ return '<div class=\"g-step\"><button data-a=\"pa'+k+'-\" '+(atMin?'disabled':'')+'>&minus;<\/button><div class=\"val\">'+txt+(unit?'<span>'+unit+'<\/span>':'')+'<\/div><button data-a=\"pa'+k+'+\" '+(atMax?'disabled':'')+'>+<\/button><\/div>'; };\n      var paintSeg='<div class=\"g-q\"><label>Should the pro supply the paint?<\/label>'+seg('paint',['No, I have paint','Yes, include paint'],s.paint)+'<\/div>';\n      var h='';\n      if(c.kind==='whole'){ h='<div class=\"g-q\"><label>What is the ceiling height?<\/label>'+seg('ceil',PA_CEILINGS,s.ceil)+'<\/div>'\n        +'<div class=\"g-q\"><label>How many square feet is the home?<\/label>'+stp('sq',PA_SQFT[s.sq],'sq ft',s.sq<=0,s.sq>=8)+'<\/div>'+paintSeg; }\n      else if(c.kind==='rooms'){ h='<div class=\"g-q\"><label>What is the ceiling height?<\/label>'+seg('ceil',PA_CEILINGS,s.ceil)+'<\/div>'\n        +'<div class=\"g-q\"><label>How many rooms?<\/label>'+stp('n',s.n,(s.n===1?'room':'rooms'),s.n<=1,s.n>=10)+'<\/div>'+paintSeg; }\n      else if(c.kind==='walls'){ h='<div class=\"g-q\"><label>How many walls?<\/label>'+stp('n',s.n,(s.n===1?'wall':'walls'),s.n<=1,s.n>=10)+'<\/div>'+paintSeg; }\n      else if(c.kind==='dry'){ h='<div class=\"g-q\"><label>'+c.q+'<\/label>'\n        +'<div class=\"g-itemhead\"><span>'+c.colL+'<\/span><span>'+c.colR+'<\/span><\/div>'\n        +c.items.map(function(lbl,i){var qy=s.qty[i]||0; return '<div class=\"g-item'+(qy>0?' picked':'')+'\"><div class=\"lbl\">'+lbl+'<\/div><div class=\"rs\"><button data-a=\"it-\" data-i=\"'+i+'\" '+(qy<=0?'disabled':'')+'>&minus;<\/button><span class=\"v\">'+qy+'<\/span><button data-a=\"it+\" data-i=\"'+i+'\" '+(qy>=9?'disabled':'')+'>+<\/button><\/div><\/div>';}).join('')+'<\/div>'; }\n      else { h='<div class=\"g-q\"><label>What type of siding?<\/label>'+seg('siding',PA_SIDINGS,s.siding,true)+'<\/div>'\n        +'<div class=\"g-q\"><label>How many stories?<\/label>'+seg('story',PA_STORIES,s.story)+'<\/div>'\n        +'<div class=\"g-q\"><label>How many square feet is the home?<\/label>'+stp('sq',PA_SQFT[s.sq],'sq ft',s.sq<=0,s.sq>=8)+'<\/div>'\n        +'<div class=\"g-q\"><label>Garage?<\/label>'+seg('gar',PA_GAR,s.gar)+'<\/div>'\n        +(s.gar>0?'<div class=\"g-q\"><label>What size is the garage?<\/label>'+seg('gsize',PA_GARSIZE,s.gsize)+'<\/div>':'')\n        +paintSeg; }\n      document.getElementById('paq_'+c.key).innerHTML=h+(c.note?'<div class=\"g-note\">'+c.note+'<\/div>':'');\n    } else if(c.flow==='items'){\n      var rEl=document.getElementById('rows_'+c.key);\n      rEl.innerHTML=c.items.map(function(lbl,i){var qy=s.qty[i]||0;\n        return '<div class=\"g-item'+(qy>0?' picked':'')+'\"><div class=\"lbl\">'+lbl+'<\/div><div class=\"rs\"><button data-a=\"it-\" data-i=\"'+i+'\" '+(qy<=0?'disabled':'')+'>&minus;<\/button><span class=\"v\">'+qy+'<\/span><button data-a=\"it+\" data-i=\"'+i+'\" '+(qy>=9?'disabled':'')+'>+<\/button><\/div><\/div>';}).join('');\n    } else if(c.flow==='flat'){\n    } else if(c.flow==='hi'){\n      \/\/ clamp sqft index when switching House (9 tiers) -> Apartment (5 tiers)\n      var hL=s.prop===0?HI_SQFT_HOUSE:HI_SQFT_APT;\n      if(s.hsq>hL.length-1) s.hsq=hL.length-1;\n      var hSeg=function(k,opts,sel,cls){ return '<div class=\"g-seg'+(cls?' '+cls:'')+'\">'+opts.map(function(o,i){return '<button data-a=\"flseg\" data-k=\"'+k+'\" data-i=\"'+i+'\" class=\"'+(i===sel?'on':'')+'\">'+o+'<\/button>';}).join('')+'<\/div>'; };\n      var hh='<div class=\"g-q\"><label>What type of property?<\/label>'+hSeg('prop',HI_PROPS,s.prop)+'<\/div>'\n        +'<div class=\"g-q\"><label>How many square feet?<\/label><div class=\"g-step\"><button data-a=\"hisq-\" '+(s.hsq<=0?'disabled':'')+'>&minus;<\/button><div class=\"val\">'+hL[s.hsq]+'<span>sq ft<\/span><\/div><button data-a=\"hisq+\" '+(s.hsq>=hL.length-1?'disabled':'')+'>+<\/button><\/div><\/div>';\n      if(s.prop===0){\n        hh+='<div class=\"g-q\"><label>Is the house on a raised foundation?<\/label>'+hSeg('raised',HI_RAISED,s.raised)+'<\/div>'\n          +'<div class=\"g-q\"><label>Multi-family house &amp; AC units<\/label><div class=\"g-rooms two\">'\n            +'<div class=\"g-rc\"><div class=\"rl\">Multi-Family<\/div><div class=\"rs\"><button data-a=\"him-\" '+(s.multi<=0?'disabled':'')+'>&minus;<\/button><span class=\"v\">'+(s.multi===0?'No':String(s.multi+1))+'<\/span><button data-a=\"him+\" '+(s.multi>=HI_MULTI.length-1?'disabled':'')+'>+<\/button><\/div><\/div>'\n            +'<div class=\"g-rc\"><div class=\"rl\">AC Units<\/div><div class=\"rs\"><button data-a=\"hia-\" '+(s.hvac<=0?'disabled':'')+'>&minus;<\/button><span class=\"v\">'+String(s.hvac+1)+'<\/span><button data-a=\"hia+\" '+(s.hvac>=HI_HVAC.length-1?'disabled':'')+'>+<\/button><\/div><\/div>'\n          +'<\/div><\/div>'\n          +'<div class=\"g-q\"><label>How old is the property?<\/label>'+hSeg('age',HI_AGE,s.age)+'<\/div>';\n      }\n      if(c.note) hh+='<div class=\"g-note\">'+c.note+'<\/div>';\n      document.getElementById('dq_'+c.key).innerHTML=hh;\n    } else if(c.flow==='pm'){\n      var pL=c.kind==='photo'?PM_COUNTS:PM_SQFT;\n      var pLbl=c.kind==='photo'?'How many photos?':'How many square feet is the property?';\n      var pUnit=c.kind==='photo'?'':'<span>sq ft<\/span>';\n      var ph='<div class=\"g-q\"><label>'+pLbl+'<\/label><div class=\"g-step\"><button data-a=\"pmn-\" '+(s.n<=0?'disabled':'')+'>&minus;<\/button><div class=\"val\">'+pL[s.n]+pUnit+'<\/div><button data-a=\"pmn+\" '+(s.n>=pL.length-1?'disabled':'')+'>+<\/button><\/div>'\n        +(c.note?'<div class=\"g-note\">'+c.note+'<\/div>':'')+'<\/div>';\n      document.getElementById('dq_'+c.key).innerHTML=ph;\n    } else if(c.flow==='fl'){\n      var fseg=function(k,opts,sel,cls){ return '<div class=\"g-seg'+(cls?' '+cls:'')+'\">'+opts.map(function(o,i){return '<button data-a=\"flseg\" data-k=\"'+k+'\" data-i=\"'+i+'\" class=\"'+(i===sel?'on':'')+'\">'+o+'<\/button>';}).join('')+'<\/div>'; };\n      var fsqStep='<div class=\"g-q\"><label>How many square feet?<\/label><div class=\"g-step\"><button data-a=\"flsq-\" '+(s.sq<=0?'disabled':'')+'>&minus;<\/button><div class=\"val\">'+parseInt(FL_SQFTS[s.sq],10).toLocaleString()+'<span>sq ft<\/span><\/div><button data-a=\"flsq+\" '+(s.sq>=FL_SQFTS.length-1?'disabled':'')+'>+<\/button><\/div><\/div>';\n      var fh='';\n      if(c.kind==='new'){\n        var fmat=FL_MATS[s.mat];\n        fh='<div class=\"g-q\"><label>What flooring material?<\/label>'+fseg('mat',FL_MATS,s.mat)+'<\/div>';\n        var pat=null, pk='', psel=0;\n        if(fmat==='Wood'){ pat=FL_WOOD_PATS; pk='wpat'; psel=s.wpat; }\n        else if(fmat==='Tile'){ pat=FL_TILE_PATS; pk='tpat'; psel=s.tpat; }\n        else if(fmat==='Vinyl'){ pat=FL_VINYL_PATS; pk='vpat'; psel=s.vpat; }\n        if(pat){\n          fh+='<div class=\"g-q\"><label>What pattern?<\/label>'+fseg(pk,pat,psel,'four')\n            +'<div class=\"g-flprev\"><img decoding=\"async\" src=\"'+FL_PAT_IMGS[pat[psel]]+'\" alt=\"'+pat[psel]+' pattern\" loading=\"lazy\"><span>'+pat[psel]+'<\/span><\/div><\/div>';\n        }\n        if(fmat==='Wood') fh+='<div class=\"g-q\"><label>Install method<\/label>'+fseg('inst',FL_INSTALLS,s.inst)+'<\/div>';\n        if(fmat==='Tile') fh+='<div class=\"g-q\"><label>What tile material?<\/label>'+fseg('tmat',FL_TMATS,s.tmat)+'<\/div>';\n        fh+=fsqStep;\n        \/\/ Chat-parity SERVICE INCLUDES per material\n        var fIncEl=document.querySelector('#inc_'+c.key+' ul');\n        if(fIncEl && FL_INC[fmat]) fIncEl.innerHTML=FL_INC[fmat].map(incLi).join('');\n      } else if(c.kind==='sand'){\n        fh=fsqStep\n          +'<div class=\"g-q\"><label>Stain color (your pro confirms on site)<\/label>'\n          +'<div class=\"g-flstain\"><select id=\"stain_'+c.key+'\" class=\"g-select\">'\n          +[FL_STAIN_SKIP].concat(FL_STAINS).map(function(o){return '<option value=\"'+o.replace(\/\"\/g,'&quot;')+'\"'+(o===s.stain?' selected':'')+'>'+o+'<\/option>';}).join('')\n          +'<\/select>'+(s.stain!==FL_STAIN_SKIP?'<img decoding=\"async\" src=\"'+FL_STAIN_IMGS[s.stain]+'\" alt=\"'+s.stain+'\">':'')+'<\/div>'\n          +(c.note?'<div class=\"g-note\">'+c.note+'<\/div>':'')+'<\/div>';\n      } else if(c.kind==='rem'){\n        fh='<div class=\"g-q\"><label>What flooring are we removing?<\/label>'+fseg('rt',FL_REMTYPES,s.rt)+'<\/div>'+fsqStep\n          +(c.note?'<div class=\"g-q\"><div class=\"g-note\">'+c.note+'<\/div><\/div>':'');\n      } else {\n        fh=fsqStep+(c.note?'<div class=\"g-q\"><div class=\"g-note\">'+c.note+'<\/div><\/div>':'');\n      }\n      document.getElementById('flq_'+c.key).innerHTML=fh;\n      var stSel=document.getElementById('stain_'+c.key);\n      if(stSel){ stSel.addEventListener('change',function(){ s.stain=this.value; renderDynamic(c); update(c); }); }\n    } else {\n      var pr=document.getElementById('pr_'+c.key); pr.innerHTML='';\n      PROPS.forEach(function(p){var b=document.createElement('button');b.textContent=p;if(p===s.prop)b.className='on';b.onclick=function(){s.prop=p;var o=isApt(p)?SQ_APT:SQ_HOUSE;if(o.indexOf(s.sqft)<0)s.sqft=o[1]||o[0];renderDynamic(c);update(c);};pr.appendChild(b);});\n      var l=isApt(s.prop)?SQ_APT:SQ_HOUSE, i=l.indexOf(s.sqft); if(i<0){i=1;s.sqft=l[1];}\n      document.getElementById('sq_'+c.key).innerHTML=s.sqft.replace(' sq ft','')+'<span>sq ft<\/span>';\n    }\n  }\n\n  function update(c){\n    var s=ST[c.key], pv=document.getElementById('pv_'+c.key), est=document.getElementById('est_'+c.key), bk=document.getElementById('bk_'+c.key);\n    if(!pv) return;\n    var q=document.querySelector('[data-key=\"'+c.key+'\"]');\n    if(c.flow==='hourly'){ var mxH=(s.recurring==='Recurring')?4:8; var l1=q.querySelector('[data-a=\"hr-\"]'), l2=q.querySelector('[data-a=\"hr+\"]'); if(l1)l1.disabled=s.hours<=1; if(l2)l2.disabled=s.hours>=mxH; }\n    else if(c.flow==='housewash'){ q.querySelector('[data-a=\"hsq-\"]').disabled=s.sqft<=1000; q.querySelector('[data-a=\"hsq+\"]').disabled=s.sqft>=5000; }\n    else if(c.flow==='pwarea'){ q.querySelector('[data-a=\"pwa-\"]').disabled=s.area<=c.aMin; q.querySelector('[data-a=\"pwa+\"]').disabled=s.area>=c.aMax; }\n    else if(c.flow==='loads'){ q.querySelector('[data-a=\"ld-\"]').disabled=s.loads<=1; q.querySelector('[data-a=\"ld+\"]').disabled=s.loads>=10; }\n    else if(c.flow==='items'){ }\n    else if(c.flow==='pa'){ }\n    else if(c.flow==='flat'){ }\n    else if(c.flow==='fl'){ }\n    else if(c.flow==='hi'||c.flow==='pm'){ }\n    else { var sl=isApt(s.prop)?SQ_APT:SQ_HOUSE,si=sl.indexOf(s.sqft); q.querySelector('[data-a=\"sq-\"]').disabled=si<=0; q.querySelector('[data-a=\"sq+\"]').disabled=si>=sl.length-1;\n      ['beds','full','half'].forEach(function(k){var mn=k==='half'?0:1; q.querySelector('[data-a=\"'+k+'-\"]').disabled=s[k]<=mn; q.querySelector('[data-a=\"'+k+'+\"]').disabled=s[k]>=9;}); }\n    if(!s.data){ pv.innerHTML='&hellip;'; pv.className='g-price'; est.textContent=''; bk.disabled=true; return; }\n    if(!s.data.available){ pv.textContent='Not available in your area yet'; pv.className='g-price na'; est.textContent=''; bk.disabled=true; return; }\n    var r=priceFor(c,s);\n    if(!r){ pv.innerHTML='&hellip;'; pv.className='g-price'; est.textContent=''; bk.disabled=true; return; }\n    if(r.none){ pv.textContent='Add an item'; pv.className='g-price na'; est.textContent=''; bk.disabled=true; return; }\n    pv.textContent=fmt(r.price); pv.className='g-price'; est.textContent='est. duration: '+fmtDur(r.dur); bk.disabled=false;\n  }\n\n  function fetchZip(c){\n    var s=ST[c.key]; s.data=null; update(c);\n    var reqZip=s.zip;\n    var body='zip='+encodeURIComponent(s.zip)+'&service_type='+encodeURIComponent(SERVICE)+'&cleaning_type='+encodeURIComponent(c.ct||'')+'&sub_service='+encodeURIComponent(c.sub);\n    fetch(CHECKZIP,{method:'POST',headers:{'X-Requested-With':'XMLHttpRequest','Content-Type':'application\/x-www-form-urlencoded'},body:body,credentials:'same-origin'})\n      .then(function(r){return r.json();})\n      .then(function(res){ if(s.zip!==reqZip)return; s.data={available:!!res.available, pricing:res.pricing||{}, tiers:res.fee_tiers||[], min:res.minimum_size_job||0, hourly_rate:res.hourly_rate||30};\n        if(!_hfSeenZips[reqZip]){ _hfSeenZips[reqZip]=1; _hfHeroPush(res.available?'hf_zip_check_pass':'hf_zip_check_fail', {hf_zip:{service:SERVICE, zip:reqZip, sub_service:c.sub}}); }\n        update(c); })\n      .catch(function(){ if(s.zip!==reqZip)return; s.data={available:false}; update(c); });\n  }\n\n  function bookURL(c){\n    var s=ST[c.key];\n    var p={ service:SERVICE, zip:s.zip, autobook:'1' };\n    if(SERVICE==='Painting'){\n      if(c.kind==='ext'){\n        p.pa_location='Exterior'; p.pa_sidingType=PA_SIDINGS[s.siding]; p.pa_extStories=PA_STORIES[s.story]; p.pa_sqft=PA_SQFT[s.sq];\n        p.pa_hasGarage=s.gar>0?'Yes':'No';\n        if(s.gar>0){ p.pa_garageType=s.gar===1?'Attached':'Detached'; p.pa_garageCount=PA_GARSIZE[s.gsize]; }\n        p.pa_paintSupply=s.paint===1?'Yes':'No';\n      } else {\n        p.pa_location='Interior';\n        if(c.kind==='whole'){ p.pa_intType='Whole Home'; p.pa_ceilingHeight=PA_CEILINGS[s.ceil]; p.pa_sqft=PA_SQFT[s.sq]; p.pa_paintSupply=s.paint===1?'Yes':'No'; }\n        else if(c.kind==='rooms'){ p.pa_intType='Single \/ Multi-Room'; p.pa_ceilingHeight=PA_CEILINGS[s.ceil]; p.pa_rooms=String(s.n); p.pa_paintSupply=s.paint===1?'Yes':'No'; }\n        else if(c.kind==='walls'){ p.pa_intType='Minor Touch Up'; p.pa_walls=String(s.n); p.pa_paintSupply=s.paint===1?'Yes':'No'; }\n        else { p.pa_intType='Drywall Repair'; var sel={}, parts=[];\n          for(var pi=0;pi<c.items.length;pi++){ var pqy=s.qty[pi]||0; if(pqy>0){ sel[c.items[pi]]=pqy; parts.push(pqy+' x '+c.items[pi]); } }\n          p.pa_repairItems_json=JSON.stringify(sel); p.pa_repairItems=parts.join(', '); }\n      }\n    } else if(SERVICE==='Handyman'){\n      p.hm_subService=c.sub;\n      var sel={}, parts=[];\n      for(var i=0;i<c.items.length;i++){ var qy=s.qty[i]||0; if(qy>0){ sel[c.items[i]]=qy; parts.push(qy+' x '+c.items[i]); } }\n      p.hm_items_json=JSON.stringify(sel);\n      p.hm_items=parts.join(', ');\n    } else if(SERVICE==='Plumbing'){\n      p.pl_subService=c.sub;\n      if(c.flow==='items'){\n        var plSel={}, plParts=[];\n        for(var pli=0;pli<c.items.length;pli++){ var plQ=s.qty[pli]||0; if(plQ>0){ plSel[c.items[pli]]=plQ; plParts.push(plQ+' x '+c.items[pli]); } }\n        p.pl_items_json=JSON.stringify(plSel);\n        p.pl_items=plParts.join(', ');\n      }\n    } else if(SERVICE==='Electric'){\n      p.el_subService=c.sub;\n      var elSel={}, elParts=[];\n      for(var eli=0;eli<c.items.length;eli++){ var elQ=s.qty[eli]||0; if(elQ>0){ elSel[c.items[eli]]=elQ; elParts.push(elQ+' x '+c.items[eli]); } }\n      p.el_items_json=JSON.stringify(elSel);\n      p.el_items=elParts.join(', ');\n    } else if(SERVICE==='Flooring'){\n      p.fl_type=c.sub;\n      if(c.kind==='new'){\n        var bMat=FL_MATS[s.mat]; p.fl_material=bMat;\n        if(bMat==='Wood'){ p.fl_woodPattern=FL_WOOD_PATS[s.wpat]; p.fl_installMethod=FL_INSTALLS[s.inst]; }\n        else if(bMat==='Tile'){ p.fl_tileMaterial=FL_TMATS[s.tmat]; p.fl_tilePattern=FL_TILE_PATS[s.tpat]; }\n        else if(bMat==='Vinyl'){ p.fl_vinylPattern=FL_VINYL_PATS[s.vpat]; }\n      } else if(c.kind==='sand'){\n        if(s.stain!==FL_STAIN_SKIP) p.fl_stainColor=s.stain;\n      } else if(c.kind==='rem'){\n        p.fl_removalType=FL_REMTYPES[s.rt];\n      }\n      p.fl_sqft=FL_SQFTS[s.sq];\n    } else if(SERVICE==='Home Inspection'){\n      p.hi_subService=c.sub;\n      if(c.flow==='hi'){\n        p.hi_propertyType=HI_PROPS[s.prop];\n        p.hi_sqft=(s.prop===0?HI_SQFT_HOUSE:HI_SQFT_APT)[s.hsq];\n        if(s.prop===0){\n          p.hi_raised=HI_RAISED[s.raised];\n          p.hi_multiFamily=HI_MULTI[s.multi];\n          p.hi_hvac=HI_HVAC[s.hvac];\n          p.hi_age=HI_AGE[s.age];\n        }\n      }\n    } else if(SERVICE==='Photo & Marketing'){\n      p.pm_subService=c.sub;\n      if(c.flow==='pm'){\n        if(c.kind==='photo') p.pm_photoCount=PM_COUNTS[s.n];\n        else if(c.pmkey==='plan') p.pm_planSqft=PM_SQFT[s.n];\n        else p.pm_tourSqft=PM_SQFT[s.n];\n      }\n    } else if(c.grp==='pw'){\n      p.cleaningType=c.ct; p.pressureWashType=c.sub;\n      if(c.flow==='housewash'){ p.stories=s.stories; p.houseWashSqft=String(s.sqft); }\n      else { p.area=String(s.area); }\n    } else if(c.grp==='junk'){\n      p.cleaningType=c.ct; p.truckloads=String(s.loads);\n    } else {\n      p.cleaningType=c.ct; p.houseCleaningType=c.sub;\n      if(c.recurring){ p.recurring=s.recurring; if(s.recurring==='Recurring') p.frequency=s.frequency; }\n      if(c.flow==='hourly'){ p.cleaners=(s.cleaners===2?'2 Cleaners':'1 Cleaner'); p.hours=s.hours+' HR'; }\n      else { p.propertyType=s.prop; p.sqft=s.sqft; p.bedrooms=String(s.beds); p.fullBaths=String(s.full); p.halfBaths=String(s.half); }\n    }\n    var qs=Object.keys(p).map(function(k){return encodeURIComponent(k)+'='+encodeURIComponent(p[k]);}).join('&');\n    return BOOK+'?'+qs;\n  }\n\n  function wireCard(c){\n    var s=stateFor(c);\n    var root=document.querySelector('[data-key=\"'+c.key+'\"]');\n    root.addEventListener('click',function(e){\n      var t=e.target.closest('[data-a]'); if(!t)return; var a=t.getAttribute('data-a');\n      if(a==='inc'){ document.getElementById('inc_'+c.key).classList.toggle('open'); return; }\n      if(a==='sq-'){ var l=isApt(s.prop)?SQ_APT:SQ_HOUSE,i=l.indexOf(s.sqft); if(i>0){s.sqft=l[i-1];renderDynamic(c);update(c);} }\n      else if(a==='sq+'){ var l2=isApt(s.prop)?SQ_APT:SQ_HOUSE,i2=l2.indexOf(s.sqft); if(i2<l2.length-1){s.sqft=l2[i2+1];renderDynamic(c);update(c);} }\n      else if(a==='hsq-'){ if(s.sqft>1000){s.sqft-=500;renderDynamic(c);update(c);} }\n      else if(a==='hsq+'){ if(s.sqft<5000){s.sqft+=500;renderDynamic(c);update(c);} }\n      else if(a==='pwa-'){ if(s.area>c.aMin){s.area-=c.aStep;renderDynamic(c);update(c);} }\n      else if(a==='pwa+'){ if(s.area<c.aMax){s.area+=c.aStep;renderDynamic(c);update(c);} }\n      else if(a==='ld-'){ if(s.loads>1){s.loads--;renderDynamic(c);update(c);} }\n      else if(a==='ld+'){ if(s.loads<10){s.loads++;renderDynamic(c);update(c);} }\n      else if(a==='it-'||a==='it+'){ var ii=+t.getAttribute('data-i'); var dd=(a==='it+')?1:-1; s.qty[ii]=Math.max(0,Math.min(9,(s.qty[ii]||0)+dd)); renderDynamic(c);update(c); }\n      else if(a==='paseg'){ var kk=t.getAttribute('data-k'), vi=+t.getAttribute('data-i'); s[kk==='ceil'?'ceil':kk==='paint'?'paint':kk==='siding'?'siding':kk==='story'?'story':kk==='gar'?'gar':'gsize']=vi; renderDynamic(c);update(c); }\n      else if(a==='pasq-'){ if(s.sq>0){s.sq--;renderDynamic(c);update(c);} }\n      else if(a==='pasq+'){ if(s.sq<8){s.sq++;renderDynamic(c);update(c);} }\n      else if(a==='flseg'){ var fk=t.getAttribute('data-k'), fvi=+t.getAttribute('data-i'); s[fk]=fvi; renderDynamic(c);update(c); }\n      else if(a==='flsq-'){ if(s.sq>0){s.sq--;renderDynamic(c);update(c);} }\n      else if(a==='flsq+'){ if(s.sq<FL_SQFTS.length-1){s.sq++;renderDynamic(c);update(c);} }\n      else if(a==='hisq-'){ if(s.hsq>0){s.hsq--;renderDynamic(c);update(c);} }\n      else if(a==='hisq+'){ var hMx=(s.prop===0?HI_SQFT_HOUSE:HI_SQFT_APT).length-1; if(s.hsq<hMx){s.hsq++;renderDynamic(c);update(c);} }\n      else if(a==='him-'){ if(s.multi>0){s.multi--;renderDynamic(c);update(c);} }\n      else if(a==='him+'){ if(s.multi<HI_MULTI.length-1){s.multi++;renderDynamic(c);update(c);} }\n      else if(a==='hia-'){ if(s.hvac>0){s.hvac--;renderDynamic(c);update(c);} }\n      else if(a==='hia+'){ if(s.hvac<HI_HVAC.length-1){s.hvac++;renderDynamic(c);update(c);} }\n      else if(a==='pmn-'){ if(s.n>0){s.n--;renderDynamic(c);update(c);} }\n      else if(a==='pmn+'){ var pMx=(c.kind==='photo'?PM_COUNTS:PM_SQFT).length-1; if(s.n<pMx){s.n++;renderDynamic(c);update(c);} }\n      else if(a==='pan-'){ if(s.n>1){s.n--;renderDynamic(c);update(c);} }\n      else if(a==='pan+'){ if(s.n<10){s.n++;renderDynamic(c);update(c);} }\n      else if(a==='hr-'){ if(s.hours>1){s.hours--;renderDynamic(c);update(c);} }\n      else if(a==='hr+'){ var mx=(s.recurring==='Recurring')?4:8; if(s.hours<mx){s.hours++;renderDynamic(c);update(c);} }\n      else if(\/^(beds|full|half)[+-]$\/.test(a)){ var k=a.slice(0,-1),d=a.slice(-1)==='+'?1:-1,mn=k==='half'?0:1; s[k]=Math.max(mn,Math.min(9,s[k]+d)); document.getElementById(k+'_'+c.key).textContent=s[k]; update(c); }\n    });\n    var zi=document.getElementById('z_'+c.key);\n    zi.addEventListener('input',function(){ this.value=this.value.replace(\/\\D\/g,'').slice(0,5); document.getElementById('zb_'+c.key).classList.toggle('bad',this.value.length!==5); if(this.value.length===5){ GZIP=this.value; s.zip=this.value; fetchZip(c);} });\n    document.getElementById('bk_'+c.key).addEventListener('click',function(){\n      if(!s.data||!s.data.available)return;\n      try{ window.dataLayer=window.dataLayer||[]; window.dataLayer.push({event:'hf_card_book', hf_service:c.sub, hf_zip:s.zip}); }catch(e){}\n      var bkVal=0; try{ bkVal=parseFloat((document.getElementById('pv_'+c.key).textContent||'').replace(\/[^0-9.]\/g,''))||0; }catch(e){}\n      _hfHeroPush('begin_checkout', {currency:'USD', value:bkVal, items:[{item_id:'hero_'+c.key, item_name:c.sub, item_category:SERVICE, price:bkVal, quantity:1}]});\n      window.location.href=bookURL(c);\n    });\n    renderDynamic(c); update(c);\n    if(s.zip!==GZIP){ s.zip=GZIP; s.data=null; }\n    if(!s.data) fetchZip(c); else update(c);\n  }\n\n  var currentGrp=CARDS[0].grp;\n  var currentByGrp={};\n  CARDS.forEach(function(x){ if(!currentByGrp[x.grp]) currentByGrp[x.grp]=x.key; });\n  function byKey(k){ for(var i=0;i<CARDS.length;i++){ if(CARDS[i].key===k) return CARDS[i]; } return CARDS[0]; }\n  function renderCats(){\n    if(!SHOWCATS) return;\n    document.getElementById('hfskCats').style.display='';\n    document.getElementById('hfskDiv').style.display='';\n    var el=document.getElementById('hfskCats'); el.innerHTML='';\n    el.className='hfsk-pills fixedrow';\n    CATS.forEach(function(c){\n      var b=document.createElement('button'); b.type='button';\n      b.className='hfsk-pill'+(c.key===currentGrp?' on':'');\n      b.textContent=c.label;\n      b.onclick=function(){ if(currentGrp===c.key)return; currentGrp=c.key;\n        try{ window.dataLayer=window.dataLayer||[]; window.dataLayer.push({event:'hf_hero_select', hf_kind:'category', hf_value:c.label}); }catch(e){}\n        _hfHeroPush('view_item_list', {item_list_name:SERVICE+' - '+c.label, items:CARDS.filter(function(x){return x.grp===c.key;}).map(function(x,i){return {item_id:'hero_'+x.key, item_name:x.sub, item_category:SERVICE, index:i, quantity:1};})});\n        renderCats(); renderSubs(); mountCard(); b.blur(); };\n      el.appendChild(b);\n    });\n  }\n  function renderSubs(){\n    var el=document.getElementById('hfskSubs'); el.innerHTML='';\n    var rows={}, order=[], hasFixed=false;\n    CARDS.forEach(function(x){ if(x.grp!==currentGrp) return; var rk=x.row||1; if(x.row)hasFixed=true; if(!rows[rk]){rows[rk]=[];order.push(rk);} rows[rk].push(x); });\n    order.sort(function(a,b){return a-b;});\n    order.forEach(function(rk){\n      var rowEl=document.createElement('div');\n      var maxLen=0; rows[rk].forEach(function(x){ var L=(x.pt||x.title).length; if(L>maxLen)maxLen=L; });\n      rowEl.className='hfsk-pills'+(hasFixed?' fixedrow':'')+(hasFixed&&maxLen<=14?' compact':'');\n      rows[rk].forEach(function(x){\n        var b=document.createElement('button'); b.type='button';\n        b.className='hfsk-pill'+(x.key===currentByGrp[currentGrp]?' on':'');\n        b.textContent=x.pt||x.title;\n        b.onclick=function(){ if(currentByGrp[currentGrp]===x.key)return; currentByGrp[currentGrp]=x.key;\n          try{ window.dataLayer=window.dataLayer||[]; window.dataLayer.push({event:'hf_hero_select', hf_kind:'sub_service', hf_value:x.sub}); }catch(e){}\n          renderSubs(); mountCard(); b.blur(); };\n        rowEl.appendChild(b);\n      });\n      el.appendChild(rowEl);\n    });\n  }\n  function mountCard(){\n    var c=byKey(currentByGrp[currentGrp]);\n    document.getElementById('hfskMount').innerHTML=cardHTML(c);\n    wireCard(c);\n    if(!_hfSeenCards[c.key]){ _hfSeenCards[c.key]=1;\n      _hfHeroPush('view_item', {currency:'USD', items:[{item_id:'hero_'+c.key, item_name:c.sub, item_category:SERVICE, quantity:1}]}); }\n  }\n  function boot(){ renderCats(); renderSubs(); mountCard(); }\n  if(document.readyState==='loading') document.addEventListener('DOMContentLoaded', boot); else boot();\n})();\n<\/script>\n<!-- ================= END HOUSE FLY SMOKE HERO ================= -->\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5a5d5f2 e-con-full e-flex e-con e-parent\" data-id=\"5a5d5f2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bf0675a elementor-widget elementor-widget-html\" data-id=\"bf0675a\" 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.hf-plb-cards{max-width:1200px;margin:0 auto;padding:80px 20px 20px}\n.hf-plb-cards h2{text-align:center;font-size:2rem;color:#3D4F6F;margin-bottom:8px}\n.hf-plb-cards .hf-plb-sub{text-align:center;color:#666;margin-bottom:40px;font-size:1.05rem}\n.hf-plb-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:24px}\n.hf-plb-card{background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 2px 12px rgba(0,0,0,.08);transition:transform .3s,box-shadow .3s}\n.hf-plb-card:hover{transform:translateY(-4px);box-shadow:0 8px 24px rgba(0,0,0,.12)}\n.hf-plb-card img{width:100%;height:200px;object-fit:cover}\n.hf-plb-card-body{padding:20px}\n.hf-plb-card-body h3{font-size:1.1rem;color:#3D4F6F;margin:0 0 8px}\n.hf-plb-card-body .hf-plb-meta{font-size:.85rem;color:#888;margin-bottom:12px}\n.hf-plb-card-body ul{list-style:none;padding:0;margin:0 0 16px}\n.hf-plb-card-body ul li{font-size:.9rem;color:#555;padding:4px 0;padding-left:20px;position:relative}\n.hf-plb-card-body ul li::before{content:\"\\2713\";position:absolute;left:0;color:#2ED87A;font-weight:700}\n.hf-plb-btn{display:inline-block;background:#40C9F3;color:#fff;padding:10px 24px;border-radius:8px;text-decoration:none;font-weight:600;font-size:.9rem;transition:background .3s}\n.hf-plb-btn:hover{background:#2ED87A}\n@media(max-width:1024px){.hf-plb-grid{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:600px){.hf-plb-grid{grid-template-columns:1fr}.hf-plb-cards h2{font-size:1.5rem}}\n\/* HF-SVC-V2 *\/.hf-hm-cards h2{color:#40C9F3!important}\n\/* hf-plb-what-we-offer-eyebrow-2026-05-31 *\/\n.hf-plb-eyebrow{font-size:27.5px;font-weight:800;letter-spacing:2.5px;color:#29ABE2;text-transform:uppercase;margin-bottom:14px;line-height:1.1;text-align:center}\n@media(max-width:700px){.hf-plb-eyebrow{font-size:25px;letter-spacing:2px;margin-bottom:12px}}\n<\/style>\n<div class=\"hf-plb-cards\">\n<div class=\"hf-plb-eyebrow\">What We Offer<\/div>\n<h2>Our Plumbing Services<\/h2>\n<p class=\"hf-plb-sub\">Professional plumbers for all your home service needs. See job descriptions and upfront prices before booking.<\/p>\n<div class=\"hf-plb-grid\">\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2024\/05\/Frame-1000010553-35.png\" alt=\"Kitchen Fixture Replacement\">\n<div class=\"hf-plb-card-body\">\n<h3>Kitchen Fixture Replacement<\/h3>\n<ul><li>Sink Faucet<\/li><li>Garbage Disposal<\/li><li>Dishwasher<\/li><li>Gas Stove<\/li><li>Refrigerator Water Supply Line<\/li><\/ul>\n<\/div><\/div>\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2024\/05\/Frame-1000010553-36.png\" alt=\"Bath \/ Utility Fixture Replacement\">\n<div class=\"hf-plb-card-body\">\n<h3>Bath \/ Utility Fixture Replacement<\/h3>\n<ul><li>Washer \/ Dryer<\/li><li>Toilet<\/li><li>Sink Faucet<\/li><li>Shower Head<\/li><\/ul>\n<\/div><\/div>\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/Bathroom-Vanity-Replacement.png\" alt=\"Vanity \/ Utility Sink\">\n<div class=\"hf-plb-card-body\">\n<h3>Vanity \/ Utility Sink<\/h3>\n<ul><li>Single Sink - Up to 36\" Wide<\/li><li>Single Sink - Up to 72\" Wide<\/li><li>Double Sink - Up to 72\" Wide<\/li><li>Double Sink - Up to 90\" Wide<\/li><\/ul>\n<\/div><\/div>\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2024\/05\/Frame-1000010553-36.png\" alt=\"Toilet Repair\">\n<div class=\"hf-plb-card-body\">\n<h3>Toilet Repair<\/h3>\n<ul><li>Diagnosing and fixing common toilet issues such as running water, weak flush, leaks, and unusual noises<\/li><\/ul>\n<\/div><\/div>\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2024\/05\/Frame-1000010553-35.png\" alt=\"Leaking Faucet Repair\">\n<div class=\"hf-plb-card-body\">\n<h3>Leaking Faucet Repair<\/h3>\n<ul><li>Identifying and repairing the source of a faucet leak to restore proper function and prevent water waste or damage<\/li><\/ul>\n<\/div><\/div>\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2024\/05\/Frame-1000010553-36.png\" alt=\"Drain Clog Removal\">\n<div class=\"hf-plb-card-body\">\n<h3>Drain Clog Removal<\/h3>\n<ul><li>Sink<\/li><li>Bath \/ Shower<\/li><li>Toilet<\/li><li>Dishwasher<\/li><\/ul>\n<\/div><\/div>\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/Bathroom-Vanity-Replacement.png\" alt=\"Camera Inspection\">\n<div class=\"hf-plb-card-body\">\n<h3>Camera Inspection<\/h3>\n<ul><li>A thorough examination of a property's plumbing system using a specialized waterproof camera to identify blockages, leaks, and other issues within the pipes<\/li><\/ul>\n<\/div><\/div>\n\n<div class=\"hf-plb-card\">\n<img decoding=\"async\" src=\"https:\/\/housefly.com\/wp-content\/uploads\/2024\/05\/Frame-1000010553-35.png\" alt=\"Hydro Clean\">\n<div class=\"hf-plb-card-body\">\n<h3>Hydro Clean<\/h3>\n<ul><li>A thorough cleaning process that utilizes high-pressure water to clear blockages, buildup, and debris from pipes, restoring optimal flow and function to the plumbing system<\/li><\/ul>\n<\/div><\/div>\n\n<\/div>\n\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-06ef81b e-con-full e-flex e-con e-parent\" data-id=\"06ef81b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3b12501 elementor-widget elementor-widget-html\" data-id=\"3b12501\" 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>#hf-optimized-faqs{display:none!important}<\/style>\n<!-- plumbing-HIW-from-parent-671577f-2026-05-29 -->\n<style>\n.hf-svc-hiw{max-width:1200px;margin:0 auto;padding:42px 24px;font-family:'Inter',-apple-system,sans-serif;text-align:center}\n.hf-svc-hiw *{box-sizing:border-box}\n.hf-svc-hiw-label{font-size:26px;font-weight:700;letter-spacing:3px;text-transform:uppercase;color:#40C9F3;margin-bottom:12px}\n.hf-svc-hiw h2{font-size:clamp(28px,4vw,42px);font-weight:800;color:#2D3E50;margin:0 0 12px}\n.hf-svc-hiw-sub{font-size:17px;color:#6b7d93;max-width:560px;margin:0 auto 48px;line-height:1.6}\n.hf-svc-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:32px;position:relative}\n.hf-svc-steps::before{content:'';position:absolute;top:36px;left:12%;right:12%;height:2px;background:linear-gradient(90deg,#2ED87A,#40C9F3);z-index:0}\n.hf-svc-step{position:relative;z-index:1}\n.hf-svc-step-num{width:72px;height:72px;border-radius:50%;background:#fff;border:2px solid #eef2f6;display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-size:13px;font-weight:700;color:#fff;position:relative}\n.hf-svc-step-num-inner{width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center}\n.hf-sn-1 .hf-svc-step-num-inner{background:#2ED87A}\n.hf-sn-2 .hf-svc-step-num-inner{background:#40C9F3}\n.hf-sn-3 .hf-svc-step-num-inner{background:#3D4F6F}\n.hf-sn-4 .hf-svc-step-num-inner{background:#2ED87A}\n.hf-svc-step-num svg{width:26px;height:26px;fill:#fff}\n.hf-svc-step h3{font-size:16px;font-weight:700;color:#2D3E50;margin:0 0 8px}\n.hf-svc-step p{font-size:13px;color:#6b7d93;line-height:1.5;margin:0}\n\n\n.hf-svc-trust2 img:hover{opacity:1}\n@media(max-width:768px){\n  \/* hf-svc-hiw-mobile-stack-2026-05-28: mirror home hf-hiw2 mobile stack layout *\/\n  \/* hf-svc-hiw-mobile-top-gap-2026-05-29: breathing room above HIW section under svc-grid *\/\n  .hf-svc-hiw{padding:64px 18px 28px}\n  .hf-svc-hiw-label{font-size:25px;letter-spacing:2px;margin-bottom:12px}\n  .hf-svc-hiw h2{font-size:26px;line-height:1.2;margin-bottom:10px}\n  .hf-svc-hiw-sub{font-size:14px;max-width:340px;margin:0 auto 32px}\n  .hf-svc-steps{grid-template-columns:1fr;gap:0;padding:0 0 0 6px;position:relative;margin-bottom:0}\n  .hf-svc-steps::before{display:block;top:27px;bottom:27px;left:31px;right:auto;width:2px;height:auto;background:linear-gradient(180deg,#2ED87A,#40C9F3,#3D4F6F);border-radius:2px}\n  .hf-svc-step{display:grid;grid-template-columns:64px 1fr;grid-template-rows:auto auto;column-gap:18px;row-gap:6px;align-items:start;text-align:left;padding-bottom:28px}\n  .hf-svc-step:last-child{padding-bottom:0}\n  .hf-svc-step-num{grid-column:1;grid-row:1 \/ span 2;width:54px;height:54px;margin:0;justify-self:start;margin-left:4px;box-shadow:0 4px 12px rgba(41,171,226,.18)}\n  .hf-svc-step-num-inner{width:42px;height:42px}\n  .hf-svc-step-num svg{width:20px;height:20px}\n  .hf-svc-step h3{grid-column:2;grid-row:1;font-size:16.5px;font-weight:700;color:#40C9F3;margin:0;padding-top:4px;line-height:1.25}\n  .hf-svc-step p{grid-column:2;grid-row:2;font-size:13.5px;color:#000;line-height:1.55;margin:0;padding-top:2px}\n}\n<\/style><div class=\"hf-svc-hiw\">\n  <div class=\"hf-svc-hiw-label\">HOW IT WORKS<\/div>\n  <h2>From Selection to Done in Just a Few Taps<\/h2>\n  <p class=\"hf-svc-hiw-sub\">No phone tag. No guessing games. One upfront price, hand-matched pros, and total peace of mind.<\/p>\n  <div class=\"hf-svc-steps\">\n    <div class=\"hf-svc-step hf-sn-1\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0016 9.5 6.5 6.5 0 109.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"><\/path><\/svg><\/div><\/div>\n      <h3>Select Your Service<\/h3>\n      <p>Pick your service, set the details, and see your real upfront price instantly.<\/p>\n    <\/div>\n    <div class=\"hf-svc-step hf-sn-2\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"><\/path><\/svg><\/div><\/div>\n      <h3>Schedule The Job<\/h3>\n      <p>Select the day and time best for you and checkout with any of our secure payment options.<\/p>\n    <\/div>\n    <div class=\"hf-svc-step hf-sn-3\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z\"><\/path><\/svg><\/div><\/div>\n      <h3>Sit Back And Relax<\/h3>\n      <p>House Fly takes care of all pro-matching, scheduling, communication, and payments.<\/p>\n    <\/div>\n    \n  <\/div>\n  <\/div>\n\n<!-- plumbing-Common-Questions-from-parent-68f9d25-2026-05-29 -->\n<div class=\"hf-cq\">\n  <div class=\"hf-cq-head\">\n    <div class=\"hf-cq-eyebrow\">Common Questions<\/div>\n    <h2 class=\"hf-cq-title\">Ask Homer Anything<\/h2>\n    <p class=\"hf-cq-sub\">Select a question to start a chat with Homer.<\/p>\n  <\/div>\n  <div class=\"hf-cq-chips\">\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;What is your cancellation policy?&quot;)\">\n      <span class=\"hf-cq-q\">What&rsquo;s the cancellation policy?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;Can I book a same-day service?&quot;)\">\n      <span class=\"hf-cq-q\">Same-day booking?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;What payment methods do you accept?&quot;)\">\n      <span class=\"hf-cq-q\">Payment methods?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n  <\/div>\n<\/div>\n\n<style>\n\/* Match Simple-by-Design header proportions (.hf-hiw2-eyebrow\/.hf-hiw2-title\/.hf-hiw2-sub) *\/\n\/* hf-cq-bottom-gap-2026-05-29: separation from \"We're here to help\" section *\/\n.hf-cq { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; max-width: 1140px; margin: 0 auto; padding: 60px 24px 56px; color: #000; box-sizing: border-box; }\n.hf-cq * { box-sizing: border-box; }\n.hf-cq-head { text-align: center; margin-bottom: 48px; }\n.hf-cq-eyebrow { font-size: 27.5px; font-weight: 800; letter-spacing: 2.5px; text-transform: uppercase; color: #29ABE2; margin: 0 0 14px; line-height: 1.1; font-family: inherit; }\n.hf-cq-title { font-size: 38px; font-weight: 800; color: #000; line-height: 1.18; margin: 0 0 14px; letter-spacing: -0.5px; font-family: inherit; }\n.hf-cq-sub { font-size: 16px; color: #000; max-width: 520px; margin: 0 auto; line-height: 1.6; font-family: inherit; }\n\n\/* Chips \u2014 no card wrapper, sit directly on the page background *\/\n.hf-cq-chips { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; max-width: 680px; margin: 0 auto; padding: 0 16px; }\n.hf-cq-chip { background: #F1F5F9; border: 1px solid #E2E8F0; border-radius: 99px; padding: 12px 20px; font-size: 14px; color: #1E293B; font-weight: 600; cursor: pointer; transition: all .15s; font-family: inherit; display: inline-flex; align-items: center; gap: 8px; }\n.hf-cq-chip:hover { background: #E0F2FE; border-color: #7DD3FC; color: #0C4A6E; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(64,201,243,0.18); }\n.hf-cq-chip:active { transform: translateY(0); }\n.hf-cq-chip.hf-cq-loading { opacity: 0.65; cursor: wait; }\n.hf-cq-arrow { color: #94A3B8; font-size: 12px; }\n.hf-cq-chip:hover .hf-cq-arrow { color: #29ABE2; }\n\n\/* \"View All FAQs \u2192\" Elementor button widget #0ce9e01 \u2014 turn link blue *\/\n.elementor-element-0ce9e01 .elementor-button,\n.elementor-element-0ce9e01 .elementor-button-text,\n.elementor-element-0ce9e01 .elementor-button .elementor-button-text { color: #29ABE2 !important; }\n.elementor-element-0ce9e01 .elementor-button:hover .elementor-button-text { color: #0891B2 !important; }\n\n\/* Hide snippet 3650's invisible-but-present accordion on homepage (was set earlier) *\/\nbody.home #hf-optimized-faqs, body.page-id-2229 #hf-optimized-faqs, body.page-id-538 #hf-optimized-faqs { display: none !important; }\n\n\/* Mobile \u2014 match SBD breakpoints *\/\n@media (max-width: 900px) {\n  .hf-cq { padding: 50px 20px 44px; }\n  .hf-cq-head { margin-bottom: 36px; }\n  .hf-cq-eyebrow { font-size: 25px; letter-spacing: 2px; margin-bottom: 12px; }\n  .hf-cq-sub { font-size: 14px; max-width: 340px; }\n}\n@media (max-width: 700px) {\n  .hf-cq { padding: 40px 18px 36px; }\n  .hf-cq-eyebrow { font-size: 22px; letter-spacing: 1.8px; }\n  .hf-cq-title { font-size: 28px; }\n  .hf-cq-chips { gap: 10px; }\n  .hf-cq-chip { padding: 10px 16px; font-size: 13px; }\n}\n<\/style>\n\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"How does House Fly work for booking home services?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly is a concierge home services platform serving the Greater New Orleans area. Chat with Homer, pick your date and time, and pay upfront. A local home services pro arrives and completes the work. Transparent pricing, instant booking, and a real rep manages the job from start to finish.\"}},{\"@type\":\"Question\",\"name\":\"Are there any hidden fees with House Fly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. The service fee is built into the upfront price shown when you book, so there are no surprise charges at checkout or after service. The price you see is the price you pay. Payments are processed securely through Stripe with no extra processing fees added at checkout.\"}},{\"@type\":\"Question\",\"name\":\"What is House Fly's cancellation policy?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"You can cancel any House Fly booking for free up to 24 hours before the scheduled appointment and receive a full refund. Cancellations inside the 24-hour window may incur a small fee depending on the service. Reschedule any time by chatting with Homer or contacting House Fly support.\"}},{\"@type\":\"Question\",\"name\":\"Can I book same-day home services with House Fly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Most House Fly home services have same-day or next-day availability across the Greater New Orleans coverage area. Available time slots appear in real time when you book through Homer. Emergency services like plumbing leaks are often dispatched within a couple of hours of booking.\"}},{\"@type\":\"Question\",\"name\":\"What payment methods does House Fly accept?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly accepts all major credit cards, Apple Pay, and PayPal. All payments are processed securely through Stripe's PCI-compliant infrastructure. Your card is charged only when you confirm the booking. You can save a payment method to your account for one-tap rebooking on future services.\"}},{\"@type\":\"Question\",\"name\":\"How does House Fly choose its home services pros?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly hand-selects local home services pros through a diligence process that includes reviewing each pro's Google Business Profile, customer reviews, and operating history. We work only with pros that demonstrate a strong track record of quality work in their local area.\"}}]}<\/script>\n\n<script>\n(function(){\n  function getInput(){\n    var f = document.getElementById('hfCcFrame');\n    try { return f && f.contentDocument && f.contentDocument.querySelector('#hfAiSearchInput'); }\n    catch(e){ return null; }\n  }\n  function inject(q, btn, tries){\n    var input = getInput();\n    if (input) {\n      try {\n        input.value = q;\n        input.dispatchEvent(new Event('input', {bubbles:true}));\n        var form = input.form || document.getElementById('hfCcFrame').contentDocument.getElementById('hfAiSearchForm');\n        if (form) {\n          if (typeof form.requestSubmit === 'function') form.requestSubmit();\n          else form.dispatchEvent(new Event('submit', {bubbles:true, cancelable:true}));\n        }\n      } catch(e){}\n      if (btn) btn.classList.remove('hf-cq-loading');\n      return;\n    }\n    if (tries > 0) setTimeout(function(){ inject(q, btn, tries - 1); }, 300);\n    else if (btn) btn.classList.remove('hf-cq-loading');\n  }\n  window.hfCqAsk = function(btn, q){\n    if (btn && btn.classList) btn.classList.add('hf-cq-loading');\n    var launcher = document.getElementById('hfCcLauncher');\n    if (launcher) launcher.click();\n    setTimeout(function(){ inject(q, btn, 20); }, 400);\n  };\n})();\n<\/script>\n<!-- plumbing-Help-from-parent-7f6a459-2026-05-29 -->\n<style>\n.hf-contact{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;width:100%;background:linear-gradient(180deg,#f8fbfd 0%,#f1f6fb 100%);padding:48px 20px;text-align:center}\n.hf-contact *{box-sizing:border-box;margin:0;padding:0}\n.hf-contact-inner{max-width:520px;margin:0 auto}\n.hf-contact-heading{font-size:30px;font-weight:800;color:#000;margin:0 0 10px;line-height:1.2;letter-spacing:-.3px}\n.hf-contact-sub{font-size:15px;color:#000;margin:0 auto 26px;max-width:340px;line-height:1.5}\n\n.hf-chat-cta{display:inline-flex;align-items:center;justify-content:center;gap:10px;background:#29ABE2;color:#fff;font-weight:700;font-size:16px;padding:16px 36px;border-radius:12px;border:0;cursor:pointer;text-decoration:none;box-shadow:0 10px 28px rgba(41,171,226,.32);font-family:inherit;line-height:1;transition:transform .2s,box-shadow .2s;position:relative;margin-bottom:24px}\n.hf-chat-cta{-webkit-tap-highlight-color:rgba(46,216,122,.3)}.hf-chat-cta:hover{transform:translateY(-2px);box-shadow:0 14px 32px rgba(46,216,122,.4);background:#2ED87A;color:#fff}.hf-chat-cta:active,.hf-chat-cta:focus,.hf-chat-cta:focus-visible{background:#29ABE2!important;color:#fff!important;outline:2px solid #29ABE2!important;outline-offset:2px;-webkit-tap-highlight-color:transparent}\/* hf-cta-no-red-2026-05-24 *\/\n.hf-chat-cta svg{width:20px;height:20px;fill:#fff}\n.hf-chat-cta-dot{position:absolute;top:13px;right:18px;width:8px;height:8px;border-radius:50%;background:#2ED87A;box-shadow:0 0 0 4px rgba(46,216,122,.25);animation:hfPulse 2s infinite}\n@keyframes hfPulse{0%,100%{box-shadow:0 0 0 4px rgba(46,216,122,.25)}50%{box-shadow:0 0 0 8px rgba(46,216,122,.10)}}\n\n.hf-contact-divider{display:flex;align-items:center;gap:12px;color:#8a9ab0;font-size:11px;letter-spacing:1.8px;text-transform:uppercase;font-weight:700;margin-bottom:18px}\n.hf-contact-divider::before,.hf-contact-divider::after{content:\"\";flex:1;height:1px;background:#d8e0ea}\n\n.hf-contact-links{display:flex;flex-direction:column;gap:10px}\n.hf-contact-link{display:flex;align-items:center;gap:14px;padding:16px 22px;border-radius:14px;color:#fff;text-decoration:none;transition:transform .2s,box-shadow .2s;font-size:15px;font-weight:600;line-height:1.2}\n.hf-contact-link:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.18);color:#fff;text-decoration:none}\n.hf-contact-link .ic{width:36px;height:36px;border-radius:10px;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.hf-contact-link .ic svg{width:20px;height:20px;fill:#fff}\n.hf-contact-link .lbl{font-weight:700;font-size:15px;color:#fff}\n.hf-contact-link .inf{margin-left:auto;font-weight:700;font-size:15px;color:#fff;letter-spacing:.2px}\n\n.hf-cc-call{background:linear-gradient(135deg,#2ED87A 0%,#24b866 100%)}\n.hf-cc-text{background:linear-gradient(135deg,#40C9F3 0%,#2ba8d4 100%)}\n.hf-cc-email{background:linear-gradient(135deg,#3D4F6F 0%,#2f3e58 100%)}\n\n@media (max-width:600px){\n  .hf-contact{padding:40px 16px}\n  .hf-contact-heading{font-size:26px}\n  .hf-contact-sub{font-size:14px;margin-bottom:22px}\n  .hf-chat-cta{padding:15px 30px;font-size:15px;margin-bottom:20px}\n  .hf-contact-link{padding:14px 18px}\n  .hf-contact-link .lbl{font-size:14px}\n  .hf-contact-link .inf{font-size:14px}\n}\n@media (max-width:380px){\n  .hf-contact-heading{font-size:22px}\n  .hf-contact-link{padding:13px 14px;gap:10px}\n  .hf-contact-link .ic{width:32px;height:32px}\n  .hf-contact-link .ic svg{width:18px;height:18px}\n  .hf-contact-link .lbl{font-size:13px}\n  .hf-contact-link .inf{font-size:13px;letter-spacing:0}\n}\n\n@media (min-width: 768px) {\n  \/* hf-help-desktop-grid-2026-05-28: 3 square cards side-by-side on wide viewports *\/\n  .hf-contact-inner { max-width: 1000px; }\n  .hf-contact-links { flex-direction: row; gap: 20px; align-items: stretch; }\n  .hf-contact-link {\n    flex: 1 1 0;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    text-align: center;\n    padding: 36px 24px;\n    gap: 16px;\n    min-height: 230px;\n    border-radius: 20px;\n  }\n  .hf-contact-link .ic {\n    width: 64px;\n    height: 64px;\n    border-radius: 50%;\n  }\n  .hf-contact-link .ic svg { width: 28px; height: 28px; }\n  .hf-contact-link .lbl { font-size: 22px; font-weight: 800; }\n  .hf-contact-link .lbl::after { content: ' Us'; }\n  .hf-contact-link .inf { margin-left: 0; font-size: 15px; font-weight: 500; opacity: .95; letter-spacing: .2px; }\n}\n<\/style>\n<div class=\"hf-contact\">\n  <div class=\"hf-contact-inner\">\n    <h2 class=\"hf-contact-heading\">We're Here to Help<\/h2>\n    <p class=\"hf-contact-sub\">Reach out however works best for you.<\/p>\n\n    <button type=\"button\" class=\"hf-chat-cta\" onclick=\"var l=document.getElementById('hfCcLauncher');if(l){l.click();}\">\n      <svg viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"\/><\/svg>\n      Chat with Homer\n      <span class=\"hf-chat-cta-dot\"><\/span>\n    <\/button>\n\n    <div class=\"hf-contact-divider\">Or Reach Us<\/div>\n\n    <div class=\"hf-contact-links\">\n      <a class=\"hf-contact-link hf-cc-call\" href=\"tel:5044207359\" data-wpel-link=\"internal\" rel=\"follow\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Call<\/span>\n        <span class=\"inf\">504-420-7359<\/span>\n      <\/a>\n      <a class=\"hf-contact-link hf-cc-text\" href=\"sms:5044207359\" data-wpel-link=\"internal\" rel=\"follow\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Text<\/span>\n        <span class=\"inf\">504-420-7359<\/span>\n      <\/a>\n      <a class=\"hf-contact-link hf-cc-email\" href=\"mailto:help@housefly.com\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Email<\/span>\n        <span class=\"inf\">help@housefly.com<\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>PLUMBING SERVICES Trusted Plumbing Serviceswith Upfront Pricing Verified pros, upfront pricing, and instant booking with no surprises 5.0 on Google A+ Better Business Bureau Free cancellation Our Plumbing Services Licensed, trusted plumbers for every job Kitchen Fixture Replacement Sink Faucet Garbage Disposal Dishwasher Gas Stove Refrigerator Water Supply Line Bath \/ Utility Fixture Replacement Washer [&hellip;]<\/p>\n","protected":false},"author":15,"featured_media":2697,"parent":538,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3445","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.9 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Plumbing Services | Book Licensed Plumbers | House Fly<\/title>\n<meta name=\"description\" content=\"Find and instantly book plumbers with upfront pricing. Repairs, installations, drain cleaning, and emergency service. Trusted pros on House Fly.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/housefly.com\/es\/services\/plumbing\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Plumbing\" \/>\n<meta property=\"og:description\" content=\"Find and instantly book plumbers with upfront pricing. Repairs, installations, drain cleaning, and emergency service. Trusted pros on House Fly.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/housefly.com\/es\/services\/plumbing\/\" \/>\n<meta property=\"og:site_name\" content=\"House Fly\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/houseflyapp\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-08T03:19:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/housefly.com\/wp-content\/uploads\/2025\/01\/housefly-social-share.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"503\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@houseflyapp\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Plumbing Services | Book Licensed Plumbers | House Fly","description":"Find and instantly book plumbers with upfront pricing. Repairs, installations, drain cleaning, and emergency service. Trusted pros on House Fly.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/housefly.com\/es\/services\/plumbing\/","og_locale":"es_MX","og_type":"article","og_title":"Plumbing","og_description":"Find and instantly book plumbers with upfront pricing. Repairs, installations, drain cleaning, and emergency service. Trusted pros on House Fly.","og_url":"https:\/\/housefly.com\/es\/services\/plumbing\/","og_site_name":"House Fly","article_publisher":"https:\/\/www.facebook.com\/houseflyapp","article_modified_time":"2026-07-08T03:19:45+00:00","og_image":[{"url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/01\/housefly-social-share.jpg","width":800,"height":503,"type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@houseflyapp","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/housefly.com\/services\/plumbing\/","url":"https:\/\/housefly.com\/services\/plumbing\/","name":"Plumbing Services | Book Licensed Plumbers | House Fly","isPartOf":{"@id":"https:\/\/housefly.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/housefly.com\/services\/plumbing\/#primaryimage"},"image":{"@id":"https:\/\/housefly.com\/services\/plumbing\/#primaryimage"},"thumbnailUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/New-Orleans-plumber-pipe-burst.png","datePublished":"2026-03-06T01:42:05+00:00","dateModified":"2026-07-08T03:19:45+00:00","description":"Find and instantly book plumbers with upfront pricing. Repairs, installations, drain cleaning, and emergency service. Trusted pros on House Fly.","breadcrumb":{"@id":"https:\/\/housefly.com\/services\/plumbing\/#breadcrumb"},"inLanguage":"es-MX","potentialAction":[{"@type":"ReadAction","target":["https:\/\/housefly.com\/services\/plumbing\/"]}]},{"@type":"ImageObject","inLanguage":"es-MX","@id":"https:\/\/housefly.com\/services\/plumbing\/#primaryimage","url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/New-Orleans-plumber-pipe-burst.png","contentUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/New-Orleans-plumber-pipe-burst.png","width":1011,"height":636,"caption":"New Orleans plumber pipe burst"},{"@type":"BreadcrumbList","@id":"https:\/\/housefly.com\/services\/plumbing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/housefly.com\/"},{"@type":"ListItem","position":2,"name":"Services","item":"https:\/\/housefly.com\/services\/"},{"@type":"ListItem","position":3,"name":"Plumbing"}]},{"@type":"WebSite","@id":"https:\/\/housefly.com\/#website","url":"https:\/\/housefly.com\/","name":"House Fly","description":"On-Demand Home Services Mobile App","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/housefly.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es-MX"}]}},"_links":{"self":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/comments?post=3445"}],"version-history":[{"count":1,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3445\/revisions"}],"predecessor-version":[{"id":4475,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3445\/revisions\/4475"}],"up":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/538"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media\/2697"}],"wp:attachment":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media?parent=3445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}