
Classmio, a SaaS for managing in-person academies
Classmio is a multi-tenant platform for academies — dance, martial arts, languages, fitness... — students, schedules, fees and payments in one private dashboard, plus a public website for each academy.
Classmio is a vertical SaaS for managing in-person and online academies: dance, martial arts, languages, fitness, training… any business that organizes recurring groups, schedules and students. It’s my latest launched project, and the first one I’ve taken all the way to production as a commercial product, not as a learning exercise. You can see it at classmio.com.
The idea comes from a very specific problem: most of these academies manage students, schedules and payments with spreadsheets, WhatsApp groups and a notebook. Classmio centralizes all of that in a private dashboard per academy — and adds, on top, a public website that academy didn’t even have before.
Multi-tenant: one app, one database
Classmio isn’t “one deployment per client.” It’s a single application and a single database where each academy is an independent tenant: every business table is separated by academy_id, and isolation between academies is enforced with Row Level Security at the PostgreSQL level, not just with filters in the code.
A single user can belong to several academies with different roles in each — be the owner of their own and a student in a friend’s, for example — so the user’s global identity lives separate from their specific relationship with each academy (membership). Each membership, in turn, separates two things that tend to get mixed up: the dashboard access role (owner, admin or none) and the functional role within that academy (teacher or student).
Everything an academy needs, day to day, in one dashboard
- Students and teachers: full profiles, status, notes and the groups they belong to.
- Dual-role memberships: a dashboard access role (owner / admin) and a functional role within the academy (teacher / student), independent from each other.
- Classes and groups: time slots, multiple teachers per class, an end date, and private classes visible only to enrolled students.
- Schedules: a navigable weekly calendar over real dates, with holidays and closures marked, and responsive (1, 3 or 7 columns depending on the device).
- Attendance per session: present, absent, late or excused, class by class.
- Fees generated automatically from each academy's pricing plans — never created by hand.
- Unified requests and invitations: a student asks to join from the public site, or the academy invites them directly with a link.
Payments: two layers of Stripe, two different businesses
Classmio integrates Stripe twice, for two things that shouldn’t be confused:
- The academy pays Classmio its SaaS subscription (free or paid plan), managed through Stripe Billing and its billing portal.
- The student pays the academy, by card, through Stripe Connect (Express accounts). The money goes straight to the academy’s bank account — Classmio doesn’t take a cut of what the academy charges its own students, only of the subscription the academy pays to use the platform.
Fees are generated automatically from the configured pricing plans, can be charged by card or marked as paid through another method, and support refunds without leaving Classmio.
A public website for every academy
Most of these academies didn’t have a website of their own. Every academy on Classmio has one, with its own space for content — schedules, team, plans and a contact form — without anyone having to touch code.
- A page of its own per academy, with information, schedules, team and pricing plans visible to anyone.
- 15 different visual templates (from editorial minimalism to styles like neon, martial arts or street), each academy picks its own.
- Public directory of academies, with search and filters by category and mode (online / in-person).
- Public teacher profiles, with photo and bio.
- Requesting a spot directly from the public site, without going through the private dashboard.
- SEO done properly: metadata, sitemap and structured data (JSON-LD) on every public page.
Plans, from free to enterprise
Classmio is sold in five tiers, with student/teacher limits and features that unlock as you go up:
Free — up to 10 students
Starter — €29/mo, up to 50 students
Pro — €59/mo, up to 150 students
Business — €119/mo, up to 500 students
Enterprise — custom pricing, unlimited students
Security, not an afterthought
With student and payment data involved, security isn’t an optional layer. Beyond academy_id isolation enforced with Row Level Security on every table, Classmio validates every role change on the server (an admin can never touch an owner, or grant themselves that role through a form), checks that any id coming from a form actually belongs to that academy before using it, and applies rate limiting on the most sensitive entry points: login, sign-up and requests to join an academy.
Tech stack
- SvelteKit + Svelte 5 (Runes) and strict TypeScript throughout.
- Supabase as the backend: PostgreSQL, authentication and Row Level Security enabled on every table.
- Drizzle ORM as the single source of truth for the database schema, on top of PostgreSQL.
- Stripe, in two independent integrations: the academy's SaaS subscription to Classmio, and Stripe Connect so each academy can charge its own students.
- Zod for validation, both in forms and on the server.
- mdsvex for the blog and each academy's editorial content.
- Vitest for unit and component tests, Playwright for end-to-end.
- Deployed on Vercel, with a direct TCP connection from Drizzle to Postgres (via Supabase's pooler in transaction mode).
Classmio is live and in real use, not a demo or a prototype.