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.

.NET 8 ASP.NET Core Angular 19 EF Core SQL Server / PostgreSQL Firebase Auth Google Cloud
Live at mytrainers.app ↗

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

Designed

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.

Implemented

the backend (ASP.NET Core, .NET 8): authentication, facilities, client and trainer profiles, memberships, reservations, trainer availability, notifications, reviews, statistics, and file storage.

Implemented

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.

Built

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.

Delivered

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

01

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.

02

Trainer availability engine

A recurring weekly schedule per trainer plus one-off overrides for exceptions like vacation or sick leave.

03

Membership & package management

Four membership types — personal, periodic, group, and duet training — tracked from template to sold membership.

04

Multi-tenant facility management

Every facility's data is isolated at the query level, with a controlled super-admin path across facilities.

05

Facility operations dashboard

Client, trainer, and booking statistics — active clients, sessions delivered, cancellations, packages sold — in one view.

06

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.

Web panel — Angular 19Facility Admin · Trainer · Client · Super Admin
API — ASP.NET Core (.NET 8)Auth · Facilities · Profiles · Reservations · Memberships · Statistics
DatabaseEF Core — SQL Server / PostgreSQL
External servicesFirebase Auth · Google Cloud Storage

Technical challenges

What was actually hard to get right

01

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.

02

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.

03

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.

04

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

21API controllers across shared, web, and mobile-ready route groups
20core domain entities modeling the facility-management domain
12EF Core migrations evolving the schema
2interchangeable database providers, same codebase
4user roles sharing one application, consistent permissions
1background job automating expiry & birthday notifications
LiveDeployed to production and running at mytrainers.app ↗

Technologies

The stack

Backend & data

ASP.NET Core (.NET 8)REST API, layered architecture
Entity Framework CoreCode-first ORM, 12 migrations
SQL Server / PostgreSQLInterchangeable production database
FluentValidation + AutoMapperValidation & entity–DTO mapping
EPPlusExcel import for onboarding

Frontend

Angular 19Standalone-components web panel
ng-zorro-antdUI component library
Angular CDKDrag-and-drop scheduling
Angular SignalsApplication state

Auth & storage

Firebase AuthenticationEmail/password, Google, Facebook sign-in
Google Cloud StorageFile storage

Infrastructure

Google Cloud RunAPI container hosting
Docker / Docker ComposeLocal development environment

Have a similar project?

Let's talk about working together.

Message me on LinkedIn