# How to build an education platform in Bubble

- Tool: Bubble
- Difficulty: Beginner
- Time required: 40-50 min
- Compatibility: Growth plan+ (backend workflows and higher WU limits)
- Last updated: March 2026

## TL;DR

An educational platform in Bubble extends beyond an LMS to include student enrollment, lesson delivery, video hosting, assignment submission, grading, instructor dashboards, and discussion forums. This tutorial covers the broader platform architecture with multiple user roles and interactive learning features.

## Overview: Building an Educational Platform in Bubble

An educational platform goes beyond simple course delivery — it includes enrollment management, multiple content types, assignments, grades, discussions, and role-based dashboards. This tutorial covers the full architecture for a platform that serves students, instructors, and administrators.

## Before you start

- A Bubble app on Growth plan or above
- Experience with Data Types, workflows, and Repeating Groups
- A video hosting service (YouTube, Vimeo)
- Understanding of role-based access patterns

## Step-by-step guide

### 1. Design the platform data structure with multiple roles

Extend the User Data Type with a role field (Option Set: Student, Instructor, Admin). Create these Data Types: Course (title, description, instructor, category, price, published, enrollment_count). Module (course, title, order). Lesson (module, title, content_type Option Set: Video/Text/PDF, content, video_url, duration, order). Assignment (lesson, title, description, due_date, max_points). Submission (assignment, student, content, file, submitted_date, grade, feedback). Discussion (course, title, author, content). Reply (discussion, author, content).

**Expected result:** A complete data structure supporting courses, lessons, assignments, discussions, and multiple user roles.

### 2. Build the course catalog and enrollment system

Create a catalog page with courses in a Repeating Group filtered by published = yes. Each card shows title, instructor, rating, enrollment count, and price. The Enroll button creates an Enrollment record linking the student to the course. For paid courses, redirect to Stripe Checkout first. After enrollment, the student can access the course player page.

**Expected result:** Students can browse, enroll, and access courses.

### 3. Create the course delivery interface

Build a course player page with a sidebar showing modules and lessons, and a main content area that adapts based on content_type. For Video lessons, embed the video via an HTML iframe. For Text lessons, display rich text content. For PDF lessons, embed a PDF viewer. Track lesson completion using a LessonProgress Data Type. Show a progress bar based on completed lessons.

> Pro tip: Use a Reusable Element for the lesson content area so different content types render without duplicating page elements.

**Expected result:** Students navigate through course content with automatic progress tracking.

### 4. Implement the assignment submission and grading system

On the lesson page, show any associated Assignment below the lesson content. Students submit work via a text input for written assignments or a File Uploader for document/code submissions. This creates a Submission record. Instructors see pending submissions on their dashboard in a Repeating Group filtered by assignment's course's instructor = Current User AND grade is empty. They enter grades and feedback which update the Submission record.

**Expected result:** Students submit assignments and instructors grade them with feedback.

### 5. Build role-based dashboards

Create three dashboard pages. Student dashboard: enrolled courses, progress bars, upcoming assignments, recent grades. Instructor dashboard: their courses, pending submissions to grade, student enrollment stats. Admin dashboard: all users, all courses, revenue metrics, platform analytics. Use conditions and Privacy Rules to ensure each role sees only their data.

**Expected result:** Each user role has a tailored dashboard showing relevant information and actions.

## Complete code example

File: `Workflow summary`

```text
EDUCATIONAL PLATFORM SUMMARY
==============================

ROLES: Student, Instructor, Admin

DATA TYPES:
  Course: title, description, instructor (User), category, price, published
  Module: course, title, order
  Lesson: module, title, content_type (Video/Text/PDF), content, video_url, order
  Enrollment: course, student, enrolled_date, completed
  LessonProgress: enrollment, lesson, completed, completed_date
  Assignment: lesson, title, description, due_date, max_points
  Submission: assignment, student, content, file, submitted_date, grade, feedback
  Discussion: course, title, author, content
  Reply: discussion, author, content

PAGES:
  /catalog — browse courses
  /course-player (type: Course) — lesson delivery
  /student-dashboard — enrolled courses, grades
  /instructor-dashboard — manage courses, grade submissions
  /admin-dashboard — platform management

KEY WORKFLOWS:
  Enroll: Create Enrollment → (paid: Stripe first)
  Complete Lesson: Create LessonProgress → check course completion
  Submit Assignment: Create Submission → notify instructor
  Grade: Make Changes to Submission → grade + feedback → notify student
```

## Common mistakes

- **Not separating content types in the Lesson data structure** — Different content types (video, text, PDF) need different display elements. A single approach leads to broken rendering. Fix: Use a content_type field and conditions on the display elements to render the appropriate viewer for each type.
- **Building one dashboard for all roles** — Overloading a single page with conditional elements for three roles makes it complex, slow, and hard to maintain Fix: Create separate dashboard pages for each role with dedicated layouts and data sources
- **Not tracking individual lesson progress** — Without per-lesson tracking, students cannot resume where they left off and completion percentage is inaccurate Fix: Create a LessonProgress record when each lesson is completed and calculate progress from these records

## Best practices

- Use separate dashboard pages for each role instead of one page with many conditions
- Track progress at the lesson level for accurate completion tracking
- Host videos externally and embed via iframe to save Bubble storage
- Send notifications when assignments are graded or new content is published
- Use Privacy Rules to ensure students only see their own grades and submissions
- Create a notification system for due date reminders and grade announcements

## Frequently asked questions

### Can I host videos directly in Bubble?

Technically yes, but it is not recommended. Video files are large and consume storage quickly. Host on YouTube (unlisted), Vimeo, or Loom and embed via iframe.

### How do I handle multiple instructors per course?

Change the instructor field to a list of Users, or create a CourseInstructor Data Type linking courses to users with role information.

### Can students leave course reviews?

Yes. Create a Review Data Type with course, student, rating, and comment fields. Display reviews on the course catalog page.

### How do I implement a discussion forum per course?

The Discussion and Reply Data Types in the data structure support this. Display discussions in a Repeating Group on the course page, with nested replies.

### Is Bubble suitable for a large educational platform?

For small to medium platforms (hundreds to low thousands of students), yes. For large-scale platforms, consider hybrid architecture with external services for video delivery and search. RapidDev can help architect scalable educational platforms.

### Can I issue certificates upon course completion?

Yes. When all lessons are completed, generate a certificate page with the student's name, course title, and completion date. Add a Print button using JavaScript's window.print().

---

Source: https://www.rapidevelopers.com/bubble-tutorial/build-an-educational-platform-in-bubble
© RapidDev — https://www.rapidevelopers.com/bubble-tutorial/build-an-educational-platform-in-bubble
