I have taught Excel informally for years — to colleagues, to friends starting a business, to family. When I decided to turn that into an online course, the obvious path was a platform like Teachable or Hotmart. I chose to build it myself instead, as a product I fully control and as a full-stack exercise on my own site.
The course
Five levels, from a free Fundamentals level to Excel Pro: 36 modules covering formulas, references, conditional formatting, pivot tables, XLOOKUP and INDEX/MATCH, dynamic arrays, Power Query, dashboards, macros, VBA and Power Pivot. Every level ships with two workbooks — worked examples and practice exercises — plus a cheat sheet in PDF. Extra modules cover shortcuts, common errors, a glossary and a diagnostic test.
Architecture
- Flask serves everything under
/curso: landing, pricing, auth, dashboard, modules, submissions and an admin area. - Supabase handles authentication (email + password with OTP verification, Google OAuth with PKCE), the Postgres tables for profiles, purchases, per-module permissions and submissions, and a storage bucket for uploaded workbooks.
- Stripe Checkout sells each level or a bundle; a webhook marks the purchase complete and unlocks the modules.
- Modules as React components. Each lesson is a JSX file rendered in the browser; Flask injects the user's preferred formula language so
=SUMIFSand=SUMAR.SI.CONJUNTOare one setting away.
# The module registry drives navigation, pricing and permissions
LEVELS = {
"nivel2": {
"title": "Nivel 2 — Intermedio",
"modules": [
{"id": "nivel2_modulo01_absolute_refs", "title": "Referencias absolutas y mixtas"},
{"id": "nivel2_modulo08_pivottables", "title": "Tablas dinámicas"},
# ...
],
"xlsx": ["nivel2_ejemplos.xlsx", "nivel2_practica.xlsx"],
},
}
Grading real workbooks
Students submit their practice file for each module. Uploads are validated (Excel
formats only), stored in Supabase Storage under user/module/timestamp
and listed in an admin panel where I open the workbook, grade it and leave feedback
that shows up in the student's dashboard. It is the part that makes the course feel
like a class rather than a video library.
Access control
Access is granular: a purchase unlocks a level, but I can also enable or revoke individual modules per student, and new accounts wait for approval before they can buy — a small friction that keeps the platform tidy while it is young. Everything admin-side goes through the Supabase service role on the server; the browser only ever holds the anon key.
Takeaways
Owning the platform meant owning auth, payments and file handling — more work than uploading videos somewhere, but it gave me a real product with real users on my own domain, and a codebase I keep extending.