Tampa Bay, FL · 2025 · Live

Personal training, without the gym.

A private in-home training service in Tampa Bay needed a platform that felt more like a members' club than a booking app. We shipped a Next.js 15 portal, an Express API, and a Stripe-billed membership system with an editorial design language its owner could send to a magazine.

3 tiers
$520 / $980 / $1,380 per month
13
Trainer onboarding modules
2
Portals · client & trainer
RLS
Row-level security everywhere

The founder had built a private, in-home personal training business in Tampa Bay. The offering was premium — trainers coming to your home, working around your schedule, tracking progress across weeks — but the software category she had to shop for looked nothing like the offering.

MindBody clones. Booking widgets. Receipt-style interfaces. The competition treated the trainer-client relationship like a taxi ride: pick a slot, get billed, move on. That's not what her business was.

She needed a platform that would onboard trainers with real legal weight — signed acknowledgments, credential tracking, PDF modules gated behind scroll-to-bottom and legal-name signature. She needed a progress tracker clients would actually open — not a chart, something they'd want to look at. And she needed billing that felt like a membership, not a subscription — three tiers, pause/downgrade/cancel flows that respected the relationship.

Above all: the whole thing had to feel like her brand. Editorial. Considered. Not templated. The existing tools failed her not on features but on tone.

We built a Next.js 15 monorepo with three surfaces sharing a design system: a client portal, a trainer portal, and an admin.

The design language came first. Canela as the display face, Matter as the body, no border-radius on anything, no drop shadows anywhere. Four color tokens — ink, cream, stone, warm — and a single accent used sparingly. It reads like an editorial page, not an app. Every micro-decision defended the aesthetic.

Stripe billing at three tiers ($520 / $980 / $1,380), with pause, downgrade, and cancel flows on the client side. Supabase as the database with row-level security on every table — a trainer can only see their own clients, an admin can see everything, a client can only see themselves. Not enforced in code — enforced in Postgres.

Trainer onboarding is the credential system in disguise. Thirteen locked PDF modules, each requiring the trainer to scroll to the bottom before the "acknowledge" button unlocks, type their legal name to sign, and pass a timestamped acknowledgment that lands in the audit table. Substitute trainers can be onboarded in half a day instead of three.

The before/after progress slider is the moment we knew the design was working. Two photos, a draggable divider, three key numbers below. Trainers pull it up during check-ins. Clients screenshot it and post to Instagram. The slider does the marketing.

What we built it with.

Frontend
Next.js 15 (App Router)
Server components for the marketing surface, streaming for the portal — one deploy, one framework.
TypeScript
End-to-end types from the Supabase schema through the API to the client.
Canela + Matter
Editorial typography pairing. Reads like a magazine spread, not a SaaS app.
Backend
Express.js
Thin API layer for Stripe webhooks, admin operations, and long-running exports.
Supabase (Postgres)
Row-level security on every table — access rules live in the database, not the app.
Supabase Storage
Progress photos with signed URLs; only the client and their trainer can access.
Infrastructure
Vercel
Frontend deploys. Edge-cached marketing pages, ISR for the portal.
Railway
API deploys. Simple env-based config, no ops overhead.
Payments & Email
Stripe
Three-tier subscriptions with pause and downgrade flows.
Resend
Transactional email for onboarding, receipts, and reminders.

The intelligence layer.

Claude Sonnet 4.6
Development pair — architecture decisions, code review, and RLS policy generation
Cursor
In-editor AI for TypeScript refactoring and Supabase migration authoring
v0.dev
Rapid UI prototyping for the trainer onboarding module viewer

From brief to production.

Weeks 1–2 Discovery & Design System
Editorial system defined — Canela + Matter, ink/cream/stone/warm, zero border-radius. Founder walked through the trainer onboarding flow and helped map every module.
Weeks 3–5 Portals & RLS
Client and trainer portals built against Supabase with row-level security. Every table locked down before UI was wired in.
Weeks 6–7 Stripe & Billing
Three-tier subscription setup with pause/downgrade/cancel flows. Webhook-driven state so the source of truth stays with Stripe.
Weeks 8–9 Onboarding & Progress
Locked-PDF trainer onboarding with signed acknowledgments. Before/after progress slider integrated with Supabase Storage.
Week 10 Launch
Deployed to my.formed.fit. First trainers onboarded. First members billed.

What shipped.

Live
Deployed & billing
my.formed.fit serving clients, trainers, and admin from a single Next.js 15 monorepo.
13/13
Onboarding modules
All trainer credential modules operational with signed acknowledgment and timestamped audit.
3-tier
Stripe subscriptions
Pause, downgrade, and cancel flows all live. Webhook-synced state.
Mobile-ready
API prepared
API and RLS layer are ready to power a Flutter companion app for trainers on the road.
"
The platform doesn't feel like software. It feels like part of the brand. Clients open it — that never happened with the last tool. Trainers get through onboarding in a day. This is what I asked for.
F
Rodeny
Formed, Tampa Bay

Building something similar?

If your problem lives at the intersection of AI, product, and real business constraints, let's talk.

Trusted Worldwide — Long-Term Partnerships Built on Trust and Results

Take it from leading businesses around the world. Time and time again, our clients experience the quality, speed, and reliability of our AI solutions and automation services, leading to long-term partnerships with AXCEL.

Ready to Automate and Scale Your Business?

We design and deploy AI solutions that streamline operations and accelerate growth.

WhatsApp