# How to Develop an LMS in Bubble (Instructor Focus)

- Tool: Bubble
- Difficulty: Beginner
- Time required: 30-35 min
- Compatibility: All Bubble plans
- Last updated: March 2026

## TL;DR

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.

## Before you start

- 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

### 1. 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.

### 2. 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.

### 3. 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.

### 4. 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.

### 5. 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.

### 6. 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 code example

File: `Workflow summary`

```text
INSTRUCTOR LMS — WORKFLOW SUMMARY
====================================

DATA TYPES:
  Course: title, description, instructor, price, status
  Lesson: title, content, video_url, course, order_number,
    drip_days_after_enrollment
  Enrollment: student, course, enrolled_date, progress_%
  LessonCompletion: enrollment, lesson, completed_date

COURSE CREATION:
  Step 1: Course details form
  Step 2: Add/order lessons with drip schedule
  Step 3: Review + Publish (status = published)

DRIP CONTENT:
  Lesson available when:
    enrolled_date + drip_days <= Current date/time
  Otherwise: show 'Available in X days'

ENROLLMENT:
  Create Enrollment on signup/payment
  Track: enrolled_date, progress, last_accessed

PROGRESS:
  Mark Complete → Create LessonCompletion
  Progress = completions / total_lessons * 100
  100% → optional certificate/badge

ANALYTICS:
  Enrollments over time (chart)
  Average completion rate
  Lesson-level completion (drop-off funnel)
  Revenue: enrollments * price
```

## Common mistakes

- **Calculating drip availability on the client side only** — Students can manipulate client-side logic to access locked content early Fix: Enforce drip access in Privacy Rules: only allow lesson access when the enrollment date + drip days condition is met
- **Not tracking individual lesson completions, only overall progress** — Without per-lesson tracking, you cannot identify drop-off points or generate accurate completion certificates Fix: Create a LessonCompletion record for each completed lesson and calculate progress from the completion count
- **Allowing students to access courses without an enrollment record** — Students bypass payment by accessing lesson URLs directly without enrolling Fix: 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

## 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.

---

Source: https://www.rapidevelopers.com/bubble-tutorial/develop-a-learning-management-system-in-bubble
© RapidDev — https://www.rapidevelopers.com/bubble-tutorial/develop-a-learning-management-system-in-bubble
