Japp
Classmio, a SaaS for managing in-person academies

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
Public website, student, class and schedule management. No attendance tracking, card payments, custom cover image or theme: the entry point to try Classmio at no cost.
Starter — €29/mo, up to 50 students
Adds attendance tracking, card payments to students (Stripe Connect), a custom cover image and photos, and color customization.
Pro — €59/mo, up to 150 students
Everything in Starter, plus access to the 14 paid visual templates for the academy's public site.
Business — €119/mo, up to 500 students
Same features as Pro, with much higher limits on students, teachers and admins — built for larger academies or those with multiple locations.
Enterprise — custom pricing, unlimited students
The only plan with a custom domain for the academy's public site, and everything above with no caps.

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.

Visitar web
classmio.com

Leave without saving?

You have unsaved changes in this form. If you leave now, they'll be lost.

esen