YSBDesigns

← All work

Client

Hair by Chrissy

Node API on Render · Supabase/Postgres · Stripe Checkout · Unbuilt front end

Problem

Chrissy fits hair extensions by hand in a private London studio. Bookings came through Instagram DMs — a thread per client, no calendar, and no way to stop two people asking for the same Saturday.

Approach

So the site is not a brochure, it is the booking system. Pick a service, see genuine live availability, take a slot, and pay by cash or card — card takes a deposit through Stripe Checkout to hold the slot, with the balance on the day. Behind it Chrissy has her own dashboard: she sets working days, hours, breaks and time off, and the client calendar updates the moment she saves. Her day comes back as a run sheet, gaps included.

Outcome

One front end, unbuilt and unbundled, served two ways. The booking engine — live calendar, dashboard, payments — runs as a small Node API on Render with Supabase behind it. GitHub Pages cannot run any of that, so the published copy deliberately falls back to enquiry mode: the real price list and an enquiry, rather than a calendar that looks live and is not. A build step snapshots the database to static JSON so the public page still shows her real services and prices.

The screens

The Hair by Chrissy site hero
Hero · editorial, photography-led
The four-step booking flow with live availability
Booking · service, slot, details, payment
The work gallery section
Work · before and after
The site on a phone
Mobile · book in four taps

If this looks like your problem

Tell me about it and I'll tell you what it takes.