Cardetail1 Auto Marine RV Fleet
📍 Serving Westchester, NY & Surrounding Areas | Fully Mobile Service

Mobile Car Detailing in Westchester

Professional mobile detailing in Westchester, NY — we bring the water, the power, and the expertise directly to your driveway. No waiting rooms, no hassle—just a showroom finish at your doorstep.

★★★★★ Neighbor-rated Lock in your driveway service online
📍ž Call or Text: 551-313-2956
↓ Scroll
📍 What's your ZIP? We'll show local pricing
Based in Palisades Park — we serve Bergen County neighbors and the wider Tri-State. Pop in your ZIP to check coverage.
Popular Near You
SERVICES IN
YOUR AREA
Before & After
REAL TRANSFORMATIONS.
DRAG TO COMPARE.
Actual jobs from our mobile route — leather restoration, exterior refresh, and deep interior work at the customer's location.
Subaru Crosstrek exterior after mobile detailing — clean paint, dressed trim, and fresh tires
Subaru Crosstrek exterior before mobile detailing — road film on paint and dusty wheels
Before After
Subaru Crosstrek
Exterior Detail & Paint Enhancement

Road film and brake dust cleared off the blue paint, trim restored to a deep black, and the whole finish brought back to a clean, reflective shine — right in the customer's driveway.

John Deere Gator interior after deep cleaning — spotless dash, floor mats, and seats
John Deere Gator interior before deep cleaning — dusty dash, floor mats, and controls
Before After
John Deere Gator XUV835M
Utility Vehicle Interior Deep Clean

Work vehicles take a beating. We pulled the dust out of every vent and crevice, scrubbed the rubber floor mats, and left the cab ready for the next job — not the last one.

GMC Terrain exterior after mobile detailing — glossy white paint and deep black trim
GMC Terrain exterior before mobile detailing — road film on white paint and dusty grille
Before After
GMC Terrain
Exterior Wash & Paint Decontamination

Weeks of driveway dust and road film dulled this white SUV. Same front angle after the wash — paint back to a clean white, black trim deep again, and the whole front end looking like it just left the lot.

Rear bench interior after pet hair removal — clean fabric seats and rubber floor mats
Rear bench interior before pet hair removal — heavy dog hair on fabric seats
Before After
Crossover Rear Bench
Pet Hair Removal & Interior Deep Clean

Dog hair woven into every crease of the honeycomb fabric — the kind of mess that doesn't come out with a household vacuum. We extracted it from the seats, mats, and seams until the whole rear cabin looked and smelled fresh again.

Mini Cooper S front after exterior detail — mirror-gloss black paint
Mini Cooper S front before exterior detail — dusty hood and dull black paint
Before After
Mini Cooper S
Exterior Detail & Gloss Restoration

Pollen, dust, and dried spots had flattened the black paint on this Clubman. One pass through our full exterior process and the hood was reflecting the sky again — tight body, small car, same standard of finish.

Mini Cooper Clubman side after exterior detail — deep gloss on dark blue paint
Mini Cooper Clubman side before exterior detail — road dust on lower doors and wheels
Before After
Mini Cooper Clubman
Full Exterior Detail

Road grime had worked its way up the lower doors and rear quarter. Side-by-side from the same profile — dust gone, dark paint brought back to a wet-look shine, wheels and trim cleaned up to match.

Mini Cooper Clubman rear after exterior detail — clean split doors and glossy paint
Mini Cooper Clubman rear before exterior detail — thick dust on barn doors and bumper
Before After
Mini Cooper Clubman
Rear Detail & Trim Restoration

The barn doors and rear glass were coated in a thick layer of dust — easy to miss until you walk around back. Same rear angle after the job: clean glass, sharp reflections, and trim that actually looks black again.

Renegade Vienna RV front after exterior detail — glossy black cap and clean windshield
Renegade Vienna RV front before exterior detail — mud streaks on black front cap
Before After
Renegade Vienna (Mercedes Sprinter RV)
RV Front Cap & Windshield Detail

