Tell us about yourself

All fields marked * are required.

Personal Details

Please enter your first name
Please enter your last name

Minimum age 18 years

Please enter a valid date of birth (18+)

Contact Details

Please enter a valid email address

Include country code (e.g. +61 for Australia)

Please enter your phone number with country code
Please select your home country

Choose Your Room

Select your accommodation type, then fill in a few more details.

Noosa Escape · Noosa Crest · 11 to 17 November 2026 · With Alice Evans & the AE Team

Display Currency

Rates are indicative and updated daily. Final charge in AUD.

Accommodation Package *

Prices shown are total retreat cost per person, not the deposit.

A Few More Details

You'll receive an AE tank top to keep!

Please select your tank top size

We'll try to pair you in the same room if available.

Please tell us how you found us

Review & Pay Deposit

Double check everything looks right, then pay your deposit to lock in your spot.

Personal Details Edit

Your Booking Edit

By booking you agree to Active Escapes' Policies & Conditions. All prices include tax where applicable. Deposits are non refundable, full balance is due 60 days prior to your escape.

Deposit to pay today

A$500

AUD, Australian Dollar

The deposit secures your spot. Balance is due 60 days before your escape. We offer flexible payment plans, just ask!

Secure payment via Airwallex

You're almost there!

Your booking details have been received and a confirmation has been sent to .

We've also notified the Active Escapes team. You're now being redirected to complete your deposit payment, your spot will be secured once payment is confirmed.

