2025
Rainbow Surf Retreats
Multi-currency retreat booking, scaled to 5 languages.
- Launched in
- 1 month
- Live for
- 1 year
On this page
Context
Where this lives in the world.
Rainbow Surf Retreats has been running surf weeks on Lanzarote since 2017 — multi-week stays, group bookings, mixed-room configurations, guests from across Europe paying in their own currencies.
Challenge
What was hard about it.
The existing WordPress booking flow leaked roughly 40% of conversions on the payment step. Currency math was approximate, group pricing required manual quotes, and Stripe 3DS challenges silently broke the checkout on certain banks. The owner needed a flow that matched how she actually sold retreats — not a generic e-commerce add-on.
Solution
What we built to solve it.
We rebuilt the entire booking pipeline as a Next.js 16 App Router site with a custom retreat-aware checkout. Stripe handles three currencies with proper 3DS flows; installments are first-class; group bookings combine into a single payment intent; webhook reconciliation matches every state transition. Email (booking confirmations, reminders, post-stay follow-ups) runs through self-hosted Postal so we own the deliverability story.
Tech story
Decisions worth calling out.
- Custom payment-state machine: pending → 3DS challenge → frozen authorization → captured / refunded — every edge handled, every state visible in admin
- Multi-currency pricing computed server-side from a single base price + daily FX snapshots — no rounding drift between cart and Stripe
- PostgreSQL 18 + MinIO for media — zero vendor lock-in; the entire stack runs on a private VPS
- Sentry catches every payment-path error with PII scrubbing on by default
Screenshots
What it looks like in flight.
Outcome
Live in production
Looking to build something like this?
If you're sitting on a similar problem — multi-currency booking, clinical workflow, real-time pipelines, anything in this orbit — we've already done the hard parts once. The second time is faster, cheaper, and shaped to your business. Tell us what you have in mind.