Product
What’s actually built, what’s spec’d, and how the three surfaces (Owner, Trainer, Member) cohere into one operating system.
Refreshed July 2026. What’s-built content verified by code audit (May 2026); live URLs included throughout.
1. Value proposition (one paragraph, both audiences)
For independent gym owners: GymStack runs your gym’s billing, member management, check-ins, workout/diet plans, leads, and member app — all from a single dashboard, with UPI Autopay, WhatsApp Business automation, and 5% GST invoicing as the target renewal workflow. Set up in 24 hours, ₹999/month to start.
For members: A branded gym app on your phone — see today’s workout, log sets, scan in, pay your fee, talk to your trainer, see your progress, all in one place.
2. What is built and shipping today
Verified by code audit of the monorepo (May 2026). These are not roadmap items — they are live and serving traffic.
Live URLs
| Surface | URL | Stack | Status |
|---|---|---|---|
| Admin dashboard | gymstack-admin.comfyfw.workers.dev | Next.js 16 + Cloudflare Workers via @opennextjs/cloudflare | Live |
| Marketing + member app (web) | gymstack-mobile.pages.dev | Flutter web + Next.js marketing | Live |
| API | apig.unsearch.dev | Fastify 5.3 + Neon Postgres + Drizzle ORM | Live (NYC region) |
| Exercise catalog | apig.unsearch.dev/exercises/catalog.json | 1,500 ExerciseDB entries with GIF URLs | Live |
Admin dashboard — 12 pages, all functional
| Page | Path | What it does |
|---|---|---|
| Dashboard | / | 8 KPI cards (total members, active, expiring, revenue, check-ins today, leads, active rate, ARPU), 6-month revenue chart, weekly check-in activity, recent check-ins feed |
| Members | /members | CRUD, search/filter/status, CSV import-ready, member detail with payment history |
| Payments | /payments | Razorpay-integrated, filters by status (pending/completed/failed/refunded), date range |
| Check-ins | /check-ins | Daily logs, method breakdown (QR vs manual), peak hours |
| Classes | /classes | Schedule CRUD, capacity, trainer assignment |
| Workouts | /workouts | Trainer plan library, edit/assign to members |
| Diets | /diets | Meal-by-meal templates, macro tracking |
| Trainers | /trainers | Staff roster, role assignment (owner/manager/trainer/frontdesk) |
| Leads | /leads | Lead CRM, source tracking (walkin/referral/website/Instagram/WhatsApp), pipeline |
| Analytics | /analytics | Churn, revenue trend, cohort retention |
| Settings | /settings | Plan configuration, gym branding, payment method setup |
| Login | /login | Phone + OTP |
Member app (Flutter, 8 screens end-to-end)
| Screen | What it does |
|---|---|
| Onboarding | Fitness questionnaire (goals, experience, injuries) → personalized plan recommendation |
| Auth | Phone + OTP |
| Home | Personalized dashboard, today’s workout recommendation, QR check-in quick action |
| Workout | Active plan, exercise library with animated GIFs, set/rep logging, rest timer, session lifecycle (start → pause → resume → complete) |
| Progress | Workout history, personal records, body weight trend, progress photos |
| Diet | Meal-by-meal view, water tracker, macro counter |
| Check-in | QR scanner, location confirmation, history |
| Profile | Member info, membership status, linked trainer |
API — 11 routes, 59-table multi-tenant schema
| Domain | Endpoints |
|---|---|
| Auth | POST /api/v1/auth/otp/send, POST /api/v1/auth/verify-otp (5-min TTL OTP, in-memory fallback, JWT) |
| Members | GET/POST /api/v1/members + CSV import |
| Check-ins | POST /api/v1/check-ins (QR/biometric/manual, tenant-isolated) |
| Dashboard | GET /api/v1/dashboard/stats, /revenue-chart |
| Payments | POST /api/v1/payments/create-order (Razorpay), /webhook (signature verified), /record-offline |
| Workouts | GET/POST /api/v1/workouts |
| Diets | GET/POST /api/v1/diets |
| Trainers | GET/POST /api/v1/trainers |
| Classes | GET/POST /api/v1/classes |
| Leads | GET/POST /api/v1/leads |
| Exercises | GET /api/v1/exercises/catalog (fuzzy search over 1,500 entries) |
| Proxy | GET /api/v1/proxy/image (CORS proxy for ExerciseDB GIFs) |
Schema completeness: gymId foreign key on all tables (multi-tenant isolation), member lifecycle (active/inactive/expired/frozen), membership plans with duration/renewal, payment method enums (UPI/card/netbanking/cash), check-in methods (QR/biometric/manual), exercise metadata (category/difficulty/muscles/equipment/GIF URL), workout groups (standard/superset/circuit/dropset), lead pipeline (new → contacted → trial → converted/lost), soft deletes, timestamps.
3. What is NOT built — the gating items
These are the operational dependencies in /strategy and /gtm. Each is sized below.
| Item | Why it’s gating | Effort | Deadline |
|---|---|---|---|
| Trainer app v1 (Flutter, mirroring member-app patterns) | 40% of gyms have ≥3 trainers and won’t fully use the product without trainer-side UX. Backend tables exist; just need 6 Flutter screens | ~3 weeks | M2 end |
| WhatsApp Business API + UPI Autopay live | Renewal automation depends on it; mandate setup and trust must be proven in the 90-day sprint. Twilio SMS is the guaranteed fallback for OTP+reminders | ~2 weeks | M1 end |
| Hindi UI (member + admin) | 73% of tier-2/3 users consume regional content. Existing backend is locale-ready | ~1 week | M3 end |
| R2 photo storage (progress photos, gym branding) | Progress photos and member app theming require it | ~1 week | M2 end |
| White-label app build pipeline (Flutter flavors + Fastlane) | Pro tier (20% of M12 mix) requires it; otherwise we cap Pro adoption | ~4 weeks | M5 end |
| Customer success ops (onboarding playbook, monthly check-ins) | At >50 gyms, founder can’t onboard each one | First CS hire | M4 |
| Rate limiting + abuse prevention | Open public endpoints today | ~3 days | M2 end |
| Idempotency on Razorpay webhooks | Risk: double-charge on retry | ~1 day | M1 end |
| Pino → Sentry/Datadog log aggregation | Production debugging | ~3 days | M3 end |
Out of Year 1 scope (intentionally)
- AI churn prediction (the predictive ML model) — needs labeled data we won’t have until M9+. Caveat: retention/churn-AI is now table-stakes at the top of the market — ABC Glofox ships a 40M-member churn model and India’s Kore App ships “Predictive Retention AI” (churn flag up to 60 days out); see /competitors §4 [M]. So Year 1 ships the rules-based at-risk surface already live in the dashboard (§5 Flow 3,
/analyticschurn), and the predictive ML layer is a fast-follow competitive necessity — not a differentiator to pitch. - Offline mode (promised on marketing page but not a Year 1 priority — gyms in tier-2/3 have intermittent but available connectivity)
- Biometric check-in (enum exists; iOS/Android implementation is M9+ or vendor partnership)
- Email delivery for invoices (WhatsApp + SMS is sufficient for the buyer)
- Corporate wellness aggregator surface (Year 2)
4. Pricing — single source of truth
Pricing is published, not “request a demo.” Indian SMB buyers read hidden pricing as a signal they’re not the target.
| Plan | Price | Included | Best for |
|---|---|---|---|
| Starter | ₹999/mo | Admin dashboard, member app (GymStack-branded), up to 200 members, UPI/cash payments, GST invoicing, QR check-in, WhatsApp templates | Single gym, 100-300 members, owner-operated |
| Growth | ₹2,499/mo | Everything in Starter + unlimited members, trainer app, diet plans, lead CRM, WhatsApp Business automation, multi-staff roles, analytics | Single gym 300+ members or 2-3 trainers |
| Pro | ₹4,999/mo | Everything in Growth + white-label app (your brand on Play Store), multi-location dashboard, custom domain, priority support, API access | Boutique studios, 2-10 location chains, regional franchise brands |
Three tiers by design. The v1 business plan carried a fourth Enterprise (₹9,999+/mo, multi-location chains) tier; it is intentionally deferred to Year 2 so the validation phase sells only Starter / Growth / Pro and keeps pricing legible. Enterprise returns when a chain (the Rajesh persona) needs multi-location + dedicated support.
Add-ons (Year 1):
- Transaction fee: 1% on UPI/card transactions through GymStack (optional; defaults off)
- Premium content pack: ₹500/mo — 200+ professionally-shot exercise videos + 50 diet templates
- Extra location (Pro): ₹2,999/mo per additional location
Annual discount: 2 months free on annual plans (we offer it but don’t push; monthly is the default to lower buyer risk).
Why these prices
Anchored against:
- KriyaX at ₹499/mo — we are 2x but ship a real member app
- GymOwl annual pricing — local competitors can be inexpensive; we must win on product workflow and onboarding, not price alone
- Mindbody Starter $99/mo (~₹8,300) — our Pro is 40% below
- Vagaro $30/mo + $10/staff — Indian gyms average 2-5 staff, so Vagaro lands at ~₹4,000-6,000; we beat at Growth
These prices feed directly into the FINANCIALS MRR model.
5. User flows (the critical paths)
Flow 1 — Owner signs up and onboards
1. Marketing site CTA "Start free 14-day trial"
↓
2. Phone + OTP (no email, no password)
↓
3. Gym profile (name, address, branding color, logo upload)
↓
4. Plans setup wizard (suggest defaults based on member count)
↓
5. CSV upload OR manual entry of first 10 members
↓
6. UPI Autopay mandate setup (Razorpay flow)
↓
7. WhatsApp Business connection (optional, can defer)
↓
8. First member added → app delivers welcome WhatsApp with member app download link
Target: <24 hours from signup to first paying member through GymStack.
Flow 2 — Member uses the gym for the first time
1. Receives WhatsApp with member app link + onboarding code
↓
2. Installs app, phone OTP login
↓
3. Fitness profile (goals, experience, injuries) — 5 questions
↓
4. Personalized plan generated (using exercise catalog + goal)
↓
5. Walks into gym, scans QR at front desk → check-in logged
↓
6. Opens "Workout" tab, sees today's plan
↓
7. Logs sets as they go (rest timer auto)
↓
8. After session: PR celebration if applicable, weight log, optional progress photo
↓
9. Push notification next day reminding them of next session
Flow 3 — Renewal & save
T-7: WhatsApp template "Hi <name>, your membership at <gym> expires on <date>. Renew with one tap: <UPI link>"
↓
T-3: Same, with the gym owner CC'd if it hasn't been clicked
↓
T-0: If autopay mandate exists, debit. If not, push + WhatsApp.
↓
T+1: If failed, "at-risk" surface in owner dashboard with 1-click WhatsApp call template
↓
T+3: Owner sees them in "expired" list. Can manually offer winback discount.
Flow 4 — Trainer assigns a plan
1. Trainer opens trainer app, sees today's clients list (5-12 people)
↓
2. Taps client → sees their workout history + last 4 weeks of progress
↓
3. "Assign plan" → picks template OR builds custom
↓
4. Custom flow: search exercises (typeahead over 1,500), drag into day, set sets/reps/load
↓
5. Add notes per exercise (form cues)
↓
6. Assign → client gets notification, plan appears in their member app
Flow 5 — Owner reviews their business (Sunday weekly ritual)
1. Opens admin dashboard on phone OR laptop
↓
2. Top section: This week vs last week — MRR, new members, churned, check-ins
↓
3. At-risk list: members who haven't checked in 7+ days
↓
4. Expiring list: memberships expiring this week
↓
5. Lead pipeline: where new leads are stuck
↓
6. Decides 3 actions: nudge X members, follow up Y leads, plan next week
6. Journey maps
Owner — first 90 days
| Phase | Day | Emotional state | What happens | We win or lose by… |
|---|---|---|---|---|
| Discovery | -30 to 0 | Skeptical (“I’ve tried gym software, it didn’t stick”) | Sees ad, talks to equipment distributor, attends IHFF demo | Showing a recovered renewal in the demo, not features |
| Trial | 0-14 | Cautiously hopeful | Onboards, imports members, sees first check-in roll in | Day 3: first successful UPI Autopay debit. Day 7: first at-risk alert. Day 14: first save. |
| First payment | 14-30 | Committed but nervous | Pays ₹999. Compares to before. | Showing weekly KPI deltas vs his “before” baseline |
| Habit | 30-60 | Trusting | Uses dashboard daily, members on app | Trainer-app shipping (so all his staff are in the loop) |
| Expansion | 60-90 | Advocate | Refers to other gym owners | Easy referral mechanic, branded app he’s proud to show |
Member — first 30 days
| Day | What happens | Retention lever |
|---|---|---|
| 0 | Signs up at gym; gets WhatsApp link | Friction-free onboarding (phone OTP only) |
| 1 | Installs app; completes fitness profile | Plan personalization within 60 seconds |
| 2-3 | First gym session with plan; QR check-in | ”You logged 0 sets last session” prompt if app not used in workout |
| 7 | First weekly check-in summary push | ”You completed 3 of 3 planned sessions” |
| 14 | First “you’re hitting a PR” celebration | Shareable card |
| 30 | Renewal in T-7 reminder | UPI Autopay already debited; he sees receipt, not a chase |
Trainer — daily
| Time | What happens | Trainer-app role |
|---|---|---|
| 6am | Opens app, sees today’s clients with last-session notes | Lower mental overhead |
| Floor session | Logs PT session for commission, leaves form-cue note | One-tap log |
| 11am | Builds new plan for new client | <5min plan-build flow |
| 6pm | Same | |
| 9pm | Reviews tomorrow’s clients | At-a-glance dashboard |
7. Platform architecture (one diagram in words)
[ Member Flutter app ] [ Trainer Flutter app ] [ Admin Next.js ]
| | |
'---------> [ Cloudflare edge ] <----------------------'
|
v
[ apig.unsearch.dev ]
Fastify 5.3 (TypeScript)
|
+---------------+---------------+--------------+
v v v v
[ Neon [ Razorpay [ WhatsApp [ Twilio
Postgres ] Subs + Business fallback ]
+ Drizzle Autopay ] API ]
ORM ] |
| |
v v
[ R2 photos ] [ Webhook ←── back to API ]
Why this stack
- Flutter for member + trainer apps — single codebase iOS/Android/web, deploys to Cloudflare Pages for web preview
- Next.js 16 + Cloudflare Workers for admin — server-rendered, edge-fast, no server to maintain
- Fastify + TypeScript + Drizzle + Neon for API — Drizzle gives us SQL precision without ORM bloat; Neon’s serverless Postgres scales without ops; Fastify is fast enough that we don’t need to think about it
- Razorpay for payments, autopay, and subscriptions — practical default for India, with UPI Autopay support via NPCI/Razorpay rails
- WhatsApp Business API + Twilio SMS fallback — primary channel; SMS is the lifeline
- R2 for media — Cloudflare R2 has no egress fees, perfect for member photos/videos
- No Redis dependency in MVP — OTP storage falls back to in-memory (single-instance acceptable until M5+; then migrate to Upstash Redis)
Multi-tenancy
Every table has a gymId foreign key. API enforces tenant isolation at the route level (JWT carries gymId, all queries filter by it). No row-level security policies yet — application-layer isolation is simpler and audit-clear. RLS migration is a Year 2 hardening item.
White-label architecture
A “Pro” gym’s app is built from the same Flutter codebase using build flavors + Fastlane CI/CD:
- Owner submits brand assets (logo, color, name) in admin
- CI pipeline builds an iOS + Android APK/IPA with those assets
- Owner provides their Apple/Google developer accounts (or we host under a parent account with their branding)
- We submit; review takes 1-2 weeks for first apps
- Subsequent updates are over-the-air for the Flutter side
This pipeline is the M5 dependency. Without it, Pro tier caps at the white-label-via-our-app-store-account workaround.
8. Screens we still need to design
| Screen | App | Priority | Notes |
|---|---|---|---|
| Trainer dashboard (today’s clients) | Trainer | M2 | Mirrors member home, different content |
| Trainer plan builder | Trainer | M2 | Drag-drop, search-typeahead |
| Trainer commission ledger | Trainer | M3 | Sessions × rate, paid/unpaid status |
| Owner mobile dashboard (read-only) | Admin (Flutter wrapper or mobile web) | M3 | Tier-2/3 owners prefer phone |
| Multi-location switcher | Admin | M5 | Rajesh persona |
| White-label app config | Admin | M5 | Brand assets, color picker, preview |
| Cohort retention chart | Admin | M6 | ”Members who joined Jan 2026 — how many still active?” |
| Member referral mechanic | Member | M6 | ”Bring a friend, get ₹500 off” |
9. Pre-existing v1 spec preserved
The deeper UX/IA spec (200+ exercise screen designs, animation strategy, muscle-overlay SVGs, video-production budget) is preserved in archive/workout-ux-spec. The technical architecture v1 (Flutter + Next.js + PostgreSQL rationale, multi-tenant RLS plans, AI/ML layer) is in archive/tech-architecture.
This refreshed PRODUCT doc is the operating reality, not the full PRD. When implementation needs deeper spec, refer to those archived docs.