White-label booking where the shop keeps its customers

Most barber booking apps tie the customer to the individual barber, so when a barber leaves, the client book walks out with them. We designed a platform that turns that around.

Locality
East Midlands, UK
Disciplines
Product engineering, Marketing and engagement
Stack
  • Django
  • PostgreSQL
  • React PWA
  • Stripe Connect
  • Azure Container Apps
  • Azure Key Vault

At a glance

  • 1

    database per shop, never shared

  • 0

    booking fees taken by the platform

  • 15

    build steps across 4 phases

  • 1

    day target to stand up a new shop

The challenge

Shop owners spend years building a client book, and the apps they use quietly hand it to whoever cuts the hair. Barbers, meanwhile, want to set their own prices and be paid directly.

Both can be true at once. The customer belongs to the shop, and the barber is the merchant of record for their own work.

Architecture

White-label booking platform architectureArchitecture diagram with 8 components. Customers to Shop app. Barbers to Walk-in queue. Shop app to Walk-in queue. Shop app to Stripe Connect (barber is merchant). Shop app to SMS reminders. Walk-in queue to Shop database. Key Vault to Shop app (managed identity).One instance per shopbarber is merchantmanaged identityCustomersShop accountsBarbersPWAShop appDjango + React PWAWalk-in queueAtomic claimShop databaseIsolatedStripe ConnectDirect chargesSMS remindersConsent at signupKey VaultPer-shop keys

Swipe to explore the diagram

Each shop gets its own app and database. Payments go straight to the barber's connected account, and nothing about one shop can leak into another.

What we built

The product

  • Businesses, locations, barbers, services and availability, with customer accounts that belong to the shop
  • A booking flow, a barber PWA and shop admin
  • A walk-in virtual queue, and in-shop Tap to Pay
  • SMS reminders and blasts on a metered dashboard, with consent captured at signup

The platform

  • A fleet of white-label instances: one container app and one database per shop business, and no shared multi-tenant runtime
  • Locations in the schema from day one, for owners who open a second shop
  • Per-shop payment and SMS keys in Key Vault through managed identity, with OIDC deploys

Engineering decisions

Isolation by topology

There's no tenant filter to get wrong because there's no shared database. Offboarding a shop means handing over or deleting its database.

Direct charges, no cut

Payments go to the barber's own connected account. The shop is the data controller and the platform is its processor.

A web app, not an app store

Clients already book through web links, and the incumbents' own store apps have very few ratings. A PWA meets them where they are.

Two barbers, one customer

Claiming the head of the walk-in queue is a single locked transaction, so two barbers can never call the same person.

Outcome

The first shop's site is live on our static estate, and the booking platform is designed through payments, isolation and queue concurrency, ready to stamp out a shop at a time.