CHEMS Hub
A learning platform built from zero for environmental health professionals
Building a working learning management system and e-commerce store for a founder with deep expertise but no online presence, and handing over a platform his team could actually run.
Visit live siteCover image coming soon
The brief
Dr Kgomotso Lebelo founded the Centre for Health and Environmental Management Solutions (CHEMS Hub) to bring food safety, environmental health, and regulatory training to professionals across South Africa. His expertise is the product. The challenge was turning that expertise into a business that scales beyond a single trainer's diary.
When he reached out to me directly, CHEMS Hub had no online presence at all, no website, no booking system, no way for someone Googling “food safety training South Africa” to find him, register, pay, and start learning. The brief was ambitious in the right way:
- Run paid courses online with proper learner management.
- Establish credibility and thought leadership for Dr Lebelo himself, he's a published academic and consultant, and the site needed to reflect that.
- Build an audience of environmental health professionals who'd come back for new courses and events.
- Sell training to corporates and institutions, hospital groups, municipalities, food businesses needing certified training.
Going from zero to a full learning platform with e-commerce is not a small website project. It's a real product. The trust required from Dr Lebelo to greenlight that build with a freelance developer was significant, and a lot of the work in the first weeks was as much about demonstrating I could carry that responsibility as about writing code.
The approach
Three big choices shaped the build.
Choice 1: Boring infrastructure, ambitious content
The temptation with an LMS project is to reach for a custom build, React frontend, headless CMS, custom course logic, video streaming infrastructure. Tempting because it's interesting; wrong because nobody on Dr Lebelo's team would have been able to maintain it.
I went with WordPress + Tutor LMS + WooCommerce. None of those choices are exciting. All of them are battle-tested, well-documented, and maintainable by anyone who's ever touched a WordPress dashboard. The ambition is in the courses; the infrastructure should be invisible.
Choice 2: Skipping video hosting
Video is the obvious medium for online courses, and the obvious answer is to host it yourself or pay for Vimeo Pro. We looked at the costs and the maintenance overhead, and made a pragmatic call: no self-hosted video.
Instead, courses are delivered through:
- Slide decks with downloadable resources
- Live Zoom classes for cohort-based learning
- Online quizzes within Tutor LMS for assessment
- Articles and supplementary reading for self-paced learners
This was a real trade-off. Video courses are easier to scale, record once, sell forever. The model we built leans more on Dr Lebelo's direct involvement through Zoom sessions. But it kept costs down at launch, made the courses better (live cohorts get questions answered in real-time), and meant we could ship in 3 months instead of 6.
If video makes sense later, the platform can absorb it. Tutor LMS supports video lessons natively; we just chose not to lead with that format.
Choice 3: Different sites for different users
Logged-out visitors and enrolled learners need fundamentally different experiences. A first-time visitor needs to be sold to, “why this course, why now, why this trainer.” A returning student needs to get to work, open the course, resume where they left off, take the quiz, see their progress.
I built two distinct navigation structures. The public site leads with courses, events, and the founder's credentials. The logged-in experience drops the marketing and centres on a learner dashboard , enrolled courses, progress bars, upcoming events, and quick links to course content.
This is the kind of thing nobody mentions when you visit the site, but which the team feels every day in customer support. Nobody emails to ask “how do I find my course?”
The build
A few technical decisions worth pulling out.
Three custom post types: Courses, Events, Articles
WordPress's default post type, “blog post”, wasn't right for any of the three content types CHEMS Hub needed. Each one has different fields, different display logic, different listing pages.
So I built three custom post types:
- Courses, managed by Tutor LMS, sold via WooCommerce, with curriculum, prerequisites, prices, and access control.
- Events, managed via The Events Calendar plugin, with dates, locations (online or physical), registration, and integration into the same logged-in dashboard.
- Articles, long-form thought leadership content, freely accessible, with author bios, categories, and SEO metadata.
The three live in the same site but behave like three different products. Dr Lebelo can publish a new article without affecting course enrolment. He can launch a new course without it cluttering the events listing. The architecture matches how his business actually works.
Tutor LMS + WooCommerce: not as plug-and-play as the docs suggest
The single trickiest part of the build was getting Tutor LMS to play properly with WooCommerce. The integration exists and is officially supported, but the path from “customer adds course to cart” through to “learner has access to enrolled course” involves multiple plugins talking to each other, and the default config doesn't quite work.
I had to:
- Configure the right product type for courses in WooCommerce
- Set up the course-to-product linking on each course
- Adjust the order completion hooks so enrolment fires reliably after payment
- Test the failure modes (failed payments, refunds, manual enrolments by admin)
This is the kind of work that's tedious to do and impossible to skip. A learner who pays and doesn't get access is a refund request and a trust hit. We tested every path before launch.
Custom roles for instructors and students
CHEMS Hub had to support two distinct user types:
- Students, purchase courses, attend events, complete quizzes, see their dashboard.
- Instructors, Dr Lebelo and any future co-trainers, can author courses, see enrolment data for their courses, manage their content.
WordPress's default roles (Subscriber, Author, Editor, Admin) weren't the right shape. I extended Tutor LMS's built-in role system to give instructors the right permissions without giving them admin access to settings they shouldn't touch.
Certificates: the deliberate manual choice
We could have automated certificate generation, Tutor LMS has plugins for it. We chose not to.
Why: Dr Lebelo's certificates carry his name and reputation. He wanted a human eye on every one before it goes out. Once a learner completes a course, the admin gets a notification, reviews the completion record, and issues the certificate. It's a manual step, but it matters that it's a human manual step. We built the workflow to make that as fast as possible without removing the judgment call.
The outcome
The site went live in mid-2024. A few things have stuck:
- Money flows in. Real ones. I still remember the first time I logged into the WooCommerce dashboard a week after launch and saw actual orders from real students, that's the moment a website becomes a business.
- The team runs it. Dr Lebelo's team manages courses, events, articles, students, and orders day-to-day without me. That was the brief and we hit it.
- I'm still on call for the things they don't want to learn: hosting, email accounts, support number changes, occasional plugin updates, the small structural changes that need a developer's hands. Not a heavy retainer, just a known phone number when they need one.
That balance, independent operation with a developer-on-call, is the right outcome for a small team running a knowledge product. Heavy retainers eat margin. Pure handovers leave teams stranded. The middle path is a relationship that bills only when there's actual work to do.
What I'd do differently
If I were starting CHEMS Hub today, I'd be more aggressive about video from day one. Not because the slides + Zoom model is wrong, but because video search results are how new learners find a trainer they don't already know. Even one indexed YouTube video per course would have widened the top of the funnel meaningfully.
I'd also build the certificate workflow as a custom admin tool rather than the plugin chain we used. Three months in, that workflow has shipped enough certificates that the manual steps are starting to feel worth automating, at least up to the “ready for review” stage. A weekend project for next time.
“Thabo built something my team could actually run. We make small changes daily without needing him, and the times we do call him in, the platform doesn't feel scary to ask about.”