Professional commercial, facility & residential
cleaning throughout Metro Atlanta.

Professional commercial, facility & residential
cleaning throughout Metro Atlanta.

ABOUT WIPE AWAY

Professional Cleaning. Dependable Service.

Wipe Away Cleaning Services provides residential, commercial, and facility cleaning throughout Metro Atlanta. Our focus is straightforward: dependable service, attention to detail, and clean spaces our customers can feel good walking into.

From routine home cleaning to ongoing facility care and custom commercial projects, we approach every space with the same standard of care and professionalism.


METRO ATLANTA • COMMERCIAL • FACILITY • RESIDENTIAL CLEANING

ABOUT WIPE AWAY

Professional Cleaning. Dependable Service.

Wipe Away Cleaning Services provides residential, commercial, and facility cleaning throughout Metro Atlanta. Our focus is straightforward: dependable service, attention to detail, and clean spaces our customers can feel good walking into.

From routine home cleaning to ongoing facility care and custom commercial projects, we approach every space with the same standard of care and professionalism.


METRO ATLANTA • COMMERCIAL • FACILITY • RESIDENTIAL CLEANING

HOW WIPE AWAY WORKS

From Estimate to Clean Space

01 — Get an Estimate or Start Your Quote
Residential customers can begin with an online estimate. Commercial and facility customers can use the estimator for preliminary pricing before scheduling a free onsite quote appointment.

02 — Wipe Away Reviews Your Space
Before final pricing is confirmed, Wipe Away reviews the condition and scope of the space. Residential customers may be asked to provide photos or a short video, or schedule a walkthrough if needed. Commercial and facility quotes require an onsite property walkthrough.

03 — Receive Final Pricing & Pay Your Invoice
Once Wipe Away has confirmed the condition, scope, access, and service details, final pricing is provided and your invoice is sent. 100% payment confirms your appointment or service.

04 — We Clean Your Space
Wipe Away completes the approved cleaning so you can enjoy a cleaner, refreshed space and let us know how we did.

*Website estimates are preliminary and are not final quotes. Residential final pricing may require a photo, video, or onsite review. Commercial and facility quotes are finalized after an onsite walkthrough.

HOW WIPE AWAY WORKS

From Estimate to Clean Space

01 — Get an Estimate or Request a Custom Quote.
Choose Commercial or Residential and tell us about your space and cleaning needs.

02 — Wipe Away Reviews & Confirms
We review the size, condition, scope, access, and service details before confirming final pricing.

03 — Receive & Pay Your Invoice
Once final pricing is confirmed, Wipe Away sends your invoice. 100% payment confirms your appointment or service.

04 — We Clean Your Space
We complete the approved cleaning, then you can enjoy your clean space and let us know how we did.

*Website estimates are preliminary. Final pricing is confirmed before your invoice is sent.

Contact Wipe Away

Ready to get started?

Have a question, need a custom quote, or want to talk through your cleaning needs? Reach out to Wipe Away and we’ll help you determine the right next step.

Contact Wipe Away

Ready to get started?

Have a question, need a custom quote, or want to talk through your cleaning needs? Reach out to Wipe Away and we’ll help you determine the right next step.

Wipe Away Cleaning Services

Professional commercial, facility, and residential cleaning throughout Metro Atlanta. Dependable service. Careful attention to detail.

Privacy Policy · Terms & Conditions · Booking & Payment Policy

© 2026 Wipe Away Cleaning Services LLC. All rights reserved.

Commercial Cleaning & Facility Services

A Cleaner Facility. A Better First Impression.

Your workplace says something about your business before anyone says a word. Wipe Away provides dependable commercial cleaning and facility services designed around the needs of your space, your team, and your schedule.

BUILT AROUND YOUR FACILITY

Complete Cleaning for Your Entire Facility.

From everyday high-touch areas to the spaces your customers and employees notice most, we help keep your facility clean, presentable, and ready for business.

✓ Offices & Workspaces
✓ Lobbies & Reception Areas
✓ Conference Rooms
✓ Restrooms
✓ Breakrooms & Kitchens
✓ Floors & Common Areas
✓ High-Touch Surfaces

BUILT AROUND YOUR FACILITY

Complete Cleaning for Your Entire Facility.

From everyday high-touch areas to the spaces your customers and employees notice most, we help keep your facility clean, presentable, and ready for business.

