The platform serves two distinct customer segments — established educational academies with multiple branches and independent teachers operating solo or with small teams — from a single multi-tenant codebase. Each academy is a tenant with isolated data for students, classes, schedules, payments, and staff accounts. Tenant isolation is enforced through academy-scoped middleware in the NestJS API that injects the tenant identifier into every database query, preventing cross-academy data access even if application logic contains bugs. Within each academy, role-based access control defines permissions for administrators, branch managers, teachers, and read-only parent accounts.
Academy onboarding follows a self-service provisioning flow. A new academy administrator registers, selects a subscription plan, and completes an initial setup wizard configuring academy name, branding (logo, colors), timezone, currency, and branch locations. The provisioning pipeline creates the tenant data partition, seeds default email notification templates, configures a Stripe Connect account for payment collection, and generates a public enrollment page URL. Custom domain mapping allows academies to serve enrollment pages on their own domains — academy.example.com — with automated SSL provisioning through the same infrastructure pattern used in our eCommerce platform work.
Branch management supports multi-location academies where each branch has its own class schedule, room assignments, and staff roster while sharing a centralized student database and billing system. Students can enroll in classes at any branch, and cross-branch transfers update enrollment records without duplicate student profiles. Academy-wide reporting aggregates metrics across branches with drill-down capability, giving owners visibility into per-branch enrollment, revenue, and teacher utilization while branch managers see only their location's data.