Book Your
360° Booth

Check availability, choose your package, and lock in your date — all in one place.

Simple Pricing. No Surprises.

Pick Your
Package

2 Hours · Perfect for Birthdays & Smaller Events
The Spin
$300
The perfect way to give your guests an experience they've never had before — at a price that makes it easy to say yes.
  • On-Site Attendant
  • Unlimited Videos
  • Digital Backup
  • Free Delivery
  • Instant Digital Share
  • ✦ Prop Package Included
  • ✦ Custom Overlay Included
✦ Check Availability
Custom Duration · Corporate & Brand Events
The Experience
Let's Talk
Tailored to your event. Custom branding, flexible duration, built to make your occasion stand out.
  • Corporate Events
  • Brand Activations
  • Large Celebrations
  • ✦ Prop Package Included
  • ✦ Custom Overlay Included
  • Flexible Duration
✦ Get a Custom Quote
✦ Dates fill up fast — especially weekends.  Secure yours before it's gone.
Go Even Bigger

Add-Ons That Make
the Difference

Add-On
Fog / Smoke Effect

Low-lying fog around the platform for a cinematic, dreamy effect that makes every slow-mo clip look incredible.

+$75per event
Add-On
Extra Hour

Need more time? Add an extra hour to any package and keep the party going all night long.

+$125per hour
Check Your Date

Is Your Date
Available?

Click your event date to check availability. If it's open, secure it with a $100 deposit and we'll take care of everything from there.

Loading...
SunMonTueWedThuFriSat
Available
Booked
Selected
Selected Date
Book This Date →
⚠ Admin Mode — click any date to toggle booked/available
Got Questions?

Frequently Asked

The booth platform is approximately 6ft in diameter and the arm extends about 6ft horizontally. We recommend a minimum 10x10ft open area for the best experience.

We recommend booking at least 2–3 weeks in advance, especially for weekends and holiday events. Popular dates fill up fast — check availability above.

Videos are sent instantly via text or QR code the moment they're recorded. Guests can download and share directly to any platform right from the platform.

Yes, always. Every booking includes a dedicated on-site attendant who handles setup, runs the booth, and ensures everything runs flawlessly from start to finish.

We serve Chicago and all surrounding suburbs including Oak Park, Evanston, Naperville, Schaumburg, Joliet, Aurora and more — all with free delivery.

Cancellations 7+ days before the event receive a full deposit refund. Within 7 days the deposit is non-refundable but can be rescheduled within 60 days.

The platform comfortably fits 1–4 people per session. There is no limit on the number of sessions, so everyone gets a turn.

Absolutely — and it's included in every package. We'll brand every video with your name, event date, logo, or any design you like. Just mention it when you book.

Let's Make Your
Event Extraordinary

Location

Chicago & Surrounding Suburbs, IL

Response Time

We reply within a few hours — usually faster.

Please fill in all required fields.

✦ Secure Your Date with a $100 Deposit

Lock in your date instantly. Fill out the form above first, then pay your deposit to confirm.

Message Sent!

We received your inquiry and will get back to you within 24 hours.

