Case Study

Course Sales, Live Cohorts and Learner Management

A learning platform that carries a purchase through to course access and progress.

This learning management system case study follows a course purchase through to the learning that comes after it. A purchase ends in an enrollment. That enrollment then carries the learner's progress and their assessment results through the course. Certificates attach to the purchase and the learning records they belong to.

The challenge

A payment confirmation may arrive twice. An old checkout tab can also stay open after the learner already has access. Neither event should create a second enrollment. The server has to settle that question before it accepts another purchase or applies a callback.

What we built

Checkout works out the price from the course and currency, then applies any coupons and the supported tax fields. It checks existing access and the gateway configuration before writing any payment records. A free purchase can enroll the learner directly, while a paid one follows the route for the course, cohort or certificate bought.

Cohort managers can enroll groups, schedule classes and record attendance. Learners move through lessons and videos, then quizzes and assignments. An answer that needs human review can stay pending, and a later passing grade completes the lesson.

Payment identity comes before access

Confirmation first checks that the payment belongs to the checkout. A unique payment identifier guards against duplicate records. Enrollment locks the course before it checks whether the learner already has access, so a repeated confirmation can finish against the enrollment that exists. Coupon redemption comes next, because it takes a separate row lock.

For the supported payment gateway, a failed status lookup can queue another check for later. Temporary unavailability does not count as a final payment decision.

Learning records have their own controls

Record controllers enforce who owns an enrollment, and they protect the progress and purchased-certificate fields. Permission to create a course does not extend to enrollments elsewhere. Quiz submission locks the learner record while it counts attempts, so concurrent submissions run one at a time.

An imported SCORM archive goes through path-containment checks before its manifest is processed. Opening a package needs an enrollment and the matching lesson. The player stores completion and suspend data, though not package scores or the full SCORM sequencing model.

Each site keeps its own database and payment configuration. Redis queues handle invitations, attendance work and payment reminders.

Project success

Access is tied to a checked purchase or a free-enrollment route, and a repeated confirmation can still find the enrollment that exists. Once learning starts, completion can reflect both the recorded activity and a reviewer's assessment. Administrators manage the surrounding cohort work from the same platform.

Technology stack

Backend

Python

Frontend

Vue, Vite, Tailwind CSS

Database

MariaDB

Background processing

Redis queues

Learning integration

SCORM package handling, configurable code execution service

Recognize the pattern?

If one of these looks like your situation, the discovery call is where we find out how close.