chore: improve enrollment documentation

This commit is contained in:
Rotimi Best
2026-06-10 02:56:00 +01:00
parent bb88847570
commit ab25b8e5d7
33 changed files with 1442 additions and 728 deletions
+57 -3
View File
@@ -1,10 +1,64 @@
---
title: Course
description: Learn about courses in ClassroomIO.
description: Overview of courses in ClassroomIO — lifecycle, settings, admin areas, and links to detailed guides.
---
import { Callout } from 'fumadocs-ui/components/callout';
<Callout type="warn" title="Work in Progress">
This page is a work in progress. Help us expand it by contributing!
A **course** in ClassroomIO is a container for lessons, exercises, people, and settings. Students enroll into a course to access its content in the LMS. This page summarizes how courses work for admins. For step-by-step setup, start with [Creating Your First Course](/docs/how-to-guides/create-first-course).
## Course lifecycle
| State | Meaning |
| --- | --- |
| **Draft / unpublished** | Not visible in Explore or on the public landing page; open self-enrollment is blocked, but invite links still work |
| **Published** | Live on your academy; visible in Explore and on the public landing page |
| **Deleted** | Soft-deleted; no longer appears anywhere in the app |
Publishing makes a course discoverable. Combine publish state with **Allow New Students**, price, and invites to control who can actually join. See [How Course Enrollment Works](/docs/how-to-guides/course-enrollment).
## Key settings
| Setting | Where | Effect |
| --- | --- | --- |
| **Published** | Course **Settings** | Turns the course on for your academy |
| **Allow New Students** | Course **Settings** | Public **Enroll** on the landing page |
| **Price** | **Landing page** editor | Free vs paid enrollment |
| **Course type** | Course **Settings** | Changes nav, compliance, and public access behavior |
<Callout type="info" title="Course type changes more than a label">
Self-paced, Live class, Compliance, and Public types change what admins and students see in the app. See [Course Types](/docs/how-to-guides/course-types) for when to use each.
</Callout>
## Admin areas inside a course
When you open a course from the **Courses** list, the sidebar gives you:
| Area | Purpose |
| --- | --- |
| **Content** | Lessons, sections, exercises, media |
| **People** | Members, invites, pending students |
| **Settings** | Publish, Allow New Students, course type, links |
| **Landing page** | Public page prospects see before enrolling |
| **Compliance** | Appears for **Compliance** courses; tracking and bulk actions |
| **Marks** | Appears for **Live class** courses; grading |
## People and enrollment
The **People** tab lists everyone in the course group. Members appear when they enroll or when you add them from **Add people**. Email-only invites show as **Pending** until the student signs in.
Enrollment paths (public, invite link, admin assignment, paid) are documented in [How Course Enrollment Works](/docs/how-to-guides/course-enrollment). For sending invites, see [How to Invite Students](/docs/how-to-guides/invite-students).
## What students see
After enrolling, students open the course from **Home** or **My Learning** in the [Student Dashboard](/docs/student-dashboard). Published courses they have not joined yet may appear in **Explore**.
## Related guides
- [Creating Your First Course](/docs/how-to-guides/create-first-course)
- [Course Types](/docs/how-to-guides/course-types)
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment)
- [How to Invite Students](/docs/how-to-guides/invite-students)
- [Create a Course Landing Page](/docs/how-to-guides/course-landingpage)
- [Student Dashboard](/docs/student-dashboard)
+1 -1
View File
@@ -35,7 +35,7 @@ We support OIDC-based SSO with the following identity providers:
## How It Works
### Org-Site Login
### Academy Login
When users visit your organization's custom domain (e.g., `yourorg.classroomio.com`), SSO is automatically detected and they can sign in directly with your IdP.
### Shared App Login
@@ -13,26 +13,26 @@ Enrollment is how a student becomes a member of a course group and gets access t
| Path | Who initiates it | Typical use |
| --- | --- | --- |
| **Public self-enrollment** | Student | Open free courses on your landing page |
| **Course invite link** | You (admin) | Send a secure link to specific people |
| **Admin assignment** | You (admin) | Add org members directly from **People** |
| **Email invite** | You (admin) | Enter email addresses; ClassroomIO sends each recipient a unique enrollment link |
| **Direct add** | You (admin) | Pick existing students from a list; they are enrolled instantly with no action needed from them |
| **Paid enrollment** | Student (after payment) or invite | Courses with a price set |
All paths end at the same place: the student is added to the course **group** and can open the course in the LMS.
## What students need before they can enroll
For any self-service path (landing page or invite link), the course must be:
For **public** self-service paths (landing page, Explore), the course must be:
- **Published** — unpublished courses do not accept new enrollments from the public site
- **Active** — archived or inactive courses are blocked
- **Published** — unpublished courses are not listed in Explore and do not accept open enrollment from the public site
- **Active** — deleted courses are blocked in all paths
The student must also have (or create) a ClassroomIO account and belong to your organization when they complete enrollment.
**Email invites are an exception:** a valid invite token lets a student join a course even if it is unpublished. This lets you pre-enroll students before a course goes live. The course must still not be deleted.
## Public self-enrollment (free courses)
On a **free** course (`cost` is 0) with **Allow New Students** enabled, anyone who finds your course landing page can enroll:
1. They open the course landing page on your org site
1. They open the course landing page on your academy
2. They click **Enroll**
3. They sign in or sign up
4. They land on `/course/[slug]/enroll` and click **Join course**
@@ -44,41 +44,29 @@ No invite token is required. This is the default for free, published courses.
In the course dashboard, go to **Settings** and find **Allow New Students**. When enabled, anyone can self-enroll from the course landing page. When disabled, the public **Enroll** button is hidden and open self-enrollment is blocked — but **course invite links** and **People → Add people** still work.
</Callout>
## Course invite links
## Email invites
Invite links let you give specific people a URL to join a course. Each invite can have:
From **People → Add people**, you enter one or more email addresses and ClassroomIO sends each recipient a unique enrollment link. Each invite can have:
- An **expiry** (e.g. 24 hours, 7 days)
- A **max use** count (one-time or reusable)
- **Allowed emails** or domains (optional restriction)
The path is always `/course/<course-slug>/enroll?invite_token=...` on your **org site** (not the admin app at `app.classroomio.com`). The host depends on how your organization is set up:
When a student opens the link, they sign in (or sign up) and click **Join course**. ClassroomIO validates the token, expiry, and usage limit before enrolling them.
- **Default tenant site:** `https://<siteName>.myclassroomio.com/course/your-course-slug/enroll?invite_token=...`
Example: if your org site name is `ciodevs`, the link starts with `https://ciodevs.myclassroomio.com/...`
- **Custom domain (verified):** `https://learn.yourcompany.com/course/your-course-slug/enroll?invite_token=...`
For step-by-step instructions, see [How to Invite Students](/docs/how-to-guides/invite-students).
ClassroomIO picks the verified custom domain when you have one; otherwise it uses your `<siteName>.myclassroomio.com` subdomain. Invite emails and the **People** flow generate the correct URL for your org automatically.
When a student opens a valid invite, they sign in (or sign up) and click **Join course**. ClassroomIO validates the token, expiry, usage limit, and email restrictions before enrolling them.
For step-by-step instructions on creating and managing invites, see [How to Invite Students](/docs/how-to-guides/invite-students).
<Callout type="info" title="Invite links work on closed courses">
**Allow New Students** can be off and invite links still work. The toggle only blocks unsolicited self-enrollment from the landing page; it does not block people you explicitly invited.
<Callout type="info" title="Email invites work on closed or unpublished courses">
**Allow New Students** can be off and email invites still work. The toggle only blocks unsolicited self-enrollment from the landing page; it does not block people you explicitly invited. Invites also work on **unpublished** courses, so you can pre-enroll students before a course goes live.
</Callout>
## Admin assignment (People)
## Direct add (People)
You can add students without them using the landing page or an invite link. From the course dashboard:
If a student already has an account, you can add them to the course directly — no email, no link, no action needed from them. They appear in the course immediately.
1. Open **People**
2. Click **Add people**
3. Use **Invite Students** to either:
- **Grant access** to students who already exist in your organization, or
- **Invite by email** — import new recipients into your org and pre-assign them to this course
From the course dashboard, open **People → Add people**, select the students you want, and confirm. They are enrolled right away.
Admin assignment does **not** require **Allow New Students** to be on. Use this when you want a closed course where only people you add manually can access content.
This does **not** require **Allow New Students** to be on. Use it for closed courses where you control exactly who gets access.
<Callout title="Already enrolled students">
Revoking an invite or turning off public enrollment does not remove students who have already joined. It only blocks future enrollments through that path.
@@ -95,15 +83,61 @@ Paid courses are useful when you want to prevent casual sign-ups on a free landi
| Goal | Suggested setup |
| --- | --- |
| Anyone can join | Free course, published, **Allow New Students** on |
| Only people with invite links | **Allow New Students** off (optional), send [course invites](/docs/how-to-guides/invite-students) |
| Only people you add manually | **Allow New Students** off, use **People → Add people** (no invite link needed) |
| Only people you email invites to | **Allow New Students** off (optional), send [email invites](/docs/how-to-guides/invite-students) |
| Only people you add manually | **Allow New Students** off, use **People → Add people** to directly enroll existing students |
| Paywall + optional invites | Set a price, send invites to buyers who should skip or supplement checkout |
| Visible in catalog, enrollment closed | Published course, **Allow New Students** off, use invites or **People** to add members |
| All students in your org can join any published course | Enable **Internal Enrollment Only** in **Settings → Authentication → General**; students bypass per-course **Allow New Students** |
## Organization-level signup (separate from course enrollment)
## Enrollment vs visibility
Course enrollment is different from **organization signup**. In **Organization settings**, you can disable public signups so that only users with an **organization invite link** can create an account on your site.
Restricting who can **join** a course is not the same as hiding it from every student view.
That setting controls who can join your **org**, not who can join a specific **course**. A student might be in your org but not enrolled in any course until you assign them or they self-enroll on a published course.
| Control | What it affects |
| --- | --- |
| **Published** | Whether the course is live on your academy and eligible for Explore |
| **Allow New Students** | Whether the public **Enroll** button works on the landing page |
| **Email invites** | Who can join via a link sent to their email (works even on unpublished or closed courses) |
| **People → Add people** | Who you add directly, with or without an invite link |
| **Price** | Whether open self-enrollment requires payment |
| **Internal Enrollment Only** (org-wide) | When on, any student in your organization can self-enroll in any published course, bypassing per-course **Allow New Students** |
<Callout type="warn" title="Explore shows published courses">
**Explore** in the student LMS lists published courses the student has not enrolled in yet. Turning off **Allow New Students** blocks open enrollment from the landing page. It does **not** remove the course from Explore. ClassroomIO does not support hiding a published course from specific people in Explore today.
</Callout>
**Workarounds:**
- Keep the course **unpublished** until you are ready for students to discover it.
- Use **Allow New Students** off plus invites or **People** so only the people you choose can actually join.
- Accept that enrolled students may see the course in Explore even when they cannot self-enroll.
For where students see enrolled vs available courses, see [Student Dashboard](/docs/student-dashboard).
## People and membership
When a student enrolls or you add them from **People**, they become a member of the course **group** right away. They do not need to open a lesson first.
| State | What it means |
| --- | --- |
| **Active member** | Linked to a profile; appears in **People** with full details |
| **Pending** | Added by email before they sign in or finish onboarding |
The **People** tab in the course dashboard is the source of truth for course membership.
<Callout type="info" title="People vs Compliance status">
**Compliance** courses also track completion status (for example **not started**). That is separate from membership. A student can appear in **People** as soon as they are enrolled while still showing **not started** on the Compliance dashboard until they begin the course.
</Callout>
## Organization-level access settings (separate from course enrollment)
Course enrollment is different from **organization signup**. In **Settings → Authentication → General**, you have two org-level controls that work together:
**Disable Signup / Allow Public Signups** — controls who can create an account on your academy. When signup is disabled (invite-only), only people you invite can register. This controls who can sign up, not which courses they can join.
**Internal Enrollment Only** — when enabled, any student in your organization can self-enroll in any published course without needing the course to have **Allow New Students** turned on. This is useful for internal academies: disable public signup, add employees via course invite links (which creates their account as a student in your organization), and they can then discover and join any other published course themselves without per-course admin work.
A student might be in your org but not enrolled in any course until you assign them, they self-enroll on a course with **Allow New Students** on, or **Internal Enrollment Only** is enabled org-wide.
## What students see after enrolling
@@ -129,7 +163,7 @@ Turn **Allow New Students** off to hide public enrollment. From **People**, send
<Step>
### Staff-only or hand-picked list
Turn **Allow New Students** off. Add each student from **People → Add people** (existing org members or email import). No public self-enrollment; use direct assignment or invite links as needed.
Turn **Allow New Students** off. Use **People → Add people** to directly enroll existing students, or send email invites to people who do not have an account yet. No one can self-enroll.
</Step>
<Step>
@@ -137,10 +171,19 @@ Turn **Allow New Students** off. Add each student from **People → Add people**
Set the course price on the landing page. Students pay to enroll, or you send invites to people who should receive complimentary access.
</Step>
<Step>
### Closed org academy — any student can join any course
Enable **Disable Signup** and **Internal Enrollment Only** in **Settings → Authentication → General**. Add employees by sending them course invite links from **People → Add people** — accepting a course invite creates their account as a student in your organization. Once they are students in your org, they can discover and self-enroll in any other published course from Explore without per-course setup. **Allow New Students** on individual courses is bypassed for students when this setting is on.
</Step>
</Steps>
## Related guides
- [How to Invite Students](/docs/how-to-guides/invite-students) — create, send, and revoke course invite links
- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — who can create courses and access the admin dashboard
- [Student Dashboard](/docs/student-dashboard) — Home, My Learning, Explore, and Programs
- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — org URLs used in enrollment links
- [Create a Course Landing Page](/docs/how-to-guides/course-landingpage) — pricing, publish state, and what prospects see before enrolling
- [Creating Your First Course](/docs/how-to-guides/create-first-course) — create and publish a course
@@ -1,26 +1,95 @@
---
title: Create a Course Landing Page
description: Learn how to create a course landing page.
description: Build and edit a course landing page, including pricing, hero buttons, preview, and publish settings.
---
ClassroomIO empowers you to design a course landing page, enabling you to showcase your courses to prospective students. On this page, students can explore course details, enrollment statistics, fees (if applicable), and course availability, enabling them to make informed choices. To access this, from your admin dashboard, navigate to **Settings** > **Landing Page.**
import { Callout } from 'fumadocs-ui/components/callout';
import { Step, Steps } from 'fumadocs-ui/components/steps';
## Steps
A **course landing page** is the public page for one course. Prospects read the description, see pricing, and click **Enroll** if enrollment is open. This is separate from your [academy landing page](/docs/how-to-guides/org-landing-page), which is the academy homepage.
### 1. Go to the Courses page
## Open the editor
Once you are logged in, click on **Courses** on the left sidebar, you will be taken to your course list page where you can access the courses you have created. For this tutorial, we will focus on the **Intro to Javascript** course displayed in the image below. Click on the desired course to proceed to its respective dashboard.
<Steps>
<Step>
### Select a course
![ClassroomIO Landing Page](/course-landing-page.webp)
From the admin dashboard, open **Courses** and click the course you want.
</Step>
### 2. Open the Landing page editor
<Step>
### Open Landing page
Select the "**Landing page**" option from the sidebar, which will lead you to the settings for your landing page. Here, you can customize various aspects of your course, including the course title, fees (if applicable), requirements, description, and more.
In the course sidebar, click **Landing page** to open the editor.
</Step>
![ClassroomIO Course Page](/course-page.png)
<Step>
### Edit sections
### 3. Edit and Save your changes
Update sections such as hero, description, requirements, pricing, instructors, and footer. Click **Save** when finished.
</Step>
After making the desired adjustments, ensure to save your changes by clicking on the "**Save**" button located at the top-left corner of the screen. Then, to preview the updated landing page, click on the arrow button situated to the right of the "**Save**" button.
<Step>
### Preview
![ClassroomIO Course Page Settings](/landing-page.png)
Use the preview control next to **Save** to see the page. Confirm behavior on the live academy for links and enroll buttons.
</Step>
</Steps>
## Editor sections
| Section | What you configure |
| --- | --- |
| **Hero** | Title, subtitle, primary CTA (e.g. Enroll, Get Started) |
| **Description** | Course overview for prospects |
| **Requirements** | Prerequisites or audience notes |
| **Pricing** | Price and currency |
| **Instructors** | Instructor cards |
| **Footer** | Supporting links and copy |
Hero and pricing interact with [course enrollment](/docs/how-to-guides/course-enrollment): a free course with **Allow New Students** on shows an open **Enroll** button; paid or closed courses route visitors through payment or invites.
## Pricing and currency
Set the course price in the **Pricing** section. ClassroomIO supports these currencies today:
| Currency | Code |
| --- | --- |
| US Dollar | USD |
| Nigerian Naira | NGN |
<Callout type="info" title="Other currencies">
If you need a currency outside USD and NGN, that requires product support today. Pick the closest supported currency or keep the course free and handle payment outside ClassroomIO.
</Callout>
## Publish and Allow New Students
Landing page content can be ready before you open enrollment:
| Course **Settings** | Effect on landing page |
| --- | --- |
| **Published** | Page is live on your academy |
| **Allow New Students** | Public **Enroll** works (for free courses) |
| **Price > 0** | Enrollment requires payment or a valid invite |
See [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) for closed cohorts and invite-only access.
## Preview vs live site
The in-app preview shows layout and copy. Test **Enroll**, external links, and payment on your live academy URL (subdomain or [custom domain](/docs/how-to-guides/custom-domain)) before sharing publicly.
<Callout type="warn" title="Org landing page preview">
The org homepage preview in **Settings → Landing Page** disables link clicks. Course landing previews should still be checked on the live site for enrollment flows.
</Callout>
## What students see after enrolling
After a successful enroll, students land in the [Student Dashboard](/docs/student-dashboard) (**Home** / **My Learning**). The course may disappear from **Explore** once they are a member.
## Related guides
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — who can join and how Explore relates to publish settings
- [How to Invite Students](/docs/how-to-guides/invite-students) — invite links when public enroll is off
- [Course Types](/docs/how-to-guides/course-types) — how type affects public vs LMS access
- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — host for your landing page URL
- [Creating Your First Course](/docs/how-to-guides/create-first-course)
@@ -0,0 +1,73 @@
---
title: Course Types
description: Learn what Self-paced, Live class, Compliance, and Public course types do in ClassroomIO and when to use each.
---
import { Callout } from 'fumadocs-ui/components/callout';
Course **type** is set in each course's **Settings**. It is easy to miss because the dropdown alone does not show every change. Types mainly affect admin navigation, compliance tracking, grading, and whether the course uses the normal enroll-and-LMS flow.
## Types at a glance
| Type | Best for | Main differences |
| --- | --- | --- |
| **Self-paced** | Default online courses | Standard LMS; students progress at their own pace |
| **Live class** | Instructor-led with grading | **Marks** nav for grading exercises |
| **Compliance** | Required training with deadlines | **Compliance** dashboard, due dates, retakes, bulk actions |
| **Public** | Open content without login | Anonymous lesson access; no normal enrollment flow |
## Self-paced
**Self-paced** is the default. Students enroll, open lessons in the LMS, and complete exercises on their schedule. Auto-grading applies to many exercise types in self-paced and compliance courses.
Use self-paced for standard training, onboarding content, and evergreen material.
## Live class
**Live class** adds instructor grading workflows. Admins and tutors see a **Marks** section in the course sidebar to review and grade student work.
Use live class when an instructor scores assignments and you need a dedicated grading view.
## Compliance
**Compliance** turns on compliance-specific tooling:
- **Compliance** nav in the course sidebar
- Passing scores, due dates, and retake rules
- Bulk actions on student status
- Completion tracking (including **not started** before a student opens content)
- Certificate rules tied to compliance settings
Use compliance for mandatory training where you must track who completed requirements by a deadline.
<Callout type="info" title="Compliance status vs People membership">
A student can appear in **People** as soon as they enroll while still showing **not started** on the Compliance dashboard. Membership and completion status are separate.
</Callout>
## Public
**Public** courses skip the normal enroll-and-LMS path. Visitors can access lesson content anonymously. The landing page routes toward lesson content rather than a **Join course** flow.
Use public when you want open educational content without requiring accounts. Public courses are not a substitute for private cohort enrollment.
<Callout type="warn" title="Changing type on an existing course">
Switching type after launch can change which sidebar items appear and how completion is tracked. Pick the type that matches your delivery model before students enroll when possible.
</Callout>
## Why types can feel identical in Settings
If you only flip the type dropdown, the course title and content look the same. The differences show up in:
- Which sidebar items appear (**Marks**, **Compliance**)
- How exercises are graded
- Whether anonymous public access is used
- How completion and certificates are evaluated
Open the course sidebar after changing type to confirm the right tools are available.
## Related guides
- [Course](/docs/course) — course overview and admin areas
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — enrollment (not used for Public in the same way)
- [Student Dashboard](/docs/student-dashboard) — student LMS views
- [Creating Your First Course](/docs/how-to-guides/create-first-course)
@@ -0,0 +1,80 @@
---
title: Set Up a Custom Domain
description: Connect and verify a custom domain for your ClassroomIO academy and learn which links use your org URL.
---
import { Callout } from 'fumadocs-ui/components/callout';
import { Step, Steps } from 'fumadocs-ui/components/steps';
Every organization gets a default site at `https://<siteName>.myclassroomio.com`. You can connect your own domain (for example `https://learn.yourcompany.com`) so students see your brand in the browser bar and in links.
## How ClassroomIO picks a base URL
When ClassroomIO builds a link for your organization, it resolves the host in this order:
1. **Verified custom domain** → `https://<your-domain>`
2. **Self-hosted override** (`DASHBOARD_ORIGIN` env var, if set)
3. **Development** → `http://localhost:5173`
4. **Academy URL** → `https://<siteName>.myclassroomio.com`
5. **Fallback** → `https://app.classroomio.com`
Most customer-facing course links use your org context and stop at step 1 or 4. The `app.classroomio.com` fallback applies when no academy URL is available.
## Set up your domain
<Steps>
<Step>
### Open domain settings
From the admin dashboard, go to **Settings → Organization**, then click **Edit domain** in the Custom Domain section.
</Step>
<Step>
### Enter your domain
Add the hostname you want (for example `learn.yourcompany.com`). Follow the DNS instructions ClassroomIO shows to verify ownership.
</Step>
<Step>
### Wait for verification
Verification can take time while DNS propagates. The domain must show as verified before links use it.
</Step>
<Step>
### Test on the live site
Open your custom domain in a browser. Sign in, open a course landing page, and confirm URLs stay on your domain.
</Step>
</Steps>
<Callout type="warn" title="Verification required">
An unverified custom domain is not used for generated links. Until verification succeeds, ClassroomIO keeps using `<siteName>.myclassroomio.com`.
</Callout>
## Which links use your org URL
| Link type | Uses org domain when verified? |
| --- | --- |
| Course enrollment (`/course/.../enroll`) | Yes |
| Course invite emails from **People** | Yes |
| Org site landing page and course catalog | Yes |
| Organization team invite (some flows) | May still use platform URL until fully aligned |
Course invites are documented in [How to Invite Students](/docs/how-to-guides/invite-students). Those links should point at your academy, not `app.classroomio.com`, when your domain is verified.
## Email sender address
Invite and notification emails may still send from the ClassroomIO platform mail address. Your **organization name** appears in the message body; the sender inbox is not fully white-labeled today.
## Student login and redirects
Students should sign in on your academy so sessions and redirects stay on your academy URL. If login sends users to `app.classroomio.com` unexpectedly, check that the custom domain is verified and that you are sharing academy links (not the generic app URL).
## Related guides
- [Customize Your Organization](/docs/how-to-guides/customize-organization) — org profile and default subdomain
- [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page) — public homepage on your domain
- [How to Invite Students](/docs/how-to-guides/invite-students) — enrollment links on your academy
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — enrollment paths and org signup
- [Organization](/docs/organization) — org settings overview
@@ -91,8 +91,17 @@ Click on Update Domain to save the changes.
</Step>
</Steps>
<Callout title="⏳ Coming Soon">Organizations can also integrate existing domain names.</Callout>
For full custom domain setup (DNS, verification, which links use your domain), see [Set Up a Custom Domain](/docs/how-to-guides/custom-domain).
For the public homepage (hero, nav, footer), see [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page).
## Set Brand Color
We understand that every organization has a preferred color that suits their brand, hence we offer organizations the flexibility to choose a theme for their brand from a variety of colors like **blue**, **green**, **orange**, and more. To select a brand color for your organization simply click on any of the provided color theme and this would be automatically applied across your entire application.
## Related guides
- [Organization](/docs/organization) — org settings overview
- [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page) — public homepage
- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — your own hostname
- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — team access
@@ -12,13 +12,13 @@ For a full overview of enrollment paths (public enroll, invites, admin assignmen
## How course invitations work
- **Email-based invites:** You enter one or more email addresses (or paste a list). ClassroomIO creates a unique invite per recipient and can send the enrollment link by email.
- **Enrollment link:** Each invite link points to an **enrollment page** on your org site (not `app.classroomio.com`). The path is `/course/your-course-slug/enroll?invite_token=...` on either `https://<siteName>.myclassroomio.com` (e.g. `https://ciodevs.myclassroomio.com/...`) or your verified custom domain (e.g. `https://learn.yourcompany.com/...`). When a student opens the link, they see the course details and a **Join course** button.
- **One link per invite:** Invite links are tied to the course and (for paid or restricted courses) to the invite’s rules (expiry, max uses, allowed emails). Students sign in or sign up when they click **Join course**, then they’re enrolled and redirected to the learning dashboard.
- **Enrollment link:** Each invite link points to an **enrollment page** on your academy (not `app.classroomio.com`). The path is `/course/your-course-slug/enroll?invite_token=...` on either `https://<siteName>.myclassroomio.com` (e.g. `https://ciodevs.myclassroomio.com/...`) or your verified custom domain (e.g. `https://learn.yourcompany.com/...`). When a student opens the link, they see the course details and a **Join course** button.
- **One link per invite:** Invite links are tied to the course and (for paid or restricted courses) to the invite's rules (expiry, max uses, allowed emails). Students sign in or sign up when they click **Join course**, then they're enrolled and redirected to the learning dashboard.
## Free vs paid courses
- **Free courses:** Students can enroll without an invite. From the course landing page they click **Enroll** and are taken to the same enrollment page (`/course/:slug/enroll`) with no token; they sign in or sign up and are enrolled immediately.
- **Paid or invite-only courses:** Students need either to pay (if you’ve set up payment) or to use a valid invite link. If they open the enrollment page without a valid invite or payment, they’ll see a message that they need to pay or be invited.
- **Paid or invite-only courses:** Students need either to pay (if you've set up payment) or to use a valid invite link. If they open the enrollment page without a valid invite or payment, they'll see a message that they need to pay or be invited.
## Sending email invites
@@ -59,21 +59,28 @@ Each recipient gets a unique link to the course enrollment page with their invit
1. **Email:** If you sent invite emails, the student receives an email containing the course name, your organization name, and a link to the enrollment page.
2. **Enrollment page:** Opening the link takes them to `/course/[course-slug]/enroll?invite_token=...`. They see the course title and description and a **Join course** button.
3. **Sign in or sign up:** If they’re not signed in, clicking **Join course** sends them to sign in or create an account. After that, they’re returned to the enrollment page (the redirect is preserved).
4. **Enrolled:** Once they’re signed in and click **Join course**, they’re enrolled in the course and redirected to the learning dashboard (e.g. **LMS** or **Home**).
3. **Sign in or sign up:** If they're not signed in, clicking **Join course** sends them to sign in or create an account. After that, they're returned to the enrollment page (the redirect is preserved).
4. **Enrolled:** Once they're signed in and click **Join course**, they're enrolled in the course and redirected to the learning dashboard (e.g. **LMS** or **Home**).
## Managing invites
From the same **People** > **Invite** flow, use the **Existing invites** (or **History**) tab to:
- See invites you’ve created, their expiry and usage.
- See invites you've created, their expiry and usage.
- **Revoke** an invite so its link can no longer be used.
Revoking does not remove students who have already joined; it only invalidates the invite link for future use.
## Tips
- **Free courses:** You don’t need to create invites for free courses; students can enroll directly from the course landing page.
- **Free courses:** You don't need to create invites for free courses; students can enroll directly from the course landing page.
- **Paid courses:** Use email invites (or payment) so only the right people can enroll.
- **Expiry and uses:** Use short expiry and one-time use for sensitive or limited spots; use longer expiry and multiple uses for open cohorts or self-paced courses.
- **Redirect after login:** If a student follows an invite link while logged out, they’re sent to sign in or sign up and then back to the same enrollment page so they can complete joining.
- **Redirect after login:** If a student follows an invite link while logged out, they're sent to sign in or sign up and then back to the same enrollment page so they can complete joining.
## Related guides
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — enrollment paths, Allow New Students, and Explore visibility
- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — who can manage courses vs learn in the LMS
- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — which host appears in invite links
- [Student Dashboard](/docs/student-dashboard) — where students land after joining
@@ -4,11 +4,14 @@
"customize-organization": "Customize Your Organization",
"course-landingpage": "Create a Course Landing Page",
"course-enrollment": "How Course Enrollment Works",
"setup-profile": "Setup Profile",
"course-types": "Course Types",
"certificates": "How to Create Certificates",
"grade-exercise": "How to Grade an Exercise",
"invite-students": "How to Invite Students",
"invite-team-member": "Inviting a Team Member",
"take-attendance": "How to Take Attendance",
"use-math-in-editor": "Use Math in the Editor"
"use-math-in-editor": "Use Math in the Editor",
"roles-and-permissions": "Roles and Permissions",
"org-landing-page": "Customize Your Academy Landing Page",
"custom-domain": "Set Up a Custom Domain"
}
@@ -0,0 +1,77 @@
---
title: Customize Your Academy Landing Page
description: Edit your academy landing page, including nav, hero buttons, footer, preview mode, and what the summary labels mean.
---
import { Callout } from 'fumadocs-ui/components/callout';
import { Step, Steps } from 'fumadocs-ui/components/steps';
Your **academy landing page** is the public homepage for your academy (for example `https://ciodevs.myclassroomio.com` or your custom domain). Students and prospects see it before they sign in. This guide covers the editor in **Settings → Landing Page**.
For org profile and subdomain setup, see [Customize Your Organization](/docs/how-to-guides/customize-organization) and [Set Up a Custom Domain](/docs/how-to-guides/custom-domain).
## Open the landing page settings
<Steps>
<Step>
### Go to Settings
From the admin dashboard, open **Settings**, then select **Landing Page**.
</Step>
<Step>
### Review the summary card
The right-hand card shows your current theme, hero heading, and nav link count. Click **Customize** to open the full editor.
</Step>
</Steps>
## What "2 links" next to Nav means
On the summary card, **Nav** may show a label like **2 links**. That is a **count of navigation items** you configured in the landing page editor. It is not a separate setting named "2 links."
| Label | Meaning |
| --- | --- |
| **1 link** | One item in the top navigation |
| **2 links** | Two items in the top navigation |
Edit the actual links in the customize flow (labels and URLs for each nav item).
## Hero buttons
The hero section supports a primary and optional secondary action.
| Button | Typical default | What to configure |
| --- | --- | --- |
| **Primary** (e.g. Get Started, Start Learning) | Often points to `/login` | Label and destination URL |
| **Secondary** (e.g. View Programs) | Optional second CTA | Label and destination URL |
Use your academy paths (for example `/login` or `/courses`) so visitors stay on your academy domain. After you verify a [custom domain](/docs/how-to-guides/custom-domain), test buttons on the live site, not only in preview.
<Callout type="warn" title="Preview disables link clicks">
The thumbnail preview on the Landing Page settings screen renders with links disabled. Use **Open Academy** or open your live academy URL to test buttons like **Get Started** and **View Programs**.
</Callout>
## Footer
The footer editor lets you set brand text, link columns, social links, and bottom bar copy. Save changes in the editor, then check the live site. If footer text looks wrong in preview, confirm on the published page.
## Themes
ClassroomIO ships multiple landing themes. Some themes require a paid plan. If customize is locked, upgrade or pick a theme included in your plan.
## Preview vs live site
| Mode | Behavior |
| --- | --- |
| **Settings preview** | Scaled thumbnail; course and nav links do not navigate |
| **Live academy** | Full behavior; use this to validate CTAs and footer |
Always validate hero and footer links on the live site before sharing the URL externally.
## Related guides
- [Customize Your Organization](/docs/how-to-guides/customize-organization) — org name, logo, brand color
- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — use your own domain on the landing page
- [Create a Course Landing Page](/docs/how-to-guides/course-landingpage) — per-course public pages (separate from the org homepage)
- [Student Dashboard](/docs/student-dashboard) — where students go after signing in
@@ -0,0 +1,62 @@
---
title: Roles and Permissions
description: Understand org roles in ClassroomIO, who can create courses, and how admin access differs from the student LMS.
---
import { Callout } from 'fumadocs-ui/components/callout';
ClassroomIO uses organization roles to control what each person can do. This guide covers the three built-in roles, who can create courses, and how that relates to course enrollment (which is controlled separately per course).
## Organization roles
| Role | Typical use | Admin dashboard | Create courses | Edit course content |
| --- | --- | --- | --- | --- |
| **Admin** | Org owners, lead instructors | Yes | Yes | Yes (all org courses) |
| **Tutor** | Instructors, content authors | Yes | No | Yes (courses they teach) |
| **Student** | Learners | No (LMS only) | No | No |
Admins have full control over organization settings, billing, domains, and all courses. Tutors can manage content for courses they are assigned to but cannot create new courses or change org-wide settings. Students use the [Student Dashboard](/docs/student-dashboard) to learn.
<Callout type="info" title="Per-person enroll or create toggles">
ClassroomIO does not support per-person flags like "this user can create courses but that user cannot." Access is set by role. To limit who joins a **course**, use course settings, invites, and **People** instead. See [How Course Enrollment Works](/docs/how-to-guides/course-enrollment).
</Callout>
## Who can create courses
Only **Admins** can create new courses. The create-course action requires admin permissions on the API.
Tutors and students cannot create courses. If someone needs to author content, assign them as a **Tutor** on the course or promote them to **Admin** if they also need org-level access.
## Admin dashboard vs student LMS
| Area | Who sees it | URL pattern |
| --- | --- | --- |
| **Admin dashboard** | Admins and Tutors | Course management, org settings, analytics |
| **Student LMS** | All signed-in users | `/lms` and related paths |
Students sign in on your academy and land in the LMS. Admins and tutors can switch to the admin dashboard to manage courses and settings.
## Inviting team members
To add Admins or Tutors, use [Inviting a Team Member](/docs/how-to-guides/invite-team-member). Team invites are separate from [student course invites](/docs/how-to-guides/invite-students).
## Organization signup vs course enrollment
Two different gates often get mixed up:
| Setting | Controls |
| --- | --- |
| **Organization signup** | Who can create an account on your academy |
| **Course enrollment** | Who can join a specific course |
A person can be in your organization (org signup) without being enrolled in any course. Likewise, course **Allow New Students**, invites, and **People** only affect that course.
Configure org signup under **Settings → Organization**. Configure per-course access under each course's **Settings** and **People** tabs.
## Related guides
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — restrict who can join each course
- [How to Invite Students](/docs/how-to-guides/invite-students) — course enrollment links
- [Inviting a Team Member](/docs/how-to-guides/invite-team-member) — add admins and tutors
- [Student Dashboard](/docs/student-dashboard) — what students see in the LMS
- [Organization](/docs/organization) — org settings overview
@@ -1,45 +0,0 @@
---
title: Setup Profile
description: Learn how to setup your profile on ClassroomIO.
---
import { Step, Steps } from 'fumadocs-ui/components/steps';
<Steps>
<Step>
### Go to ClassroomIO
Go to [app.classroomio.com](https://app.classroomio.com). Click on the "Login" button on the top right to take you to the Login page.
![ClassroomIO Page](/classroomio.webp)
</Step>
<Step>
### Sign In
Sign in with your email & password.
![ClassroomIO Page](/login-page.webp)
</Step>
<Step>
### Go to the Settings page
Click on the "Settings" button on the lower left corner on your dashboard page and you'll be routed to the profile page.
![Unedited Profile Page](/unedited-profile-page.webp)
</Step>
<Step>
### Make Changes
Upload a profile picture and edit any input field you want to then click "Update Profile".
![Edited Profile Page](/edited-profile-page.webp)
</Step>
</Steps>
+1
View File
@@ -3,6 +3,7 @@
"---Introduction---",
"home",
"what-is-classroomio",
"terminology",
"quickstart",
"---Core Features---",
+34 -4
View File
@@ -1,12 +1,42 @@
---
title: Organization
description: Learn about organizations in ClassroomIO.
description: Overview of organizations in ClassroomIO — settings, branding, domains, roles, and related guides.
---
import { Callout } from 'fumadocs-ui/components/callout';
<Callout type="warn" title="Work in Progress">
This page is a work in progress. Help us expand it by contributing!
An **organization** in ClassroomIO holds courses, people, branding, and your academy. Every admin and student belongs to an organization. This page points you to the right guides for setup and day-to-day management.
## What you configure at org level
| Area | Where | Guide |
| --- | --- | --- |
| Name, logo, brand color | **Settings → Organization** | [Customize Your Organization](/docs/how-to-guides/customize-organization) |
| Public homepage | **Settings → Landing Page** | [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page) |
| Custom domain | **Settings → Organization** | [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) |
| Team roles | **Settings → Organization** | [Roles and Permissions](/docs/how-to-guides/roles-and-permissions), [Inviting a Team Member](/docs/how-to-guides/invite-team-member) |
| Signup rules, Internal Enrollment Only | **Settings → Authentication → General** | [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) (org access section) |
## Default URL
On creation, each org gets `https://<siteName>.myclassroomio.com` as its academy URL. You can connect a [custom domain](/docs/how-to-guides/custom-domain) so students use your own hostname.
<Callout type="info" title="Academy vs admin app">
Share your academy URL with students. The generic `app.classroomio.com` host is for platform access when no org subdomain applies. Course and enroll links should use your academy when possible.
</Callout>
We will write about organizations here.
## Courses and programs inside an org
- **Courses** are individual learning containers. See [Course](/docs/course).
- **Programs** group courses with shared goals. See [Programs](/docs/programs).
- **Students** use the [Student Dashboard](/docs/student-dashboard) after they sign in.
## Related guides
- [Customize Your Organization](/docs/how-to-guides/customize-organization)
- [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page)
- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain)
- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions)
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment)
- [Course](/docs/course)
- [Programs](/docs/programs)
+60 -3
View File
@@ -1,10 +1,67 @@
---
title: Programs
description: Learn when to use Programs in ClassroomIO, the kinds of training they support, and how they work for both admins and learners.
description: Learn what Programs are in ClassroomIO, how goals work, and what students see in the Programs view.
---
import { Callout } from 'fumadocs-ui/components/callout';
<Callout type="warn" title="Coming Soon">
Full customer documentation for Programs is still being prepared. For now, this page is a placeholder and the draft content has been moved into the product PRD.
**Programs** group multiple courses into a structured learning path. Use them when students need to complete a set of courses toward a shared outcome (onboarding, certification prep, role-based training). Individual courses still live in the LMS; programs add goals and a dedicated **Programs** view for students.
## Programs vs courses
| Concept | Scope | Student view |
| --- | --- | --- |
| **Course** | Single content container with lessons | **Home**, **My Learning**, **Explore** |
| **Program** | Multiple courses with shared goals | **Programs** in the LMS |
A student can be enrolled in courses without belonging to a program, and in a program that references several courses. See [Student Dashboard](/docs/student-dashboard) for how those views fit together.
## Admin workflow
From the admin dashboard:
1. Create a program and add courses to it.
2. Configure program **Settings** (metadata, visibility, assignments).
3. Add **Goals** that define what success looks like.
4. Assign students to the program (existing students or by email invite).
Students assigned to a program see it under **Programs** in the LMS.
## Program goal types
When you add a goal in **Programs → Settings → Goals**, you pick a **type**. Each type measures progress differently.
| Type | Label in the app | What it measures |
| --- | --- | --- |
| `complete_all` | Complete all selected courses | Every selected course must be finished |
| `n_of_m` | Complete N of M selected courses | Student must finish a required count from the courses you select |
| `score` | Score above threshold on every course | Minimum score on each selected course |
| `pass_rate` | Team pass-rate threshold | Aggregate pass rate across the group |
| `readiness` | Readiness (no deadline) | Readiness tracking without a fixed deadline |
### Complete N of M selected courses (`n_of_m`)
This type asks: "finish at least **N** courses from the list I picked." You select the courses, then set **required count** (N). N cannot be larger than the number of courses selected.
If you see wording like "N of M" in the dropdown, **M** is the number of courses you selected, not a separate field called "cells."
<Callout type="info" title="Deadlines on goals">
Goals can also have deadline settings (absolute date, relative to join, recurring, or none). Configure these in the same goal form when creating or editing a goal.
</Callout>
## What students see
Students who belong to a program open **Programs** in the LMS to see their tracks and goal progress. Individual course lessons still open from enrolled courses in **Home** or **My Learning**.
| Need | Where to look |
| --- | --- |
| Progress on a program track | **Programs** |
| Lessons inside one course | **Home** or **My Learning** |
| Optional courses not yet joined | **Explore** |
## Related guides
- [Student Dashboard](/docs/student-dashboard) — Programs vs My Learning vs Explore
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — how students join courses inside a program
- [Course](/docs/course) — single-course overview
- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — who can manage programs and courses
+81 -3
View File
@@ -1,10 +1,88 @@
---
title: Student Dashboard
description: Learn about the student dashboard.
description: Learn how students navigate the LMS, including Home, My Learning, Programs, and Explore.
---
import { Callout } from 'fumadocs-ui/components/callout';
<Callout type="warn" title="Work in Progress">
This page is a work in progress. Help us expand it by contributing!
The student dashboard (LMS) is where students open courses, track progress, and discover new content. If you are an admin, this page helps you explain what students see after they join your organization.
Students reach the LMS after they sign in on your academy. The left sidebar lists the main areas below. **Exercise** and **Community** only appear when your organization has those features enabled.
## LMS navigation at a glance
| Area | Path | What it shows |
| --- | --- | --- |
| **Home** | `/lms` | Enrolled courses with progress |
| **My Learning** | `/lms/mylearning` | Enrolled courses only, grouped by status |
| **Programs** | `/lms/programs` | Programs the student belongs to |
| **Explore** | `/lms/explore` | Published courses they are not enrolled in yet |
| **Exercise** | `/lms/exercises` | Exercises (if enabled for your org) |
| **Community** | `/lms/community` | Community (if enabled for your org) |
| **Settings** | `/lms/settings` | Profile and integrations |
## Home
**Home** is the default landing page after a student signs in. It shows courses they are already enrolled in, along with progress indicators so they can pick up where they left off.
Use Home when you want a quick overview of everything the student is actively taking.
## My Learning
**My Learning** focuses only on enrolled courses. Students can switch between tabs such as **In progress** and **Complete** to filter their list.
| View | Best for |
| --- | --- |
| **Home** | Progress at a glance across enrolled courses |
| **My Learning** | Browsing and filtering enrolled courses by completion status |
Both show enrolled courses. My Learning adds clearer filtering for students managing a longer list.
## Explore
**Explore** lists **published, active courses** in your organization that the student has **not** enrolled in yet. Each card links to the course landing page so they can read details and enroll (if enrollment is open).
<Callout type="info" title="Explore is a catalog, not an enrollment gate">
A course can appear in Explore even when public self-enrollment is turned off. **Allow New Students** controls whether someone can join from the landing page, not whether the course is visible in Explore. To restrict who can join, see [How Course Enrollment Works](/docs/how-to-guides/course-enrollment).
</Callout>
Explore is useful when you want students to discover optional or elective courses without assigning them manually.
## Programs
**Programs** are separate from individual courses. A program groups courses under shared goals (for example, complete all courses in an onboarding track). Students who belong to a program see it under **Programs** in the LMS.
| Concept | Where students see it |
| --- | --- |
| Individual enrolled courses | Home, My Learning |
| Courses not yet joined | Explore |
| Multi-course tracks with goals | Programs |
For how admins create programs and set goals, see [Programs](/docs/programs).
## What students see right after enrolling
When a student enrolls in a course (from a landing page, invite link, or admin assignment):
1. They are added to the course **group** immediately.
2. The course appears on **Home** and **My Learning**.
3. It no longer appears in **Explore** (because they are enrolled).
4. They can open lessons, exercises, and materials from the course sidebar.
If you added them from **People** but they have not signed in yet, they may show as **Pending** in the admin People list until they accept the invite or create an account.
## Courses vs programs: quick comparison
| Question | Answer |
| --- | --- |
| Where do I see courses I am taking? | **Home** or **My Learning** |
| Where do I find courses I have not joined? | **Explore** |
| Where do I see structured learning paths? | **Programs** |
| Can one student use all three views? | Yes. They work together. |
## Related guides
- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — how students join courses and what settings control access
- [How to Invite Students](/docs/how-to-guides/invite-students) — send enrollment links by email
- [Programs](/docs/programs) — multi-course tracks and goals for admins
- [Create a Course Landing Page](/docs/how-to-guides/course-landingpage) — what prospects see before enrolling
+2 -2
View File
@@ -6,7 +6,7 @@ description: Organize and filter courses with organization-scoped tags in Classr
import { Callout } from 'fumadocs-ui/components/callout';
Tags in ClassroomIO help teams structure course catalogs and improve discovery across admin
and learner experiences.
and student experiences.
## Scope and Ownership
@@ -38,7 +38,7 @@ and learner experiences.
- Org Courses:
- Supports URL-based filtering with `?tags=<comma-separated-tag-slugs>`.
- Public `/courses` (org site/custom domain):
- Public `/courses` (your academy/custom domain):
- Displays published courses.
- Supports tag filtering with URL query params.
+18
View File
@@ -0,0 +1,18 @@
---
title: Terminology
description: Key terms used throughout ClassroomIO and what they refer to in the product.
---
| Term | What it means |
| --- | --- |
| **Academy** | Your public-facing site — the org homepage, course landing pages, and Explore. Students land here before and after signing in. URL: `<siteName>.myclassroomio.com` or your custom domain. |
| **LMS** | The authenticated learning area students enter after signing in. Contains Home, My Learning, Explore, Programs, and Settings. Reached via **Open Academy** or **Go to LMS** in the admin dashboard. |
| **Organization** | Your admin workspace — holds courses, people, settings, and branding. Each organization maps to one academy. |
| **Explore** | The course discovery tab inside the LMS. Shows published courses the student has not enrolled in yet. |
| **Academy landing page** | The public homepage for your academy. Editable in **Settings → Landing Page**. |
| **Course landing page** | The public page for a single course — description, price, and Enroll button. Editable from the course sidebar. |
| **Student** | A user enrolled in one or more courses. Has access to the LMS but not the admin dashboard. |
| **Course** | The primary learning container — holds lessons, exercises, people, and settings. |
| **Program** | A group of courses with a shared completion goal (complete all, pass rate, score). |
| **Enrollment** | Joining a course. Can happen via public self-enrollment, invite link, admin assignment, or payment. |
| **Invite** | An email sent to a specific person containing a unique enrollment link for a course or organization. |