+19% in online revenue within 10 weeks and −32% in reception calls about bookings
A headless commerce platform that combines the resort's service catalog, shopping cart, and slot-based booking system in a single flow. Guests can buy one-time services or reserve time-bound services for a specific date based on real availability. After checkout, they view upcoming bookings and purchase history in their account, apply promo codes, and use active passes. Payments are processed online through the resort's local bank gateway.
A large wellness resort in the French Alps with six experience zones — Aqualudic, Aquawellness, Spa & Treatments, Surf, Climbing, and Fitness — where the guest experience is expected to feel seamless from purchase to arrival. We worked with the Head of Guest Experience and the resort's e-commerce manager. The legacy system couldn't sell slots, passes, or bundled offers cleanly. During peak weeks, that meant queues at reception, manual slot reassignments, and lost revenue. The client wanted guests to be able to purchase and book everything in advance from a smartphone, while the operations team controlled capacity and rules from a single admin panel.
Legacy PrestaShop
The previous store ran on an outdated PrestaShop release with heavy customizations that made support and migration of the logic to a new system more complex.
Two product types in one cart
The new platform had to handle both regular service purchases and date-based bookings on a slot model — and let guests combine them in a single order.
Full-featured passes
Passes let guests book selected services at no charge within a validity period. That required flexible tracking of usage, limits, and remaining balance — with consistent logic across the web and the planned mobile app.
Bank integration
The resort used a local French bank's payment service with proprietary protocols and no off-the-shelf SDK like Stripe. That introduced additional complexity around security, callback handling, and payment-status reconciliation.
User migration without password reset
Accounts and addresses had to move from PrestaShop to the new platform, and existing customers had to be able to sign in with their current passwords on first login — no mass reset email.
Multiple frontend clients
The backend had to be designed as headless from day one so the website, the future mobile app, and other channels could work through a single API.
We built a headless commerce platform on React + Directus with a clean separation of responsibilities. Directus manages products, passes, bookings, orders, users, and the bank integration. The frontend manages customer experience and cart flow. All core business logic — slots, passes, promo codes, payment statuses — live in backend services, making it straightforward to add new clients on top of the same API.
Products and bookings
We designed a Directus data model that distinguishes one-time services from services booked for a specific date or time. For bookings, the model stores slots, calendar days, capacity caps, and order references — letting the resort manage standard purchases and reservations from a single admin panel without merging the two data shapes.
Slots and capacity
We gave administrators per-service control over the number of available spots per date, recurring slot rules, and blackouts for over-saturated time windows. The backend checks availability at checkout, holds the slot, and surfaces confirmed bookings in the guest account — preventing collisions caused by overlapping slot allocation.
Passes and pricing rules
We implemented a dedicated pass entity with a validity period and a list of covered services. At checkout, the backend determines whether a pass could be applied, which items remained free, and which required an extra charge. Each pass carries a usage history so guests could see what they had already spent and staff could verify status quickly.
Local bank payment gateway
Because the client used a local bank's payment service, we built a dedicated integration service between the website and the bank gateway. It builds payment requests, accepts callbacks, processes statuses, and records the final outcome in Directus — keeping the bank protocol isolated from the rest of the codebase.
User accounts and password migration
We supported the legacy password format on the backend so users could sign in on first login with their existing credentials. From there, passwords are upgraded transparently to the new format. The goal was to minimize support load during cutover — no forced password reset, no broken email loops.
API for multiple clients
Directus exposes a stable REST/GraphQL layer serving both the website and the future mobile app. We built authorization, cart, booking, and pass logic on stable endpoint contracts, so a second or third client could be added without touching the core.
Administration and content
We built admin interfaces on top of Directus for managing products, slots, passes, promo codes, and orders — giving operators direct control over content, date limits, promotions, and seasonal rules without developer involvement.
We started by reverse-engineering the old PrestaShop project to understand the current product types, checkout flow, custom code, and the steps still handled manually outside the system. In parallel, the resort team walked us through how guests actually booked services in real life. We documented the core scenarios in two passes — current state and target state — covering passes, promotions, the future mobile app, and the bank's specific requirements. By the end of this phase we determined that the right approach was to build a new commerce core rather than keep patching the legacy one.
+3 Resource
The new platform gave the resort a modern online sales and booking channel without breaking continuity for existing guests. Bookings, passes, promotions, and bank payments all run through a single headless system ready to power both the website and the future mobile app. Operations became more predictable and scalable, and the guest experience aligned with modern e-commerce standards expected from mature e-commerce products.
online revenue within 10 weeks
reception calls about bookings
stuck-payment rate during peak season
manual pass checks at reception
total reception inquiries after migration
time to reconfigure for seasonal rules
Or send us a message and we'll get back to you within 15 minutes during business hours