All case studies

Web App · Marketing Site · Full Stack

E-learning and mentorship for a visibility business

A cohort school with paid enrolment, mentorship and OKR tracking — plus the marketing site, blog and newsletter that feed it, on one backend.

learn.kuzahub.africa
Industry
Professional development
Timeline
Ongoing
Year
2026

What it supports

Cohort programmes

Sessions, resources and a coach/assistant/learner role split, with invitations that bind on first sign-in.

Paid enrolment

Registration carries payment state; learners file claims with a reference and hosts verify them. Per-host payment profiles for M-Pesa and bank.

Mentorship & OKRs

Goal cycles on a weekly, fortnightly or monthly rhythm, with objectives, key results, check-ins and mentor assignment.

Forms & assessments

Sectioned forms with typed questions, saved drafts a learner can resume, submissions and feedback.

Marketing site

An editable programme catalogue, enquiry capture for every form, and applications routed to the right inbox.

Newsletter & blog

Subscriber list with one-click unsubscribe, scheduled broadcasts through Brevo, and a tagged blog with view counts.

The challenge

KuzaHub teaches professionals how to be visible in their field, and was running it on WhatsApp groups, spreadsheets and manual payment follow-up. Cohorts couldn't be enrolled without someone chasing each learner by hand, mentorship had no record between sessions, and the marketing site was a separate static thing that couldn't tell anyone a programme existed. They needed both halves — the school and the front door — and they needed them to know about each other.

How we built it

The decisions that shaped the product, in the order we made them.

  1. 01

    Mapped the cohort as it actually ran

    Started from the real rhythm — sessions, resources, assignments, payment chasing — instead of from a course-platform template. That is what surfaced mentorship and goal tracking as first-class needs rather than add-ons.

  2. 02

    Built it multi-tenant from the first migration

    Every table is scoped to an organization on a shared schema, so a second course host is a row rather than a redeploy. KuzaHub is tenant one of a product, not a one-off build.

  3. 03

    Modelled the money the way Tanzania pays

    No card gateway. A learner registers, pays by M-Pesa or bank, and files a payment claim with a reference; the host verifies it in-app. The awkward step was already happening — it just wasn't written down anywhere.

  4. 04

    Wired the marketing site to the same backend

    kuzahub.africa stopped being a brochure: programmes, enquiry forms, the newsletter and the blog all read and write the same database the school runs on, so a new cohort is published once.

  5. 05

    Instrumented what goes unused

    Page views and named funnel events are logged so the team can see which parts of the product nobody opens — and cut them instead of guessing.

What it's built with

Named in full, because the question behind it is usually whether your own team could take this over.

  • Django 5 + DRFREST API and admin
  • PostgreSQLshared-schema multi-tenancy
  • Celery + Redisdigests, scheduled sends
  • React 19 + TanStack Startserver-rendered
  • Tailwind CSStoken-driven design system
  • Google sign-in + JWTno passwords to lose
  • Brevodomain-authenticated email
  • Docker + Caddyone box, automatic TLS

Results

2 sites

School and marketing site, one backend

Multi-tenant

A second course host is a row, not a rebuild

In-app

Payment claims verified where the cohort lives