Mud streaks ran down the entire front cap and windshield after weeks on the road. We cut through the grime on the black fiberglass and glass until the front of this coach looked like it did the day it rolled off the lot.

Renegade Vienna RV roof after cleaning — clean solar panels and white roof surface
Renegade Vienna RV roof before cleaning — grime and debris on solar panels and roof
Before After
Renegade Vienna (Mercedes Sprinter RV)
Roof Wash & Solar Panel Cleaning

Tree debris, grime, and oxidation on the roof don't just look bad — they cut into solar output. Same overhead angle after we cleared the panels and white roof membrane back to a clean, uniform finish.

Land Rover Defender exterior after mobile detail — glossy white paint and clean wheels
Land Rover Defender exterior before mobile detail — road film and dusty wheels
Before After
Land Rover Defender
Exterior Detail & Wheel Clean

City driving had dulled the white panels and loaded brake dust into the alloys. Same front-quarter angle after the detail — crisp white paint, deep black trim, and wheels that actually match the rest of the truck.

Land Rover Defender interior after deep clean — spotless dash and console
Land Rover Defender interior before deep clean — muddy floor mat and dusty dash
Before After
Land Rover Defender
Interior Deep Clean

Mud on the rubber mat, dust in the vents, grime in the console — typical NYC daily-driver wear. Before and after from slightly different angles, same cabin: cleaned, vacuumed, and wiped down until it felt new inside.

Volvo XC90 exterior after mobile detail — mirror-gloss black paint
Volvo XC90 exterior before mobile detail — pollen and dust on black hood
Before After
Volvo XC90
Exterior Wash & Decontamination

Spring pollen had turned this black SUV matte overnight. Same front angle after we washed and decontaminated the paint — deep gloss back, trees reflecting off the hood like a mirror.

Lamborghini Urus & Porsche Lineup
Exotic & Luxury Exterior Detail

Three exotics, one driveway — a Urus and two Porsches lined up after a full exterior refresh. Paint decontaminated, wheels detailed, and every panel brought back to a deep, wet gloss without leaving the property.

Two Porsches and Range Rover after multi-vehicle premium detail — three luxury SUVs lined up in a driveway with deep gloss finish
Two Porsches & Range Rover
Multi-Vehicle Premium Detail

Three cars, one visit — two Porsches and a Range Rover detailed back-to-back in the same driveway. Full exterior refresh on every vehicle without a second trip or shop drop-off.

Jayco Eagle Series fifth-wheel front cap with custom Dolly decal after exterior detail — glossy white fiberglass reflecting sky and trees
Jayco Eagle “Dolly”
Fifth-Wheel Front Cap & Exterior Detail

This Jayco Eagle wears a custom “Dolly” decal on the front cap. We cut through road film and oxidation on the white fiberglass until the whole front end was reflecting the sky again — logo, decal, and tinted cap all cleaned up.

John Deere Gator XUV835M side profile after full exterior detail — polished green panels and dressed off-road tires
John Deere Gator XUV835M
UTV Full Exterior Detail

Same Gator, outside this time — green panels polished, knobby tires dressed, and those yellow wheels popping again. Built for mud and job sites; finished like it just rolled off the lot.

📅 PICK YOUR DATE

Tell us when works for you — we'll text you to confirm once we've checked the route, weather, and access at your place.

✓ No shop visit
✓ We bring everything
✓ We'll text you to confirm
✓ Your card locks the slot

Your vehicle is an investment — we treat it like one.

We bring the water, the power, and the expertise directly to your driveway. No waiting rooms, no hassle—just a showroom finish at your doorstep.