If you're not redirected automatically, click here to pay your deposit.

); const cur = data.payNowCurrency; const sym = CURRENCY_SYMBOLS[cur]; const dep = DEPOSITS[cur]; const priceNum = pkg ? (cur === 'AUD' ? pkg.aud : Math.round(pkg.aud * fxRates[cur])) : 0; const dobFmt = data.dob ? new Date(data.dob).toLocaleDateString('en-AU',{day:'numeric',month:'long',year:'numeric'}) : '—'; const templateParams = { guest_first_name: data.firstName, guest_last_name: data.lastName, guest_name: data.firstName + ' ' + data.lastName, guest_email: data.email, guest_phone: data.phone, guest_country: data.country, guest_sex: data.sex || '—', guest_dob: dobFmt, retreat_dates: data.retreatDates, retreat_location: data.retreatLabel, retreat_hotel: data.hotel, retreat_team: evt.team, package_name: data.roomType || '—', retreat_price: sym + priceNum.toLocaleString() + ' ' + cur, tank_top_size: data.shirtSize || '—', friend_name: data.friendName || 'N/A', referral_source: data.referral || '—', previous_guest: data.previousGuest || '—', comments: data.notes || 'None', deposit_currency: cur, deposit_amount: sym + dep, deposit_symbol: sym, payment_plan: data.paymentPlan === 'monthly' ? 'Pay Monthly' : 'Deposit + Balance', booking_ref: data.bookingRef, staff_email: CONFIG.ADMIN_EMAIL, booking_date: new Date().toLocaleDateString('en-AU',{day:'numeric',month:'long',year:'numeric',hour:'2-digit',minute:'2-digit'}), }; await emailjs.send(CONFIG.emailjs.serviceId, CONFIG.emailjs.guestTemplate, { ...templateParams, to_email: data.email, to_name: data.firstName, reply_to: CONFIG.ADMIN_EMAIL, }); console.log('Guest email sent'); await emailjs.send(CONFIG.emailjs.serviceId, CONFIG.emailjs.staffTemplate, { ...templateParams, to_email: CONFIG.ADMIN_EMAIL, to_name: 'Active Escapes Team', reply_to: data.email, }); console.log('Staff email sent'); } // ══════════════════════════════════════════════════════════ // INITIATE PAYMENT // ══════════════════════════════════════════════════════════ async function initAirwallexDropIn() { state.pendingData = collectFormData(); state.pendingData.status = 'pending'; const payBtn = document.getElementById('payBtn'); if (payBtn) { payBtn.disabled = true; payBtn.innerHTML = ' Submitting your request…'; } try { localStorage.setItem('ae_booking_pending', JSON.stringify(state.pendingData)); sessionStorage.setItem('ae_booking_pending', JSON.stringify(state.pendingData)); } catch(_) {} // Save booking + send emails — wait up to 8 seconds const timeout = new Promise(resolve => setTimeout(resolve, 8000)); await Promise.race([ Promise.all([ callBackend({ action: 'saveBooking', booking: state.pendingData }) .catch(e => console.warn('Booking save error:', e)), sendConfirmationEmails(state.pendingData) .catch(e => console.warn('Email error:', e)), ]), timeout, ]); // Redirect to deposit page based on selected currency const depositPages = { AUD: 'depositaud.html', USD: 'depositusd.html', GBP: 'depositgbp.html', EUR: 'depositeur.html' }; const depositPage = depositPages[state.pendingData.currency] || 'depositaud.html'; window.location.href = depositPage; } function showPending(data) { document.querySelectorAll('.step,.progress-step').forEach(el => el.classList.remove('active')); document.getElementById('stepPending').classList.add('active'); document.getElementById('pendingRef').textContent = data.bookingRef; document.getElementById('pendingSub').textContent = `Thanks ${data.firstName}! We've received your booking request for the ${data.retreatLabel}. ` + `We'll review it and be in touch shortly to confirm your spot.`; window.scrollTo({ top: 0, behavior: 'smooth' }); } function showSuccess(data) { document.querySelectorAll('.step,.progress-step').forEach(el => el.classList.remove('active')); document.getElementById('stepSuccess').classList.add('active'); document.getElementById('successRef').textContent = data.bookingRef; document.getElementById('successSub').textContent = `You're booked into the ${data.retreatLabel} (${data.retreatDates})! ` + `A confirmation is on its way to ${data.email}.`; document.getElementById('create-account-box').dataset.email = data.email; document.getElementById('create-account-box').dataset.firstName = data.firstName; document.getElementById('create-account-box').dataset.lastName = data.lastName; if (sessionStorage.getItem('ae_token')) { document.getElementById('create-account-box').style.display = 'none'; } window.scrollTo({ top: 0, behavior: 'smooth' }); } // ══════════════════════════════════════════════════════════ // CREATE ACCOUNT // ══════════════════════════════════════════════════════════ async function createAccount() { const box = document.getElementById('create-account-box'); const alertEl = document.getElementById('create-account-alert'); const password = document.getElementById('ca-password').value; const confirm = document.getElementById('ca-confirm').value; const email = box.dataset.email; const firstName = box.dataset.firstName; const lastName = box.dataset.lastName; alertEl.style.display = 'none'; if (password.length < 8) { alertEl.textContent = 'Password must be at least 8 characters.'; alertEl.style.display = 'block'; return; } if (password !== confirm) { alertEl.textContent = 'Passwords do not match.'; alertEl.style.display = 'block'; return; } const btn = document.getElementById('ca-btn'); btn.textContent = 'Creating account…'; btn.disabled = true; const profile = { firstName, lastName, phone: document.getElementById('phone')?.value.trim() || '', dob: document.getElementById('dob')?.value || '', country: document.getElementById('country')?.value || '', sex: state.sex || '', shirtSize: document.getElementById('shirtSize')?.value || '', referral: document.getElementById('referral')?.value || '', previousGuest: state.previousGuest || '', }; try { const data = await callBackend({ action: 'register', email, password, profile }); if (!data.success) throw new Error(data.error); sessionStorage.setItem('ae_token', data.token); sessionStorage.setItem('ae_email', email); box.style.display = 'none'; document.getElementById('account-created-box').style.display = 'block'; } catch(err) { alertEl.textContent = err.message || 'Could not create account. Please try via the guest portal.'; alertEl.style.display = 'block'; } btn.textContent = 'Create My Account'; btn.disabled = false; } function caCheckStrength(input) { const pw = input.value; const fill = document.getElementById('ca-strength-fill'); let score = 0; if (pw.length >= 8) score++; if (pw.length >= 12) score++; if (/[A-Z]/.test(pw)) score++; if (/[0-9]/.test(pw)) score++; if (/[^A-Za-z0-9]/.test(pw)) score++; const colors = ['transparent','#dc2626','#f97316','#eab308','#22c55e','#16a34a']; const widths = ['0%','25%','50%','75%','90%','100%']; fill.style.width = widths[Math.min(score,5)]; fill.style.background = colors[Math.min(score,5)]; } function caToggle(id, btn) { const el = document.getElementById(id); el.type = el.type === 'password' ? 'text' : 'password'; btn.textContent = el.type === 'text' ? '🙈' : '👁'; }