✓ Offices & Workspaces
✓ Lobbies & Reception Areas
✓ Conference Rooms
✓ Restrooms
✓ Breakrooms & Kitchens
✓ Floors & Common Areas
✓ High-Touch Surfaces

SERVICE THAT FITS YOUR OPERATION

Cleaning Built Around How Your Business Runs.

Every property operates differently. We look at the size of your space, how it is used, cleaning frequency, flooring, restrooms, shared areas, and any special requirements before recommending service.
Whether you need ongoing maintenance or a one-time commercial cleaning, the goal is the same:
A consistent standard you can feel confident walking into.

Recurring Commercial Cleaning

For businesses that need dependable ongoing service to keep their facility consistently clean, maintained, and ready for employees and customers.

One-Time & Project Cleaning

For move-ins, move-outs, deep cleans, resets, special projects, and facilities that need a professional cleaning without an ongoing schedule.

(function(){ var rates={ office:.14, retail:.15, medical:.20, school:.18, studio:.15, other:.16 }; var scopeMult={ routine:1, deep:1.40, move:1.50, project:1.30 }; var floorMult={ mixed:1, carpet:1, hard:1.05 }; var visits={ monthly:1, biweekly:2.17, weekly:4.33, "3x":13, "5x":21.67 }; var facilityLabels={ office:"Office / Professional", retail:"Retail / Storefront", medical:"Medical / Healthcare", school:"School / Education", studio:"Studio / Specialty Space", other:"Other Commercial Space" }; var scopeLabels={ routine:"Routine Commercial Cleaning", deep:"Deep Commercial Cleaning", move:"Move-In / Move-Out", project:"Special Project Cleaning" }; var frequencyLabels={ "one-time":"One-Time", monthly:"Monthly", biweekly:"Every Two Weeks", weekly:"Weekly", "3x":"3 Times Per Week", "5x":"5 Times Per Week" }; function n(id){ return Number(document.getElementById(id).value)||0; } function money(value){ return "$"+Math.round(value).toLocaleString(); } document .getElementById("waCommercialCalculate") .addEventListener("click",function(){ var facility= document.getElementById("waComFacility").value; var sqft= n("waComSqft"); var scope= document.getElementById("waComScope").value; var frequency= document.getElementById("waComFrequency").value; var flooring= document.getElementById("waComFlooring").value; var hours= document.getElementById("waComHours").value; if( !facility || !sqft || !scope || !frequency || !flooring ){ alert("Please complete the required calculator fields."); return; } var roomCharges= (n("waComRestrooms")*25)+ (n("waComKitchens")*30)+ (n("waComOffices")*5)+ (n("waComCommon")*15); var subtotal= ((sqft*rates[facility])+roomCharges) * scopeMult[scope] * floorMult[flooring]; subtotal=Math.max(225,subtotal); var servicePrice= frequency==="one-time" ? subtotal*1.15 : subtotal; var low= Math.round(servicePrice*.90); var high= Math.round(servicePrice*1.10); var monthlyLow=null; var monthlyHigh=null; if(frequency!=="one-time"){ monthlyLow= Math.round( servicePrice* visits[frequency]* .90 ); monthlyHigh= Math.round( servicePrice* visits[frequency]* 1.10 ); } var oneTimeLabel= document.getElementById( "waCommercialOneTimeLabel" ); var recurringLabel= document.getElementById( "waCommercialRecurringLabel" ); if(frequency==="one-time"){ oneTimeLabel.style.display= "block"; recurringLabel.style.display= "none"; }else{ oneTimeLabel.style.display= "none"; recurringLabel.style.display= "block"; } document .getElementById( "waCommercialPrice" ) .textContent= money(low)+"–"+money(high); document .getElementById( "waCommercialFacilityResult" ) .textContent= facilityLabels[facility]; document .getElementById( "waCommercialSqftResult" ) .textContent= sqft.toLocaleString()+" sq. ft."; document .getElementById( "waCommercialScopeResult" ) .textContent= scopeLabels[scope]; document .getElementById( "waCommercialFrequencyResult" ) .textContent= frequencyLabels[frequency]; var monthlyRow= document.getElementById( "waCommercialMonthlyRow" ); if(monthlyLow!==null){ monthlyRow.style.display= "flex"; document .getElementById( "waCommercialMonthlyResult" ) .textContent= money(monthlyLow)+"–"+money(monthlyHigh); }else{ monthlyRow.style.display= "none"; } document .getElementById( "waCommercialResult" ) .style.display= "block"; window.WACommercialEstimate={ facility: facilityLabels[facility], sqft: sqft, scope: scopeLabels[scope], frequency: frequencyLabels[frequency], restrooms: n("waComRestrooms"), kitchens: n("waComKitchens"), offices: n("waComOffices"), common: n("waComCommon"), flooring: document .getElementById("waComFlooring") .options[ document .getElementById("waComFlooring") .selectedIndex ].text, hours: hours, low: low, high: high, range: money(low)+"–"+money(high), monthlyRange: monthlyLow!==null ? money(monthlyLow)+"–"+money(monthlyHigh) : "", calculatedAt: new Date().toISOString() }; setTimeout(function(){ document .getElementById( "waCommercialResult" ) .scrollIntoView({ behavior:"smooth", block:"nearest" }); },100); }); })();
(function () { if (window.__WA_COMMERCIAL_ENGINE_LOADED__) return; window.__WA_COMMERCIAL_ENGINE_LOADED__ = true; var HUBSPOT_PORTAL_ID = '247142307'; var HUBSPOT_FORM_ID = '77e063d4-392a-4182-a6a0-e2723b930d28'; var HUBSPOT_ENDPOINT = 'https://api.hsforms.com/submissions/v3/integration/submit/' + HUBSPOT_PORTAL_ID + '/' + HUBSPOT_FORM_ID; var submitting = false; function getValue(id) { var el = document.getElementById(id); return el ? String(el.value || '').trim() : ''; } function getHubSpotCookie() { var match = document.cookie.match(/(?:^|;\s*)hubspotutk=([^;]+)/); return match ? decodeURIComponent(match[1]) : ''; } function getEstimate() { return window.WACommercialEstimate || null; } function getHubSpotFrequency(estimate) { if (!estimate || !estimate.frequency) { return ''; } var map = { 'One-Time': 'One-Time', 'Monthly': 'Monthly', 'Every Two Weeks': 'Biweekly', 'Weekly': 'Weekly' }; return map[estimate.frequency] || ''; } function buildSpaceDetails(estimate) { var company = getValue('waComCompany') || 'Not provided'; var address = getValue('waComAddress') || 'Not provided'; var walkthroughDate = getValue('waComWalkDate') || 'Flexible / not specified'; var walkthroughTime = getValue('waComWalkTime') || 'Flexible'; var contactMethod = getValue('waComContactMethod') || 'Either'; var notes = getValue('waComNotes') || 'None provided'; var lines = [ 'COMMERCIAL QUOTE APPOINTMENT REQUEST', '', 'Business / Facility Name: ' + company, 'Property Address: ' + address, 'Facility Type: ' + estimate.facility, 'Approximate Square Footage: ' + Number(estimate.sqft).toLocaleString(), 'Requested Frequency: ' + estimate.frequency, 'Cleaning Scope: ' + estimate.scope, 'Number of Restrooms: ' + estimate.restrooms, 'Breakrooms / Kitchens: ' + estimate.kitchens, 'Offices / Rooms: ' + estimate.offices, 'Common / Reception Areas: ' + estimate.common, 'Primary Flooring: ' + estimate.flooring, 'Preferred Cleaning Hours: ' + estimate.hours, 'Preliminary Website Estimate: ' + estimate.range ]; if (estimate.monthlyRange) { lines.push( 'Estimated Monthly Range: ' + estimate.monthlyRange ); } lines.push( '', 'FREE ONSITE QUOTE APPOINTMENT', 'Preferred Walkthrough Date: ' + walkthroughDate, 'Preferred Walkthrough Timing: ' + walkthroughTime, 'Preferred Contact Method: ' + contactMethod, 'Access / Special Requirements: ' + notes, '', 'IMPORTANT:', 'The website estimate is preliminary and is not a final commercial quote. Wipe Away will complete an onsite walkthrough to confirm the property condition, cleaning scope, layout, access requirements, flooring, buildup, service needs, and other relevant details before final pricing is provided.' ); return lines.join('\n'); } function setStatus(message) { var status = document.getElementById('waCommercialStatus'); if (status) { status.textContent = message || ''; } } function setButtonState(loading) { var button = document.getElementById('waCommercialSubmit'); if (!button) return; button.disabled = loading; button.textContent = loading ? 'SENDING REQUEST...' : 'REQUEST FREE QUOTE APPOINTMENT'; } function showSuccess() { var form = document.getElementById('waCommercialLeadForm'); var success = document.getElementById('waCommercialSuccess'); setStatus(''); if (form) { form.style.display = 'none'; } if (success) { success.style.display = 'block'; setTimeout(function () { success.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } } async function submitCommercialForm(event) { if (event) { event.preventDefault(); } if (submitting) return; var form = document.getElementById('waCommercialLeadForm'); if (!form) return; if (!form.checkValidity()) { form.reportValidity(); return; } var estimate = getEstimate(); if (!estimate) { setStatus( 'Please calculate your preliminary commercial estimate above before requesting your quote appointment.' ); return; } submitting = true; setButtonState(true); setStatus( 'Sending your quote appointment request...' ); var fields = [ { name: 'firstname', value: getValue('waComFirst') }, { name: 'lastname', value: getValue('waComLast') }, { name: 'email', value: getValue('waComEmail') }, { name: 'phone', value: getValue('waComPhone') }, { name: 'zip', value: getValue('waComZip') }, { name: 'cleaning_type', value: 'Commercial' }, { name: 'service_needed', value: 'Commercial / Office Cleaning' }, { name: 'approximate_square_footage', value: String(estimate.sqft) }, { name: 'space_details', value: buildSpaceDetails(estimate) } ]; var company = getValue('waComCompany'); if (company) { fields.push({ name: 'company', value: company }); } var frequency = getHubSpotFrequency(estimate); if (frequency) { fields.push({ name: 'cleaning_frequency', value: frequency }); } var context = { pageUri: window.location.href, pageName: document.title || 'Wipe Away Commercial Quote' }; var hutk = getHubSpotCookie(); if (hutk) { context.hutk = hutk; } var payload = { submittedAt: Date.now(), fields: fields, context: context }; try { var response = await fetch( HUBSPOT_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(payload) } ); var responseText = await response.text(); if (!response.ok) { console.error( 'Wipe Away HubSpot submission rejected:', response.status, responseText ); throw new Error( 'HubSpot rejected the submission.' ); } console.log( 'Wipe Away commercial request submitted successfully.', responseText ); window.dataLayer = window.dataLayer || []; window.dataLayer.push({event: 'wa_commercial_quote_success', lead_type: 'commercial'}); showSuccess(); } catch (error) { console.error( 'Wipe Away commercial submission error:', error ); setStatus( 'Your request did not send. Please try again. If the problem continues, call Wipe Away at 404-860-2956.' ); submitting = false; setButtonState(false); } } function initCommercialEngine() { var form = document.getElementById('waCommercialLeadForm'); var button = document.getElementById('waCommercialSubmit'); if (!form || !button) { return false; } if (!form.dataset.waSubmitBound) { form.dataset.waSubmitBound = 'true'; form.addEventListener( 'submit', submitCommercialForm ); } if (!button.dataset.waClickBound) { button.dataset.waClickBound = 'true'; button.addEventListener( 'click', function (event) { event.preventDefault(); if (form.checkValidity()) { submitCommercialForm(event); } else { form.reportValidity(); } } ); } console.log( 'Wipe Away commercial submission engine ready.' ); return true; } function startEngine() { var attempts = 0; var timer = setInterval( function () { attempts++; if ( initCommercialEngine() || attempts >= 40 ) { clearInterval(timer); } }, 250 ); } if (document.readyState === 'loading') { document.addEventListener( 'DOMContentLoaded', startEngine ); } else { startEngine(); } })();

Residential Cleaning

A Cleaner Home. Less on Your Plate.

Wipe Away provides dependable residential cleaning throughout Metro Atlanta for routine cleaning, deep cleaning, and move-in or move-out service. Start with a preliminary estimate, then we’ll confirm the details and final pricing before your service.

Residential Services

Cleaning Built Around Your Home

Whether your home needs routine upkeep, a deeper reset, or cleaning before or after a move, Wipe Away provides the level of service your space needs. Start with an estimate below and tell us a little about your home.

Routine Cleaning
For maintaining a clean, comfortable home on a regular basis.

Deep Cleaning
For homes that need more detailed attention and a more thorough reset.

Move-In / Move-Out
For preparing a home before moving in or leaving the space clean when moving out.

Residential Services

Cleaning Built Around Your Home

Whether your home needs routine upkeep, a deeper reset, or cleaning before or after a move, Wipe Away provides the level of service your space needs. Start with an estimate below and tell us a little about your home.

Routine Cleaning
For maintaining a clean, comfortable home on a regular basis.

Deep Cleaning
For homes that need more detailed attention and a more thorough reset.

Move-In / Move-Out
For preparing a home before moving in or leaving the space clean when moving out.

(function(){ var prices={ routine:[ 150, 170, 190, 225, 250, 300, 375 ], deep:[ 225, 260, 295, 350, 400, 475, 575 ], move:[ 250, 290, 325, 385, 440, 525, 625 ] }; var includedSqft=[ 1000, 1200, 1500, 1800, 2200, 2800, 3500 ]; var extraPer500={ routine:30, deep:45, move:55 }; var homeLabels={ 0:"1 Bed / 1 Bath", 1:"2 Bed / 1 Bath", 2:"2 Bed / 2 Bath", 3:"3 Bed / 2 Bath", 4:"3 Bed / 3 Bath", 5:"4 Bed / 3 Bath", 6:"4+ Bed / 4+ Bath" }; var hubspotHomeLabels={ 0:"1 Bed / 1 Bath", 1:"2 Bed / 1 Bath", 2:"2 Bed / 2 Bath", 3:"3 Bed / 2 Bath", 4:"3 Bed / 3 Bath", 5:"4 Bed / 3 Bath", 6:"4 Bed + / 4 Bath +" }; var serviceLabels={ routine:"Routine Cleaning", deep:"Deep Cleaning", movein:"Move-In Cleaning", moveout:"Move-Out Cleaning" }; var frequencyLabels={ "one-time":"One-Time", monthly:"Monthly", biweekly:"Every Two Weeks", weekly:"Weekly" }; var hubspotFrequencyLabels={ "one-time":"One-Time", monthly:"Monthly", biweekly:"Biweekly", weekly:"Weekly" }; var recurringDiscounts={ monthly:.10, biweekly:.15, weekly:.20 }; function n(id){ return Number(document.getElementById(id).value)||0; } function checked(id){ return document.getElementById(id).checked; } function money(value){ return "$"+Math.round(value).toLocaleString(); } document .getElementById("waResidentialCalculate") .addEventListener("click",function(){ var service= document.getElementById("waResService").value; var homeSize= document.getElementById("waResHomeSize").value; var sqft= n("waResSqft"); var frequency= document.getElementById("waResFrequency").value; if( !service || homeSize==="" || !sqft || !frequency ){ alert("Please complete the required calculator fields."); return; } var homeIndex= Number(homeSize); var pricingType= service==="movein" || service==="moveout" ? "move" : service; var servicePrice= prices[pricingType][homeIndex]; var included= includedSqft[homeIndex]; if(sqft>included){ var extraBlocks= Math.ceil((sqft-included)/500); servicePrice= servicePrice+ (extraBlocks*extraPer500[pricingType]); } var addons=[]; if(checked("waResOven")){ servicePrice+=35; addons.push("Inside Oven"); } if(checked("waResFridge")){ servicePrice+=35; addons.push("Inside Refrigerator"); } if(checked("waResPet")){ servicePrice+=25; addons.push("Excessive Pet Hair"); } if(checked("waResCabinets")){ servicePrice+=50; addons.push("Inside Cabinets"); } var recurringPrice=null; if(frequency!=="one-time"){ recurringPrice= Math.round( servicePrice* (1-recurringDiscounts[frequency]) ); } document.getElementById("waResidentialPrice").textContent= money(servicePrice); document.getElementById("waResidentialServiceResult").textContent= serviceLabels[service]; document.getElementById("waResidentialHomeResult").textContent= homeLabels[homeIndex]; document.getElementById("waResidentialSqftResult").textContent= sqft.toLocaleString()+" sq. ft."; document.getElementById("waResidentialFrequencyResult").textContent= frequencyLabels[frequency]; document.getElementById("waResidentialAddonsResult").textContent= addons.length ? addons.join(", ") : "None"; var recurringRow= document.getElementById("waResidentialRecurringRow"); if(recurringPrice!==null){ recurringRow.style.display="flex"; document.getElementById("waResidentialRecurringResult").textContent= money(recurringPrice); }else{ recurringRow.style.display="none"; } document.getElementById("waResidentialResult").style.display="block"; window.WAResidentialEstimate={ service:serviceLabels[service], hubspotService: serviceLabels[service], homeSize: homeLabels[homeIndex], hubspotHomeSize: hubspotHomeLabels[homeIndex], sqft:sqft, frequency: frequencyLabels[frequency], hubspotFrequency: hubspotFrequencyLabels[frequency], addons:addons, firstCleanPrice: servicePrice, firstCleanEstimate: money(servicePrice), recurringPrice: recurringPrice, recurringEstimate: recurringPrice!==null ? money(recurringPrice) : "", calculatedAt:new Date().toISOString() }; setTimeout(function(){ document .getElementById("waResidentialResult") .scrollIntoView({ behavior:"smooth", block:"nearest" }); },100); }); })();
(function () { if ( window.__WA_RESIDENTIAL_ENGINE_LOADED__ ) return; window.__WA_RESIDENTIAL_ENGINE_LOADED__ = true; var HUBSPOT_PORTAL_ID = '247142307'; var HUBSPOT_FORM_ID = '222532c9-15d6-401c-b279-dd6d8e8ae906'; var HUBSPOT_ENDPOINT = 'https://api.hsforms.com/submissions/v3/integration/submit/' + HUBSPOT_PORTAL_ID + '/' + HUBSPOT_FORM_ID; var submitting = false; function getValue(id) { var el = document.getElementById(id); return el ? String( el.value || '' ).trim() : ''; } function getHubSpotCookie() { var match = document.cookie.match( /(?:^|;\s*)hubspotutk=([^;]+)/ ); return match ? decodeURIComponent( match[1] ) : ''; } function getEstimate() { return ( window.WAResidentialEstimate || null ); } function buildSpaceDetails( estimate ) { var address = getValue( 'waResAddress' ) || 'Not provided'; var timing = getValue( 'waResTiming' ) || 'Flexible'; var reviewMethod = getValue( 'waResReviewMethod' ) || 'Whatever Wipe Away Recommends'; var notes = getValue( 'waResRequestNotes' ) || 'None provided'; var addons = ( estimate.addons && estimate.addons.length ) ? estimate.addons.join( ', ' ) : 'None'; var lines = [ 'RESIDENTIAL ESTIMATE REVIEW REQUEST', '', 'SERVICE ADDRESS', 'Address: ' + address, '', 'PRELIMINARY WEBSITE ESTIMATE', 'Service Needed: ' + estimate.service, 'Home Size: ' + estimate.homeSize, 'Approximate Square Footage: ' + Number( estimate.sqft ).toLocaleString(), 'Cleaning Frequency: ' + estimate.frequency, 'Add-Ons: ' + addons, 'First Cleaning Preliminary Estimate: ' + estimate.firstCleanEstimate ]; if( estimate.recurringEstimate ){ lines.push( 'Future Recurring Cleaning Estimate: ' + estimate.recurringEstimate ); } lines.push( '', 'HOME REVIEW', 'Preferred Service Timing: ' + timing, 'Preferred Review Method: ' + reviewMethod, 'Home Condition / Special Cleaning Details: ' + notes, '', 'IMPORTANT:', 'The website estimate is preliminary and is not final residential pricing. Wipe Away may request photos, a short video, or an onsite walkthrough when necessary to confirm the actual condition, buildup, access, cleaning scope, and service requirements before the final price is provided.' ); return lines.join( '\n' ); } function setStatus( message ) { var status = document.getElementById( 'waResidentialStatus' ); if(status){ status.textContent = message || ''; } } function setButtonState( loading ) { var button = document.getElementById( 'waResidentialSubmit' ); if(!button){ return; } button.disabled = loading; button.textContent = loading ? 'SENDING REQUEST...' : 'SUBMIT RESIDENTIAL REQUEST'; } function showSuccess() { var form = document.getElementById( 'waResidentialLeadForm' ); var success = document.getElementById( 'waResidentialSuccess' ); setStatus(''); if(form){ form.style.display = 'none'; } if(success){ success.style.display = 'block'; setTimeout( function(){ success.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100 ); } } async function submitResidentialForm( event ) { if(event){ event.preventDefault(); } if(submitting){ return; } var form = document.getElementById( 'waResidentialLeadForm' ); if(!form){ return; } if( !form.checkValidity() ){ form.reportValidity(); return; } var estimate = getEstimate(); if(!estimate){ setStatus( 'Please calculate your preliminary residential estimate above before submitting your request.' ); return; } submitting = true; setButtonState( true ); setStatus( 'Sending your residential request...' ); var fields = [ { name: 'firstname', value: getValue( 'waResFirst' ) }, { name: 'lastname', value: getValue( 'waResLast' ) }, { name: 'email', value: getValue( 'waResEmail' ) }, { name: 'phone', value: getValue( 'waResPhone' ) }, { name: 'zip', value: getValue( 'waResZip' ) }, { name: 'cleaning_type', value: 'Residential' }, { name: 'service_needed', value: estimate.hubspotService }, { name: 'home_size', value: estimate.hubspotHomeSize }, { name: 'cleaning_frequency', value: estimate.hubspotFrequency }, { name: 'approximate_square_footage', value: String( estimate.sqft ) }, { name: 'space_details', value: buildSpaceDetails( estimate ) } ]; var context = { pageUri: window.location.href, pageName: document.title || 'Wipe Away Residential Estimate' }; var hutk = getHubSpotCookie(); if(hutk){ context.hutk = hutk; } var payload = { submittedAt: Date.now(), fields: fields, context: context }; try { var response = await fetch( HUBSPOT_ENDPOINT, { method: 'POST', headers:{ 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify( payload ) } ); var responseText = await response.text(); if( !response.ok ){ console.error( 'Wipe Away residential HubSpot submission rejected:', response.status, responseText ); throw new Error( 'HubSpot rejected the residential submission.' ); } console.log( 'Wipe Away residential request submitted successfully.', responseText ); showSuccess(); }catch(error){ console.error( 'Wipe Away residential submission error:', error ); setStatus( 'Your request did not send. Please try again. If the problem continues, call Wipe Away at 404-860-2956.' ); submitting = false; setButtonState( false ); } } function initResidentialEngine() { var form = document.getElementById( 'waResidentialLeadForm' ); var button = document.getElementById( 'waResidentialSubmit' ); if( !form || !button ){ return false; } if( !form.dataset.waSubmitBound ){ form.dataset.waSubmitBound = 'true'; form.addEventListener( 'submit', submitResidentialForm ); } if( !button.dataset.waClickBound ){ button.dataset.waClickBound = 'true'; button.addEventListener( 'click', function(event){ event.preventDefault(); if( form.checkValidity() ){ submitResidentialForm( event ); }else{ form.reportValidity(); } } ); } console.log( 'Wipe Away residential submission engine ready.' ); return true; } function startEngine() { var attempts = 0; var timer = setInterval( function(){ attempts++; if( initResidentialEngine() || attempts >= 40 ){ clearInterval( timer ); } }, 250 ); } if( document.readyState === 'loading' ){ document.addEventListener( 'DOMContentLoaded', startEngine ); }else{ startEngine(); } })();
(function(){ var root = document.getElementById('wa-results'); var lightbox = document.getElementById('wa-results-lightbox'); if(!root || !lightbox){ return; } var lightboxImage = lightbox.querySelector('img'); var lightboxLabel = lightbox.querySelector('.wa-lightbox-label'); var closeButton = lightbox.querySelector('.wa-close'); function openPhoto(button){ var image = button.querySelector('img'); if(!image || !image.src){ return; } lightboxImage.src = image.src; lightboxImage.alt = image.alt || ''; lightboxLabel.textContent = button.getAttribute('data-title') || ''; lightbox.classList.add('wa-open'); document.body.style.overflow = 'hidden'; } function closePhoto(){ lightbox.classList.remove('wa-open'); lightboxImage.src = ''; document.body.style.overflow = ''; } root.addEventListener( 'click', function(event){ var button = event.target.closest('.wa-photo'); if(button){ openPhoto(button); } } ); closeButton.addEventListener( 'click', closePhoto ); lightbox.addEventListener( 'click', function(event){ if(event.target === lightbox){ closePhoto(); } } ); document.addEventListener( 'keydown', function(event){ if(event.key === 'Escape'){ closePhoto(); } } ); })();