Everything a customer sees is the booking front end. This is the other half: the internal admin suite the business is actually operated from. It spans roughly two dozen views behind an admin-only guard, covering a daily run-sheet, appointments and scheduling, a full customer record, revenue and funnel analytics, memberships, promotions, reviews, an admin quoting and booking tool, and a kanban ops board. I built it as a real operations product, not a settings page. I keep exact table and endpoint names private, since it runs on live customer and payment data.
What it's built with.
How it works.
What this is
A customer books in a few taps; running the business behind that is a different problem. This admin suite is where appointments get scheduled and repriced, payments get collected and refunded, customers get looked up and understood, and the day gets run. It's the tool the operator lives in, so I built it like a product: a run-sheet to start the day, a command palette to move fast, and a customer page deep enough to answer almost any question in one place.
Turning data into decisions
The part I'm most proud of is the customer intelligence. Instead of a flat list, every customer carries a live health score built from how recently and often they book and how much they spend, decayed over time, plus a velocity read on whether their cadence is speeding up or slowing down. That rolls into a ranked next-best-action, so the business knows who to win back, who to upsell, and who is drifting away. To be precise about what it is: a transparent, hand-tuned heuristic computed in the app, not a trained model. I'd rather describe it accurately than dress it up as ML.
What I'm not publishing here
I describe how the admin suite works but keep exact table names, function names, and endpoint paths private, since it operates on real customer and payment data. Happy to walk through the implementation live.
The things I'm proudest of.
- ▹360-degree customer record: one page aggregates a customer's profile, vehicles, addresses, appointments, orders, carts, membership and credit balance, notes, and promo history. From it an admin can book, reschedule, reprice, refund, invoice, and collect payment on the customer's behalf, all routed through SECURITY DEFINER Postgres procedures rather than raw client writes.
- ▹Customer-health scoring: a hand-tuned exponential-decay RFM model (recency, frequency, and monetary value with roughly a 139-day half-life) combined with an ordinary-least-squares booking-velocity trend (accelerating vs. decaying) and cart-abandonment penalties, computed in-app and surfaced as a sortable, color-coded health column with per-customer risk factors. It feeds a deterministic next-best-action ranker on each customer. To be clear, it's transparent heuristic scoring, not a trained ML model, and I frame it that way.
- ▹Server-side scheduling and availability: slot bookability (business hours with effective-date fallbacks, vacation and partial-day blocks, per-vehicle-group service durations, buffer expansion, and a parallel-capacity limit) lives in the database, and slot integrity uses hold procedures with advisory locks so two checkouts can't grab the same slot.
- ▹Email lifecycle automation: a fleet of Supabase edge functions send branded transactional email through Resend, including appointment confirmations, reminders, invoices and payment links, an 'on my way' message, and a review-and-tip request, plus an opt-in automated win-back offer (single-use Stripe coupons on a daily cron with a per-customer cooldown). A cron-canary alerts admins if a scheduled job stalls.
- ▹Analytics surfaces: an overview dashboard, conversion funnels, and cart-health views query real operational tables with simple trend regressions, giving the business revenue, acquisition, and drop-off visibility without leaving the admin app.
- ▹Operated behind a hard admin boundary: admin status is enforced at the database level (an admin email-domain guard plus a role trigger) and the whole surface is deny-by-default under row-level security. A command palette and quick-action chrome make it fast to actually run a shift from.