We detail at your home, office, marina, or approved spot Pro equipment on every job — no shop drop-off We'll text you before we lock in your appointment Track your appointment easily via text or your local dashboard
Choose Your Service
CARS · BOATS · RVS
POWERSPORTS · FLEET
We are a local, hard-working team proud to serve our Bergen County neighbors. Pick your vehicle, see packages and pricing, and lock in your driveway service — all from your phone.
The Process
FOUR STEPS.
ZERO HASSLE.
No shop drop-off, no waiting room, no phone tag. Lock in your driveway service online — we'll take it from there.
📱
Grab Your Spot
Lock in your driveway service online.
🔒
Lock It In
Book with confidence. We place a secure $0 hold just to reserve your spot on our route. We never charge you upfront. You only pay when the job is done and you're 100% happy with the results.
🚐
We Come To You
Our tech rolls up to your driveway, office, or marina with pro gear. You stay put — we handle the rest.
Inspect & Pay
Walk around with your tech when the job's done. Final payment happens after you've seen the results.
🔧
PRO
Gear On Board
📍
LOCAL
Bergen County
$0
No Charge Today
📅
ONLINE
Book Anytime
🚐
MOBILE
We Come To You
Customer Reviews & Recent Feedback
TRUSTED ON
REAL VEHICLES.
See what customers say about Cardetail1 across cars, SUVs, RVs, and mobile detailing throughout the Tristate — NJ, NY, CT and surrounding areas + PA.
2.8k+
Vehicles Detailed
5+
Years in Service
Tristate
NJ · NY · CT + PA
All Year
Round Service
5.0
Customer Rating
1 / 14
⭐ Leave a Google Review
🧽Recent detail work
📍¸Photo gallery of recent work now live
📍Serving Bergen County & North Jersey
🔧Professional equipment
🔧Mobile-ready equipment available
Booking reviewed before confirmation
📍 Bergen County & North Jersey · Local Detail Service
📍ž
CALL OR TEXT US
551-313-2956
Mon–Fri 8AM–5PM · Bergen County, NJ and nearby areas
BOOK FROM YOUR DRIVEWAY
We'll text you to confirm · Track your appointment easily via text or your local dashboard
📍ž Call
Username
Password
1
Category
2
Package
3
Vehicle
4
Info
5
Secure Your Booking
6
Confirm
Step 01
WHAT ARE WE
DETAILING?
Enter your ZIP code first — we'll detect your area and show accurate pricing for your location.
📍 Enter your 5-digit ZIP code to unlock services and see local pricing
Cars and trucks receiving mobile detailing
Cars & Trucks
Sedans · SUVs · Trucks · Vans
Packages shown after ZIP check
Boats receiving mobile marine detailing
Boats
All vessels · Priced by length
From $199
RVs and travel trailers receiving mobile detailing
RVs & Trailers
Trailers · 5th Wheels · Class A/C
From $8/ft
Motorcycle ATV and jet ski detailing
Powersports
Motorcycle · ATV · UTV · Jet Ski
From $119
Step 02
CHOOSE YOUR
PACKAGE
Select a package — price updates by vehicle type or exact length for boats, RVs and travel trailers.

Starting prices — final price depends on vehicle size, condition, location, and selected add-ons. Heavy pet hair, odor treatment, biohazard, excessive stains, and oversized vehicles may require additional charges.

Step 03
YOUR VEHICLE
Enter your vehicle details. Boats, RVs and travel trailers are priced by exact length.
Select Length
Use the slider to select exact size. Pricing updates by length.
24 ft
10 ft24 ft36 ft45 ft60 ft
Large boats, RVs, fifth wheels, severe oxidation, height restrictions, or difficult access may require estimate confirmation.
Fleet Quantity
Select the number of units for this request. Final route and volume pricing may be adjusted after review.
2 units
For larger fleets, recurring accounts, mixed fleets, or multi-location work, submit the request and we will confirm the final quote.
Sedan receiving mobile detailing
Package price
starting price
Enhance your service
Running Total
$0
starting estimate
🛒 Vehicles in this booking
Configure this vehicle then add to cart
Step 04
YOUR DETAILS
We'll confirm your appointment by text or call within a few hours.
·
$0
First Name *
Last Name *
Phone / Text *
Email *
Service Address *
Due to high demand and route planning, our next available appointments are typically 3 days out.
Preferred Date *
Preferred Time *
Need a rush appointment or same-day service? Call or Text Us to check for route cancellations.
Water available?
Electricity available?
Service location / access
Access notes (optional)
Notes (optional)
Step 05
SECURE YOUR
BOOKING
This sends a booking request — we'll review your location, vehicle, weather, and access, then text you to confirm. Nothing charged today.
Lock Your Slot
Payment Preference
Card on File Required
No charge today. Your card is securely saved by Stripe and may only be charged according to our cancellation, no-show, access, or approved service payment policy.
Before saving your card, please note:
  • No charge is made today for saving your card.
  • Late cancellation, no-show, inaccessible vehicle, unsafe location, or denied access may result in a fee per the posted policy.
  • Final service payment is collected on-site by card or cash, or online if approved.
