Hamzah.
Work Feedback About Training ↗
Get in touch

This case study is private.

Return to the homepage and unlock with a password to view this work.

← Back to work
← Selected work / 01

Scaling a learning platform to 180,000 learners across 90+ countries

Learning platform · Hairstyling industry

Role
Full-stack engineer · small team (3–5 engineers)
Industry
Learning platform · Hairstyling industry
Period
Jun 2023 to Present
Stack
Next.js · TypeScript · PostgreSQL · GraphQL · Stripe

180,000+ learners. 90+ countries. 250+ on-demand courses from named industry educators. The education arm of a category-leading media brand, running on a fragile WordPress + WooCommerce stack that fought the team every release. I led the move to a typed, headless architecture — Next.js, GraphQL, Postgres — and rebuilt the parts that touch money. The result: quieter incidents, faster pages, and a product the team can finally ship against.

  1. 01

    A course platform built around access, not lessons

    Per-user state, multi-tier entitlements, live + recorded side-by-side.

    Most LMS pain isn't the video player. It's deciding who gets to see what, when, and why.

    The platform mixes recurring subscriptions, one-off course purchases, and bundles — with live cohort drops sitting next to a back catalog of 250+ on-demand classes from named industry educators. I designed a custom schema so instructors can revise curriculum mid-cycle without breaking access for enrolled students, and a single user's entitlements stay easy to reason about no matter what they've bought.

    The payoff: when an instructor says swap module 4 next Tuesday, nobody loses sleep over what breaks.

  2. 02

    The access engine

    One boolean in the UI. The most consequential logic in the product.

    I built the access layer top to bottom — UX, schema, API, frontend. It reads every subscription state a user has ever held, every bundle they've redeemed, every promotional grant, and resolves a single answer: can this person open this class right now?

    Get it wrong and a learner in São Paulo can't open the class she paid for. Get it right and the rest of the platform mostly disappears — no support tickets, no spreadsheet workarounds, no manual grants. Just access that works.

  3. 03

    Stripe, the full surface

    Subscriptions, prorations, refunds, dunning, tax across 90+ countries — typed, tested, boring.

    The hard parts of billing don't live in the Stripe docs. They live in the edge cases: mid-cycle plan changes, partial refunds, failed payments retried out of order, VAT and tax across 90+ countries.

    I rebuilt the full billing surface in typed TypeScript with real test coverage: recurring tiers, one-time purchases, trials, prorations, dunning, tax. At a 180,000-learner global user base, every edge case caught at the schema level is a support ticket and a refund that never happened.

  4. 04

    Going headless

    Kept WordPress as the CMS. Moved everything that matters into typed code. A decoupling, not a rewrite.

    Editors still author content where they're comfortable. Billing, access, and product logic moved into Next.js + GraphQL + Postgres behind a typed API layer.

    Three drivers made this non-negotiable:

    Why it had to change
    • 01

      Performance

      Every request used to walk through WooCommerce, three cache layers, and a stack of plugins before our code ran. The render budget was spent on infrastructure, not on serving the user.

    • 02

      SEO

      Slow pages tank Core Web Vitals. SEO plugins fight each other for control of meta, schema, and sitemaps. Going headless gave us full control of rendered output and crawl budget.

    • 03

      Scalability

      Shipping a single billing rule meant editing PHP across half a dozen files and praying the plugin chain held. The codebase couldn't grow without growing the breakage.

  5. 05

    Outcome

    Billing that mostly disappears. The boring metric that means real money.

    Quieter incidents. Cleaner subscription state. The tickets that used to dominate the queue — charged twice, can't access what I paid for, plan didn't upgrade — are now the exception, not the cadence.

    I won't invent a clean percentage. The trajectory is unambiguous: a friction surface that used to live in the daily support queue is now mostly invisible. The team ships product features — new courses, new educators, new live formats — instead of patching billing.

    That's what a rebuild is supposed to buy you. At a six-figure global user base, it's the difference between scaling and stalling.

Next → Replacing four SaaS tools with one platform that runs the agency end-to-end

Build with intent. Ship with care.

© 2026 Hamzah. All rights reserved. Karachi · Available Q3 2026