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.

Excel 365 course landing page
The landing page of the course.

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 =SUMIFS and =SUMAR.SI.CONJUNTO are 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.

36interactive modules
10practice workbooks
$0platform fees

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.