{"id":3423,"date":"2026-03-05T23:14:34","date_gmt":"2026-03-05T23:14:34","guid":{"rendered":"https:\/\/housefly1stg.wpenginepowered.com\/?page_id=3423"},"modified":"2026-07-08T03:19:34","modified_gmt":"2026-07-08T03:19:34","slug":"cleaning","status":"publish","type":"page","link":"https:\/\/housefly.com\/es\/services\/dallas\/cleaning\/","title":{"rendered":"Limpieza"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3423\" class=\"elementor elementor-3423\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-464c961 e-con-full e-flex e-con e-parent\" data-id=\"464c961\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4efcae1 elementor-widget elementor-widget-html\" data-id=\"4efcae1\" 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-464c961,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::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-464c961::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::after{display:none !important;background:transparent !important;content:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-4efcae1 .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-cleaning-3-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-cleaning-3-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\">Dallas House Cleaning<\/div>\n      <h1 class=\"hfsk-h1\">Book Trusted <span>Cleaners<\/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='75201';\n\n  var SERVICE='Cleaning';\n  var SHOWCATS=true;\n  var CATS=[{key:'house',label:'House Cleaning'},{key:'pw',label:'Pressure Washing'},{key:'junk',label:'Junk Removal'}];\n  var CARDS = [\n    { key:'whole', row:1, grp:'house', ct:'House Cleaning', title:'Whole Home', sub:'Whole Home', badge:'\ud83d\udc65 Minimum 2 Cleaners', cat:'726', flow:'rooms', recurring:true,\n      mults:{K:2,B:0.5,F:0.5,H:0.25}, kitchen:60,\n      inc:['Kitchen, living, and dining room','Floors throughout the home','Kitchen surfaces and appliance exteriors','Bathroom sinks, tubs, showers, and toilets','Bedroom and common area blinds and surfaces'] },\n    { key:'deep', row:1, grp:'house', ct:'House Cleaning', title:'Deep Clean', sub:'Deep Clean', badge:'\ud83d\udc65 Minimum 2 Cleaners', cat:'727', flow:'rooms',\n      mults:{K:4,B:1,F:1,H:0.5}, kitchen:120,\n      inc:['Kitchen, living, and dining room','Floors throughout the home','Kitchen surfaces and appliance exteriors','Cabinet fronts and backsplash','Bathrooms: detailed sinks, tubs, showers, and toilets','Bedroom and common area blinds and surfaces','Baseboards, doors, and trim'] },\n    { key:'mio', row:1, grp:'house', ct:'House Cleaning', title:'Move In \/ Out', sub:'Move In \/ Move Out', badge:'\ud83d\udc65 Minimum 2 Cleaners', cat:'725', flow:'rooms',\n      mults:{K:4,B:1,F:1,H:0.5}, kitchen:120,\n      inc:['Kitchen, living, and dining room','Floors throughout the home','Blinds, fixtures, fans, mirrors, and closet shelves','Kitchen surfaces and appliance exteriors','Cabinets and drawers inside and out','Inside oven and refrigerator if empty and powered','Bathroom sinks, tubs, showers, and toilets','Interior windows and blinds'] },\n    { key:'hourly', row:1, grp:'house', ct:'House Cleaning', title:'Hourly Cleaning', pt:'Hourly', sub:'Hourly Cleaning', badge:'\u23f1 Flexible \u00b7 1\u20138 hrs', cat:'439', flow:'hourly', recurring:true,\n      inc:['<b>Your priorities:<\/b> direct the cleaner to focus on what matters most','<b>Targeted areas:<\/b> routine upkeep on the rooms you choose','<b>Flexible:<\/b> 1 or 2 cleaners, 1&ndash;8 hours'] },\n    { key:'hw', row:1, grp:'pw', ct:'Pressure Washing', title:'House Wash', sub:'House Wash', badge:'\ud83d\udca6 Whole-home exterior', flow:'housewash', book:'Book This Wash',\n      inc:['Thoroughly cleaning your home&rsquo;s exterior siding, windows, and doors','High-pressure wash removes dirt, grime, and mildew','<b>Does not include<\/b> roof washing'],\n      note:'Total home size: we price the full exterior by square footage and story count.' },\n    { key:'dw', row:1, grp:'pw', ct:'Pressure Washing', title:'Driveway \/ Walkway', sub:'Driveway \/ Walkway', badge:'\ud83d\udcd0 Priced per sq ft', cat:'445', flow:'pwarea', book:'Book This Wash',\n      unit:'sq ft', unitSize:250, aMin:250, aMax:5000, aStep:250, aDef:500,\n      inc:['High-pressure wash of your driveway or walkway','Effectively removes dirt, grime, stains, and algae','Concrete, pavers, and stone surfaces'],\n      note:'A single-car driveway is roughly 500 sq ft; a two-car driveway is roughly 750&ndash;1,000 sq ft.' },\n    { key:'fw', row:1, grp:'pw', ct:'Pressure Washing', title:'Fence Wash', sub:'Fence Wash', badge:'\ud83d\udccf Priced per linear ft', cat:'446', flow:'pwarea', book:'Book This Wash',\n      unit:'linear ft', unitSize:25, aMin:25, aMax:500, aStep:25, aDef:100,\n      inc:['High-pressure wash of your fencing','Effectively removes dirt, grime, stains, and algae','Wood, vinyl, and metal fencing'],\n      note:'Walk the fence line and estimate its length. An average backyard fence runs 150&ndash;200 linear feet.' },\n    { key:'tha', row:1, grp:'junk', ct:'Trash Haul Away', title:'Trash Haul Away', sub:'Trash Haul Away', badge:'\ud83d\udefb 1 hour per truckload', cat:'441', flow:'loads', book:'Book This Haul',\n      inc:['Collection and disposal of pre-packaged waste and debris','Standard 5-foot truck bed per load','Weight of individual items must not exceed 70 lbs','<b>Does not include<\/b> prohibited waste: customer must follow local environmental and disposal regulations'],\n      note:'One load = a standard 5-foot truck bed. Not sure? Book one load and your pro can quote extras on site.' }\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-7509952 e-con-full e-flex e-con e-parent\" data-id=\"7509952\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-aadaed2 elementor-widget elementor-widget-html\" data-id=\"aadaed2\" 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<!-- hf: old text cards retired 2026-07-16 - replaced by hero booking cell in container 464c961. Restore from wp option hf_cleaning_3423_backup_20260716 -->\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-eade1a6 e-con-full e-flex e-con e-parent\" data-id=\"eade1a6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2ebfeba elementor-widget elementor-widget-html\" data-id=\"2ebfeba\" 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<!-- hf: Pressure Washing + Trash Haul Away info sections retired 2026-07-16; services live in the hero tabs. Restore from wp option hf_cleaning_3423_backup_20260716_preTrim -->\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-2adfbb7 e-con-full e-flex e-con e-parent\" data-id=\"2adfbb7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e818acb elementor-widget elementor-widget-html\" data-id=\"e818acb\" 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<!-- cleaning-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<!-- cleaning-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<!-- cleaning-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>Dallas House Cleaning Book Trusted Cleaners Get My Price Whole Home Move In \/ Move Out Deep Clean Hourly Cleaning Pressure Washing Junk Removal &#10003;5.0 on Google &#10003;A+ Better Business BureauA+ BBB &#10003;Free cancellation INTERIOR CLEANING House Cleaning Services Professional cleaners for all your home service needs. See job descriptions and upfront prices before booking. [&hellip;]<\/p>\n","protected":false},"author":15,"featured_media":2679,"parent":3422,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-3423","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>House Cleaning Services Dallas | Book Instantly | House Fly<\/title>\n<meta name=\"description\" content=\"Book trusted house cleaners in Dallas with upfront pricing. Deep cleans, move-in\/out, recurring service. Google-reviewed 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\/dallas\/cleaning\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cleaning\" \/>\n<meta property=\"og:description\" content=\"Book trusted house cleaners in Dallas with upfront pricing. Deep cleans, move-in\/out, recurring service. Google-reviewed pros on House Fly.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/housefly.com\/es\/services\/dallas\/cleaning\/\" \/>\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:34+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=\"703\" \/>\n\t<meta property=\"og:image:height\" content=\"703\" \/>\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=\"5 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"House Cleaning Services Dallas | Book Instantly | House Fly","description":"Book trusted house cleaners in Dallas with upfront pricing. Deep cleans, move-in\/out, recurring service. Google-reviewed 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\/dallas\/cleaning\/","og_locale":"es_MX","og_type":"article","og_title":"Cleaning","og_description":"Book trusted house cleaners in Dallas with upfront pricing. Deep cleans, move-in\/out, recurring service. Google-reviewed pros on House Fly.","og_url":"https:\/\/housefly.com\/es\/services\/dallas\/cleaning\/","og_site_name":"House Fly","article_publisher":"https:\/\/www.facebook.com\/houseflyapp","article_modified_time":"2026-07-08T03:19:34+00:00","og_image":[{"url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/01\/housefly-social-share.jpg","width":703,"height":703,"type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@houseflyapp","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/housefly.com\/services\/dallas\/cleaning\/","url":"https:\/\/housefly.com\/services\/dallas\/cleaning\/","name":"House Cleaning Services Dallas | Book Instantly | House Fly","isPartOf":{"@id":"https:\/\/housefly.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/housefly.com\/services\/dallas\/cleaning\/#primaryimage"},"image":{"@id":"https:\/\/housefly.com\/services\/dallas\/cleaning\/#primaryimage"},"thumbnailUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/New-Orleans-House-Cleaner.png","datePublished":"2026-03-05T23:14:34+00:00","dateModified":"2026-07-08T03:19:34+00:00","description":"Book trusted house cleaners in Dallas with upfront pricing. Deep cleans, move-in\/out, recurring service. Google-reviewed pros on House Fly.","breadcrumb":{"@id":"https:\/\/housefly.com\/services\/dallas\/cleaning\/#breadcrumb"},"inLanguage":"es-MX","potentialAction":[{"@type":"ReadAction","target":["https:\/\/housefly.com\/services\/dallas\/cleaning\/"]}]},{"@type":"ImageObject","inLanguage":"es-MX","@id":"https:\/\/housefly.com\/services\/dallas\/cleaning\/#primaryimage","url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/New-Orleans-House-Cleaner.png","contentUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/08\/New-Orleans-House-Cleaner.png","width":703,"height":703,"caption":"New Orleans House Cleaner"},{"@type":"BreadcrumbList","@id":"https:\/\/housefly.com\/services\/dallas\/cleaning\/#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":"Dallas Home Services","item":"https:\/\/housefly.com\/services\/dallas\/"},{"@type":"ListItem","position":4,"name":"Cleaning"}]},{"@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\/3423","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=3423"}],"version-history":[{"count":18,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3423\/revisions"}],"predecessor-version":[{"id":4455,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3423\/revisions\/4455"}],"up":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3422"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media\/2679"}],"wp:attachment":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media?parent=3423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}