Powered by Stripe PCI-secure · no raw card data stored

Read full booking terms & agreements →

View policy summary (optional)

Suggested Booking Terms Summary

  • Booking: Submitting this form sends a booking request. Cardetail1 reviews your service, location, access, weather, and availability before final confirmation.
  • Service photos: Cardetail1 may take before/after photos of the vehicle during service for quality improvement, training, and the documentation/security of both parties.
  • Pre-existing damage: Cardetail1 is not responsible for pre-existing damage (scratches, dents, chips, stains, mechanical or electrical issues, worn or aged components) present before service.
  • New damage from vehicle condition: due to the condition and nature in which some vehicles are found, new issues may occur during normal detailing — e.g. loose or brittle trim/clips, failing clearcoat or paint, cracked or aged plastics, worn seals or water intrusion, or peeling films. These are a result of the vehicle's existing condition and are not the responsibility of Cardetail1.
  • Time windows: arrival windows are estimates only. Traffic, weather, prior jobs, parking, tolls, and access issues may cause delays.
  • Weather: rain, storms, freezing temperatures, unsafe heat, wind, or lack of safe covered access may require rescheduling with no penalty.
  • Cancellation / rescheduling: please request changes at least 24 hours before the appointment. Rescheduling is preferred over cancellation.
  • Late cancellation: cancellations made within 24 hours, same-day cancellation, unavailable vehicle/vessel, no-show, denied access, or unsafe location may result in a fee under the booking policy.
  • Fairness policy: if weather, emergency, or reasonable schedule conflict occurs, Cardetail1 may offer rescheduling to avoid unfair charges.
  • Final price: online totals are starting estimates. Excessive dirt, pet hair, odor, stains, mold, oxidation, black streaks, distance, tolls, parking, difficult access, or add-ons may change the final price.
  • Unsafe/out-of-scope conditions: biohazard, pest contamination, abandoned units, sewage, mold, severe odor, unsafe roofs, or damaged surfaces may require estimate or may be declined.
Booking Policy Summary · Read Full Terms →
  • Booking review: Submitting a request does not guarantee an appointment. We review location, vehicle condition, service type, weather, access, and availability before confirming.
  • Card on file: No charge is made when your card is saved. Card information is handled securely by Stripe and is not stored by Cardetail1.
  • Cancellation / no-show: Cancellations less than 24 hours before the confirmed appointment, no-show, inaccessible vehicle, denied access, or unsafe location may be subject to a cancellation/no-show fee according to the confirmed booking amount and service conditions.
  • Service payment: If service is completed and you are not available for on-site payment, Cardetail1 may send an online payment request or charge an approved saved payment method according to your selected payment preference and booking policy.
  • Weather / reschedule: Severe weather, unsafe conditions, freezing temperatures, or lack of suitable space may require rescheduling. We will contact you to adjust the appointment.
  • Pricing: Prices shown are starting estimates. Final pricing may change based on vehicle size, condition, pet hair, odor, stains, excessive soil, oversized vehicles, distance, tolls, and add-ons.
  • Access: You must provide safe legal access to the vehicle and enough working space. If the vehicle cannot be accessed, a no-show/access fee may apply.
  • Personal items: Please remove personal items before service. Cardetail1 is not responsible for unsecured personal belongings left inside the vehicle.
  • Photos: Before/after photos may be taken for documentation, quality control, and dispute resolution unless you request otherwise.
  • Pre-existing condition: Failing clear coat, loose trim, cracked surfaces, previous repairs, and heavily worn materials may limit results. Cardetail1 is not responsible for pre-existing defects.
