Skip to content
← All work

Case study · Booking platform

Audacious Loc Empire

A website, booking platform and owner dashboard for a Houston loctician studio. Clients book an appointment with a deposit; the owner runs bookings, pricing, content and the whole look of the site from one place. Built end to end, and owned outright rather than rented from a booking app.

Client
Audacious Loc Empire, Houston TX
Scope
Website, booking platform & owner dashboard
Role
End-to-end, design, frontend, backend, infrastructure

The brief

Audacious Loc Empire is an established Houston studio, with a real client base and 132 reviews on its Google profile, that had outgrown renting its booking software. The brief was ownership: move booking, payments and content off a subscription platform and onto a system the studio owns outright, run day to day from one dashboard by a non-technical owner, without losing what already worked, like the instalment option her clients use and a deposit policy they already know. Build the public site, the booking platform and the back office as one coherent system rather than a theme with plugins bolted on.

What we built

Booking with a deposit

Clients pick a service and a slot and pay a deposit through Stripe hosted Checkout, so no card data ever touches our server. Apple Pay, Google Pay and Affirm instalments work without extra code. The slot is reserved before checkout even starts, so nobody is ever sent to pay for a chair someone else already holds, and a failed or abandoned payment releases it.

Double-booking made impossible

Three guards, in order: only genuinely free slots are offered, the slot is re-checked in the instant before charging, and a Postgres exclusion constraint refuses any overlapping write outright. The constraint is the one that actually holds, because two clients paying at the same moment can both pass the first two.

Scheduling that survives daylight saving

The availability engine is pure, testable functions with no database or network, covered by 28 cases including the two days a year Houston moves its clocks. An appointment stays at the same wall-clock time across the change, so a 10am booking is still 10am the morning after the shift.

One dashboard, run by the owner

A non-technical owner controls all of it from one private admin: bookings, hours, slots and the daily cap, services and pricing, the gallery, reviews, homepage content, pop-ups, the theme and staff access. No code, no separate logins, no monthly stack of disconnected tools.

Seasonal theming, reskin as a data change

Four hand-built palettes, each checked against WCAG AA. Because no component hardcodes a colour and a season is just a set of CSS variables, switching one restyles the whole site with no class-swapping and no flash of the wrong palette. Preview affects only the owner clicking; publishing is what visitors see.

She owns the business, Stripe only moves money

Services, prices, durations, deposits, availability, bookings, reviews and media all live in her own database. Stripe holds charges and refunds and nothing else. An earlier build kept the catalogue in Square; owning it outright removed a whole class of sync problems and a subscription, and every payment call goes through one folder, so swapping processor again is a one-folder change.

Accounts and security

Three roles from most to least privileged, a real password policy, login rate-limiting and lockout, optional two-factor by email code or authenticator app, and a password-reset flow. Clients need no account at all: a booking is reached through a hashed, single-use token in the confirmation email, so holding the link is the whole authorisation story.

Self-service cancel and reschedule

Clients manage their own booking from the link in their email. Cancel more than an hour before and the deposit is refunded automatically, inside the window, with no phone call. The deposit itself is half the service price, stored as a percentage so it tracks every price the owner sets without a number to keep in sync.

The hard part

The real work was making a booking impossible to take twice and a business impossible to lock inside a processor. Availability is our own arithmetic, not a booking product's, so it can be tested to the edge cases that matter, including the two days a year Houston's clocks move. A held slot from an abandoned checkout expires after thirty minutes and is swept before any availability question, and Stripe's own session expires at the same moment, so a payment can never complete for a slot we have already released.

Everything the studio offers, its services, prices, durations, deposits, availability and content, lives in its own database. Stripe moves money and is never the source of truth for what the studio sells. Every payment call goes through a single folder, which is exactly why moving an earlier version off Square was a one-folder change rather than a rewrite. A local payment stand-in keeps the whole flow exercisable before real keys arrive, and it refuses to run in production unless explicitly allowed, so a half-configured deploy fails loudly instead of quietly recording bookings whose deposits were never taken.

The deposit is charged, not authorised and held. A hold expires in about a week, but clients book up to forty-five days out, so a hold would silently die on exactly the bookings that matter most. It is half the service price, stored as a percentage so it tracks every price the owner sets, and the amount actually charged is recorded on each booking, so changing the policy later never rewrites history.

And the whole thing is run by one person who does not write code. Two names are handled deliberately, not conflated: the registered company, Audacious Empire LLC, appears only on legal and copyright notices, while the trading name, Audacious Loc Empire, is what every client-facing surface says. The dashboard puts bookings, hours, pricing, gallery, reviews, homepage content and the site's entire look behind one login, so the owner changes the business without ever touching the build.

28
Scheduling cases (incl. DST)
4
Seasonal palettes, AA-verified
100%
Business data owned, not rented
1 folder
To swap payment processor

Under the hood

A modern, typed stack, chosen so the studio owns its data and the code stays maintainable:

Next.js 16 (App Router) TypeScript (strict) Tailwind CSS v4 Prisma 7 + Neon Postgres Auth.js v5 Stripe hosted Checkout Backblaze B2 storage Resend email Vercel

Want a system like this?

If your business runs on bookings and payments, we build the whole thing, the site, the scheduling and the back office, so you own it outright instead of renting it a month at a time.