TikTok Instagram Facebook
document.body.classList.add('js-loaded'); const SITE_CONFIG = { // ── Backend API URL (update after deploying to Railway) ── api_url: 'https://your-backend.railway.app', // ── EmailJS (emailjs.com) ────────────────────────────── emailjs_public_key: 'REPLACE_EMAILJS_PUBLIC_KEY', emailjs_service_id: 'REPLACE_EMAILJS_SERVICE_ID', emailjs_template_id: 'REPLACE_EMAILJS_TEMPLATE_ID', // ── Firebase (console.firebase.google.com) ───────────── firebase: { apiKey: 'REPLACE_FIREBASE_API_KEY', authDomain: 'REPLACE.firebaseapp.com', projectId: 'REPLACE_FIREBASE_PROJECT_ID', }, // ── Stripe Payment Links (dashboard.stripe.com) ──────── stripe_2hr: 'https://buy.stripe.com/REPLACE_2HR_LINK', stripe_4hr: 'https://buy.stripe.com/REPLACE_4HR_LINK', // ── Admin (click footer logo 7x fast to enter) ───────── admin_password: 'REPLACE_ADMIN_PASSWORD', }; // ── NAV SCROLL ──────────────────────────────────────────── const nav = document.getElementById('nav'); window.addEventListener('scroll', () => nav.classList.toggle('scrolled', scrollY > 60)); function toggleMenu() { document.getElementById('navLinks').classList.toggle('open'); } document.querySelectorAll('#navLinks a').forEach(a => a.addEventListener('click', () => document.getElementById('navLinks').classList.remove('open'))); // ── REVEAL ON SCROLL ────────────────────────────────────── const obs = new IntersectionObserver(entries => entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('visible'); obs.unobserve(e.target); } }), { threshold: 0.12 }); document.querySelectorAll('.reveal,.how-step-card').forEach(el => obs.observe(el)); // ── FAQ ACCORDION ───────────────────────────────────────── function toggleFaq(btn) { const item = btn.closest('.faq-item'); const open = item.classList.contains('open'); document.querySelectorAll('.faq-item.open').forEach(i => i.classList.remove('open')); if (!open) item.classList.add('open'); } // ── EMAILJS ─────────────────────────────────────────────── try { emailjs.init(SITE_CONFIG.emailjs_public_key); } catch(e) {} // Inject Stripe links from config document.querySelectorAll('[href="STRIPE_LINK_2HR"]').forEach(el => { el.href = SITE_CONFIG.stripe_2hr; }); document.querySelectorAll('[href="STRIPE_LINK_4HR"]').forEach(el => { el.href = SITE_CONFIG.stripe_4hr; }); // ── AVAILABILITY CALENDAR ───────────────────────────────── let calYear = new Date().getFullYear(); let calMonth = new Date().getMonth(); let calSelectedISO = null; let calBookedDates = new Set(); let calDb = null; let calAdminMode = false; let calAdminClicks = 0; let calAdminTimer = null; const MONTHS = ['January','February','March','April','May','June', 'July','August','September','October','November','December']; // Secret admin: click footer logo 7x quickly document.querySelector('.footer-logo').addEventListener('click', () => { calAdminClicks++; clearTimeout(calAdminTimer); calAdminTimer = setTimeout(() => { calAdminClicks = 0; }, 2000); if (calAdminClicks >= 7) { calAdminClicks = 0; const pw = prompt('Admin password:'); if (pw === SITE_CONFIG.admin_password) calEnterAdmin(); else if (pw !== null) alert('Incorrect password.'); } }); function calEnterAdmin() { calAdminMode = true; document.getElementById('cal-admin-bar').classList.add('show'); calRenderMonth(); } function calExitAdmin() { calAdminMode = false; document.getElementById('cal-admin-bar').classList.remove('show'); calRenderMonth(); } async function calRenderMonth() { document.getElementById('cal-loading').style.display = 'flex'; document.getElementById('cal-month-title').textContent = `${MONTHS[calMonth]} ${calYear}`; await calLoadBookedDates(calYear, calMonth); document.getElementById('cal-loading').style.display = 'none'; const today = new Date(); today.setHours(0, 0, 0, 0); const firstDay = new Date(calYear, calMonth, 1).getDay(); const daysInMonth = new Date(calYear, calMonth + 1, 0).getDate(); const container = document.getElementById('cal-days'); container.innerHTML = ''; for (let i = 0; i < firstDay; i++) { const b = document.createElement('div'); b.className = 'cal-day empty'; container.appendChild(b); } for (let d = 1; d <= daysInMonth; d++) { const iso = `${calYear}-${String(calMonth+1).padStart(2,'0')}-${String(d).padStart(2,'0')}`; const date = new Date(calYear, calMonth, d); const div = document.createElement('div'); div.textContent = d; if (date < today) { div.className = 'cal-day past'; } else if (calBookedDates.has(iso)) { div.className = 'cal-day booked'; if (calAdminMode) { div.style.cursor = 'pointer'; div.title = 'Click to unbook'; div.onclick = () => calToggleDate(iso); } } else { div.className = 'cal-day available' + (iso === calSelectedISO ? ' selected' : ''); if (date.toDateString() === today.toDateString()) div.classList.add('today'); div.onclick = () => calAdminMode ? calToggleDate(iso) : calSelectDate(iso); } container.appendChild(div); } } function scrollToBooking() { setTimeout(() => { const el = document.getElementById('contact'); if (el) el.scrollIntoView({ behavior: 'smooth' }); }, 120); } async function calToggleDate(iso) { if (!calDb) { alert('Firebase not configured yet — see SETUP.md.'); return; } try { const ref = calDb.collection('booked_dates').doc(iso); if (calBookedDates.has(iso)) { await ref.delete(); calBookedDates.delete(iso); } else { await ref.set({ date: iso }); calBookedDates.add(iso); } calRenderMonth(); } catch(e) { alert('Error: ' + e.message); } } function calChangeMonth(dir) { calMonth += dir; if (calMonth > 11) { calMonth = 0; calYear++; } if (calMonth < 0) { calMonth = 11; calYear--; } const now = new Date(); if (calYear < now.getFullYear() || (calYear === now.getFullYear() && calMonth < now.getMonth())) { calMonth = now.getMonth(); calYear = now.getFullYear(); } calRenderMonth(); } // ── BACKEND INTEGRATION ─────────────────────────────────── // Override calInit to load from backend API async function calInit() { try { if (!firebase.apps.length) firebase.initializeApp(SITE_CONFIG.firebase); calDb = firebase.firestore(); } catch(e) { calDb = null; } calRenderMonth(); } // Override calLoadBookedDates to try backend API first, fall back to Firebase async function calLoadBookedDates(year, month) { calBookedDates = new Set(); try { // Try backend API const r = await fetch(`${SITE_CONFIG.api_url}/api/availability?year=${year}&month=${month+1}`); if (r.ok) { const data = await r.json(); (data.bookedDates || []).forEach(d => calBookedDates.add(d)); return; } } catch(e) {} // Fallback to Firebase direct if (!calDb) return; const prefix = `${year}-${String(month+1).padStart(2,'0')}`; try { const snap = await calDb.collection('booked_dates') .where('date', '>=', prefix + '-01') .where('date', '<=', prefix + '-31').get(); snap.forEach(doc => calBookedDates.add(doc.data().date)); } catch(e) {} } // Check booking success URL param (function checkBookingReturn() { const params = new URLSearchParams(window.location.search); if (params.get('booking') === 'success') { const date = params.get('date'); // Show success message document.getElementById('form-fields').style.display = 'none'; document.getElementById('form-success').classList.add('show'); if (date && document.getElementById('f-date')) { document.getElementById('f-date').value = date; } // Clean URL window.history.replaceState({}, '', window.location.pathname); // Scroll to contact setTimeout(() => document.getElementById('contact')?.scrollIntoView({ behavior: 'smooth' }), 500); } if (params.get('booking') === 'cancelled') { window.history.replaceState({}, '', window.location.pathname); } })(); // ── STRIPE CHECKOUT ─────────────────────────────────────── async function startCheckout(tier) { const get = id => document.getElementById(id); const firstName = get('f-firstname')?.value.trim() || ''; const lastName = get('f-lastname')?.value.trim() || ''; const email = get('f-email')?.value.trim() || ''; const phone = get('f-phone')?.value.trim() || ''; const eventType = get('f-eventtype')?.value || ''; const date = get('f-date')?.value || ''; const message = get('f-message')?.value.trim() || ''; // Determine package from tier const packageName = tier === '4hr' ? '4 Hour Spin' : '2 Hour Spin'; if (!firstName || !email || !date || !eventType) { const errEl = get('form-error-msg'); if (errEl) { errEl.textContent = 'Please fill in your name, email, event date, and event type first.'; errEl.classList.add('show'); } get('f-firstname')?.scrollIntoView({ behavior: 'smooth', block: 'center' }); return; } // Auto-select the right package const pkgSelect = get('f-package'); if (pkgSelect) pkgSelect.value = tier === '4hr' ? '4 Hour Spin — $600' : '2 Hour Spin — $300'; const btn = event?.target; if (btn) { btn.disabled = true; btn.style.opacity = '0.6'; } try { const r = await fetch(`${SITE_CONFIG.api_url}/api/create-checkout`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ firstName, lastName, email, phone, eventType, eventDate: date, packageName, message }), }); const data = await r.json(); if (r.status === 409) { // Date already booked — show waitlist openWaitlist(date); return; } if (!r.ok) throw new Error(data.error || 'Failed to create checkout'); // Redirect to Stripe window.location.href = data.url; } catch(e) { console.error('Checkout error:', e); alert(e.message || 'Something went wrong. Please try again or email us at bookings@allaroundchitown.com'); if (btn) { btn.disabled = false; btn.style.opacity = ''; } } } // ── FORM SUBMIT (inquiry without deposit) ───────────────── async function handleSubmit(e) { e.preventDefault(); const get = id => document.getElementById(id); const firstName = get('f-firstname').value.trim(); const lastName = get('f-lastname').value.trim(); const email = get('f-email').value.trim(); const eventType = get('f-eventtype').value; const date = get('f-date').value; const pkg = get('f-package').value; const message = get('f-message').value.trim(); const phone = get('f-phone').value.trim(); const errEl = get('form-error-msg'); if (!firstName || !lastName || !email || !eventType || !date || !pkg) { errEl.classList.add('show'); return; } errEl.classList.remove('show'); const btn = get('form-submit-btn'); const fields = get('form-fields'); btn.innerHTML = 'Sending...'; fields.classList.add('sending'); try { // Try backend first const r = await fetch(`${SITE_CONFIG.api_url}/api/inquiry`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ firstName, lastName, email, phone, eventType, eventDate: date, packageName: pkg, message }), }); if (!r.ok) throw new Error('backend'); fields.classList.remove('sending'); get('form-success').classList.add('show'); fields.style.display = 'none'; } catch(e) { // Fall back to EmailJS try { await emailjs.send(SITE_CONFIG.emailjs_service_id, SITE_CONFIG.emailjs_template_id, { from_name: `${firstName} ${lastName}`, from_email: email, reply_to: email, phone: phone || 'Not provided', event_type: eventType, event_date: date, package: pkg, message: message || 'No message provided', }); fields.classList.remove('sending'); get('form-success').classList.add('show'); fields.style.display = 'none'; } catch(err2) { fields.classList.remove('sending'); btn.innerHTML = 'Send Inquiry ✦'; errEl.textContent = 'Something went wrong. Please email us directly at bookings@allaroundchitown.com'; errEl.classList.add('show'); } } } // ── WAITLIST ────────────────────────────────────────────── let waitlistDate = null; function openWaitlist(date) { waitlistDate = date; const [y, m, d] = date.split('-'); const months = ['January','February','March','April','May','June', 'July','August','September','October','November','December']; document.getElementById('waitlist-date-display').textContent = `Requested date: ${months[parseInt(m)-1]} ${parseInt(d)}, ${y}`; document.getElementById('waitlist-success').style.display = 'none'; document.getElementById('waitlist-form-fields').style.display = 'flex'; document.getElementById('waitlist-modal').style.display = 'flex'; document.body.style.overflow = 'hidden'; } function closeWaitlist() { document.getElementById('waitlist-modal').style.display = 'none'; document.body.style.overflow = ''; } async function submitWaitlist() { const name = document.getElementById('wl-name').value.trim(); const email = document.getElementById('wl-email').value.trim(); const phone = document.getElementById('wl-phone').value.trim(); if (!name || !email || !waitlistDate) return; try { const r = await fetch(`${SITE_CONFIG.api_url}/api/waitlist`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ date: waitlistDate, name, email, phone }), }); if (!r.ok) throw new Error('failed'); document.getElementById('waitlist-form-fields').style.display = 'none'; document.getElementById('waitlist-success').style.display = 'block'; setTimeout(closeWaitlist, 3000); } catch(e) { alert('Could not join waitlist. Please email us at bookings@allaroundchitown.com'); } } // Close waitlist modal on backdrop click document.getElementById('waitlist-modal').addEventListener('click', e => { if (e.target === e.currentTarget) closeWaitlist(); }); // Override calSelectDate to also show waitlist if date is booked function calSelectDate(iso) { if (calBookedDates.has(iso)) { openWaitlist(iso); return; } calSelectedISO = iso; const [y, m, d] = iso.split('-'); const months = ['January','February','March','April','May','June', 'July','August','September','October','November','December']; const friendly = `${months[parseInt(m) - 1]} ${parseInt(d)}, ${y}`; document.getElementById('cal-selected-date-text').textContent = friendly; document.getElementById('cal-selected-banner').classList.add('show'); const dateInput = document.getElementById('f-date'); if (dateInput) dateInput.value = iso; calRenderMonth(); } // ════════════════════════════════════════════════════════ // MULTI-STEP BOOKING MODAL // ════════════════════════════════════════════════════════ const BMC_MONTHS = ['January','February','March','April','May','June','July','August','September','October','November','December']; let bmcYear = new Date().getFullYear(); let bmcMonth = new Date().getMonth(); let bmcSelectedISO = null; let bmcIsBooked = false; let bkSelectedPkg = null; let bkSelectedAddons = {}; let bkCurrentStep = 1; function openBookingModal(date) { document.getElementById('book-modal-overlay').classList.add('open'); document.body.style.overflow = 'hidden'; bmcRender(); if (date) { bmcSelectDate(date); } } function closeBookingModal() { document.getElementById('book-modal-overlay').classList.remove('open'); document.body.style.overflow = ''; } document.getElementById('book-modal-overlay').addEventListener('click', e => { if (e.target === document.getElementById('book-modal-overlay')) closeBookingModal(); }); // ── STEP NAVIGATION ────────────────────────────────────── function goToStep(n) { document.querySelectorAll('.book-step').forEach(s => s.classList.remove('active')); document.getElementById(`bstep-${n === 'success' ? 'success' : n}`).classList.add('active'); bkCurrentStep = n; for (let i = 1; i <= 4; i++) { const dot = document.getElementById(`sdot-${i}`); if (!dot) continue; dot.className = 'step-dot' + (i < n ? ' done' : i === n ? ' active' : ''); dot.textContent = i < n ? '✓' : i; } document.getElementById('book-modal').scrollTop = 0; if (n === 4) renderSummary(); } function bmcBack(from) { goToStep(from - 1); } function bmcNext() { if (bmcSelectedISO && !bmcIsBooked) goToStep(2); } function bmcNext2() { if (bkSelectedPkg) goToStep(3); } function bmcNext3() { const first = document.getElementById('bk-first').value.trim(); const email = document.getElementById('bk-email').value.trim(); if (!first || !email) { alert('Please fill in at least your name and email.'); return; } goToStep(4); } // ── MINI CALENDAR ──────────────────────────────────────── let bmcBookedSet = new Set(); async function bmcLoadBooked() { bmcBookedSet = new Set(); if (!calDb) return; // Use existing calDb from main site script const prefix = `${bmcYear}-${String(bmcMonth+1).padStart(2,'0')}`; try { const snap = await calDb.collection('booked_dates') .where('date', '>=', prefix+'-01').where('date', '<=', prefix+'-31').get(); snap.forEach(d => bmcBookedSet.add(d.id)); } catch(e) {} } async function bmcRender() { document.getElementById('bmc-title').textContent = `${BMC_MONTHS[bmcMonth]} ${bmcYear}`; await bmcLoadBooked(); const today = new Date(); today.setHours(0,0,0,0); const firstDay = new Date(bmcYear, bmcMonth, 1).getDay(); const daysInMonth = new Date(bmcYear, bmcMonth+1, 0).getDate(); const container = document.getElementById('bmc-days'); container.innerHTML = ''; for (let i = 0; i < firstDay; i++) { const b = document.createElement('div'); b.className = 'bmc-day'; container.appendChild(b); } for (let d = 1; d <= daysInMonth; d++) { const iso = `${bmcYear}-${String(bmcMonth+1).padStart(2,'0')}-${String(d).padStart(2,'0')}`; const date = new Date(bmcYear, bmcMonth, d); const div = document.createElement('div'); div.textContent = d; if (date < today) div.className = 'bmc-day past'; else if (bmcBookedSet.has(iso)) { div.className = 'bmc-day booked bmc-day-booked-waitlist'; div.title = 'Booked — click to join waitlist'; div.onclick = () => bmcSelectBooked(iso); } else { div.className = 'bmc-day available' + (iso === bmcSelectedISO ? ' selected' : ''); div.onclick = () => bmcSelectDate(iso); } if (date.toDateString() === today.toDateString()) div.classList.add('today'); container.appendChild(div); } } function bmcSelectDate(iso) { bmcSelectedISO = iso; bmcIsBooked = false; document.getElementById('waitlist-box').style.display = 'none'; const [y,m,d] = iso.split('-'); document.getElementById('bmc-selected-label').textContent = `Selected: ${BMC_MONTHS[parseInt(m)-1]} ${parseInt(d)}, ${y}`; document.getElementById('bstep1-next').disabled = false; // Pre-fill date in main form too const df = document.getElementById('f-date'); if (df) df.value = iso; bmcRender(); } function bmcSelectBooked(iso) { bmcSelectedISO = iso; bmcIsBooked = true; document.getElementById('waitlist-box').style.display = 'block'; document.getElementById('bstep1-next').disabled = true; document.getElementById('bmc-selected-label').textContent = '⚠ This date is booked'; bmcRender(); } function bmcMonth(dir) { bmcMonth += dir; if (bmcMonth > 11) { bmcMonth = 0; bmcYear++; } if (bmcMonth < 0) { bmcMonth = 11; bmcYear--; } const now = new Date(); if (bmcYear < now.getFullYear() || (bmcYear===now.getFullYear()&&bmcMonths+a.price,0); const total = basePrice + addonsTotal; const [y,m,d] = (bmcSelectedISO||'').split('-'); const dateStr = bmcSelectedISO ? `${BMC_MONTHS[parseInt(m)-1]} ${parseInt(d)}, ${y}` : '—'; let rows = `
Date${dateStr}
Package${pkgName}
`; Object.values(bkSelectedAddons).forEach(a => { rows += `
${a.name}+$${a.price}
`; }); rows += `
Deposit Due Now$100
Total (balance due day-of)$${total}
`; document.getElementById('bk-summary').innerHTML = rows; // Set stripe links const stripe2 = SITE_CONFIG.stripe_2hr; const stripe4 = SITE_CONFIG.stripe_4hr; document.getElementById('bk-stripe-2hr').style.display = bkSelectedPkg==='2hr' ? 'flex' : 'none'; document.getElementById('bk-stripe-4hr').style.display = bkSelectedPkg==='4hr' ? 'flex' : 'none'; document.getElementById('bk-stripe-2hr').href = stripe2; document.getElementById('bk-stripe-4hr').href = stripe4; document.getElementById('success-stripe-2hr').href = stripe2; document.getElementById('success-stripe-4hr').href = stripe4; } // ── SUBMIT INQUIRY ─────────────────────────────────────── async function submitBookingInquiry() { const btn = document.getElementById('bk-inquiry-btn'); btn.textContent = 'Sending...'; btn.disabled = true; const first = document.getElementById('bk-first').value.trim(); const last = document.getElementById('bk-last').value.trim(); const email = document.getElementById('bk-email').value.trim(); const phone = document.getElementById('bk-phone').value.trim(); const evtType = document.getElementById('bk-eventtype').value; const message = document.getElementById('bk-message').value.trim(); const pkgName = bkSelectedPkg === '4hr' ? '4 Hour Premium Spin — $600' : '2 Hour Spin — $300'; const addons = Object.values(bkSelectedAddons).map(a=>a.name).join(', '); const [y,m,d] = (bmcSelectedISO||'').split('-'); const dateStr = bmcSelectedISO ? `${BMC_MONTHS[parseInt(m)-1]} ${parseInt(d)}, ${y}` : 'TBD'; try { await emailjs.send(SITE_CONFIG.emailjs_service_id, SITE_CONFIG.emailjs_template_id, { from_name: `${first} ${last}`, from_email: email, reply_to: email, phone: phone || 'Not provided', event_type: evtType || 'Not specified', event_date: dateStr, package: pkgName + (addons ? ` + ${addons}` : ''), message: message || 'No message', }); goToStep('success'); } catch(err) { console.error(err); btn.textContent = 'Or Send Inquiry Without Deposit →'; btn.disabled = false; alert('Something went wrong. Please try again or email bookings@allaroundchitown.com'); } } // ── WAITLIST ────────────────────────────────────────────── async function joinWaitlist() { const name = document.getElementById('wl-name').value.trim(); const phone = document.getElementById('wl-phone').value.trim(); const email = document.getElementById('wl-email').value.trim(); if (!name || !email) { alert('Please enter your name and email.'); return; } try { await fetch('/.netlify/functions/waitlist', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action:'add', date: bmcSelectedISO, name, email, phone, package: bkSelectedPkg||'' }), }); document.getElementById('waitlist-box').innerHTML = '
✦ You're on the waitlist! We'll text you if this date opens up.
'; } catch(e) { alert('Something went wrong. Please try again.'); } }