✓ No charge today · Card on file is required for every booking request
Step 06
REVIEW &
SUBMIT
Give it a quick look, then send your request — we'll text you to confirm.
Service
Category
Vehicle
Package
Pkg price
Total
Final price confirmed on-site. Add-ons are starting prices.
Appointment
Name
Phone
Email
Address
Date & time
Request / Payment
Charged today$0.00 — booking request only
Payment selectionNot selected
Final paymentCollected on-site by card or cash after service, or online if approved. Cancellation/no-show fees apply per the posted policy.
Terms & Conditions
BOOKING REQUEST RECEIVED
✓ Your request was submitted

You're all set! We'll review your details and text you to confirm your appointment — usually within a few hours.

StatusUnder Review
Package
Vehicle
Total
Date

Questions? Call / text 551-313-2956 · Mon–Fri 8AM–5PM

After your service is completed, we'd appreciate your honest review.

⭐ Leave a Google Review
], fn:()=>({ reply:chatStartingPricesReply(), chips:[{label:'📅 Get my exact price',act:'book'},{label:'📍 Travel fees?',q:'Is there a travel fee?'},{label:'🧑‍🔧 Talk to a human',act:'human'}] }) }, { keys:['area','areas','serve','service area','location','where','city','town','county','zip','near me','come to','pa','pennsylvania','new jersey','new york','connecticut',' nj',' ny',' ct'], fn:()=>({ reply:"We're mobile — we come to you! 🚐 We serve "+AREAS+".\n\nEnter your ZIP when booking to confirm coverage and see local pricing (some areas have a small travel fee). Not sure if we reach you? Just ask or call "+telLink()+".", chips:[{label:'📅 Check my ZIP',act:'book'},{label:'💵 Pricing',q:'How much does it cost?'},{label:'🧑‍🔧 Talk to a human',act:'human'}] }) }, { keys:['travel fee','surcharge','extra fee','area fee','distance','toll'], fn:()=>({ reply:"Most core areas have no travel fee. Farther zones (e.g. NYC, Long Island, PA Philly/Pocono) may include a small distance-based fee — typically $15–$35 — already included in the package total shown when you book.", chips:[{label:'📅 See my area fee',act:'book'},{label:'🧑‍🔧 Talk to a human',act:'human'}] }) }, { keys:['package','packages','plan','plans','tier','what do you offer','full detail','interior','exterior'], fn:()=>{ const names=pkgNames('cars'); const list=names.length?names.map(n=>'• '+n).join('\n'):'• Maintenance Detail\n• Premium Detail'; return { reply:"For cars we offer:\n\n"+list+"\n\nBoats, RVs and trailers are priced by exact length, and fleet has volume pricing. Each package lists exactly what's included in the booking flow.", chips:[{label:'✨ Add-ons',q:'What add-ons do you have?'},{label:'📅 See packages',act:'book'},{label:'💵 Pricing',q:'How much does it cost?'}] }; } }, { keys:['add-on','add on','addon','extra','upgrade','pet hair','odor','ceramic','wax','shampoo','stain'], fn:()=>{ const popularIds=['pethair','odor','rainx']; const all=(PRICING.cars?.addons||[]); const popular=all.filter(a=>popularIds.includes(a.id)).map(a=>'• '+a.name+' (+$'+a.price+')'); const others=all.filter(a=>!popularIds.includes(a.id)).slice(0,4).map(a=>'• '+a.name+' (+$'+a.price+')'); const list=[...popular,...others].join('\n')||'• Pet Hair Removal (+$95)\n• Odor Treatment (+$149)\n• Rain-X Glass Treatment (+$25)'; return { reply:"Popular add-ons you can pick during booking:\n\n"+list+"\n\nThey appear right after you choose your package & vehicle, and the total updates live.", chips:[{label:'📅 Add to my booking',act:'book'},{label:'💵 Pricing',q:'How much does it cost?'}] }; } }, { keys:['book','booking','appointment','schedule','reserve','agendar','set up','sign up','how do i'], fn:()=>({ reply:"Booking takes a couple minutes: 📍 enter ZIP → 🚗 pick category & package → confirm your vehicle → ✨ add extras → your details → review & submit. No charge today — we confirm by text or call first.", chips:[{label:'📅 Start booking',act:'book'},{label:'💳 Deposit/payment',q:'Do I pay now?'},{label:'🧑‍🔧 Talk to a human',act:'human'}] }) }, { keys:['pay','payment','deposit','charge now','credit card','card','stripe','money','pay now','upfront'], fn:()=>({ reply:"You're not charged when you submit — it's a request first. A card on file is required for booking security and is saved securely through Stripe. Choose cash on-site, card on-site, or online after service as your separate payment preference.", chips:[{label:'📅 Book now',act:'book'},{label:'❌ Cancellation policy',q:'What is your cancellation policy?'},{label:'🧑‍🔧 Talk to a human',act:'human'}] }) }, { keys:['hour','hours','open','time','when are you','availability','available','today','same day','same-day','weekend'], fn:()=>({ reply:"We operate Mon–Fri, 8AM–5PM. Request your preferred date during booking — we confirm availability based on route, weather, and service type before scheduling.", chips:[{label:'📅 Check availability',act:'book'},{label:'🧑‍🔧 Talk to a human',act:'human'}] }) }, { keys:['cancel','cancellation','reschedule','refund','no-show','policy','weather','rain'], fn:()=>({ reply:"Easy & fair: 🔄 reschedule or cancel at least 24h before (rescheduling preferred). Weather, emergencies or schedule conflicts → free reschedule. Late cancellations / no-shows / denied access may incur a fee or deposit loss. Full terms are on the Terms page.", chips:[{label:'📅 Book now',act:'book'},{label:'🧑‍🔧 Talk to a human',act:'human'}] }) }, { keys:['what do you detail','vehicle','vehicles','cars','boat','rv','trailer','motorcycle','atv','jet ski','truck','suv'], fn:()=>({ reply:"We detail 🚗 cars & trucks, 🚥️️️️ boats, 🏕️ RVs & travel trailers, 🏍️ powersports (motorcycle/ATV/UTV/jet ski) and 🚚 fleets — all mobile, at your home or workplace.", chips:[{label:'💵 Pricing',q:'How much does it cost?'},{label:'📅 Book now',act:'book'}] }) }, { keys:['mobile','come to me','at home','my place','do you travel','my location','my house','my driveway'], fn:()=>({ reply:"Yes — we're 100% mobile. We bring professional equipment; water/power access may depend on location and service type. No shop visit needed — just safe access to your vehicle. 🚐", chips:[{label:'📍 Service area',q:'What areas do you serve?'},{label:'📅 Book now',act:'book'}] }) }, { keys:['how long','duration','take','hours to','time to finish','minutes'], fn:()=>({ reply:"It depends on the package and vehicle — each package shows its estimated time in the booking flow (a wash is quick; a full detail takes longer). Pick a package to see the duration.", chips:[{label:'📅 See times',act:'book'},{label:'💵 Pricing',q:'How much does it cost?'}] }) }, { keys:['human','agent','person','representative','call','phone','contact','speak','talk to','someone','manager','owner','real person'], fn:()=>({ reply:"Happy to connect you! 📍ž Call or text us at "+telLink()+" (Mon–Fri 8AM–5PM), or leave your question here and our team will get back to you.", chips:[{label:'📍¨ Send my question',act:'human'},{label:'📅 Book now',act:'book'}] }) }, { keys:['thank','thanks','obrigado','appreciate','great','awesome','perfect'], fn:()=>({ reply:"You're welcome! 🙌 Anything else I can help with?", chips:DEFAULT_CHIPS }) } ]; function cdLocalAnswer(text){ const t=' '+text.toLowerCase()+' '; let best=null, bestScore=0; INTENTS.forEach(intent=>{ let score=0; intent.keys.forEach(k=>{ if(t.indexOf(k.toLowerCase())>-1) score += k.length>3?2:1; }); if(score>bestScore){ bestScore=score; best=intent; } }); if(best && bestScore>0) return best.fn(); return { reply:"I want to get this right 🤔 — I'm not 100% sure about that one. I can connect you with our team, or you can call "+telLink()+". Want me to pass your question along?", chips:[{label:'📍¨ Send my question',act:'human'},{label:'💵 Pricing',q:'How much does it cost?'},{label:'📅 Book now',act:'book'}] }; } // ── HUMAN HANDOFF (last resort → owner / admin portal) ── function openHandoff(){ $('cd-handoff').style.display='flex'; $('cd-input-row').style.display='none'; $('cd-chips').style.display='none'; $('cd-h-out').style.display='none'; push("No problem — leave your details and question and our team will reply by text, call or email. 📍¨",'bot'); setTimeout(()=>$('cd-h-name')&&$('cd-h-name').focus(),100); } function cdCancelHandoff(){ const f=$('cd-handoff'); if(!f) return; f.style.display='none'; $('cd-input-row').style.display='flex'; $('cd-chips').style.display='flex'; } window.cdCancelHandoff=cdCancelHandoff; window.cdOpenHandoff=openHandoff; function getInquiries(){ try{ return JSON.parse(localStorage.getItem('cd1_inquiries')||'[]'); }catch(e){ return []; } } function setInquiries(l){ try{ localStorage.setItem('cd1_inquiries',JSON.stringify(l)); }catch(e){} } function cdSubmitHandoff(e){ e.preventDefault(); const name=$('cd-h-name').value.trim(), phone=$('cd-h-phone').value.trim(), email=$('cd-h-email').value.trim(), message=$('cd-h-msg').value.trim(); const out=$('cd-h-out'); if(!name || !phone){ out.style.display='block'; out.style.color='var(--rd)'; out.innerHTML='Please add your name and a phone number so we can reach you.'; return; } const inquiry={ id:'INQ-'+Date.now().toString(36).toUpperCase(), name, phone, email, message, createdAt:new Date().toISOString(), status:'New', source:'Chat widget' }; // 1) always save locally so it shows in the Admin portal const list=getInquiries(); list.push(inquiry); setInquiries(list); // 2) best-effort send to the backend (degrades silently if not configured) try{ if(typeof INQUIRY_URL==='string' && INQUIRY_URL){ fetch(INQUIRY_URL,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(inquiry)}).catch(()=>{}); } if(typeof BACKEND_URL==='string' && BACKEND_URL){ fetch(BACKEND_URL,{method:'POST',mode:'no-cors',headers:{'Content-Type':'application/json'},body:JSON.stringify(Object.assign({type:'inquiry'},inquiry))}).catch(()=>{}); } }catch(e){} // 3) guaranteed fallback: prefilled email + SMS links to the owner const subject=encodeURIComponent('Website question from '+name); const body=encodeURIComponent('Name: '+name+'\nPhone: '+phone+(email?'\nEmail: '+email:'')+'\n\nQuestion:\n'+(message||'(none)')); const adminEmail=(typeof ADMIN_EMAIL==='string'&&ADMIN_EMAIL)?ADMIN_EMAIL:''; const adminSms=(typeof ADMIN_SMS==='string'&&ADMIN_SMS)?ADMIN_SMS:PHONE_TEL; const mailto=adminEmail?('mailto:'+adminEmail+'?subject='+subject+'&body='+body):''; cdCancelHandoff(); push("✅ Thanks, "+esc(name)+"! Your question is on its way to our team — we'll reply to "+esc(phone)+" soon.",'bot'); let extra="Want it instantly? "+(mailto?'email us or ':'')+'text us — or call '+telLink()+'.'; push(extra,'bot'); setChips([{label:'📅 Book now',act:'book'},{label:'💬 Ask something else',q:'hi'}]); $('cd-h-name').value=$('cd-h-phone').value=$('cd-h-email').value=$('cd-h-msg').value=''; } window.cdSubmitHandoff=cdSubmitHandoff; // ── init ── // gentle attention nudge after a moment if the user hasn't opened the chat setTimeout(()=>{ if(!started){ const b=$('cd-badge'); if(b) b.style.display='flex'; } }, 6000); })();