Gym Management Platform
Problem
A fitness business was running members, plans, and class schedules by hand — spreadsheets, paper sign-in sheets, manual billing. Errors were common: double-booked classes, missed payments, no-shows with no waitlist. Admin overhead was 15+ hours/week.
Solution
Member management and class scheduling on a Laravel backend, with a mobile client (React Native) so members handle check-ins and bookings themselves.
Architecture
- Backend: Laravel 11 + MySQL
- Mobile: React Native (Expo) + TypeScript
- Auth: Laravel Sanctum + JWT
- Payments: Stripe Connect for recurring memberships
- Notifications: Expo Push (iOS/Android) + Twilio SMS fallback
- Infrastructure: Docker + GitHub Actions + AWS ECS Fargate + RDS MySQL
Key Features
Member Portal (Mobile App)
- View/book/cancel classes with real-time availability
- View membership status, billing history, upcoming renewals
- Digital membership card with QR check-in
- Push notifications: class reminders, waitlist openings, billing alerts
Admin Dashboard (Web)
- Member management: CRUD, status, notes, tags
- Class scheduling: recurring, one-off, waitlists, capacity rules
- Membership plans: trial, monthly, annual, punch cards, corporate
- Billing: Stripe Connect, automated retries, dunning emails
- Reports: revenue, attendance, churn, LTV, capacity utilization
Check-In System
QR code on member app scanned at front desk (iPad kiosk) or self-scan at entrance. Offline-first: queues sync when online. Duplicate check-in prevention.
Waitlist Automation
When a spot opens, next person on waitlist gets push + SMS. 10-min window to confirm. Auto-promotes if no response.
Results
- Admin time: 15 hrs/week to 2 hrs/week
- No-shows: Reduced 65% (automated reminders + waitlist)
- Billing errors: Near zero (Stripe automation)
- Member satisfaction: 4.8/5 app store rating
- Revenue recovery: $2,300/mo from failed payment retries
Key Technical Decisions
- Expo over bare React Native: Faster iteration, OTA updates, no native build pipeline for most changes
- Stripe Connect over custom billing: Handles PCI, retries, dunning, webhooks — saved months of dev time
- MySQL over PostgreSQL: Team familiarity, cheaper RDS, JSON support sufficient
- Expo Push over FCM/APNs directly: Unified API, handles token rotation, delivery receipts
Ongoing
Current roadmap: multi-location support, personal training booking, nutrition tracking integration, Apple Watch companion app.