How to Build an Online Course Platform in Bubble.io
Teachable and Kajabi charge transaction fees and limit customisation. A Bubble course platform takes 3-5 weeks, costs $119/month, and charges zero transaction fees. Complete data model, video lessons, purchase flow, progress tracking, certificates, and Lesson access control via privacy rules.
Building Your Own Course Platform vs. Using Teachable or Kajabi
Online course platforms like Teachable, Kajabi, and Thinkific charge 5-10% transaction fees plus monthly platform fees, offer limited customisation, and own the relationship between you and your students. A Bubble-built course platform takes 3-5 weeks to build, costs $119/month for infrastructure, charges zero transaction fees, and gives you complete control over your student experience, pricing, and data. For course creators generating more than $3,000/month, a custom Bubble platform pays for itself in reduced platform fees within months.
Every Type You Need
Course
title, description, thumbnail
: text, text, image
slug
: text (url: /courses/slug)
instructor
: User
status
: option set (Draft / Published)
price
: number
stripe_price_id
: text (for payment)
total_lessons
: number (denormalised)
enrolled_count
: number (denormalised)
Module
course
-> Course
title
text
sort_order
number
Lesson
module
-> Module
title
text
content
text (rich HTML from Rich Text Editor)
video_url
text (YouTube embed or Vimeo)
duration_min
number
sort_order
number
is_preview
yes/no (free preview without purchase)
Enrollment
student
-> User
course
-> Course
enrolled_at
date
stripe_pi_id
text (payment record)
LessonProgress
student
-> User
lesson
-> Lesson
is_completed
yes/no
completed_at
date
What Makes a Course Platform Complete
Video Lessons
Embed YouTube or Vimeo videos using the Bubble video element or an HTML iframe. Store the video URL on the Lesson record. For protected video (preventing download), use Vimeo Pro with domain restriction. Students cannot access lesson content without an active Enrollment record.
One-Time Purchase
Stripe Checkout with mode=payment for a one-time course purchase. On checkout.completed webhook: create an Enrollment record linking the student to the course. The Enrollment record is the access key — its presence (or absence) determines what the student can see.
Progress Tracking
Track which lessons each student has completed via LessonProgress records. Show a progress bar on the course page: completed lessons / total lessons * 100. A ‘Mark as Complete’ button creates or updates the LessonProgress record.
Certificates
Generate a certificate PDF when a student completes all lessons in a course. Use PDF Conjurer plugin with a branded certificate template. Store the generated PDF URL on a Certificate record. Students can download from their profile page.
Student Community
Discussion threads per lesson or per course. Students post questions; instructors and other students reply. Moderation tools for the instructor. Notification when someone replies to a thread the student participated in.
Instructor Dashboard
Total enrollment count, revenue, lesson completion rates per lesson (which lessons have low completion?), student progress overview, and a content management view for adding/editing courses, modules, and lessons.
Protecting Paid Content
Condition 1
: This Lesson’s is_preview = yes (free preview)
Permissions
: Find ✓ View all fields ✓
Condition 2
: Search for Enrollments [
student = Current User,
course = This Lesson’s module’s course
]:count > 0
Permissions
: Find ✓ View all fields ✓
// Without an Enrollment record: non-preview lessons are invisible
// UI conditions also hide content but privacy rules are the security layer
Build Your Bubble.io App With Expert Help
Pakistan’s leading Bubble.io development team. Multi-tenant SaaS architecture, Stripe billing, and full product builds done right from day one.