No multi-location control
Businesses with more than one space had no way to separate hours, staff and calendar by location — the tool didn't keep up with growth.
Case Study — Product & Engineering
How I designed and built, from scratch, a scheduling system for team-based businesses — multi-tenant architecture, a per-location availability engine, plans with real enforced limits, and an engineering discipline that proves every change in production before trusting it.
The product
is the scheduling system I designed and built for team-based businesses — barbershops, hair salons, clinics, studios. Multi-tenant from the first schema line, built with TanStack Start, Cloudflare Workers and Supabase Postgres.
The challenge
Appointment-based businesses have tools to book. What's missing is running the operation: separating hours and staff once a business grows past one location, protecting against no-shows with no tooling at all, and seeing the day without opening the full calendar by hand.
Businesses with more than one space had no way to separate hours, staff and calendar by location — the tool didn't keep up with growth.
Without a booking deposit or a no-show history, a client who doesn't show up costs time and revenue with no way for the business to protect itself.
Without a dashboard or export, the owner of an appointment-based business had no view of the day without opening the full calendar by hand.
Architecture
Every layer was designed for real businesses — the database enforces the rules even when the frontend fails, not the other way around.
Every organisation isolated by Row-Level Security in Postgres — the frontend never decides what's visible, the database does.
Hours resolved by precedence: staff exception → staff schedule at that location → staff's general schedule → location hours → base business hours. Covered by unit tests and validated against real data before every change.
Three plans (Starter, Pro, Business) with limits — staff, SMS, features — enforced by database triggers, not just the interface.
Asynchronous email and SMS queues, with a monthly quota per plan sized from the real per-message cost, to protect margin without cutting reminders to an active business.
Sensitive functions run as SECURITY DEFINER with explicit session and organisation checks — never implicit trust in the client.
Execution
A clear sequence, each phase proven in production before the next.
Authentication, organisations, end-to-end Row-Level Security, internal calendar and public booking page.
Invite gate, waitlist and referral program — to grow with control instead of opening the floodgates.
Manual and online booking deposits via Stripe Connect, automatic blocking of repeat no-show clients.
Four successive phases — data foundation, per-location hours, location choice on public booking, calendar and dashboard filtered by location — each tested in production before the next.
Monthly quota per plan, sized from the real per-message cost, to keep the product sustainable while it grows.
Current state
No inflated business numbers: the product is in invite-only closed beta, with no commercial launch yet. What exists is a working, tested multi-tenant system, ready for its first real customers.
plans with real limits
Starter, Pro and Business — every limit enforced by a database trigger, not just the interface.
multi-location phases shipped
From the data foundation to the location-filtered dashboard, each one proven in production.
of migrations tested before applying
Production rollback-tests — never a blind schema change.
invite-only
Controlled growth ahead of commercial launch.
No business metrics (sales, paying users) because none exist yet in any meaningful way — the product is pre-commercial-launch. What's measured here is engineering maturity, not traction.
If you recognise the need for a well-built product — not just a campaign or a website, but a system that holds up at scale — let's talk about the next step.
Talk about a similar project