An instructor-focused LMS in Bubble gives educators tools to create courses with ordered lessons, schedule drip content releases, manage student enrollments, and view per-course analytics. This tutorial focuses on the instructor side — course creation wizards, lesson management with drag ordering, drip scheduling via backend workflows, enrollment tracking, and completion analytics dashboards.
Overview: Instructor-Focused LMS in Bubble
This tutorial builds the instructor side of a learning management system. You will create course and lesson management, drip content scheduling, student enrollment, and analytics.
Prerequisites
- A Bubble app with user authentication and role management
- Understanding of Data Types, Repeating Groups, and backend workflows
- Content (videos, text) to use in courses
Step-by-step guide
Create the LMS data model
Create the LMS data model
Create 'Course' with: title, description, instructor (User), thumbnail, price (number), status (draft/published/archived), category, created_date. Create 'Lesson' with: title, content (text/HTML), video_url, course, order_number (number), is_free_preview (yes/no), drip_days_after_enrollment (number — 0 for immediate). Create 'Enrollment' with: student (User), course, enrolled_date, progress_percentage (number), last_accessed. Create 'LessonCompletion' with: enrollment, lesson, completed_date.
Expected result: Data model supports courses, lessons, enrollments, and progress tracking.
Build the course creation wizard
Build the course creation wizard
Create a multi-step creation page for instructors. Step 1: Course details (title, description, category, thumbnail, price). Step 2: Add lessons — show a Repeating Group of added lessons with order numbers, titles, and options to edit, delete, or reorder. Add a 'New Lesson' button that opens a form for title, content (rich text editor), video URL, and drip schedule. Step 3: Review and publish — show a summary and a Publish button that sets status to 'published'.
Pro tip: Let instructors preview their course as a student would see it before publishing. Add a 'Preview as Student' button that shows the student view.
Expected result: Instructors can create courses with multiple lessons through a guided wizard with preview capability.
Implement lesson ordering and drip content
Implement lesson ordering and drip content
Each lesson has an order_number field. When adding a new lesson, set order_number to the count of existing lessons + 1. For reordering, add up/down arrow buttons that swap order_number values between adjacent lessons. For drip content: set drip_days_after_enrollment on each lesson (0 = available immediately, 7 = available 7 days after enrollment). When a student accesses a lesson, check: enrolled_date + drip_days <= Current date/time. If not, show 'Available in X days'.
Expected result: Lessons display in order and unlock progressively based on the drip schedule.
Build enrollment and student management
Build enrollment and student management
When a student enrolls (free or after payment), create an Enrollment record with enrolled_date = now, progress_percentage = 0. The instructor dashboard shows enrolled students per course in a Repeating Group with: student name, enrolled date, progress percentage, and last accessed date. Add bulk actions: email all enrolled students, export student list. Track enrollment trends on a chart showing new enrollments per week.
Expected result: Instructors see all enrolled students with progress and can manage them in bulk.
Track lesson completion and course progress
Track lesson completion and course progress
When a student marks a lesson as complete (checkbox or 'Mark Complete' button), create a LessonCompletion record. Calculate progress_percentage: count of LessonCompletions for this enrollment / total lessons in course * 100. Update the enrollment's progress_percentage. When progress reaches 100%, optionally generate a certificate or badge. Show a completion rate on the instructor's course analytics page.
Expected result: Student progress is tracked per lesson with an overall completion percentage per enrollment.
Build the instructor analytics dashboard
Build the instructor analytics dashboard
Create an analytics page showing per-course metrics: total enrollments, active students (accessed in last 7 days), average completion rate, revenue generated (enrollments * price), lesson-level completion rates (which lessons have the lowest completion — indicating drop-off points). Use charts for enrollment trends over time and a funnel showing how many students complete each lesson in order.
Expected result: Instructors see actionable analytics including enrollment trends, completion rates, and drop-off points.
Complete working example
1INSTRUCTOR LMS — WORKFLOW SUMMARY2====================================34DATA TYPES:5 Course: title, description, instructor, price, status6 Lesson: title, content, video_url, course, order_number,7 drip_days_after_enrollment8 Enrollment: student, course, enrolled_date, progress_%9 LessonCompletion: enrollment, lesson, completed_date1011COURSE CREATION:12 Step 1: Course details form13 Step 2: Add/order lessons with drip schedule14 Step 3: Review + Publish (status = published)1516DRIP CONTENT:17 Lesson available when:18 enrolled_date + drip_days <= Current date/time19 Otherwise: show 'Available in X days'2021ENROLLMENT:22 Create Enrollment on signup/payment23 Track: enrolled_date, progress, last_accessed2425PROGRESS:26 Mark Complete → Create LessonCompletion27 Progress = completions / total_lessons * 10028 100% → optional certificate/badge2930ANALYTICS:31 Enrollments over time (chart)32 Average completion rate33 Lesson-level completion (drop-off funnel)34 Revenue: enrollments * priceCommon mistakes when developing an LMS in Bubble (Instructor Focus)
Why it's a problem: Calculating drip availability on the client side only
How to avoid: Enforce drip access in Privacy Rules: only allow lesson access when the enrollment date + drip days condition is met
Why it's a problem: Not tracking individual lesson completions, only overall progress
How to avoid: Create a LessonCompletion record for each completed lesson and calculate progress from the completion count
Why it's a problem: Allowing students to access courses without an enrollment record
How to avoid: Set Privacy Rules on Lesson content: only visible when an Enrollment exists for Current User and this Course
Best practices
- Enforce content access with Privacy Rules, not just UI conditionals
- Track per-lesson completions for detailed analytics and drop-off identification
- Use drip scheduling to pace content delivery and improve completion rates
- Let instructors preview courses from the student perspective before publishing
- Show lesson-level completion analytics to help instructors improve content
- Add a 'Resume where you left off' feature using last_accessed tracking
- Generate completion certificates to motivate students and provide credentialing
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I want to build an LMS in Bubble.io where instructors create courses with ordered lessons, drip content over time, and see student progress analytics. What Data Types and features do I need for the instructor side?
Build an instructor LMS dashboard. Create Course, Lesson, Enrollment, and LessonCompletion data types. Add a course creation wizard with lesson ordering and drip scheduling. Show enrolled students with progress. Build an analytics page with completion rates and enrollment trends.
Frequently asked questions
Can I host video lessons directly in Bubble?
You can upload videos to Bubble, but for better streaming performance, use a video hosting service like Vimeo, Wistia, or Mux and embed the player via URL.
How do I implement paid courses with Stripe?
On the enrollment page, add a Stripe charge before creating the Enrollment record. Only create the enrollment after successful payment.
Can instructors issue certificates on course completion?
Yes. When progress reaches 100%, generate a Certificate record with a unique ID. Create a certificate page that displays the student name, course title, completion date, and a shareable link.
How do I handle course refunds?
Process the Stripe refund, then set the Enrollment status to 'refunded' and revoke lesson access by adjusting Privacy Rules to exclude refunded enrollments.
Can RapidDev build a complete learning platform in Bubble?
Yes. RapidDev can build LMS platforms with course creation, student management, payments, certifications, analytics, and mobile support in Bubble.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation