Rejuvenair Spa
One owner-run booking system to replace two rented tools, ready for opening day.
The problem
Rejuvenair Sanctuary, a holistic spa in Doncaster, ran on two rented systems at once: GymCatch for its Reformer and Mat Pilates classes, memberships and passes, and Timely for its 1:1 aesthetic and recovery treatments. That meant two monthly subscriptions, two diaries, and two halves of the same business that never spoke to each other - and still neither tool could handle the way the sanctuary actually runs, with two treatment rooms and a four-room recovery suite working alongside a Pilates class, all at the same time.
Before and after
| Before | After |
|---|---|
| Two rented booking systems - GymCatch for classes, Timely for treatments | One booking platform she owns, covering both |
| Classes and 1:1 treatments managed in separate diaries | A single calendar showing every class and appointment together |
| Neither tool could run concurrent rooms | Up to six treatments plus a class booked at the same time, never double-booking a person or a room |
| Customers signed in separately on the website and the booking widget | One login, with seamless single sign-on from her WordPress site |
| Changing a class, price or staff member meant asking a developer | She configures her own catalogue, prices, staff and timetable in plain English |
The build
I built Rejuvenair a single booking platform that replaces both rented tools. The class side carries timetabled sessions, memberships, class-credit bundles, passes, drop-ins, waitlists with automatic promotion and full customer self-service. The treatment side books 1:1 appointments against staff and rooms, with per-practitioner availability and resource-gated machines - the oxygen chambers, red-light and infrared cabins - so several treatments run at once without ever double-booking a person or a room. Stripe runs the money end to end: drop-ins, membership subscriptions, bundles that convert to class credits, deposits, discount codes and a self-service billing portal, with Apple Pay, Klarna and Clearpay appearing automatically at checkout. Everything is owner-controlled - she sets her catalogue, prices, instructors, treatments and policies from an admin she edits herself - and the booking site embeds in her WordPress site and shares a single login with it, so customers move between the two already signed in.
The result
Live at book.rejuvenairsanctuary.co.uk on its own host, with the full Stripe payment path verified end to end on the live system. Her real history came across in the migration - 1,464 client records and 4,937 past and upcoming appointments, along with her consent forms - so nothing was lost in the switch off two platforms. What launched as the class-booking half now also runs the treatment side that used to live in Timely, and it is developed week to week as the sanctuary grows into it.
The human bit
Delivered through SOYO Studios for the spa's owner, and built owner-controlled by design. She runs a sanctuary, not a software team, so the test for every feature is whether she can do it herself: shorten a single appointment when a treatment runs quicker than its slot, block out a busy afternoon, set a new class teacher up to receive their own booking alerts, change a price. The work is shaped around how she actually runs her day, in language that makes sense from behind the front desk.
Under the hood
Node.js with Express 5, server-rendered EJS (no build step), Sequelize over MySQL with database-backed sessions, running under PM2 behind a LiteSpeed reverse proxy. Stripe handles payments and subscriptions through a signed-webhook fulfilment path; Resend sends email and Twilio sends SMS confirmations and reminders. Treatment availability is a combined staff-and-resource engine that offers a time only when a qualified practitioner and the right room or machine are both free. The same proven architecture as my other Node client systems.
a look inside
Need something like this?