Case study
MyTrainer
A multi-tenant SaaS platform for managing fitness facilities — gyms, personal-training studios, and clubs. One web panel for bookings, memberships, and trainer schedules, replacing spreadsheets and paper calendars.
I was responsible for the full build of the product: architecture, backend, frontend, and deployment.
Live at mytrainers.app ↗The app in action
Real screens from the facility panel
Screenshots grouped by the three things a facility admin does most: booking sessions, planning trainer availability, and running the day-to-day of the facility. Each calendar is shown in month, week and day view so you can see how it holds up with a full schedule.
Booking calendar
Trainer availability calendar
Facility operations
Problem
Running a facility without a system doesn't scale
Fitness facility owners and admins running their operations without a dedicated system typically rely on a mix of paper calendars, spreadsheets, and manual bookkeeping. That approach breaks down quickly:
- booking a session means checking a trainer's availability by hand, with no protection against double-booking,
- membership status (type, remaining visits, payment) lives in someone's memory or a spreadsheet,
- there's no simple way to see facility-wide numbers — active clients, sessions delivered, cancellations,
- onboarding a facility with an existing client/trainer list means re-entering everything by hand.
As a facility grows past a handful of trainers and clients, this produces missed or double-booked sessions, expired memberships nobody catches in time, and zero operational visibility for the owner.
Solution
One multi-tenant panel, scoped per facility
MyTrainer replaces that toolset with a single web platform, scoped per facility, with role-based access for everyone who touches it:
Booking calendar
Day/week/month views with drag-and-drop scheduling against real trainer availability, including one-off overrides.
Memberships
Package templates and sold memberships — personal, periodic, group, and duet training — with visit counts and payment status.
Facility operations
Client and trainer profiles, diagnostics, review history, and operational reports in one place.
The result: a facility admin runs bookings, memberships, and staff from one screen — a trainer gets a focused view of their own schedule — a client sees their own bookings and notifications — without anyone touching a spreadsheet.
My role
Scope of responsibility
the system architecture end to end: the facility-centric, multi-tenant data model (Facility → Client/Trainer profiles → Memberships → Reservations), the role and permission model shared across four user roles, and the REST API contract.
the backend (ASP.NET Core, .NET 8): authentication, facilities, client and trainer profiles, memberships, reservations, trainer availability, notifications, reviews, statistics, and file storage.
the Angular web panel end to end: the booking calendar (day/week/month, drag-and-drop), membership and client/trainer management screens, statistics dashboards, and the role-aware navigation and permission layer.
the persistence layer on Entity Framework Core with a runtime-switchable database provider (SQL Server / PostgreSQL), and the Excel-based data import for onboarding facilities with existing records.
the deployment setup: Dockerized local environment, cloud-hosted API, and the production rollout of both backend and frontend.
Key features
Built for the way a facility actually runs
Drag-and-drop booking calendar
Day, week, and month views for scheduling sessions against live trainer availability, with conflict-aware placement on the time grid.
Trainer availability engine
A recurring weekly schedule per trainer plus one-off overrides for exceptions like vacation or sick leave.
Membership & package management
Four membership types — personal, periodic, group, and duet training — tracked from template to sold membership.
Multi-tenant facility management
Every facility's data is isolated at the query level, with a controlled super-admin path across facilities.
Facility operations dashboard
Client, trainer, and booking statistics — active clients, sessions delivered, cancellations, packages sold — in one view.
Legacy data import
An Excel import path for facilities migrating an existing client and trainer list instead of re-entering it by hand.
Architecture
Web panel → API → database → external services
A single Angular client talks to one REST API over JWT-secured HTTPS; the API owns all business rules and reaches the database and external services — nothing bypasses it.
Technical challenges
What was actually hard to get right
Trainer availability without booking conflicts
Trainer availability isn't a fixed weekly template — trainers need a recurring schedule and the ability to take a single day off without editing their whole calendar. Solution: a base recurring weekly availability combined with one-off ScheduleOverride records, both checked together whenever a new booking is placed.
Multi-tenant data isolation
Every facility's data must stay strictly isolated, while a super-admin still needs cross-facility access. Solution: global EF Core query filters scope every query to the caller's facility by default, with an explicit, auditable bypass reserved for the super-admin role — enforced once, centrally.
Duet memberships shared between two clients
A duet membership is sold to one client but consumed by a session involving two clients sharing the same slot and visit deduction. Solution: the reservation and membership model both carry an optional secondary client reference, so one booking correctly represents a shared session without duplicating records.
A database layer not locked to one provider
The data layer needed to run against SQL Server in some environments and PostgreSQL in others, without maintaining parallel code paths. Solution: a single EF Core model with a runtime provider switch — the same migrations, entities, and repositories work unchanged against either engine.
Results
Technical scope, in numbers
Technologies
The stack
Backend & data
Frontend
Auth & storage
Infrastructure