Teachable and Thinkific work for simple courses, but they cap your control — you can't own the data, build custom enrolment flows, bundle courses with a SaaS product, or integrate deeply with your business. A custom LMS gives you full ownership and the architecture to scale past what hosted platforms allow.
LMS data model
The core data model: Courses contain Sections, Sections contain Lessons. Enrolments link a User to a Course with a progress record per Lesson. This keeps query patterns simple and scales cleanly to thousands of learners.
model Course { id String @id @default(cuid()) title String slug String @unique sections Section[]} model Lesson { id String @id @default(cuid()) title String videoUrl String? sectionId String section Section @relation(fields: [sectionId], references: [id]) progress Progress[]} model Progress { userId String lessonId String completed Boolean @default(false) lesson Lesson @relation(fields: [lessonId], references: [id]) @@id([userId, lessonId])}Video delivery — the bandwidth question
Hosting course videos yourself will bankrupt a small platform on bandwidth costs. We use Mux or Cloudflare Stream — they handle transcoding, adaptive bitrate streaming and a secure signed-URL player so videos can't be downloaded or hotlinked.
Quizzes & assessments
A quiz is a set of Questions each with multiple Answers and a correct flag. We grade client-side (immediate feedback), store the score server-side (prevents replay cheating), and gate the next lesson behind a passing score when required.
Automated certificates
When a learner completes all required lessons and quizzes, we generate a PDF certificate server-side with their name, course title and a unique verification UUID. The certificate is emailed and stored on their profile — the verification UUID resolves to a public page so employers can verify it.
signed URLs
Secure video
auto
Certificates
progress
Per-lesson
100%
Owned data
Need this built? Explore our SaaS Development service.
View service →Written by Zahid Ghotia · Published 16 June 2026 · 8 min read



