02 · What we built
The solution
We built one React Native app with separate navigators for clients and trainers rather than two apps, so both sides share one codebase, one login and one chat. Behind it sit two Express backends on one MongoDB database. The mobile backend owns everything a phone touches: bookings, Stripe, Socket.IO chat with Redis for presence, caching and unread counts, and nine scheduled jobs for subscriptions, attendance, check-ins and settlement. The web backend serves the superadmin console: users and trainer certifications, log audits, moderation, the ledger and payouts.
Read the full solutionShow less
The key decision was a single unified ledger. Every sale and every refund writes a linked group of entries for the client, the trainer and the platform that must sum to zero, and a reconciliation check lists any group that does not. Stripe events arrive at one webhook on one backend, so no event is processed twice.