{"id":2169,"date":"2024-11-25T04:31:12","date_gmt":"2024-11-25T04:31:12","guid":{"rendered":"https:\/\/housefly.com\/?page_id=2169"},"modified":"2026-07-08T03:19:36","modified_gmt":"2026-07-08T03:19:36","slug":"handyman","status":"publish","type":"page","link":"https:\/\/housefly.com\/es\/services\/new-orleans\/handyman\/","title":{"rendered":"Handyman"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2169\" class=\"elementor elementor-2169\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5379bbe e-con-full e-flex e-con e-parent\" data-id=\"5379bbe\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6fc08ad elementor-widget elementor-widget-html\" data-id=\"6fc08ad\" 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 id=\"hfc-css\">\n.hfc,.hfc *{box-sizing:border-box}.hfc{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:#0b172a;position:relative;width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);background:#fff;text-align:left}\n.hfc-hero{position:relative;width:100%;margin-top:calc(-1 * var(--hf-header-h, 88px));padding:calc(84px + var(--hf-header-h, 88px)) 24px 64px;text-align:center;color:#fff;\n background:linear-gradient(180deg,rgba(11,23,42,.40),rgba(11,23,42,.84)),url(\"https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-handyman-1-1536x864.webp\") 62% 30%\/cover no-repeat,#0b172a}\n.hfc-ey{font-size:20px;font-weight:800;letter-spacing:3px;text-transform:uppercase;color:#41C7F5!important;margin:0}.hfc-lead{color:rgba(255,255,255,.92)!important}#hfc .hfc-hero .hfc-ey{color:#41C7F5!important;-webkit-text-fill-color:#41C7F5}\n.hfc-h1{font-size:60px;font-weight:800;letter-spacing:-1.5px;line-height:1.04;margin:12px 0 14px;color:#fff}.hfc-h1 span{background:linear-gradient(90deg,#41C7F5,#5cd67a);-webkit-background-clip:text;background-clip:text;color:transparent}\n.hfc-lead{font-size:18px;line-height:1.55;max-width:600px;margin:0 auto;color:rgba(255,255,255,.92)}\n.hfc-srch{max-width:660px;margin:28px auto 0;display:flex;align-items:center;background:#fff;border:1.5px solid #40C9F3;border-radius:999px;padding:7px 7px 7px 22px;box-shadow:0 0 0 6px rgba(64,201,243,.16),0 24px 60px -18px rgba(0,0,0,.45)}\n.hfc-srch svg{flex:none;color:#94a3b8;margin-right:10px}\n.hfc-srch input{flex:1;border:0!important;outline:0;font:500 17px Inter,sans-serif;padding:12px 0!important;color:#16233A;min-width:0;background:transparent!important;box-shadow:none!important;height:auto;border-radius:0}\n.hfc-srch input::placeholder{color:#8CA0B8}\n.hfc .hfc-srch button,.hfc .hfc-srch button:focus{flex:none;border:0;border-radius:999px;background:#40C9F3;color:#fff;font:700 16px Inter,sans-serif;padding:14px 30px;cursor:pointer;transition:background .15s}\n.hfc .hfc-srch button:hover{background:#2ED87A;color:#fff}\n.hfc-btn{display:inline-flex;align-items:center;justify-content:center;background:#41C7F5;color:#0b172a!important;font-weight:800;font-size:15px;border-radius:11px;padding:14px 22px;border:0;cursor:pointer;font-family:inherit;text-decoration:none!important;line-height:1.1}\n.hfc-btn:disabled{opacity:.55;cursor:default}\n.hfc-pop{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin:20px auto 0;max-width:660px}\n.hfc .hfc-pop button{display:inline-flex;align-items:center;border-radius:999px;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.28);padding:9px 16px;font:600 15px Inter,sans-serif;color:#eaf2fa;cursor:pointer;transition:all .15s;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}\n.hfc-wrap{max-width:1240px;margin:0 auto;padding:0 29px}\n.hfc-lay{display:grid;grid-template-columns:minmax(0,1fr) 508px;gap:32px;align-items:stretch;padding:40px 0 58px}.hfc-box{position:relative;align-self:stretch}.hfc-box .hfc-nb{position:relative;top:0}\n.hfc-stp{display:flex;align-items:center;gap:11px;margin:0 0 13px}.hfc-stp i{font-style:normal;width:31px;height:31px;border-radius:5px;background:#0b172a;color:#41C7F5;font-weight:800;font-size:15px;display:flex;align-items:center;justify-content:center;flex:none}\n.hfc-stp h3{margin:0;font-size:22px;font-weight:800;letter-spacing:-.3px;color:#0b172a}.hfc-stp span{margin-left:auto;font-size:14px;color:#5a6b85}\n.hfc-blk{margin-bottom:31px}\n.hfc-lay>*,.hfc-sv>*,.hfc-aog>*{min-width:0}.hfc-sv{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:9px}\n.hfc-card{display:flex;gap:11px;align-items:center;border:1.5px solid #e3e9f1;border-radius:13px;padding:13px;background:#fff;cursor:pointer;text-align:left;font-family:inherit;width:100%;transition:border-color .15s,box-shadow .15s}\n.hfc-card:hover{border-color:#9fd6ee}.hfc-card.on{border-color:#29ABE2;background:#eef8fd;box-shadow:0 0 0 3px rgba(41,171,226,.15)}\n.hfc-ic{width:40px;height:40px;border-radius:5px;background:#f2f6fa;display:flex;align-items:center;justify-content:center;font-size:20px;flex:none}\n.hfc-card h4{margin:0;font-size:15px;font-weight:800;color:#0b172a;line-height:1.2}.hfc-card p{margin:2px 0 0;font-size:14px;color:#5a6b85;line-height:1.35}\n.hfc-more{display:flex;justify-content:center;align-items:center;gap:7px;border:1.5px dashed #9fd6ee;border-radius:11px;padding:13px;color:#1580b8;font-weight:800;font-size:14px;margin-top:9px;background:#fff;width:100%;cursor:pointer;font-family:inherit}\n.hfc-more span{font-weight:600;color:#5a6b85}\n.hfc-cat{margin-top:16px}.hfc-cat h5{margin:0 0 7px;font-size:14px;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;color:#29ABE2}\n.hfc-aog{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:9px}\n.hfc-ao{display:flex;justify-content:space-between;align-items:center;gap:9px;border:1.5px solid #e3e9f1;border-radius:11px;padding:13px 14px;font-size:14px;font-weight:700;background:#fff;color:#0b172a;cursor:pointer;font-family:inherit;text-align:left;width:100%}\n.hfc-ao b{color:#1f9d55;white-space:nowrap;font-weight:800}.hfc-ao small{font-size:14px;font-weight:600;color:#5a6b85}.hfc-ao.on{border-color:#5cd67a;background:#effbf2}.hfc-ao:disabled{opacity:.45;cursor:default}\n.hfc-note{font-size:14px;color:#5a6b85;margin:0 0 11px}\n.hfc-nb{background:linear-gradient(160deg,#16243a,#0b172a 60%);border:1px solid rgba(65,199,245,.18);border-radius:17px;padding:22px;color:#fff;box-shadow:0 24px 50px rgba(11,23,42,.28)}\n.hfc-nb .t{font-size:23px;font-weight:800;letter-spacing:-.4px;line-height:1.15}\n.hfc-pill{display:inline-block;margin-top:8px;font-size:14px;font-weight:700;color:#8fe0ff;border:1px solid rgba(65,199,245,.4);background:rgba(65,199,245,.1);border-radius:77px;padding:5px 10px}\n.hfc-inc{border:1.5px solid rgba(255,255,255,.16);border-radius:9px;margin-top:12px}.hfc-inc button{display:flex;justify-content:space-between;width:100%;background:none;border:0;color:#fff;padding:12px 14px;font:800 14px Inter,sans-serif;letter-spacing:1.4px;cursor:pointer}\n.hfc-inc button span{color:#41C7F5}.hfc-inc ul{margin:0;padding:0 14px 11px 28px;font-size:14px;line-height:1.5;color:#d7e2ef}.hfc-inc li{margin:3px 0}\n.hfc-lbl{font-size:14px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;color:#9fb0c6;margin:12px 0 6px}\n.hfc-seg{display:grid;grid-template-columns:1fr 1fr;gap:8px}.hfc-seg.c3{grid-template-columns:repeat(3,1fr)}.hfc-seg.c4{grid-template-columns:1fr 1fr}\n.hfc-seg button{border:1.5px solid rgba(255,255,255,.2);border-radius:9px;padding:10px 6px;text-align:center;font:700 14px Inter,sans-serif;color:#fff;background:transparent;cursor:pointer}\n.hfc-seg button.on{border-color:#41C7F5;background:rgba(65,199,245,.14);color:#8fe0ff}\n.hfc-step{display:grid;grid-template-columns:40px 1fr 40px;gap:8px}.hfc-step button,.hfc-step div{border:1.5px solid rgba(255,255,255,.22);border-radius:9px;height:40px;display:flex;align-items:center;justify-content:center;font:800 15px Inter,sans-serif;color:#fff;background:transparent}\n.hfc-step button{cursor:pointer}.hfc-step button:disabled{opacity:.35;cursor:default}.hfc-step div{border-color:#41C7F5;color:#8fe0ff;font-size:15px}.hfc-step div small{font-size:14px;font-weight:600;margin-left:5px;opacity:.8}\n.hfc-rooms{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.hfc-rooms>div{border:1.5px solid rgba(255,255,255,.2);border-radius:9px;padding:9px 5px;text-align:center;font-weight:700;font-size:14px}\n.hfc-mini{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:5px}.hfc-mini button{width:25px;height:25px;border-radius:6px;border:1.5px solid rgba(255,255,255,.25);background:transparent;color:#8fe0ff;font:800 14px Inter,sans-serif;cursor:pointer}\n.hfc-mini button:disabled{opacity:.3;cursor:default}.hfc-mini b{font-size:19px;min-width:17px}\n.hfc-ex{border-top:1px solid rgba(255,255,255,.14);margin-top:14px;padding-top:5px}\n.hfc-li{display:flex;align-items:center;gap:8px;font-size:14px;padding:5px 0;color:#d7e2ef}.hfc-li span{flex:1}.hfc-li b{color:#5cd67a}.hfc-li .hfc-mini{margin:0}.hfc-li .hfc-mini b{font-size:14px}\n.hfc-li .x{background:none;border:0;color:#8a9bb2;font-size:14px;cursor:pointer;padding:0 2px}\n.hfc-foot{display:flex;align-items:center;justify-content:space-between;gap:9px;border-top:1px solid rgba(255,255,255,.14);margin-top:14px;padding-top:12px}\n.hfc-price{font-size:31px;font-weight:800;color:#5cd67a;letter-spacing:-.5px;line-height:1.05}.hfc-price.na{font-size:14px;color:#ffcf70}.hfc-foot p{margin:3px 0 0;font-size:14px;color:#9fb0c6}\n.hfc-ft{font-size:14px;color:#8a9bb2;text-align:center;margin-top:11px}.hfc-err{font-size:14px;color:#ffcf70;text-align:center;margin-top:8px}\n.hfc-bar{display:none}\n.hfc button{font-family:inherit;text-transform:none;box-shadow:none;outline:none;min-height:0;line-height:1.2}\n.hfc button{white-space:normal;word-break:normal}.hfc .hfc-card h4{color:#0b172a!important}.hfc .hfc-card p{color:#5a6b85!important;font-size:14px!important}.hfc .hfc-card{color:#0b172a!important}.hfc-card>span:last-child{flex:1;min-width:0}.hfc-ao>span{min-width:0}\n.hfc .hfc-card:hover,.hfc .hfc-card:focus{background:#fff;color:#0b172a}.hfc .hfc-card.on:hover,.hfc .hfc-card.on:focus{background:#eef8fd}\n.hfc .hfc-ao:hover,.hfc .hfc-ao:focus{background:#fff;color:#0b172a;border-color:#9fd6ee}.hfc .hfc-ao.on:hover,.hfc .hfc-ao.on:focus{background:#effbf2;border-color:#5cd67a}\n.hfc .hfc-more:hover,.hfc .hfc-more:focus{background:#f4f9fd;color:#1580b8}\n.hfc .hfc-btn:hover,.hfc .hfc-btn:focus{background:#6dd5f8;color:#0b172a}\n.hfc .hfc-seg button:hover,.hfc .hfc-seg button:focus{background:rgba(255,255,255,.06);color:#fff}.hfc .hfc-seg button.on:hover,.hfc .hfc-seg button.on:focus{background:rgba(65,199,245,.14);color:#8fe0ff}\n.hfc .hfc-step button:hover,.hfc .hfc-step button:focus,.hfc .hfc-mini button:hover,.hfc .hfc-mini button:focus{background:rgba(255,255,255,.08);color:#8fe0ff}\n.hfc .hfc-inc button:hover,.hfc .hfc-inc button:focus,.hfc .hfc-li .x:hover,.hfc .hfc-li .x:focus{background:none;color:#fff}\n.hfc .hfc-pop button:hover,.hfc .hfc-pop button:focus{background:rgba(64,201,243,.22);border-color:#40C9F3;color:#fff}\n.hfc-mini button{padding:0;display:inline-flex;align-items:center;justify-content:center}.hfc-step button{padding:0}\n@media(max-width:1100px){.hfc-lay{grid-template-columns:minmax(0,1fr) 454px;gap:22px}}\n@media(max-width:900px){.hfc-lay{grid-template-columns:minmax(0,1fr)}.hfc-box{position:static}.hfc-box .hfc-nb{position:static!important;width:auto!important}}\n@media(max-width:767px){.hfc-rooms{gap:5px}.hfc-rooms>div{padding:8px 2px;font-size:14px}.hfc-mini{gap:3px}.hfc-mini button{width:22px;height:22px;font-size:14px}.hfc-mini b{font-size:15px;min-width:11px}.hfc-li{gap:5px;font-size:14px}.hfc-li .hfc-mini b{font-size:14px}}\n@media(max-width:767px){.hfc-hero{padding:calc(48px + var(--hf-header-h, 70px)) 16px 40px;background-image:linear-gradient(180deg,rgba(11,23,42,.55),rgba(11,23,42,.9)),url(\"https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-handyman-1-1536x864.webp\")}\n.hfc-ey{font-size:15px;letter-spacing:1.8px}.hfc-h1{font-size:38px;letter-spacing:-1px}.hfc-lead{font-size:16px}\n.hfc-srch{margin-top:22px;padding:5px 5px 5px 16px}.hfc-srch svg{display:none}.hfc-srch input{font-size:16px;padding:10px 0!important}.hfc .hfc-srch button,.hfc .hfc-srch button:focus{padding:12px 16px;font-size:14px}.hfc-pop{gap:6px;margin-top:16px}.hfc .hfc-pop button{padding:8px 13px;font-size:14px}\n.hfc-wrap{padding:0 14px}.hfc-lay{gap:23px;padding:25px 0 0}.hfc-stp h3{font-size:18px}.hfc-sv,.hfc-aog{grid-template-columns:minmax(0,1fr)}\n.hfc-nb{padding:15px;border-radius:14px}.hfc-nb .t{font-size:19px}.hfc-price{font-size:25px}.hfc-btn{font-size:14px;padding:13px 16px}\n.hfc-bar{display:flex;position:sticky;bottom:0;z-index:5;justify-content:space-between;align-items:center;gap:11px;background:#0b172a;color:#fff;padding:11px 14px;margin:22px -14px 0;border-radius:14px 14px 0 0}\n.hfc-bar b{font-size:20px;color:#5cd67a;display:block}.hfc-bar small{display:block;color:#9fb0c6;font-size:14px}}\n@media(max-width:767px){.hfc-mini button{width:30px;height:30px}.hfc-step button,.hfc-step div{height:44px}}\n<\/style>\n<style id=\"hfc-css2\">\n.hfc .hfc-sv{align-items:start}\n.hfc-cw{border:1.5px solid #e3e9f1;border-radius:13px;background:#fff;transition:border-color .15s,box-shadow .15s;min-width:0}\n.hfc-cw:hover{border-color:#9fd6ee}.hfc-cw.on{border-color:#29ABE2;box-shadow:0 0 0 3px rgba(41,171,226,.15)}\n.hfc .hfc-cw>.hfc-card{border:0!important;box-shadow:none!important;border-radius:12px;position:relative;padding-right:40px}\n.hfc .hfc-cw.on>.hfc-card{background:#eef8fd}.hfc .hfc-cw.on>.hfc-card:not(:last-child){border-radius:12px 12px 0 0}\n.hfc-ck{position:absolute;top:12px;right:12px;width:22px;height:22px;border-radius:6px;border:1.5px solid #c9d6e4;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:800;color:#fff;background:#fff}\n.hfc-cw.on .hfc-ck{background:#29ABE2;border-color:#29ABE2}\n.hfc-opt{padding:4px 14px 14px;border-top:1px solid #e3e9f1}\n.hfc-opt .ol{font-size:14px;font-weight:800;letter-spacing:1.1px;text-transform:uppercase;color:#5a6b85;margin:12px 0 7px}\n.hfc-opt .os{display:flex;flex-wrap:wrap;gap:7px}\n.hfc .hfc-opt .os button{flex:1 1 auto;border:1.5px solid #dbe4ee;border-radius:10px;padding:9px 10px;font:700 14px Inter,sans-serif;color:#0b172a;background:#fff;cursor:pointer;text-align:center}\n.hfc .hfc-opt .os button.on,.hfc .hfc-opt .os button.on:hover{border-color:#29ABE2;background:#eef8fd;color:#0b6c99}\n.hfc .hfc-opt .os button:hover,.hfc .hfc-opt .os button:focus{background:#f6f9fc;color:#0b172a}.hfc .hfc-opt .os button small{font-size:14px;font-weight:600;color:#1f9d55}\n.hfc-opt .orw{display:flex;align-items:center;gap:10px;padding:6px 0;font-size:15px;color:#0b172a}.hfc-opt .orw>span{flex:1;min-width:0}\n.hfc-opt .orw small{display:block;font-size:14px;color:#5a6b85}\n.hfc-opt .om{display:flex;align-items:center;gap:8px;flex:none}\n.hfc .hfc-opt .om button{width:32px;height:32px;border-radius:8px;border:1.5px solid #c9d6e4;background:#fff;color:#1580b8;font:800 18px Inter,sans-serif;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}\n.hfc .hfc-opt .om button:hover,.hfc .hfc-opt .om button:focus{background:#f2f8fc;color:#1580b8}\n.hfc .hfc-opt .om button:disabled{opacity:.35;cursor:default}\n.hfc-opt .om b{min-width:22px;text-align:center;font-size:16px;color:#0b172a}.hfc-opt .om b.z{color:#94a3b8}\n.hfc-opt .ost{display:flex;align-items:center;gap:8px}.hfc-opt .ost .ov{flex:1;text-align:center;border:1.5px solid #dbe4ee;border-radius:10px;padding:7px 6px;font-weight:800;font-size:15px;color:#0b172a}\n.hfc-opt .ost .ov small{font-weight:600;color:#5a6b85;margin-left:5px;font-size:14px}\n.hfc-opt .orm{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}.hfc-opt .orm>div{border:1.5px solid #dbe4ee;border-radius:10px;padding:8px 4px;text-align:center;font-size:14px;font-weight:700;color:#0b172a}\n.hfc-opt .orm .om{justify-content:center;margin-top:5px}\n.hfc-opt .oh{font-size:14px;color:#c2410c;margin:8px 0 0}\n.hfc .hfc-opt .oi{display:flex;justify-content:space-between;width:100%;background:none;border:0;padding:12px 0 0;font:800 14px Inter,sans-serif;letter-spacing:1.1px;color:#1580b8;cursor:pointer;text-transform:uppercase}\n.hfc .hfc-opt .oi:hover,.hfc .hfc-opt .oi:focus{background:none;color:#1580b8}\n.hfc-opt ul{margin:6px 0 0;padding-left:20px;font-size:14px;line-height:1.45;color:#3d4d66}\n.hfc-nb .t{font-size:23px}\n.hfc-nb .hfc-emp{font-size:15px;color:#9fb0c6;margin:12px 0 4px;line-height:1.45}\n.hfc-nb .hfc-ln{display:flex;gap:10px;align-items:flex-start;padding:11px 0;border-bottom:1px solid rgba(255,255,255,.1);font-size:15px;color:#fff}\n.hfc-nb .hfc-ln:last-child{border-bottom:0}.hfc-nb .hfc-ln>span{flex:1;min-width:0;font-weight:700;line-height:1.3}\n.hfc-nb .hfc-ln small{display:block;font-weight:500;font-size:14px;color:#9fb0c6;margin-top:2px}\n.hfc-nb .hfc-ln b{color:#5cd67a;white-space:nowrap;font-size:15px}.hfc-nb .hfc-ln b.q{color:#ffcf70}\n.hfc .hfc-nb .x,.hfc .hfc-nb .x:hover,.hfc .hfc-nb .x:focus{border:0!important;box-shadow:none!important;background:none!important;min-width:0;width:auto;height:auto;padding:0 2px;color:#8a9bb2;font-size:18px;line-height:1}.hfc .hfc-nb .x:hover{color:#fff}\n.hfc .hfc-nb .hfc-ln .x{background:none;border:0;color:#8a9bb2;font-size:18px;cursor:pointer;padding:0 2px;line-height:1}\n.hfc .hfc-nb .hfc-ln .x:hover,.hfc .hfc-nb .hfc-ln .x:focus{background:none;color:#fff}\n.hfc-nb .hfc-lns{margin-top:6px;max-height:52vh;overflow-y:auto}\n.hfc-sv{grid-auto-flow:row dense}.hfc-cw.wide{grid-column:1\/-1}.hfc-cw.wide .hfc-card h4{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.hfc-cw.wide .hfc-opt{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);column-gap:28px}.hfc-cw.wide .hfc-opt>.ol,.hfc-cw.wide .hfc-opt>.os,.hfc-cw.wide .hfc-opt>.ost,.hfc-cw.wide .hfc-opt>.orm,.hfc-cw.wide .hfc-opt>.oh,.hfc-cw.wide .hfc-opt>.oi,.hfc-cw.wide .hfc-opt>ul{grid-column:1\/-1}\n.hfc-cat{margin-top:26px}.hfc-cat .hfc-stp{margin-bottom:12px}\n.hfc-nb .hfc-sg{border-bottom:1px solid rgba(255,255,255,.1);padding:4px 0 8px}.hfc-nb .hfc-sg:last-child{border-bottom:0}\n.hfc-nb .hfc-sg .hfc-ln{border-bottom:0;padding:8px 0}.hfc-nb .hfc-row{padding:6px 0 6px 12px!important;border-left:2px solid rgba(65,199,245,.35)}\n.hfc-nb .hfc-sh{display:flex;align-items:center;gap:10px;padding:10px 0 4px;font-weight:800;font-size:15px;color:#fff}.hfc-nb .hfc-sh>span{flex:1}\n.hfc-bs{display:flex;align-items:center;gap:7px;flex:none}\n.hfc .hfc-bs button{width:28px;height:28px;border-radius:8px;border:1.5px solid rgba(255,255,255,.28);background:transparent;color:#8fe0ff;font:800 16px Inter,sans-serif;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}\n.hfc .hfc-bs button:hover,.hfc .hfc-bs button:focus{background:rgba(255,255,255,.08);color:#8fe0ff}.hfc .hfc-bs button:disabled{opacity:.3;cursor:default}\n.hfc-bs b{min-width:20px;text-align:center;color:#fff!important;font-size:15px}\n.hfc .hfc-sm{background:none;border:0;padding:2px 0;color:#41C7F5;font:700 14px Inter,sans-serif;cursor:pointer}.hfc .hfc-sm:hover,.hfc .hfc-sm:focus{background:none;color:#8fe0ff}\n.hfc-dsc{font-size:14px;line-height:1.5;color:#c9d6e6;padding:4px 0 6px}.hfc-dsc p{margin:0 0 4px}.hfc-dsc ul{margin:0;padding-left:18px}\n\/* HF-2026-10-10v: the hero subtext on ONE line (two at most on phones); the pills ONE row, never wider than the search bar *\/\n.hfc .hfc-hero .hfc-lead{max-width:none;white-space:nowrap}\n.hfc .hfc-pop{flex-wrap:nowrap;overflow:hidden;max-width:660px;width:100%}.hfc .hfc-pop button{flex:none;white-space:nowrap}\n@media(max-width:767px){.hfc .hfc-opt .om button{width:34px;height:34px}.hfc .hfc-hero .hfc-lead{white-space:normal;max-width:350px;font-size:16px}}\n<\/style>\n<!-- ================= 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-5379bbe,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-5379bbe::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-5379bbe::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-5379bbe::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-5379bbe::after{display:none !important;background:transparent !important;content:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-6fc08ad .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-handyman-1-1536x864.webp') center\/cover no-repeat;opacity:.45;animation:hfHeroKenBurns 28s ease-in-out infinite alternate;will-change:transform;z-index:-2}\n.hfsk-hero::after{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(115deg,rgba(13,20,31,.92) 0%,rgba(13,20,31,.72) 45%,rgba(13,20,31,.55) 100%);z-index:-1;pointer-events:none}\n@media (max-width:1024px){.hfsk-hero::before{background-image:url('https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-handyman-1-1024x576.webp')}}\n.hfsk-cols{position:relative;z-index:2;max-width:1220px;margin:0 auto;display:grid;grid-template-columns:1.05fr 1fr;gap:56px;align-items:center}\n.hfsk-left{text-align:left}\n.hfsk-ey{font-size:clamp(16px,1.6vw,21px);font-weight:800;letter-spacing:.22em;color:#40C9F3;text-transform:uppercase;margin:0 0 12px;line-height:1.2}\n.hfsk-h1{font-size:clamp(34px,4.4vw,56px);font-weight:900;line-height:1.05;letter-spacing:-1.5px;margin:0 0 12px;color:#fff}\n.hfsk-h1 span{background:linear-gradient(90deg,#40C9F3,#2ED87A);-webkit-background-clip:text;background-clip:text;color:transparent}\n.hfsk-sub{color:rgba(201,214,230,.82);font-size:16.5px;font-weight:300;line-height:1.55;max-width:460px;margin:0 0 30px}\n.hfsk-rowlabel{font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.85);margin:0 0 12px}\n.hfsk-pills{display:flex;flex-wrap:wrap;gap:10px}\n#hfskCats{margin-bottom:24px}\n.hfsk-pill{display:inline-flex;align-items:center;font-family:inherit;font-size:14px;font-weight:700;color:#dfe9f5;\n  background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02));border:1.5px solid rgba(255,255,255,.2);\n  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-radius:999px;padding:11px 19px;cursor:pointer;transition:all .16s}\n.hfsk-pill:hover:not(.on){border-color:rgba(255,255,255,.48)}\n.hfsk-pill.on{border-color:#40C9F3;background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09));color:#fff;box-shadow:0 0 0 4px rgba(35,210,255,.14),0 12px 30px -12px rgba(35,210,255,.5)}\n.hfsk-pill:focus{outline:none}\n.hfsk-pill:focus-visible{outline:2px solid #40C9F3;outline-offset:2px}\n.hfsk-divider{max-width:420px;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.18),transparent);margin:2px 0 20px}\n#hfskSubs{display:flex;flex-direction:column;gap:10px}\n.hfsk-pills.fixedrow{flex-wrap:nowrap}\n.hfsk-pills.fixedrow .hfsk-pill{min-width:0;justify-content:center;white-space:nowrap}\n@media (max-width:480px){.hfsk-pills.fixedrow .hfsk-pill{flex:1 1 0;font-size:clamp(9.5px,2.9vw,12.5px);padding:9px 4px;min-height:33px}}\n@media (max-width:480px){.hfsk-pills.fixedrow.compact .hfsk-pill{white-space:nowrap;font-size:clamp(9px,2.55vw,12.5px);padding:9px 2px;min-height:33px}}\n\/* ===== glass booking cell ===== *\/\n.hfsk-glass{background:rgba(20,29,43,.62);border:1px solid rgba(255,255,255,.16);border-radius:22px;\n  backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);\n  box-shadow:0 40px 110px -30px rgba(0,0,0,.8),inset 0 1px 0 rgba(255,255,255,.09);\n  padding:24px 26px 22px;max-width:520px;margin-left:auto;color:#fff;text-align:left;font-family:'Inter',-apple-system,sans-serif}\n.hfsk-glass *{box-sizing:border-box}\n.g-top{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:16px}\n.g-top h3{font-size:23px;font-weight:800;letter-spacing:-.5px;color:#fff;margin:0;font-family:inherit}\n.g-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;color:#7FE3FF;background:rgba(35,210,255,.14);border:1px solid rgba(35,210,255,.3);padding:4px 10px;border-radius:99px;margin-top:8px}\n.g-zip{flex:none;width:150px;text-align:left}\n.g-zip label{display:block;font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#8fb3d0;margin-bottom:6px;padding-left:2px}\n.g-zipbox{position:relative;display:flex;align-items:center;height:42px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);border-radius:12px;padding:0 12px;transition:border-color .15s}\n.g-zipbox:focus-within{border-color:#40C9F3}.g-zipbox.bad{border-color:#ff8f8f}\n.g-zipbox .pin{position:absolute;left:12px;font-size:14px;line-height:1}\n.g-zipbox input{width:100%;height:100%;padding:0;margin:0;text-align:center;border:none;background:transparent;font-family:inherit;font-size:16px;font-weight:800;color:#fff;outline:none;letter-spacing:2px;line-height:normal;box-shadow:none}\n.g-inc{border:1px solid rgba(255,255,255,.14);border-radius:13px;overflow:hidden;margin-bottom:15px;background:rgba(255,255,255,.03)}\n.g-inc>button{width:100%;display:flex;align-items:center;justify-content:space-between;background:transparent;border:none;padding:11px 14px;font-family:inherit;font-size:12.5px;font-weight:800;color:#dfe9f5;cursor:pointer;letter-spacing:.04em}\n.g-inc .car{transition:transform .2s;color:#40C9F3}.g-inc.open .car{transform:rotate(180deg)}\n.g-inc ul{list-style:none;max-height:0;overflow:hidden;transition:max-height .28s;padding:0 16px;margin:0}\n.g-inc.open ul{max-height:420px;padding:2px 16px 12px}\n.g-inc li{font-size:12.5px;color:rgba(223,233,245,.92);padding:4px 0 4px 20px;position:relative;line-height:1.5}\n.g-inc li::before{content:\"\";position:absolute;left:2px;top:11px;width:6px;height:6px;border-radius:50%;background:#2ED87A}\n.g-inc li.you::before{background:#40C9F3}\n.g-inc li.na::before{background:#ff9b9b}\n.g-inc li b{color:#fff;font-weight:800}\n.g-q{margin-bottom:14px}.g-q:last-child{margin-bottom:0}\n.g-q>label{display:block;font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#8fa6c0;margin-bottom:8px}\n.g-seg{display:flex;flex-wrap:wrap;gap:7px}\n.g-seg button{flex:1 1 0;min-width:0;font-family:inherit;font-size:13px;font-weight:700;color:#fff;background:rgba(255,255,255,.05);border:1.5px solid rgba(255,255,255,.18);border-radius:10px;padding:10px 8px;cursor:pointer;transition:all .15s;white-space:nowrap}\n.g-seg button.on{border-color:#40C9F3;background:rgba(35,210,255,.12);color:#7FE3FF;box-shadow:0 0 0 3px rgba(35,210,255,.12)}\n.g-seg.four button{flex:1 1 46%}\n.g-step{display:flex;align-items:center;gap:8px}\n.g-step button{width:42px;height:40px;flex:none;border-radius:10px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);color:#40C9F3;font-size:21px;font-weight:700;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center;transition:all .15s}\n.g-step button:hover:not(:disabled){border-color:#40C9F3}.g-step button:disabled{opacity:.3;cursor:not-allowed}\n.g-step .val{flex:1;text-align:center;height:40px;display:flex;align-items:center;justify-content:center;border:1.5px solid rgba(64,201,243,.55);background:rgba(35,210,255,.09);border-radius:10px;font-size:14.5px;font-weight:800;color:#7FE3FF;letter-spacing:.2px}\n.g-step .val span{font-size:11px;font-weight:600;color:#8fa6c0;margin-left:5px}\n.g-rooms{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}\n.g-rooms.two{grid-template-columns:repeat(2,minmax(0,1fr))}\n.g-rc{background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.13);border-radius:12px;padding:10px 8px;text-align:center}\n.g-rc .rl{font-size:16.5px;font-weight:700;color:#fff;line-height:1.2;min-height:26px;display:flex;align-items:center;justify-content:center}\n.g-rc .rs{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:6px}\n.g-rc .rs button{width:28px;height:28px;border-radius:8px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-rc .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-rc .rs .v{font-size:24px;line-height:1;font-weight:800;color:#fff;min-width:20px}\n.g-itemhead{display:flex;justify-content:space-between;font-size:10px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:#6d8199;padding:0 2px 7px}\n.g-item .lbl{min-width:0}\n.g-item{display:flex;align-items:center;justify-content:space-between;gap:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);border-radius:13px;padding:10px 13px;margin-bottom:8px;transition:all .15s}\n.g-item:last-child{margin-bottom:0}\n.g-item.picked{border-color:rgba(64,201,243,.6);background:rgba(35,210,255,.09)}\n.g-item .lbl{font-size:13.5px;font-weight:700;color:#fff;line-height:1.3}\n.g-item .rs{display:flex;align-items:center;gap:9px;flex:none}\n.g-item .rs button{width:30px;height:30px;border-radius:9px;border:1.5px solid rgba(255,255,255,.25);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-item .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-item .rs .v{font-size:16px;font-weight:800;color:#fff;min-width:16px;text-align:center}\n.g-note{font-size:11px;color:#8fa6c0;margin-top:8px;line-height:1.5}\n.g-foot{margin-top:16px;padding-top:15px;border-top:1px solid rgba(255,255,255,.12)}\n.g-row{display:flex;align-items:center;justify-content:space-between;gap:14px}\n.g-pr{text-align:left}\n.g-price{font-size:32px;font-weight:900;letter-spacing:-1.2px;color:#2ED87A;line-height:1}\n.g-price.na{font-size:15px;color:#ff9b9b;font-weight:700;letter-spacing:0}\n.g-est{font-size:11.5px;color:#8fa6c0;margin-top:5px}\n.g-book{flex:none;background:#23D2FF;color:#0F1923;border:none;border-radius:13px;padding:15px 26px;font-family:inherit;font-size:15.5px;font-weight:800;cursor:pointer;box-shadow:0 14px 34px -12px rgba(35,210,255,.6);transition:filter .15s;white-space:nowrap}\n.g-book:hover,.g-book:focus,.g-book:active{background:#23D2FF !important;color:#0F1923 !important;filter:brightness(1.06);outline:none}\n.g-book:disabled{opacity:.45;cursor:not-allowed}\n\/* WP theme sets a red\/pink global button:hover \u2014 pin every control in this block to our palette *\/\n.hfsk-root button:hover,.hfsk-root button:focus,.hfsk-root button:active{color:inherit}\n.hfsk-pill:hover,.hfsk-pill:focus,.hfsk-pill:active{background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02)) !important;color:#dfe9f5 !important}\n.hfsk-pill.on:hover,.hfsk-pill.on:focus,.hfsk-pill.on:active{background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09)) !important;color:#fff !important}\n.g-seg button:hover,.g-seg button:focus,.g-seg button:active{background:rgba(255,255,255,.08) !important;color:#fff !important;outline:none}\n.g-seg button.on:hover,.g-seg button.on:focus,.g-seg button.on:active{background:rgba(35,210,255,.12) !important;color:#7FE3FF !important}\n.g-step button:hover,.g-step button:focus,.g-step button:active{background:rgba(255,255,255,.1) !important;color:#40C9F3 !important;outline:none}\n.g-item .rs button:hover,.g-item .rs button:focus,.g-item .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-rc .rs button:hover,.g-rc .rs button:focus,.g-rc .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-inc>button:hover,.g-inc>button:focus,.g-inc>button:active{background:rgba(255,255,255,.04) !important;color:#dfe9f5 !important;outline:none}\n.g-fine{font-size:10.5px;color:#6d8199;margin-top:12px;text-align:center}\n\/* flooring extras: pattern preview, stain picker *\/\n.g-flprev{display:flex;align-items:center;gap:10px;margin-top:9px}\n.g-flprev img{width:96px;height:64px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.18);background:#fff}\n.g-flprev span{font-size:12px;color:#8fa6c0}\n.g-flstain{display:flex;align-items:center;gap:10px;margin-top:2px}\n.g-flstain img{width:44px;height:44px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.22);flex:none}\n.g-select{flex:1;min-width:0;height:42px;padding:0 12px;border-radius:10px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);color:#fff;font-family:inherit;font-size:13.5px;font-weight:600;outline:none;appearance:auto;-webkit-appearance:menulist}\n.g-select:focus{border-color:#40C9F3}\n.g-select option{color:#0F1923;background:#fff}\n@media (max-width:980px){\n  .hfsk-hero{padding:calc(34px + var(--hf-header-h, 88px)) 18px 56px}\n  \/* minmax(0,1fr): a bare 1fr track grows to the cell's min-content and the\n     hero's overflow:hidden clips it off the right edge of small phones *\/\n  .hfsk-cols{grid-template-columns:minmax(0,1fr);gap:32px}\n  .hfsk-cols>*{min-width:0;max-width:100%}\n  .hfsk-glass{margin:0 auto;width:100%;max-width:520px}\n  .hfsk-sub{margin-bottom:22px}\n  .hfsk-pills{gap:8px}\n  .hfsk-pill{font-size:12.5px;padding:9px 14px}\n}\n@media (max-width:480px){\n  .hfsk-glass{padding:20px 18px 18px}\n  .g-price{font-size:26px}\n  .g-book{padding:13px 18px;font-size:14px}\n  .g-row{gap:10px}\n  .g-zip{width:132px}\n  .g-top h3{font-size:20px}\n  \/* compress-only-when-needed: identical at 390px+, shrinks on smaller phones *\/\n  .g-seg button{white-space:normal}\n  .hfsk-pills.fixedrow .hfsk-pill{white-space:normal;text-align:center;line-height:1.15}\n  .g-rc{padding:10px 5px}\n  .g-rc .rl{font-size:clamp(13px,4.2vw,16.5px)}\n  .g-rc .rs{gap:5px}\n  .g-rc .rs button{width:26px;height:26px}\n  .g-rc .rs .v{min-width:16px;font-size:22px}\n}\n<\/style>\n\n<div class=\"hfc\" id=\"hfc\">\n<section class=\"hfc-hero\"><div class=\"hfc-ey\">New Orleans Handyman<\/div><h1 class=\"hfc-h1\">Handyman Services in <span>New Orleans<\/span><\/h1>\n<p class=\"hfc-lead\">Search for what you need or pick a service below, and see your price as you go<\/p>\n<form class=\"hfc-srch\" id=\"hfcSearch\" role=\"search\" autocomplete=\"off\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"m20 20-3.5-3.5\"\/><\/svg><input id=\"hfcQ\" type=\"text\" placeholder=\"Search for what you need\" aria-label=\"What do you need done?\"><button type=\"submit\">Get My Price<\/button><\/form>\n<div class=\"hfc-pop\"><button type=\"button\" data-hq=\"TV mounting\">TV Mounting<\/button><button type=\"button\" data-hq=\"Furniture assembly\">Furniture<\/button><button type=\"button\" data-hq=\"Drywall repair\">Drywall<\/button><button type=\"button\" data-hq=\"Shelf installation\">Shelves<\/button><button type=\"button\" data-hq=\"Handyman by the hour\">By the Hour<\/button><\/div><\/section>\n<div class=\"hfc-wrap\"><div class=\"hfc-lay\" id=\"hfcLay\">\n<div class=\"hfc-left\"><div class=\"hfc-blk\" id=\"hfcS1\"><div class=\"hfc-stp\"><h3>Most popular<\/h3><\/div><div class=\"hfc-sv\" id=\"hfcMain\"><\/div><div id=\"hfcAll\" hidden><\/div><button type=\"button\" class=\"hfc-more\" id=\"hfcMore\"><\/button><\/div>\n<\/div>\n<div class=\"hfc-box\" id=\"hfcBox\"><div class=\"hfc-nb\" id=\"hfcNb\"><\/div><\/div>\n<div class=\"hfc-bar\" id=\"hfcBar\"><div><b id=\"hfcBarP\">&hellip;<\/b><small id=\"hfcBarS\"><\/small><\/div><button type=\"button\" class=\"hfc-btn\" id=\"hfcBarB\">Book It<\/button><\/div>\n<\/div><\/div><\/div>\n\n\n\n<!-- ================= END HOUSE FLY SMOKE HERO ================= -->\n<script id=\"hfc-js\" data-no-defer=\"1\" data-no-optimize=\"1\" data-no-minify=\"1\">\n(function(){\n  var D = {\"slug\": \"handyman\", \"st\": \"Handyman\", \"items\": [{\"qdef\": null, \"pstep\": null, \"key\": \"hm_hourly\", \"t\": \"menu\", \"name\": \"Handyman by the Hour\", \"icon\": \"\ud83d\udd27\", \"desc\": \"A skilled handyman by the hour\", \"full\": \"A skilled handyman by the hour, a half day or a full day for repairs, installs and the odd jobs list: no electrical wiring or plumbing pipe work.\", \"section\": \"By the Hour\", \"unit\": \"hour\", \"unit_label\": \"hour\", \"price\": 89.99, \"min_qty\": 1, \"max_qty\": 8, \"step\": 1, \"code\": \"HM-HOURLY\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hh_pros\", \"label\": \"Pros\", \"options\": [\"One pro\", \"Two pros\"], \"add\": {\"Two pros\": 89.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_tv\", \"t\": \"menu\", \"name\": \"TV Mounting\", \"icon\": \"\ud83d\udcfa\", \"desc\": \"Your TV on the wall with the bracket level\", \"full\": \"Your TV on the wall with the bracket level, lagged into studs or masonry anchors, cables tidied, mount supplied by you.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"TV\", \"price\": 124.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-TV\", \"variants\": [{\"key\": \"small\", \"label\": \"Up to 40\\\"\", \"price\": 124.99}, {\"key\": \"mid\", \"label\": \"41\\\" - 60\\\"\", \"price\": 144.99}, {\"key\": \"large\", \"label\": \"61\\\" - 80\\\"\", \"price\": 184.99}], \"rows\": true, \"variant_q\": \"TV size\", \"variant_default\": \"\", \"rank\": 1, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_shelf\", \"t\": \"menu\", \"name\": \"Shelf Installation\", \"icon\": \"\ud83d\udcda\", \"desc\": \"A floating or bracket shelf hung level and anchored to hold\", \"full\": \"A floating or bracket shelf hung level and anchored to hold weight, shelf supplied by you.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"shelf\", \"price\": 109.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-SHELF\", \"variants\": [{\"key\": \"small\", \"label\": \"Up to 24\\\"\", \"price\": 109.99}, {\"key\": \"mid\", \"label\": \"25\\\" - 48\\\"\", \"price\": 109.99}, {\"key\": \"large\", \"label\": \"49\\\" - 96\\\"\", \"price\": 109.99}], \"rows\": true, \"variant_q\": \"Shelf length\", \"variant_default\": \"\", \"rank\": 2, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_picture\", \"t\": \"menu\", \"name\": \"Picture \/ Mirror\", \"icon\": \"\ud83d\uddbc\", \"desc\": \"Pictures, art and mirrors hung level at the height you want\", \"full\": \"Pictures, art and mirrors hung level at the height you want, with the right anchor for the weight and the wall.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"piece\", \"price\": 109.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-PICTURE\", \"variants\": [{\"key\": \"light\", \"label\": \"Up to 25 lbs\", \"price\": 109.99}, {\"key\": \"heavy\", \"label\": \"Over 25 lbs\", \"price\": 109.99}], \"rows\": true, \"variant_q\": \"Weight\", \"variant_default\": \"\", \"rank\": 3, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_blinds\", \"t\": \"menu\", \"name\": \"Blinds \/ Curtain\", \"icon\": \"\ud83e\ude9f\", \"desc\": \"Blinds, shades or a curtain rod mounted level and square\", \"full\": \"Blinds, shades or a curtain rod mounted level and square to the window, blinds and hardware supplied by you.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"window\", \"price\": 109.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-BLINDS\", \"variants\": [{\"key\": \"small\", \"label\": \"Up to 5 ft\", \"price\": 109.99}, {\"key\": \"wide\", \"label\": \"Over 5 ft\", \"price\": 109.99}], \"rows\": true, \"variant_q\": \"Width\", \"variant_default\": \"\", \"rank\": 4, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_towel\", \"t\": \"menu\", \"name\": \"Towel \/ TP Holder\", \"icon\": \"\ud83e\uddfb\", \"desc\": \"A towel bar, ring, hook or toilet paper holder mounted solid\", \"full\": \"A towel bar, ring, hook or toilet paper holder mounted solid into tile or drywall, fixture supplied by you.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"fixture\", \"price\": 109.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-TOWEL\", \"variants\": [{\"key\": \"bar\", \"label\": \"Towel Bar\", \"price\": 109.99}, {\"key\": \"tp\", \"label\": \"TP Holder\", \"price\": 109.99}], \"rows\": true, \"variant_q\": \"Fixture\", \"variant_default\": \"\", \"rank\": 5, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_furniture\", \"t\": \"menu\", \"name\": \"Furniture Assembly\", \"icon\": \"\ud83e\ude91\", \"desc\": \"Boxed or flat-pack furniture assembled, squared and set in place\", \"full\": \"Boxed or flat-pack furniture assembled, squared and set in place, packaging stacked for pickup.\", \"section\": \"Assembly\", \"unit\": \"unit\", \"unit_label\": \"piece\", \"price\": 109.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-FURNITURE\", \"variants\": [{\"key\": \"small\", \"label\": \"Chair \/ Small Table\", \"price\": 109.99}, {\"key\": \"mid\", \"label\": \"Large Table \/ Desk\", \"price\": 184.99}, {\"key\": \"large\", \"label\": \"Bed \/ Dresser \/ Bookcase\", \"price\": 244.99}], \"rows\": true, \"variant_q\": \"Piece\", \"variant_default\": \"\", \"rank\": 1, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_drywall\", \"t\": \"menu\", \"name\": \"Drywall Repair\", \"icon\": \"\ud83e\uddf1\", \"desc\": \"A hole or damaged section patched, taped\", \"full\": \"A hole or damaged section patched, taped, floated and sanded smooth, ready for paint.\", \"section\": \"Repairs & Carpentry\", \"unit\": \"unit\", \"unit_label\": \"repair\", \"price\": 334.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-DRYWALL\", \"variants\": [{\"key\": \"small\", \"label\": \"Small Up to 2' x 2'\", \"price\": 334.99}, {\"key\": \"mid\", \"label\": \"Medium Up to 4' x 4'\", \"price\": 604.99}, {\"key\": \"large\", \"label\": \"Large Up to 4' x 8'\", \"price\": 964.99}], \"rows\": true, \"variant_q\": \"Repair size\", \"variant_default\": \"\", \"rank\": 1, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_smart_home\", \"t\": \"menu\", \"name\": \"Wi-Fi Camera, Doorbell and Smart Device Setup\", \"icon\": \"\ud83d\udcf7\", \"desc\": \"Battery or plug in cameras, a battery video doorbell, mesh Wi-Fi\", \"full\": \"Battery or plug in cameras, a battery video doorbell, mesh Wi-Fi, smart speakers and hubs mounted, paired and tested. Anything hard wired is an Electric job.\", \"section\": \"Smart Home & Safety\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 99.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-SMARTHOME\", \"variants\": [{\"key\": \"one\", \"label\": \"One battery doorbell or camera\", \"price\": 99.99}, {\"key\": \"multi\", \"label\": \"Two to four cameras\", \"price\": 199.99}, {\"key\": \"network\", \"label\": \"Mesh Wi-Fi, speakers and hub setup\", \"price\": 129.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"sh_surface\", \"label\": \"Mounting surface\", \"options\": [\"Siding, wood or drywall\", \"Brick, stucco or stone\"], \"add\": {\"Brick, stucco or stone\": 40}}, {\"key\": \"sh_height\", \"label\": \"Height\", \"options\": [\"Reachable from a 6 ft ladder\", \"Second story or over 12 ft\"], \"add\": {\"Second story or over 12 ft\": 40}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_outdoor_assembly\", \"t\": \"menu\", \"name\": \"Grill, Patio and Outdoor Assembly\", \"icon\": \"\ud83c\udf56\", \"desc\": \"A grill or smoker, a patio furniture set, a basketball hoop\", \"full\": \"A grill or smoker, a patio furniture set, a basketball hoop, a bike rack or an umbrella assembled and set in place, packaging stacked.\", \"section\": \"Assembly\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 119.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-OUTDOORASM\", \"variants\": [{\"key\": \"grill\", \"label\": \"Grill or smoker\", \"price\": 119.99}, {\"key\": \"patio\", \"label\": \"Patio furniture set, up to 6 pieces\", \"price\": 149.99}, {\"key\": \"hoop\", \"label\": \"Basketball hoop or bike rack\", \"price\": 199.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"oa_where\", \"label\": \"Boxes\", \"options\": [\"Already where it goes\", \"Carry from the garage or curb\"], \"add\": {\"Carry from the garage or curb\": 30}}, {\"key\": \"oa_ground\", \"label\": \"Base\", \"options\": [\"Portable or on a deck\", \"In-ground post set in concrete\"], \"add\": {\"In-ground post set in concrete\": 100}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_play_assembly\", \"t\": \"menu\", \"name\": \"Trampoline, Playset or Swing Set Assembly\", \"icon\": \"\ud83d\udedd\", \"desc\": \"The kit unboxed, assembled\", \"full\": \"The kit unboxed, assembled, squared and anchored where a kit is provided, ready for the kids the same day.\", \"section\": \"Assembly\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 199.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-PLAYASM\", \"variants\": [{\"key\": \"trampoline\", \"label\": \"Trampoline with enclosure\", \"price\": 199.99}, {\"key\": \"playset\", \"label\": \"Playset or swing set, one tower\", \"price\": 449.99}, {\"key\": \"large\", \"label\": \"Large playset, two towers\", \"price\": 799.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"pa_ground\", \"label\": \"Ground\", \"options\": [\"Level lawn\", \"Slope or needs leveling\"], \"add\": {\"Slope or needs leveling\": 100}}, {\"key\": \"pa_anchor\", \"label\": \"Anchors\", \"options\": [\"No anchor kit\", \"Anchor kit, you supply\"], \"add\": {\"Anchor kit, you supply\": 50}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_shed_assembly\", \"t\": \"menu\", \"name\": \"Shed, Greenhouse or Carport Kit Assembly\", \"icon\": \"\ud83c\udfe0\", \"desc\": \"A resin, metal or wood shed kit\", \"full\": \"A resin, metal or wood shed kit, a greenhouse or a carport kit built square and anchored on your prepared base.\", \"section\": \"Assembly\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 449.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-SHEDASM\", \"variants\": [{\"key\": \"resin\", \"label\": \"Resin or metal shed, up to 8 x 10\", \"price\": 449.99}, {\"key\": \"wood\", \"label\": \"Wood shed kit, up to 10 x 12\", \"price\": 799.99}, {\"key\": \"green\", \"label\": \"Greenhouse or carport kit\", \"price\": 599.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"sa_base\", \"label\": \"Base\", \"options\": [\"Level pad or existing base\", \"Build a gravel or timber base\"], \"add\": {\"Build a gravel or timber base\": 250}}, {\"key\": \"sa_pros\", \"label\": \"Pros\", \"options\": [\"One pro\", \"Two pros, faster\"], \"add\": {\"Two pros, faster\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_fitness_assembly\", \"t\": \"menu\", \"name\": \"Exercise Equipment Assembly\", \"icon\": \"\ud83c\udfcb\", \"desc\": \"A treadmill, bike, elliptical, rower\", \"full\": \"A treadmill, bike, elliptical, rower, bench or full power rack assembled, leveled and tested.\", \"section\": \"Assembly\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-FITNESSASM\", \"variants\": [{\"key\": \"cardio\", \"label\": \"Treadmill, bike, elliptical or rower\", \"price\": 149.99}, {\"key\": \"gym\", \"label\": \"Home gym, power rack or cable machine\", \"price\": 249.99}, {\"key\": \"bench\", \"label\": \"Bench, rack or small equipment\", \"price\": 99.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"fa_floor\", \"label\": \"Location\", \"options\": [\"Ground floor\", \"Upstairs or basement carry\"], \"add\": {\"Upstairs or basement carry\": 50}}, {\"key\": \"fa_move\", \"label\": \"Placement\", \"options\": [\"Boxes already in the room\", \"Carry from the garage or curb\"], \"add\": {\"Carry from the garage or curb\": 30}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_closet_system\", \"t\": \"menu\", \"name\": \"Closet System Installation\", \"icon\": \"\ud83d\udc57\", \"desc\": \"A kit closet system (PAX, Elfa, ClosetMaid\", \"full\": \"A kit closet system (PAX, Elfa, ClosetMaid, Rubbermaid) or wire shelving installed level and anchored, the old rod and shelf removed where asked.\", \"section\": \"Storage & Closets\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-CLOSET\", \"variants\": [{\"key\": \"reach\", \"label\": \"Reach-in closet\", \"price\": 249.99}, {\"key\": \"walkin\", \"label\": \"Walk-in closet\", \"price\": 449.99}, {\"key\": \"wire\", \"label\": \"Pantry, laundry or garage wire shelving\", \"price\": 199.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cs_walls\", \"label\": \"Walls\", \"options\": [\"Drywall\", \"Plaster, brick or concrete\"], \"add\": {\"Plaster, brick or concrete\": 60}}, {\"key\": \"cs_old\", \"label\": \"Old closet\", \"options\": [\"Nothing to remove\", \"Remove the old rod and shelf, patch the holes\"], \"add\": {\"Remove the old rod and shelf, patch the holes\": 49}}, {\"key\": \"cs_supply\", \"label\": \"Kit\", \"options\": [\"You supply the item\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 39}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_garage_storage\", \"t\": \"menu\", \"name\": \"Garage Storage and Overhead Racks\", \"icon\": \"\ud83c\udfd7\", \"desc\": \"Overhead ceiling racks lag bolted into the joists\", \"full\": \"Overhead ceiling racks lag bolted into the joists, slatwall or track systems with hooks, and heavy shelving anchored to the wall.\", \"section\": \"Storage & Closets\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 199.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-GARAGESTORAGE\", \"variants\": [{\"key\": \"one\", \"label\": \"One overhead rack, 4 x 8\", \"price\": 199.99}, {\"key\": \"two\", \"label\": \"Two overhead racks\", \"price\": 349.99}, {\"key\": \"wall\", \"label\": \"Slatwall or track system with hooks\", \"price\": 149.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"gs_ceiling\", \"label\": \"Ceiling\", \"options\": [\"Up to 10 ft\", \"Over 10 ft\"], \"add\": {\"Over 10 ft\": 50}}, {\"key\": \"gs_supply\", \"label\": \"Rack\", \"options\": [\"You supply the item\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 39}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_door_install\", \"t\": \"menu\", \"name\": \"Interior Door Installation\", \"icon\": \"\ud83d\udeaa\", \"desc\": \"A new slab hung in the existing frame\", \"full\": \"A new slab hung in the existing frame, a prehung interior door set plumb, bifold or closet doors fitted, or a barn door kit mounted, door supplied by you.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 199.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-DOORINSTALL\", \"variants\": [{\"key\": \"slab\", \"label\": \"Slab in the existing frame\", \"price\": 199.99}, {\"key\": \"prehung\", \"label\": \"Prehung interior door\", \"price\": 299.99}, {\"key\": \"bifold\", \"label\": \"Bifold or closet doors, one opening\", \"price\": 179.99}, {\"key\": \"barn\", \"label\": \"Barn door kit\", \"price\": 249.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"di_hardware\", \"label\": \"Hardware\", \"options\": [\"Reuse the hinges and knob\", \"New knob, deadbolt or hinges, you supply\"], \"add\": {\"New knob, deadbolt or hinges, you supply\": 30}}, {\"key\": \"di_trim\", \"label\": \"Casing\", \"options\": [\"Casing stays\", \"Replace the casing, paint ready\"], \"add\": {\"Replace the casing, paint ready\": 79}}, {\"key\": \"di_supply\", \"label\": \"Door\", \"options\": [\"You supply the item\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 49}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_door_window_repair\", \"t\": \"menu\", \"name\": \"Sliding Door, Window and Storm Door Repair\", \"icon\": \"\ud83e\ude9f\", \"desc\": \"Patio door rollers and track, window balances, locks and cranks\", \"full\": \"Patio door rollers and track, window balances, locks and cranks, or a storm or screen door hung and adjusted, parts supplied by you.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-DOORREPAIR\", \"variants\": [{\"key\": \"slider\", \"label\": \"Sliding patio door rollers or track\", \"price\": 149.99}, {\"key\": \"window\", \"label\": \"Window balance, lock or crank\", \"price\": 129.99}, {\"key\": \"storm\", \"label\": \"Storm or screen door install or repair\", \"price\": 149.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"dw_count\", \"label\": \"How many\", \"options\": [\"One\", \"Two or three\"], \"add\": {\"Two or three\": 99}}, {\"key\": \"dw_supply\", \"label\": \"Parts\", \"options\": [\"You have the parts\", \"The pro sources them at cost\"], \"add\": {\"The pro sources them at cost\": 39}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_tile_grout\", \"t\": \"menu\", \"name\": \"Tile and Grout Repair\", \"icon\": \"\ud83e\uddf1\", \"desc\": \"Loose or cracked tiles reset with matching tile, or a shower\", \"full\": \"Loose or cracked tiles reset with matching tile, or a shower, tub surround or floor regrouted and sealed.\", \"section\": \"Repairs & Carpentry\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-TILEGROUT\", \"variants\": [{\"key\": \"tiles\", \"label\": \"Reset up to 5 tiles\", \"price\": 149.99}, {\"key\": \"shower\", \"label\": \"Regrout a shower or tub surround\", \"price\": 299.99}, {\"key\": \"floor\", \"label\": \"Regrout a floor, up to 100 sq ft\", \"price\": 349.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"tg_tile\", \"label\": \"Matching tile\", \"options\": [\"You have matching tile\", \"The pro sources a close match, at cost\"], \"add\": {\"The pro sources a close match, at cost\": 39}}, {\"key\": \"tg_caulk\", \"label\": \"Caulk\", \"options\": [\"Existing caulk is fine\", \"Recaulk the corners and tub joint\"], \"add\": {\"Recaulk the corners and tub joint\": 49}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_trim\", \"t\": \"menu\", \"name\": \"Baseboard, Trim and Molding\", \"icon\": \"\ud83d\udccf\", \"desc\": \"Baseboard, shoe molding, door and window casing or crown molding\", \"full\": \"Baseboard, shoe molding, door and window casing or crown molding cut, installed, nailed and caulked, material supplied by you.\", \"section\": \"Repairs & Carpentry\", \"unit\": \"ft\", \"unit_label\": \"linear ft\", \"price\": 4.99, \"min_qty\": 20, \"max_qty\": 500, \"step\": 10, \"code\": \"HM-TRIM\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"tr_type\", \"label\": \"Trim\", \"options\": [\"Baseboard or shoe molding\", \"Door and window casing\", \"Crown molding\"], \"add\": {\"Door and window casing\": 49, \"Crown molding\": 149}}, {\"key\": \"tr_finish\", \"label\": \"Finish\", \"options\": [\"Primed, paint by others\", \"Caulked, filled and painted\"], \"add\": {\"Caulked, filled and painted\": 99}}, {\"key\": \"tr_supply\", \"label\": \"Material\", \"options\": [\"You supply the item\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 49}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_deck_repair\", \"t\": \"menu\", \"name\": \"Deck Board and Railing Repair\", \"icon\": \"\ud83e\udeb5\", \"desc\": \"Rotten or loose boards, a wobbly railing\", \"full\": \"Rotten or loose boards, a wobbly railing, loose balusters or a stair tread replaced and fastened, lumber supplied by you or picked up at cost.\", \"section\": \"Repairs & Carpentry\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-DECKREPAIR\", \"variants\": [{\"key\": \"boards\", \"label\": \"Replace up to 5 deck boards\", \"price\": 249.99}, {\"key\": \"railing\", \"label\": \"Railing or baluster repair\", \"price\": 199.99}, {\"key\": \"stairs\", \"label\": \"Stair tread or stringer repair\", \"price\": 299.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"dr_material\", \"label\": \"Material\", \"options\": [\"Pressure treated\", \"Composite or cedar\"], \"add\": {\"Composite or cedar\": 60}}, {\"key\": \"dr_supply\", \"label\": \"Lumber\", \"options\": [\"You supply the item\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 49}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_window_ac\", \"t\": \"menu\", \"name\": \"Window AC Unit Install or Removal\", \"icon\": \"\u2744\", \"desc\": \"A window unit set on a bracket, sealed and secured\", \"full\": \"A window unit set on a bracket, sealed and secured, or removed and stored for the season. Wall sleeve or hard wired units are an Electric or HVAC job.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 99.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-WINDOWAC\", \"variants\": [{\"key\": \"install\", \"label\": \"Install\", \"price\": 99.99}, {\"key\": \"remove\", \"label\": \"Remove and store\", \"price\": 69.99}, {\"key\": \"both\", \"label\": \"Install now, remove at season end\", \"price\": 149.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"wa_floor\", \"label\": \"Floor\", \"options\": [\"First floor\", \"Second floor or higher\"], \"add\": {\"Second floor or higher\": 30}}, {\"key\": \"wa_bracket\", \"label\": \"Bracket\", \"options\": [\"No bracket needed\", \"Support bracket, you supply\"], \"add\": {\"Support bracket, you supply\": 30}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_pet_door\", \"t\": \"menu\", \"name\": \"Pet Door Installation\", \"icon\": \"\ud83d\udc15\", \"desc\": \"A pet door cut into an exterior door, a wall\", \"full\": \"A pet door cut into an exterior door, a wall, or set as a sliding glass door panel insert, sealed and trimmed, door supplied by you.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-PETDOOR\", \"variants\": [{\"key\": \"door\", \"label\": \"In a wood or fiberglass door\", \"price\": 149.99}, {\"key\": \"wall\", \"label\": \"Through an exterior wall\", \"price\": 349.99}, {\"key\": \"slider\", \"label\": \"Sliding glass door panel insert\", \"price\": 99.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"pd_size\", \"label\": \"Size\", \"options\": [\"Small or medium\", \"Large or extra large\"], \"add\": {\"Large or extra large\": 40}}, {\"key\": \"pd_supply\", \"label\": \"Pet door\", \"options\": [\"You supply the item\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 39}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_child_safety\", \"t\": \"menu\", \"name\": \"Baby Proofing and Child Safety\", \"icon\": \"\ud83d\udc76\", \"desc\": \"Cabinet latches, drawer locks, corner guards, furniture anchors\", \"full\": \"Cabinet latches, drawer locks, corner guards, furniture anchors, cord cleats and hardware mounted gates installed through the home, devices supplied by you or picked up at cost.\", \"section\": \"Smart Home & Safety\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-CHILDSAFETY\", \"variants\": [{\"key\": \"starter\", \"label\": \"Starter, up to 10 devices\", \"price\": 149.99}, {\"key\": \"whole\", \"label\": \"Whole home, up to 25 devices\", \"price\": 299.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cs_gates\", \"label\": \"Gates\", \"options\": [\"No gates\", \"One or two hardware mounted gates\"], \"add\": {\"One or two hardware mounted gates\": 79}}, {\"key\": \"cs_supply\", \"label\": \"Devices\", \"options\": [\"You have the devices\", \"The pro sources them, at cost\"], \"add\": {\"The pro sources them, at cost\": 39}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_accessibility\", \"t\": \"menu\", \"name\": \"Grab Bars, Handrails and Accessibility\", \"icon\": \"\u267f\", \"desc\": \"A set of grab bars, a stair or porch handrail\", \"full\": \"A set of grab bars, a stair or porch handrail, a threshold ramp or a shower seat installed into solid backing for safe aging in place.\", \"section\": \"Smart Home & Safety\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-ACCESS\", \"variants\": [{\"key\": \"bars\", \"label\": \"Up to 3 grab bars\", \"price\": 149.99}, {\"key\": \"handrail\", \"label\": \"Stair or porch handrail, up to 12 ft\", \"price\": 249.99}, {\"key\": \"ramp\", \"label\": \"Threshold ramp or shower seat\", \"price\": 129.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"ac_surface\", \"label\": \"Surface\", \"options\": [\"Drywall or wood\", \"Tile, stone or brick\"], \"add\": {\"Tile, stone or brick\": 49}}, {\"key\": \"ac_supply\", \"label\": \"Hardware\", \"options\": [\"You supply the item\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 39}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_holiday_lights\", \"t\": \"menu\", \"name\": \"Holiday Lights and Decor\", \"icon\": \"\ud83c\udf84\", \"desc\": \"Your lights hung on the roofline with clips\", \"full\": \"Your lights hung on the roofline with clips, trees and bushes wrapped, wreaths and garland hung, and everything taken down and packed after the season.\", \"section\": \"Outdoor & Structures\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-HOLIDAY\", \"variants\": [{\"key\": \"single\", \"label\": \"Roofline up to 100 ft, single story\", \"price\": 249.99}, {\"key\": \"two\", \"label\": \"Two story or over 100 ft\", \"price\": 449.99}, {\"key\": \"takedown\", \"label\": \"Takedown and pack\", \"price\": 149.99}], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hl_lights\", \"label\": \"Lights\", \"options\": [\"You supply the lights and clips\", \"The pro supplies clips, at cost\"], \"add\": {\"The pro supplies clips, at cost\": 29}}, {\"key\": \"hl_extras\", \"label\": \"Extras\", \"options\": [\"Roofline only\", \"Add trees, bushes, a wreath or garland\"], \"add\": {\"Add trees, bushes, a wreath or garland\": 99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_built_ins\", \"t\": \"menu\", \"name\": \"Custom Built-Ins, Shelving or Closet Build\", \"icon\": \"\ud83d\udcda\", \"desc\": \"Built-in bookcases, a window seat, floating shelves cut to size\", \"full\": \"Built-in bookcases, a window seat, floating shelves cut to size, a mudroom bench or a custom closet built on site.\", \"section\": \"Storage & Closets\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 1999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-BUILTINS\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"bi_finish\", \"label\": \"Finish\", \"options\": [\"Paint grade\", \"Stain grade hardwood\"], \"add\": {\"Stain grade hardwood\": 800}}, {\"key\": \"bi_size\", \"label\": \"Size\", \"options\": [\"Under 8 ft wide\", \"8 ft or wider\"], \"add\": {\"8 ft or wider\": 800}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_ramp\", \"t\": \"menu\", \"name\": \"Wheelchair Ramp or Handrail Build\", \"icon\": \"\u267f\", \"desc\": \"A wood, composite or aluminum ramp with handrails built to code\", \"full\": \"A wood, composite or aluminum ramp with handrails built to code for the entry, or long handrails along steps and walkways.\", \"section\": \"Outdoor & Structures\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 1499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-RAMP\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"rp_length\", \"label\": \"Length\", \"options\": [\"Under 12 ft\", \"12 ft or more\"], \"add\": {\"12 ft or more\": 800}}, {\"key\": \"rp_material\", \"label\": \"Material\", \"options\": [\"Pressure treated wood\", \"Composite or aluminum\"], \"add\": {\"Composite or aluminum\": 500}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_structure\", \"t\": \"menu\", \"name\": \"Large Shed, Pergola or Covered Patio Build\", \"icon\": \"\ud83c\udfd7\", \"desc\": \"A shed over 10 x 12, a pergola or gazebo\", \"full\": \"A shed over 10 x 12, a pergola or gazebo, or a carport or covered patio built from a kit or from plans.\", \"section\": \"Outdoor & Structures\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 2999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-STRUCTURE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"st_type\", \"label\": \"Project\", \"options\": [\"Shed over 10 x 12\", \"Pergola or gazebo\", \"Carport or covered patio\"], \"add\": {\"Pergola or gazebo\": 500, \"Carport or covered patio\": 1500}}, {\"key\": \"st_permit\", \"label\": \"Permit\", \"options\": [\"Not required here\", \"Required, the pro files it\"], \"add\": {\"Required, the pro files it\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_hooks_ao\", \"t\": \"menu\", \"name\": \"Hooks, racks and small hardware\", \"icon\": \"\ud83e\ude9d\", \"desc\": \"Coat hooks, a key rack, robe hooks, a closet rod bracket\", \"full\": \"Coat hooks, a key rack, robe hooks, a closet rod bracket, door stops or a wall organizer mounted level and anchored.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"item\", \"price\": 29.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-HOOKS\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hk_wall\", \"label\": \"Wall\", \"options\": [\"Drywall or wood\", \"Tile, brick or concrete\"], \"add\": {\"Tile, brick or concrete\": 15}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_grab_bar_ao\", \"t\": \"menu\", \"name\": \"Grab bar install\", \"icon\": \"\ud83d\udec1\", \"desc\": \"A grab bar anchored into studs or solid backing in the shower\", \"full\": \"A grab bar anchored into studs or solid backing in the shower, by the tub or next to the toilet.\", \"section\": \"Smart Home & Safety\", \"unit\": \"unit\", \"unit_label\": \"bar\", \"price\": 59.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-GRABBAR\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"gb_surface\", \"label\": \"Surface\", \"options\": [\"Drywall or fiberglass\", \"Tile or stone, drilled\"], \"add\": {\"Tile or stone, drilled\": 30}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_anchor_ao\", \"t\": \"menu\", \"name\": \"Anti-tip anchoring\", \"icon\": \"\ud83d\udee1\", \"desc\": \"A dresser, bookcase, wardrobe or TV strapped to the wall\", \"full\": \"A dresser, bookcase, wardrobe or TV strapped to the wall so it cannot tip.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"piece\", \"price\": 29.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-ANCHOR\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_lock_ao\", \"t\": \"menu\", \"name\": \"Doorknob or deadbolt install\", \"icon\": \"\ud83d\udd11\", \"desc\": \"A standard doorknob, lever or deadbolt fitted and the strike\", \"full\": \"A standard doorknob, lever or deadbolt fitted and the strike lined up so it latches clean, lock supplied by you.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"unit\", \"unit_label\": \"lock\", \"price\": 49.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-LOCK\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"lk_door\", \"label\": \"Door\", \"options\": [\"Replaces the existing lock\", \"New door, 3 holes drilled to line up\"], \"add\": {\"New door, 3 holes drilled to line up\": 60}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_smart_lock_ao\", \"t\": \"menu\", \"name\": \"Smart lock or keypad deadbolt setup\", \"icon\": \"\ud83d\udd10\", \"desc\": \"A smart lock or keypad deadbolt fitted to the door\", \"full\": \"A smart lock or keypad deadbolt fitted to the door, paired to your phone and codes set, lock supplied by you.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"unit\", \"unit_label\": \"door\", \"price\": 79.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-SMARTLOCK\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"sl_type\", \"label\": \"Door\", \"options\": [\"Replaces the existing deadbolt\", \"New door, 3 holes drilled to line up\"], \"add\": {\"New door, 3 holes drilled to line up\": 60}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_pulls_ao\", \"t\": \"menu\", \"name\": \"Cabinet or drawer pulls\", \"icon\": \"\ud83e\ude9b\", \"desc\": \"Knobs and pulls fitted to cabinet doors and drawers\", \"full\": \"Knobs and pulls fitted to cabinet doors and drawers, holes drilled where there are none, hardware supplied by you.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"unit\", \"unit_label\": \"pull\", \"price\": 9.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-PULLS\", \"variants\": [{\"key\": \"single\", \"label\": \"Single screw knob\", \"price\": 9.99}, {\"key\": \"double5\", \"label\": \"Double screw, up to 5 in\", \"price\": 14.99}, {\"key\": \"double5p\", \"label\": \"Double screw, over 5 in\", \"price\": 19.99}], \"rows\": false, \"variant_q\": \"Pull type\", \"variant_default\": \"Single screw knob\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_door_adjust_ao\", \"t\": \"menu\", \"name\": \"Door adjustment\", \"icon\": \"\ud83d\udeaa\", \"desc\": \"A sticking, rubbing or non latching door fixed\", \"full\": \"A sticking, rubbing or non latching door fixed: hinges shimmed or replaced, strike plate moved, edge planed.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"unit\", \"unit_label\": \"door\", \"price\": 49.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-DOORADJ\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"da_fix\", \"label\": \"Fix\", \"options\": [\"Hinges, strike or latch adjustment\", \"Plane or trim the door edge\"], \"add\": {\"Plane or trim the door edge\": 30}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_weatherstrip_ao\", \"t\": \"menu\", \"name\": \"Weatherstripping or door sweep\", \"icon\": \"\ud83c\udf2c\", \"desc\": \"New weatherstripping and a door sweep on an exterior door\", \"full\": \"New weatherstripping and a door sweep on an exterior door so the draft, bugs and light stop.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"unit\", \"unit_label\": \"door\", \"price\": 49.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-WEATHER\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"ws_supply\", \"label\": \"Materials\", \"options\": [\"You supply the weatherstripping\", \"The pro picks it up at cost\"], \"add\": {\"The pro picks it up at cost\": 15}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_caulk_ao\", \"t\": \"menu\", \"name\": \"Caulk or seal a joint\", \"icon\": \"\ud83e\uddf4\", \"desc\": \"A window, door, trim, backsplash or tub joint cut clean\", \"full\": \"A window, door, trim, backsplash or tub joint cut clean and resealed with the right caulk.\", \"section\": \"Extras\", \"unit\": \"unit\", \"unit_label\": \"area\", \"price\": 39.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-CAULK\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"ck_area\", \"label\": \"Area\", \"options\": [\"Window, door or trim joint\", \"Tub, shower or backsplash, strip the old caulk\"], \"add\": {\"Tub, shower or backsplash, strip the old caulk\": 20}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_bulb_filter_ao\", \"t\": \"menu\", \"name\": \"Bulb, battery or air filter swap, hard to reach\", \"icon\": \"\ud83d\udca1\", \"desc\": \"High bulbs, smoke detector batteries and return air filters\", \"full\": \"High bulbs, smoke detector batteries and return air filters changed with the right ladder, items supplied by you.\", \"section\": \"Extras\", \"unit\": \"unit\", \"unit_label\": \"item\", \"price\": 24.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-BULBFILTER\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"bf_height\", \"label\": \"Height\", \"options\": [\"Reachable with a 6 ft ladder\", \"Over 12 ft, extension ladder\"], \"add\": {\"Over 12 ft, extension ladder\": 20}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_screen_ao\", \"t\": \"menu\", \"name\": \"Window screen re-screen or patch\", \"icon\": \"\ud83e\ude9f\", \"desc\": \"The torn screen re-meshed in its frame or patched\", \"full\": \"The torn screen re-meshed in its frame or patched, frame kits supplied by you where the frame is bent.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"unit\", \"unit_label\": \"screen\", \"price\": 39.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-SCREEN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"sc_frame\", \"label\": \"Frame\", \"options\": [\"Rescreen the existing frame\", \"New frame kit, you supply\"], \"add\": {\"New frame kit, you supply\": 10}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_cabinet_fix_ao\", \"t\": \"menu\", \"name\": \"Cabinet hinge, drawer slide or soft close repair\", \"icon\": \"\ud83d\udeaa\", \"desc\": \"A sagging door realigned, a broken hinge or drawer slide swapped\", \"full\": \"A sagging door realigned, a broken hinge or drawer slide swapped, soft close dampers added, parts supplied by you.\", \"section\": \"Doors, Windows & Cabinets\", \"unit\": \"unit\", \"unit_label\": \"door or drawer\", \"price\": 39.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-CABINET\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cf_parts\", \"label\": \"Parts\", \"options\": [\"Adjust or reuse the hardware\", \"New hinges or slides, you supply\"], \"add\": {\"New hinges or slides, you supply\": 10}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_mailbox_ao\", \"t\": \"menu\", \"name\": \"Mailbox, house numbers or flag holder\", \"icon\": \"\ud83d\udcec\", \"desc\": \"A mailbox, house numbers\", \"full\": \"A mailbox, house numbers, a flag holder or a hose hanger mounted straight and anchored.\", \"section\": \"Mounting & Hardware\", \"unit\": \"unit\", \"unit_label\": \"item\", \"price\": 49.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-MAILBOX\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"mb_mount\", \"label\": \"Mount\", \"options\": [\"Wall, porch or existing post\", \"New post set in the ground\"], \"add\": {\"New post set in the ground\": 60}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_pickup_ao\", \"t\": \"menu\", \"name\": \"Materials pickup from the store\", \"icon\": \"\ud83d\uded2\", \"desc\": \"The pro picks up the parts\", \"full\": \"The pro picks up the parts, hardware or the boxed item on the way, materials billed at cost.\", \"section\": \"Extras\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 39.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HM-AO-PICKUP\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hm_haul_ao\", \"t\": \"menu\", \"name\": \"Haul away packaging or the old item\", \"icon\": \"\ud83d\ude9a\", \"desc\": \"The boxes and packaging, or the old door, furniture or fixture\", \"full\": \"The boxes and packaging, or the old door, furniture or fixture, taken away and recycled.\", \"section\": \"Extras\", \"unit\": \"unit\", \"unit_label\": \"item\", \"price\": 29.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HM-AO-HAUL\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"ha_item\", \"label\": \"Item\", \"options\": [\"Boxes and packaging\", \"Old furniture, door or fixture\"], \"add\": {\"Old furniture, door or fixture\": 20}}]}], \"extras\": [], \"main\": [\"hm_tv\", \"hm_furniture\", \"hm_picture\", \"hm_shelf\", \"hm_drywall\", \"hm_hourly\"], \"sections\": [\"By the Hour\", \"Mounting & Hardware\", \"Assembly\", \"Repairs & Carpentry\", \"Smart Home & Safety\", \"Storage & Closets\", \"Doors, Windows & Cabinets\", \"Outdoor & Structures\", \"Extras\"]};\n  var APP = '\/account', QUOTE = APP + '\/customer\/booking-assistant\/quote', CART = APP + '\/customer\/booking-assistant\/create-cart', ZIP = '70124';\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'], SQ_APT = ['Up to 1,000 sq ft','1,001 - 2,000','2,001 - 3,000'];\n  var I = {}, X = {};\n  D.items.forEach(function(o){ I[o.key] = o; }); (D.extras || []).forEach(function(a){ X[a.key] = a; });\n  var st = { sel: [], c: {}, ex: {}, all: true, inc: {}, desc: {} };\n  var q = { busy: false, res: [], groups: [], seq: 0, err: '' };\n  function $(id){ return document.getElementById(id); }\n  function esc(t){ return String(t == null ? '' : t).replace(\/[&<>\"]\/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]; }); }\n  function money(n){ return '$' + Number(n).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}); }\n  function dur(h){ var m = Math.round((Number(h) || 0) * 60), dd = Math.floor(m \/ 480), r = m % 480, hh = Math.floor(r \/ 60), mm = r % 60, p = []; if (dd) p.push(dd + ' day' + (dd > 1 ? 's' : '')); if (hh) p.push(hh + ' hr'); if (mm) p.push(mm + ' min'); return p.join(' ') || '0 min'; }\n  function unitTxt(o){ if (o.unit === 'sqft') return '\/ sq ft'; if (o.unit === 'hour') return '\/ hour'; if (o.unit === 'unit' && o.unit_label) return '\/ ' + o.unit_label; return ''; }\n  function on(k){ return st.sel.indexOf(k) >= 0; }\n  function nOf(o){ return o.unit === 'sqft' ? 'sq ft' : (o.unit === 'hour' ? 'hour' : (o.unit_label || '')); }\n  function pl(o, n){ return n > 1 && (o.unit === 'unit' || o.unit === 'hour') && !\/(ft|s)$\/.test(nOf(o)) ? 's' : ''; }\n  \/\/ per service settings, created with its defaults the first time it is added\n  function cf(o){\n    if (st.c[o.key]) return st.c[o.key];\n    var c = {};\n    if (o.t === 'visit') c = { often: 'One Time', freq: 'Weekly', prop: 0, sq: 1, beds: 1, full: 1, half: 0, cleaners: 1, hours: 2 };\n    else if (o.t === 'legacy') (o.fields || []).forEach(function(f){ if (f.t === 'seg') c[f.n] = f.def != null ? f.def : f.opts[0]; else if (f.t === 'num') c[f.n] = f.def; else if (f.t === 'list') c[f.n] = f.def || 0; else if (f.t === 'items') c.items = f.items.map(function(_, i){ return i === 0 ? 1 : 0; }); });\n    else { c.qty = o.qdef || o.min_qty || 1; c.ans = {}; (o.questions || []).forEach(function(qq){ c.ans[qq.key] = qq.options[0]; }); if ((o.variants || []).length){ var dv = o.variants.filter(function(x){ return x.key === o.variant_default || x.label === o.variant_default; })[0]; c.variant = (dv || o.variants[0]).key; if (o.rows){ c.rows = {}; o.variants.forEach(function(x){ c.rows[x.key] = 0; }); } \/* HF-2026-10-10z (Chris): nothing is picked for the customer, every count starts at 0 *\/ } }\n    st.c[o.key] = c; return c;\n  }\n  function shown(o, f){ if (!f.when) return true; var v = cf(o); for (var k in f.when){ if (f.when[k].indexOf(v[k]) < 0) return false; } return true; }\n  function rowsSum(o){ var c = cf(o), n = 0; for (var k in c.rows) n += c.rows[k]; return n; }\n  \/\/ a service with counted rows needs at least one row above 0 before it can be priced\n  function empty(o){\n    if (o.t === 'legacy'){ var f = (o.fields || []).filter(function(x){ return x.t === 'items'; })[0]; return !!f && !cf(o).items.some(function(n){ return n > 0; }); }\n    if (o.rows) return rowsSum(o) <= 0;\n    return false;\n  }\n  function hintOf(o){\n    if (o.hint) return o.hint;\n    if (o.t === 'quote') return 'custom quote';\n    if ((o.variants || []).length){ var ps = o.variants.map(function(x){ return x.price; }).filter(function(x){ return x > 0; }); if (ps.length) return 'from ' + money(Math.min.apply(null, ps)) + (o.unit !== 'flat' ? ' ' + unitTxt(o) : ''); }\n    return o.price > 0 ? money(o.price) + (o.unit !== 'flat' ? ' ' + unitTxt(o) : '') : 'see price';\n  }\n  \/\/ ---- the options under a picked card (white, on the left) ----\n  function ob(k, name, val, opts){ return '<div class=\"os\">' + opts.map(function(x){ return '<button type=\"button\" data-k=\"' + k + '\" data-fs=\"' + esc(name) + '\" data-v=\"' + esc(x) + '\"' + (x === val ? ' class=\"on\"' : '') + '>' + esc(x) + '<\/button>'; }).join('') + '<\/div>'; }\n  function om(k, name, val, min, max){ return '<div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"-1\"' + (val <= min ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><b' + (val ? '' : ' class=\"z\"') + '>' + val + '<\/b><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"1\"' + (val >= max ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div>'; }\n  function ost(k, name, disp, unit, lo, hi){ return '<div class=\"ost\"><div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"-1\"' + (lo ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><\/div><div class=\"ov\">' + esc(disp) + (unit ? '<small>' + esc(unit) + '<\/small>' : '') + '<\/div><div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"1\"' + (hi ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div><\/div>'; }\n  function lbl(t){ return '<div class=\"ol\">' + esc(t) + '<\/div>'; }\n  function optsHTML(o){\n    var c = cf(o), k = o.key, h = '';\n    if (o.t === 'visit'){\n      if (o.recurring){ h += lbl('How often?') + ob(k, 'often', c.often, ['One Time', 'Recurring']); if (c.often === 'Recurring') h += lbl('How frequently?') + ob(k, 'freq', c.freq, ['Weekly', 'Bi-Weekly', 'Monthly']); }\n      if (o.hourly){ var mx = c.often === 'Recurring' ? 4 : 8; if (c.hours > mx) c.hours = mx;\n        h += lbl('How many cleaners?') + ob(k, 'cleaners', c.cleaners === 2 ? '2 Cleaners' : '1 Cleaner', ['1 Cleaner', '2 Cleaners']);\n        h += lbl('How many hours?') + ost(k, 'hours', c.hours, 'hr' + (c.hours > 1 ? 's' : ''), c.hours <= 1, c.hours >= mx);\n      } else { var sl = c.prop ? SQ_APT : SQ_HOUSE; if (c.sq > sl.length - 1) c.sq = sl.length - 1;\n        h += lbl('Type of property') + ob(k, 'prop', c.prop ? 'Apartment \/ Condo' : 'House \/ Townhouse', ['House \/ Townhouse', 'Apartment \/ Condo']);\n        h += lbl('Square feet') + ost(k, 'sq', sl[c.sq].replace(' sq ft', ''), 'sq ft', c.sq <= 0, c.sq >= sl.length - 1);\n        h += lbl('Bedrooms & bathrooms') + '<div class=\"orm\"><div>Bedrooms' + om(k, 'beds', c.beds, 1, 9) + '<\/div><div>Full Baths' + om(k, 'full', c.full, 1, 9) + '<\/div><div>Half Baths' + om(k, 'half', c.half, 0, 9) + '<\/div><\/div>';\n      }\n    } else if (o.t === 'legacy'){\n      (o.fields || []).forEach(function(f){\n        if (!shown(o, f)) return;\n        if (f.t === 'seg') h += lbl(f.label) + ob(k, f.n, c[f.n], f.opts);\n        else if (f.t === 'num') h += lbl(f.label) + ost(k, f.n, Number(c[f.n]).toLocaleString('en-US'), f.unit + (f.unit && c[f.n] > 1 && !\/ft$\/.test(f.unit) ? 's' : ''), c[f.n] <= f.min, c[f.n] >= f.max);\n        else if (f.t === 'list') h += lbl(f.label) + ost(k, f.n, f.vals[c[f.n]], f.unit, c[f.n] <= 0, c[f.n] >= f.vals.length - 1);\n        else if (f.t === 'items') h += lbl(f.label) + f.items.map(function(it, i){ return '<div class=\"orw\"><span>' + esc(it) + '<\/span>' + om(k, 'it:' + i, c.items[i], 0, 20) + '<\/div>'; }).join('');\n      });\n    } else if (o.t === 'menu'){\n      if (o.rows) h += lbl(o.variant_q || 'How many?') + o.variants.map(function(x){ return '<div class=\"orw\"><span>' + esc(x.label) + '<small>' + money(x.price) + ' each<\/small><\/span>' + om(k, 'row:' + x.key, c.rows[x.key] || 0, 0, o.max_qty || 20) + '<\/div>'; }).join('');\n      else {\n        if ((o.variants || []).length){ var cv = o.variants.filter(function(x){ return x.key === c.variant; })[0] || o.variants[0];\n          h += lbl(o.variant_q || 'Which one?') + '<div class=\"os\">' + o.variants.map(function(x){ return '<button type=\"button\" data-k=\"' + k + '\" data-var=\"' + esc(x.key) + '\"' + (x.key === cv.key ? ' class=\"on\"' : '') + '>' + esc(x.label) + '<\/button>'; }).join('') + '<\/div>'; }\n        if (o.unit !== 'flat'){ var lab = nOf(o) + pl(o, c.qty); h += lbl('How many?') + ost(k, 'qty', Number(c.qty).toLocaleString('en-US'), lab, c.qty <= o.min_qty, c.qty >= o.max_qty); }\n        (o.questions || []).forEach(function(qq){ h += lbl(qq.label) + '<div class=\"os\">' + qq.options.map(function(x){ var ad = (qq.add || {})[x]; return '<button type=\"button\" data-k=\"' + k + '\" data-q=\"' + esc(qq.key) + '\" data-v=\"' + esc(x) + '\"' + (c.ans[qq.key] === x ? ' class=\"on\"' : '') + '>' + esc(x) + (ad ? ' <small>+' + money(ad).replace('.00', '') + '<\/small>' : '') + '<\/button>'; }).join('') + '<\/div>'; });\n      }\n    }\n    if (empty(o)) h += '<p class=\"oh\">Add at least one to see your price.<\/p>';\n    if ((o.inc || []).length) h += '<button type=\"button\" class=\"oi\" data-k=\"' + k + '\" data-tog=\"inc\">What is included <span>' + (st.inc[k] ? '\u25b4' : '\u25be') + '<\/span><\/button>' + (st.inc[k] ? '<ul>' + o.inc.map(function(i){ return '<li>' + esc(i) + '<\/li>'; }).join('') + '<\/ul>' : '');\n    return h ? '<div class=\"hfc-opt\">' + h + '<\/div>' : '';\n  }\n  function cardHTML(o){\n    var s = on(o.key), op = s ? optsHTML(o) : '';\n    \/\/ HF-2026-10-10x (Chris): a picked card with options spans both columns and pushes the others down\n    return '<div class=\"hfc-cw' + (s ? ' on' : '') + (op ? ' wide' : '') + '\"><button type=\"button\" class=\"hfc-card' + (s ? ' on' : '') + '\" data-svc=\"' + o.key + '\" aria-pressed=\"' + (s ? 'true' : 'false') + '\"><span class=\"hfc-ic\">' + o.icon + '<\/span><span><h4>' + esc(o.name) + '<\/h4><p>' + esc(o.desc) + (o.desc ? ' \u00b7 ' : '') + hintOf(o) + '<\/p><\/span><span class=\"hfc-ck\">' + (s ? '\u2713' : '') + '<\/span><\/button>' + op + '<\/div>';\n  }\n  function hostVisit(){ for (var i = 0; i < st.sel.length; i++){ var o = I[st.sel[i]]; if (o.t === 'visit' && !o.hourly) return o; } return null; }\n  function renderLeft(){\n    $('hfcMain').innerHTML = D.main.map(function(k){ return cardHTML(I[k]); }).join('');\n    var rest = D.items.filter(function(o){ return D.main.indexOf(o.key) < 0; });\n    \/\/ HF-2026-10-10x (Chris): no numbered steps; \"Most popular\" on top, then every category\n    $('hfcAll').hidden = false;\n    $('hfcAll').innerHTML = D.sections.map(function(sec){\n      var it = rest.filter(function(o){ return o.section === sec; }); if (!it.length) return '';\n      return '<div class=\"hfc-cat\"><div class=\"hfc-stp\"><h3>' + esc(sec) + '<\/h3><\/div><div class=\"hfc-sv\">' + it.map(cardHTML).join('') + '<\/div><\/div>';\n    }).join('');\n    var mb = $('hfcMore'); if (mb) mb.hidden = true;\n    var s2 = $('hfcS2'); if (s2){ s2.hidden = !(D.extras || []).length;\n      if (!s2.hidden){ var hv = hostVisit();\n        $('hfcAo').innerHTML = D.extras.map(function(a){ return '<button type=\"button\" class=\"hfc-ao' + (st.ex[a.key] && hv ? ' on' : '') + '\" data-ex=\"' + a.key + '\"' + (hv ? '' : ' disabled') + '><span>' + esc(a.name) + '<\/span><b>' + money(a.price) + (a.unit !== 'flat' ? ' <small>' + unitTxt(a) + '<\/small>' : '') + '<\/b><\/button>'; }).join('');\n        var nt = $('hfcAoNote'); nt.hidden = !!hv; nt.textContent = 'These ride along with a home cleaning visit. Pick Whole Home, Deep Clean, Move In \/ Out or Airbnb above to add them.';\n        var am = $('hfcAoMore'); if (am) am.hidden = true; } }\n  }\n  \/\/ ---- engine calls: which services price together ----\n  function menuSel(o){ var c = cf(o), m = { key: o.key, qty: 1, variant: null, answers: {} };\n    if (o.rows){ m.qty = rowsSum(o); m.answers = { rows: o.variants.filter(function(x){ return c.rows[x.key] > 0; }).map(function(x){ return x.key + ':' + c.rows[x.key]; }).join(',') }; }\n    else { m.qty = o.unit === 'flat' ? 1 : c.qty; m.variant = (o.variants || []).length ? c.variant : null; for (var qk in (c.ans || {})) m.answers[qk] = c.ans[qk]; }\n    return m; }\n  function groups(){\n    var g = [], menus = [], hv = hostVisit();\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'menu' && !empty(o)) menus.push(o); });\n    if (hv) g.push({ k: 'visit', host: hv, aos: menus, ex: Object.keys(st.ex).filter(function(x){ return st.ex[x]; }) });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'visit' && o.hourly) g.push({ k: 'visit', host: o, aos: [], ex: [] }); });\n    if (!hv && menus.length) g.push({ k: 'menu', host: menus[0], aos: menus.slice(1), ex: [] });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'legacy' && !empty(o)) g.push({ k: 'legacy', host: o, aos: [], ex: [] }); });\n    return g;\n  }\n  function selection(gr){\n    var o = gr.host, c = cf(o), p = { service_type: D.st, zip: ZIP, zipcode: ZIP };\n    if (gr.k === 'visit'){\n      p.cleaningType = 'House Cleaning'; p.houseCleaningType = o.hct;\n      if (o.recurring){ p.recurring = c.often; if (c.often === 'Recurring') p.frequency = c.freq; } else p.recurring = 'One Time';\n      if (o.hourly){ p.cleaners = c.cleaners === 2 ? '2 Cleaners' : '1 Cleaner'; p.hours = c.hours + ' HR'; }\n      else { var sl = c.prop ? SQ_APT : SQ_HOUSE; p.propertyType = c.prop ? 'Apartment \/ Condo' : 'House \/ Townhouse'; p.sqft = sl[c.sq]; p.bedrooms = String(c.beds); p.fullBaths = String(c.full); p.halfBaths = String(c.half); }\n    } else if (gr.k === 'legacy'){\n      for (var k in o.sel) p[k] = o.sel[k];\n      (o.fields || []).forEach(function(f){\n        if (!shown(o, f)) return;\n        if (f.t === 'seg'){ var val = c[f.n]; p[f.p] = f.pv ? f.pv[val] : val; if (f.p2 && f.pv2 && f.pv2[val]) p[f.p2] = f.pv2[val]; }\n        else if (f.t === 'num') p[f.p] = String(c[f.n]);\n        else if (f.t === 'list') p[f.p] = f.vals[c[f.n]];\n        else if (f.t === 'items'){ var sel = {}, parts = []; f.items.forEach(function(it, i){ var n = c.items[i] || 0; if (n > 0){ sel[it] = n; parts.push(n + ' x ' + it); } }); p[f.pj] = JSON.stringify(sel); p[f.pt] = parts.join(', '); }\n      });\n    } else {\n      var m = menuSel(o); p.menu_json = JSON.stringify({ key: o.key, code: o.code, qty: m.qty, variant: m.variant, answers: m.answers, name: o.name, extras_only: false }); p.service_code = o.code;\n    }\n    var aos = gr.aos.map(menuSel).concat(gr.ex.map(function(x){ return { key: x, qty: 1 }; }));\n    if (aos.length) p.addons_json = JSON.stringify(aos);\n    return p;\n  }\n  function post(url, body, again){\n    var h = { 'Content-Type': 'application\/json', 'Accept': 'application\/json', 'X-Requested-With': 'XMLHttpRequest' };\n    var t = document.querySelector('meta[name=\"csrf-token\"]'); if (t) h['X-CSRF-TOKEN'] = t.getAttribute('content');\n    \/\/ a price answers in well under a second; one that hangs (about 1 in 60 through the load balancer) is cut at 6 s and\n    \/\/ tried again, twice at most, so the box never sits on \"\u2026\" (cart posts are never retried)\n    var quote = url === QUOTE, ac = (quote && window.AbortController) ? new AbortController() : null, tm = ac ? setTimeout(function(){ ac.abort(); }, 6000) : null;\n    return fetch(url, { method: 'POST', headers: h, credentials: 'same-origin', body: JSON.stringify(body), signal: ac ? ac.signal : undefined }).then(function(r){ clearTimeout(tm); if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })\n      .catch(function(e){ clearTimeout(tm); if (quote && (again || 0) < 2) return post(url, body, (again || 0) + 1); throw e; });\n  }\n  var timer = null;\n  function reprice(){\n    q.busy = true; q.err = ''; renderBox(); clearTimeout(timer);\n    timer = setTimeout(function(){\n      var my = ++q.seq, gs = groups();\n      if (!gs.length){ q.busy = false; q.groups = []; q.res = []; renderBox(); return; }\n      Promise.all(gs.map(function(g){ return post(QUOTE, selection(g)); })).then(function(rs){ if (my !== q.seq) return; q.groups = gs; q.res = rs; q.busy = false; renderBox(); })\n        .catch(function(){ if (my !== q.seq) return; q.busy = false; q.groups = []; q.res = []; q.err = 'We could not load a price. Please try again.'; renderBox(); });\n    }, 220);\n  }\n  \/\/ ---- the navy box: only what was added ----\n  function subOf(o){\n    var c = cf(o), sl;\n    if (o.t === 'visit'){ if (o.hourly) return (c.cleaners === 2 ? '2 cleaners' : '1 cleaner') + ' \u00b7 ' + c.hours + ' hr' + (c.hours > 1 ? 's' : '') + (c.often === 'Recurring' ? ' \u00b7 ' + c.freq : '');\n      sl = c.prop ? SQ_APT : SQ_HOUSE; return (c.often === 'Recurring' ? c.freq : 'One time') + ' \u00b7 ' + sl[c.sq].replace(' sq ft', '') + ' sq ft \u00b7 ' + c.beds + ' bd \u00b7 ' + c.full + (c.half ? '.5' : '') + ' ba'; }\n    if (o.t === 'legacy'){ var out = [];\n      (o.fields || []).forEach(function(f){ if (!shown(o, f)) return;\n        if (f.t === 'items') f.items.forEach(function(it, i){ if (c.items[i] > 0) out.push(c.items[i] + ' \u00d7 ' + it); });\n        else if (f.t === 'num') out.push(Number(c[f.n]).toLocaleString('en-US') + ' ' + f.unit + (c[f.n] > 1 && f.unit && !\/ft$\/.test(f.unit) ? 's' : ''));\n        else if (f.t === 'list') out.push(f.vals[c[f.n]] + (f.unit ? ' ' + f.unit : ''));\n        else if (f.t === 'seg') out.push(c[f.n]); });\n      return out.join(' \u00b7 '); }\n    if (o.t === 'quote') return 'Homer builds your quote in chat';\n    if (o.rows) return o.variants.filter(function(x){ return c.rows[x.key] > 0; }).map(function(x){ return c.rows[x.key] + ' \u00d7 ' + x.label; }).join(', ');\n    var v = (o.variants || []).filter(function(x){ return x.key === c.variant; })[0], bits = [];\n    if (v) bits.push(v.label); if (o.unit !== 'flat') bits.push(Number(c.qty).toLocaleString('en-US') + ' ' + nOf(o) + pl(o, c.qty));\n    (o.questions || []).forEach(function(qq){ var a = (c.ans || {})[qq.key]; if (a && a !== qq.options[0]) bits.push(\/^(yes|no)$\/i.test(a) ? qq.label.replace(\/\\?$\/, '') + ': ' + a : a); });\n    return bits.join(' \u00b7 ');\n  }\n  function bst(k, fn, n, min, max){ return '<div class=\"hfc-bs\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(fn) + '\" data-d=\"-1\"' + (n <= min ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><b>' + Number(n).toLocaleString('en-US') + '<\/b><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(fn) + '\" data-d=\"1\"' + (n >= max ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div>'; }\n  function xb(k){ return '<button type=\"button\" class=\"x\" data-rm=\"' + esc(k) + '\" aria-label=\"Remove\">\u00d7<\/button>'; }\n  function moreOf(o){ var t = o.full || ((o.inc || []).length ? '' : o.desc); if (!t && !(o.inc || []).length) return '';\n    return '<button type=\"button\" class=\"hfc-sm\" data-k=\"' + o.key + '\" data-tog=\"desc\">' + (st.desc[o.key] ? 'See less \u25b4' : 'See more \u25be') + '<\/button>' + (st.desc[o.key] ? '<div class=\"hfc-dsc\">' + (t ? '<p>' + esc(t) + '<\/p>' : '') + ((o.inc || []).length ? '<ul>' + o.inc.map(function(i){ return '<li>' + esc(i) + '<\/li>'; }).join('') + '<\/ul>' : '') + '<\/div>' : ''); }\n  \/\/ HF-2026-10-10x (Chris): every item is its own row with its amount (\u2212 n +) and price; \"See more\" opens the description\n  function groupHTML(o, price, pending){\n    var c = cf(o), P = function(v){ return v != null && !pending ? '<b>' + money(v) + '<\/b>' : '<b>&hellip;<\/b>'; }, h = '<div class=\"hfc-sg\">';\n    if (o.t === 'quote') return h + '<div class=\"hfc-ln\"><span>' + esc(o.name) + '<small>Homer builds your quote in chat<\/small><\/span><b class=\"q\">Custom quote<\/b>' + xb(o.key) + '<\/div>' + moreOf(o) + '<\/div>';\n    if (o.rows){\n      h += '<div class=\"hfc-sh\"><span>' + esc(o.name) + '<\/span>' + xb(o.key) + '<\/div>';\n      o.variants.forEach(function(x){ var n = c.rows[x.key] || 0; if (n <= 0) return;\n        h += '<div class=\"hfc-ln hfc-row\"><span>' + esc(x.label) + '<small>' + money(x.price) + ' each<\/small><\/span>' + bst(o.key, 'row:' + x.key, n, 0, o.max_qty || 20) + P(pending ? null : (function(v){ var nc = Math.round((v + 0.01) \/ 5) * 5 - 0.01; return (nc > 0 && Math.abs(nc - v) < 2.6) ? Math.round(nc * 100) \/ 100 : v; })(Math.round(x.price * n * 100) \/ 100)) + '<\/div>'; });\n      if (empty(o)) h += '<div class=\"hfc-ln hfc-row\"><span><small>Add at least one on the left<\/small><\/span><\/div>';\n    } else {\n      var stp = (o.t === 'menu' && o.unit !== 'flat') ? bst(o.key, 'qty', c.qty, o.min_qty, o.max_qty) : '';\n      h += '<div class=\"hfc-ln\"><span>' + esc(o.name) + '<small>' + esc(subOf(o)) + '<\/small><\/span>' + stp + P(price) + xb(o.key) + '<\/div>';\n    }\n    return h + moreOf(o) + '<\/div>';\n  }\n  function lineHTML(name, sub, price, k){ return '<div class=\"hfc-ln\"><span>' + esc(name) + (sub ? '<small>' + esc(sub) + '<\/small>' : '') + '<\/span>' + price + (k ? '<button type=\"button\" class=\"x\" data-rm=\"' + esc(k) + '\" aria-label=\"Remove\">\u00d7<\/button>' : '') + '<\/div>'; }\n  function renderBox(){\n    var h = '<div class=\"t\">Your services<\/div>', ok = true, total = 0, mins = 0, any = false, na = false, quotes = [];\n    var pending = q.busy || (q.groups.length !== groups().length);\n    if (!st.sel.length) h += '<p class=\"hfc-emp\">Pick one or more services on the left. Everything you add shows here with its price.<\/p>';\n    var lines = '';\n    var priced = {};\n    q.groups.forEach(function(g, i){ var r = q.res[i] || {};\n      if (!r.available){ na = true; ok = false; return; }\n      if (r.needs_quote || !(r.price > 0)){ ok = false; return; }\n      any = true; total += Number(r.price); mins += Number(r.duration) || 0;\n      var aol = r.addons || [], aoSum = 0; aol.forEach(function(l){ aoSum += Number(l.price) || 0; });\n      \/\/ HF-2026-10-11a: every line carries its own engine price and the total is their sum (no rounding on a line)\n      var base = Math.round((r.price - aoSum) * 100) \/ 100;\n      priced[g.host.key] = base;\n      aol.forEach(function(l){ priced[l.key] = Math.round(Number(l.price) * 100) \/ 100; });\n    });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'quote') quotes.push(o); lines += groupHTML(o, priced[k], pending); });\n    Object.keys(st.ex).forEach(function(x){ if (st.ex[x] && hostVisit()) lines += lineHTML(X[x].name, 'With your home cleaning', priced[x] != null && !pending ? '<b>' + money(priced[x]) + '<\/b>' : '<b>&hellip;<\/b>', 'ex:' + x); });\n    if (lines) h += '<div class=\"hfc-lns\">' + lines + '<\/div>';\n    var onlyQ = st.sel.length && quotes.length === st.sel.length, canBook = !pending && any && ok && !q.err;\n    var ptxt = onlyQ ? 'Custom quote' : (!st.sel.length ? '$0.00' : (pending ? '&hellip;' : (na ? 'Not available yet' : (any ? money(total) : '&hellip;'))));\n    var btn = onlyQ ? 'Get My Quote' : 'Book It';\n    h += '<div class=\"hfc-foot\"><div><div class=\"hfc-price' + (na || onlyQ ? ' na' : '') + '\" id=\"hfcP\">' + ptxt + '<\/div><p>' + (canBook ? 'est. duration: ' + dur(mins) : (onlyQ ? 'Homer builds your quote in chat' : '')) + '<\/p><\/div><button type=\"button\" class=\"hfc-btn\" id=\"hfcBook\"' + (canBook || onlyQ ? '' : ' disabled') + '>' + btn + '<\/button><\/div>';\n    if (quotes.length && !onlyQ) h += '<div class=\"hfc-err\">' + esc(quotes.map(function(o){ return o.name; }).join(', ')) + ' ' + (quotes.length > 1 ? 'are' : 'is') + ' priced by custom quote. Book the rest, then ask Homer for the quote.<\/div>';\n    if (q.err) h += '<div class=\"hfc-err\">' + esc(q.err) + '<\/div>';\n    h += '<div class=\"hfc-ft\">Upfront price \u00b7 free cancellation up to 24 hours before service<\/div>';\n    $('hfcNb').innerHTML = h;\n    $('hfcBarP').innerHTML = ptxt;\n    $('hfcBarS').textContent = st.sel.length ? st.sel.length + ' service' + (st.sel.length > 1 ? 's' : '') : 'Pick a service';\n    $('hfcBarB').disabled = !(canBook || onlyQ); $('hfcBarB').textContent = btn;\n  }\n  function ask(text){\n    try { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'hf_hero_select', hf_kind: 'query', hf_value: text }); } catch (e) {}\n    if (typeof window.hfOpenConcierge === 'function'){ window.hfOpenConcierge({ type: 'query', q: text, big: true }); return; }\n    window.location.href = APP + '\/customer\/ai-booking?embed=1&panel=1&full=1&q=' + encodeURIComponent(text);\n  }\n  function busyBtns(t){ [$('hfcBook'), $('hfcBarB')].forEach(function(b){ if (b){ b.disabled = true; b.textContent = t; } }); }\n  function book(){\n    var quotes = st.sel.filter(function(k){ return I[k].t === 'quote'; });\n    if (quotes.length && quotes.length === st.sel.length){ ask('I need a quote for ' + quotes.map(function(k){ return I[k].name; }).join(' and ')); return; }\n    var gs = q.groups, rs = q.res; if (!gs.length) return;\n    busyBtns('Adding to your cart\u2026');\n    try { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'hf_card_book', hf_service: st.sel.map(function(k){ return I[k].name; }).join(', '), hf_zip: ZIP }); } catch (e) {}\n    var i = 0, last = null;\n    function fail(m){ q.err = m || 'We could not add this to your cart. Please try again.'; renderBox(); }\n    function next(){\n      if (i >= gs.length){ window.location.href = (last && last.redirect) || (APP + '\/customer\/services\/cart'); return; }\n      var g = gs[i], r = rs[i], p = selection(g);\n      p.price = r.price; p.duration = r.duration; p.provider_id = r.provider_id; p.last_category_id = r.last_category_id; p.sacf_id = r.sacf_id || null;\n      p.line_title = ((g.aos.length || g.ex.length) ? '' : r.summary) || g.host.name; \/\/ with extras on the line, each extra gets its own row, so the host line is just its own name p.append = i > 0 ? 1 : 0;\n      if (r.job_items && r.job_items.length) p.job_items = r.job_items;\n      if (r.addons && r.addons.length){ p.addons_json = JSON.stringify(r.addons); var tt = {}; r.addons.forEach(function(l){ if (l.code) tt[l.code] = l.name + ((Number(l.qty) || 1) > 1 ? ' \u00d7 ' + l.qty : ''); }); p.line_titles = JSON.stringify(tt); }\n      post(CART, p).then(function(d){\n        if (d && d.success){ last = d; i++; next(); return; }\n        if (d && d.code === 'quote_only'){ ask('I need a quote for ' + g.host.name); return; }\n        if (d && d.code === 'one_pro_per_booking'){ fail(g.host.name + ' is done by a different pro, so it books separately. Book the rest first, then add it.'); return; }\n        fail(d && d.message);\n      }).catch(function(){ fail(); });\n    }\n    next();\n  }\n  function toggle(k){\n    var o = I[k]; if (!o) return;\n    if (on(k)) st.sel.splice(st.sel.indexOf(k), 1);\n    else { if (o.t === 'visit') st.sel = st.sel.filter(function(x){ return I[x].t !== 'visit'; }); st.sel.push(k); cf(o); }\n    renderLeft(); reprice();\n  }\n  function onClick(e){\n    var t = e.target.closest ? e.target.closest('button') : null; if (!t || !$('hfc').contains(t)) return;\n    if (t.getAttribute('data-hq')){ ask(t.getAttribute('data-hq')); return; }\n    if (t.getAttribute('data-svc')){ toggle(t.getAttribute('data-svc')); return; }\n    var rm = t.getAttribute('data-rm');\n    if (rm){ if (rm.indexOf('ex:') === 0) st.ex[rm.slice(3)] = 0; else if (on(rm)) st.sel.splice(st.sel.indexOf(rm), 1); renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-ex')){ var xk = t.getAttribute('data-ex'); st.ex[xk] = st.ex[xk] ? 0 : 1; renderLeft(); reprice(); return; }\n    if (t.id === 'hfcMore'){ st.all = !st.all; renderLeft(); if (!st.all) $('hfcS1').scrollIntoView({ behavior: 'smooth', block: 'start' }); return; }\n    if (t.id === 'hfcBook' || t.id === 'hfcBarB'){ book(); return; }\n    var o = I[t.getAttribute('data-k')]; if (!o) return; var c = cf(o);\n    if (t.getAttribute('data-tog') === 'inc'){ st.inc[o.key] = !st.inc[o.key]; renderLeft(); return; }\n    if (t.getAttribute('data-tog') === 'desc'){ st.desc[o.key] = !st.desc[o.key]; renderBox(); return; }\n    var fs = t.getAttribute('data-fs');\n    if (fs){ var val = t.getAttribute('data-v');\n      if (o.t === 'visit'){ if (fs === 'prop') c.prop = val === 'Apartment \/ Condo' ? 1 : 0; else if (fs === 'cleaners') c.cleaners = val === '2 Cleaners' ? 2 : 1; else c[fs] = val; }\n      else c[fs] = val;\n      renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-var')){ c.variant = t.getAttribute('data-var'); renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-q')){ c.ans[t.getAttribute('data-q')] = t.getAttribute('data-v'); renderLeft(); reprice(); return; }\n    var fn = t.getAttribute('data-fn'), d = parseInt(t.getAttribute('data-d'), 10); if (!fn) return;\n    if (o.t === 'visit'){\n      if (fn === 'beds' || fn === 'full') c[fn] = Math.max(1, Math.min(9, c[fn] + d)); else if (fn === 'half') c.half = Math.max(0, Math.min(9, c.half + d));\n      else if (fn === 'sq') c.sq = Math.max(0, c.sq + d); else if (fn === 'hours') c.hours = Math.max(1, Math.min(c.often === 'Recurring' ? 4 : 8, c.hours + d));\n    } else if (fn.indexOf('it:') === 0){ var ii = parseInt(fn.slice(3), 10); c.items[ii] = Math.max(0, Math.min(20, (c.items[ii] || 0) + d)); }\n    else if (fn.indexOf('row:') === 0){ var rk = fn.slice(4); c.rows[rk] = Math.max(0, Math.min(o.max_qty || 20, (c.rows[rk] || 0) + d));\n      if ($('hfcNb').contains(t) && rowsSum(o) <= 0 && on(o.key)) st.sel.splice(st.sel.indexOf(o.key), 1); } \/\/ the last row taken to 0 in the box takes the service off\n    else if (fn === 'qty'){ var sp = o.pstep || o.step || 1; c.qty = Math.max(o.min_qty, Math.min(o.max_qty, d > 0 ? Math.floor(c.qty \/ sp) * sp + sp : Math.ceil(c.qty \/ sp) * sp - sp)); }\n    else { var f = (o.fields || []).filter(function(x){ return x.n === fn; })[0]; if (!f) return;\n      if (f.t === 'num') c[fn] = Math.max(f.min, Math.min(f.max, c[fn] + d * f.step)); else if (f.t === 'list') c[fn] = Math.max(0, Math.min(f.vals.length - 1, c[fn] + d)); }\n    renderLeft(); reprice();\n  }\n  \/\/ HF-2026-10-10o (Chris): the booking box stays in view while the left side scrolls, never above the white section's\n  \/\/ top and never below the end of the selections (a WP wrapper's overflow breaks CSS sticky, so it is pinned by hand).\n  function pin(){\n    var col = $('hfcBox'), nb = $('hfcNb'); if (!col || !nb) return;\n    if (window.innerWidth <= 900){ nb.style.position = ''; nb.style.top = ''; nb.style.left = ''; nb.style.width = ''; return; }\n    var hh = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--hf-header-h'), 10) || 88, T = hh + 16;\n    var r = col.getBoundingClientRect(), h = nb.offsetHeight;\n    if (h + T + 16 > window.innerHeight) T = window.innerHeight - 16 - h;\n    if (r.top >= T || r.height <= h + 2){ nb.style.position = 'relative'; nb.style.top = '0px'; nb.style.left = ''; nb.style.width = ''; }\n    else if (r.bottom - h <= T){ nb.style.position = 'absolute'; nb.style.top = (r.height - h) + 'px'; nb.style.left = '0px'; nb.style.width = r.width + 'px'; }\n    else { nb.style.position = 'fixed'; nb.style.top = T + 'px'; nb.style.left = r.left + 'px'; nb.style.width = r.width + 'px'; }\n  }\n  var pinQ = false; function pinSoon(){ if (pinQ) return; pinQ = true; requestAnimationFrame(function(){ pinQ = false; pin(); }); }\n  \/\/ the pills stay one row: the last ones are hidden until the row fits the search bar's width\n  function fitPills(){ var p = document.querySelector('#hfc .hfc-pop'); if (!p) return; var bs = [].slice.call(p.children), w = p.clientWidth, gap = 8;\n    bs.forEach(function(b){ b.style.display = ''; });\n    for (var n = bs.length; n > 1; n--){ var t = 0; for (var i = 0; i < n; i++) t += bs[i].offsetWidth + (i ? gap : 0); if (t <= w) break; bs[n - 1].style.display = 'none'; } }\n  function boot(){\n    if (!$('hfc')) return;\n    fitPills(); window.addEventListener('resize', fitPills); if (document.fonts && document.fonts.ready) document.fonts.ready.then(fitPills);\n    window.addEventListener('scroll', pinSoon, { passive: true }); window.addEventListener('resize', pinSoon);\n    if (window.MutationObserver) new MutationObserver(pinSoon).observe($('hfcLay'), { childList: true, subtree: true });\n    document.addEventListener('click', onClick);\n    $('hfcSearch').addEventListener('submit', function(e){ e.preventDefault(); ask(($('hfcQ').value || '').replace(\/^\\s+|\\s+$\/g, '') || 'I need help with my home'); });\n    \/\/ HF-2026-10-10z (Chris): no service is pre-selected on any page; the customer picks\n    renderLeft(); reprice();\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); else boot();\n})();\n<\/script>\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-d851785 e-con-full e-flex e-con e-parent\" data-id=\"d851785\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-26a0725 elementor-widget elementor-widget-html\" data-id=\"26a0725\" 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 id=\"hf-city-local-css\">.hf-city-local{background:#fff;padding:64px 24px 24px}.hf-city-local .in{max-width:880px;margin:0 auto}.hf-city-local h2{font-family:Inter,-apple-system,sans-serif;font-size:34px;line-height:1.2;font-weight:800;color:#0b172a;margin:0 0 16px;letter-spacing:-.4px}.hf-city-local p{font-family:Inter,-apple-system,sans-serif;font-size:18px;line-height:1.65;color:#475569;margin:0 0 14px}@media(max-width:767px){.hf-city-local{padding:44px 18px 12px}.hf-city-local h2{font-size:26px}.hf-city-local p{font-size:16px}}<\/style><section class=\"hf-city-local\" data-city=\"new-orleans\"><div class=\"in\"><h2>Handyman Services in New Orleans<\/h2><p>Humidity swells doors and windows, porch boards soften, and hurricane season brings a list of things to secure before the next storm. A handyman takes care of the small jobs: TV mounting on plaster and lath walls, shelves, furniture assembly, drywall patches, locks and door adjustments.<\/p><p>Book by the item with a price for each, or book by the hour for a full punch list. From a Mid-City double to a new build in Kenner, everything you need fixed can ride on one visit.<\/p><\/div><\/section><script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"Service\", \"name\": \"Handyman Services in New Orleans\", \"serviceType\": \"Handyman\", \"url\": \"https:\/\/housefly.com\/services\/new-orleans\/handyman\/\", \"provider\": {\"@type\": \"Organization\", \"name\": \"House Fly\", \"url\": \"https:\/\/housefly.com\/\"}, \"areaServed\": {\"@type\": \"City\", \"name\": \"New Orleans\", \"containedInPlace\": {\"@type\": \"State\", \"name\": \"Louisiana\"}}, \"description\": \"Humidity swells doors and windows, porch boards soften, and hurricane season brings a list of things to secure before the next storm. A handyman takes care of the small jobs: TV mounting on plaster and lath walls, shelves, furniture assembly, drywall patches, locks and door adjustments.\"}<\/script>\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-aa6b352 e-con-full e-flex e-con e-parent\" data-id=\"aa6b352\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1b9f90d elementor-widget elementor-widget-html\" data-id=\"1b9f90d\" 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 handyman text cells retired 2026-07-16 - replaced by hero booking cell in container 5379bbe. Restore from wp option hf_handyman_2169_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-ff36b08 e-con-full e-flex e-con e-parent\" data-id=\"ff36b08\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2a68738 elementor-widget elementor-widget-html\" data-id=\"2a68738\" 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<!-- handyman-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\">Real prices. Real people. Real fast. 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<!-- handyman-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 available nationwide, anywhere in the United States. 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, and we are available nationwide, anywhere in the United States. 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<!-- handyman-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>NEW ORLEANS HANDYMAN SERVICES New Orleans Handyman ServicesDone Right Serving the Greater New Orleans area with verified local handymen, upfront pricing, and instant booking 5.0 on Google A+ Better Business Bureau Free cancellation Handyman Services in New Orleans Professional, trusted handymen for every home project General Help 1 &#8211; 8 Hours TV mounting Hanging pictures, [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":2843,"parent":2051,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-2169","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.8 (Yoast SEO v28.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Handyman Services in New Orleans | Upfront Prices | House Fly<\/title>\n<meta name=\"description\" content=\"Book handyman in New Orleans, LA with House Fly. TV mounting, drywall patches, doors and hurricane season punch lists. See your upfront price and book online in minutes.\" \/>\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\/new-orleans\/handyman\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Handyman\" \/>\n<meta property=\"og:description\" content=\"Book handyman in New Orleans, LA with House Fly. TV mounting, drywall patches, doors and hurricane season punch lists. See your upfront price and book online in minutes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/housefly.com\/es\/services\/new-orleans\/handyman\/\" \/>\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:36+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=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"717\" \/>\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=\"6 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Servicios de handyman en Nueva Orleans | Precios por adelantado | House Fly","description":"Book handyman in New Orleans, LA with House Fly. TV mounting, drywall patches, doors and hurricane season punch lists. See your upfront price and book online in minutes.","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\/new-orleans\/handyman\/","og_locale":"es_MX","og_type":"article","og_title":"Handyman","og_description":"Book handyman in New Orleans, LA with House Fly. TV mounting, drywall patches, doors and hurricane season punch lists. See your upfront price and book online in minutes.","og_url":"https:\/\/housefly.com\/es\/services\/new-orleans\/handyman\/","og_site_name":"House Fly","article_publisher":"https:\/\/www.facebook.com\/houseflyapp","article_modified_time":"2026-07-08T03:19:36+00:00","og_image":[{"width":1024,"height":717,"url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/01\/housefly-social-share.jpg","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@houseflyapp","twitter_misc":{"Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/housefly.com\/services\/new-orleans\/handyman\/","url":"https:\/\/housefly.com\/services\/new-orleans\/handyman\/","name":"Servicios de handyman en Nueva Orleans | Precios por adelantado | House Fly","isPartOf":{"@id":"https:\/\/housefly.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/housefly.com\/services\/new-orleans\/handyman\/#primaryimage"},"image":{"@id":"https:\/\/housefly.com\/services\/new-orleans\/handyman\/#primaryimage"},"thumbnailUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/09\/shelf-installation-services-in-new-orleans.png","datePublished":"2024-11-25T04:31:12+00:00","dateModified":"2026-07-08T03:19:36+00:00","description":"Book handyman in New Orleans, LA with House Fly. TV mounting, drywall patches, doors and hurricane season punch lists. See your upfront price and book online in minutes.","breadcrumb":{"@id":"https:\/\/housefly.com\/services\/new-orleans\/handyman\/#breadcrumb"},"inLanguage":"es-MX","potentialAction":[{"@type":"ReadAction","target":["https:\/\/housefly.com\/services\/new-orleans\/handyman\/"]}]},{"@type":"ImageObject","inLanguage":"es-MX","@id":"https:\/\/housefly.com\/services\/new-orleans\/handyman\/#primaryimage","url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/09\/shelf-installation-services-in-new-orleans.png","contentUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/09\/shelf-installation-services-in-new-orleans.png","width":1500,"height":1050,"caption":"shelf installation services in new orleans"},{"@type":"BreadcrumbList","@id":"https:\/\/housefly.com\/services\/new-orleans\/handyman\/#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":"New Orleans Home Services","item":"https:\/\/housefly.com\/services\/new-orleans\/"},{"@type":"ListItem","position":4,"name":"Handyman"}]},{"@type":"WebSite","@id":"https:\/\/housefly.com\/#website","url":"https:\/\/housefly.com\/","name":"House Fly","description":"App M\u00f3vil de Servicios para el Hogar Bajo Demanda","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\/2169","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\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/comments?post=2169"}],"version-history":[{"count":0,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/2169\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/2051"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media\/2843"}],"wp:attachment":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media?parent=2169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}