Skip to content
Site & Rise
All case studies
Custom BuildHospitality · Resort spa2026

Strike & Restore

A booking system for a resort spa's own team — massage and boxing sessions on a weekly grid, with double-booking made impossible at the database rather than in the interface.

The Strike & Restore landing page: a full-bleed spa photograph behind the headline “Heal your body. Build your power.” and a booking call to action.

0

Guest details on the public surface

1

Postgres index preventing double-booking

2

Services on one scheduling engine

0

CSS frameworks used

What it needed to do

The spa's therapists and owner needed to put a session on the books in seconds and be certain the slot was genuinely free. Sessions run as one-hour slots across a seven-day grid: massage from three therapists sharing a single room — or delivered to the guest's own room when it is occupied — and boxing on its own schedule and its own hours.

What I built

A weekly grid where availability updates live over Supabase Realtime, so two people looking at the same screen see the same free slots without refreshing. The part worth pointing at is the safety net underneath it. Double-booking is not prevented by disabling buttons — it is a partial unique index in Postgres on the service, date and slot where the booking is still active. Two people confirming the same hour in the same instant means one insert fails at the database, whatever the interface happens to be doing. Most booking systems solve this in the UI and quietly break under concurrency; this one cannot. The public surface reads from a view that exposes only slot state — no names, no room numbers, no phone numbers — so it is structurally incapable of leaking a guest. Staff sign in for the rest: guest details, history, cancellations, and blocking out unavailability. Every booking sends a confirmation email and lands in the spa's Google Calendar automatically. Built in plain CSS modules throughout — no utility framework, no component library, every surface hand-written.

Stack used

  • Next.js 14
  • React 18
  • Supabase
  • PostgreSQL
  • Google Calendar API
  • Nodemailer
  • CSS Modules
  • Vercel
Service tier
Custom Build
Industry
Hospitality · Resort spa
Year
2026
Start something similar

Next case study

AL Lending

A lending book that had outgrown Google Sheets, rebuilt as a transactional loan management system for the staff who use it every day.

Read it

Ready to build something that earns its keep?

Tell us about the project. You'll get a straight answer on scope, timeline, and price — usually within one business day, and always before you're asked for anything.

Prefer email? siteandriseweb@gmail.com