Course Enrollments
This guide explains how to manage who is enrolled in a course in EmbayLMS — from the course editor’s Enrollments tab and from an individual user’s profile. It covers manual enrollment (single and bulk), unenrollment (dropping a learner), upgrading an in-progress learner to the latest course version, and automatic enrollment rules.
Prerequisites
- Role: Admin or Manager (manager scope is limited to their own team)
- The
enrollment:createpermission to enroll, andenrollment:deleteto unenroll - For enrollment, the target course must be Published (you cannot enroll learners into a Draft course)
Where enrollments are managed
There are two entry points, and they share the same underlying rules:
| Entry point | Where | Best for |
|---|---|---|
| Course → Enrollments tab | Course editor (Courses → [course]) | Managing the full roster of one course |
| User profile → Enrollment history | Users → [user] | Managing one learner across several courses |
| Enrollment requests | Call to Action → Enrollment Requests | Deciding pending approval requests across every course |
Every enroll, unenroll, and upgrade action is permission-checked and written to the audit log.
The course Enrollments tab
Open a course from Courses, then click the Enrollments tab. The tab lists every enrollment for the course with:
- Search by learner name or email
- Filter by status (active / in-progress, completed, dropped) and by course version
- Pagination — the roster is paginated (default 50 per page)
From here you can enroll users, unenroll a learner, and run version upgrades.
Manually enroll users
Enroll a single user
- Open the course’s Enrollments tab.
- Click Enroll users.
- In People to enroll, type at least two characters of the person’s name (or email), then pick them from the list with a click or the arrow keys and Enter.
- Click Enroll.
Only active people who are not already enrolled in this course are offered, so the list never suggests someone the enroll would skip. A group admin sees only the members of the groups they administer.
The learner is enrolled immediately and appears in the roster with an active status.
Enroll many users at once (bulk)
- On the Enrollments tab, click Enroll users.
- In People to enroll, search and pick each person in turn. Every pick becomes a chip above the field; remove one with its × button (or Backspace in the empty field). You can pick up to 500 people in one batch.
- Click Enroll.
Bulk enrollment runs the same guards as a single enrollment, per user — see Enrollment guards below. If one user cannot be enrolled (for example they are already enrolled), that user is reported and skipped, and the rest of the selection proceeds. After the run you see a summary of how many were enrolled and which were skipped, with the reason for each skip.
Enrollment guards applied on every enroll
Both single and bulk enrollment apply these checks for each user:
| Guard | Behaviour |
|---|---|
| Enrollment window | Enrollment is blocked outside the course’s configured open/close dates |
| Duplicate guard | A user already actively enrolled is skipped (not enrolled twice) |
| Seat cap | If the course has a seat cap and it is full, the user is waitlisted when the waitlist is enabled; otherwise the enroll is blocked |
| Approval workflow | If the course has Require approval on, the enrollment enters the approval workflow (decided by an Owner or Admin, a Group Admin for their groups, or a Manager for their direct reports) |
| Prerequisites | If the course has prerequisites the user has not met, the enroll is blocked |
Enrollment windows (open / close dates)
A course can be open for enrollment only between two dates — an intake window for a cohort, a compliance course that stops accepting sign-ups after a deadline, or a seasonal offering.
Set the window
- Open the course in Courses → Settings tab.
- In the Enrollment settings panel, set Enrollment opens and/or Enrollment closes.
- Either date can be left blank. Blank means “no bound in that direction”, so a course with neither set is always open — which is the default and the normal case.
What learners see
Outside the window the course stays in the catalog. Hiding it would leave a learner unable to find training they know exists, so instead the card and the course page say why:
| State | Catalog card | Course page |
|---|---|---|
| Before the open date | Opens <date> in place of the Enroll button | ”Enrollment for this course opens on <date>.” |
| After the close date | Enrollment closed in place of the Enroll button | ”Enrollment for this course closed on <date>.” |
| Already enrolled | Enrolled badge, as usual | Resume, as usual |
The last row matters: the window governs joining, not access. A learner who enrolled while the window was open keeps working through the course after it closes, and their completion and certificate are unaffected.
The window is enforced on the server
The badge is an affordance; the refusal is in the enrollment procedure itself, so it applies to every path — learner self-enrollment, admin single and bulk enroll, and automatic enrollment rules. An admin who needs to place someone outside the window changes the dates (or clears them), which is audit-logged like any other course setting change.
Boundaries are inclusive: a course opening at 09:00 is enrollable at exactly 09:00, and one closing at 17:00 is still enrollable at exactly 17:00.
Due dates
A due date is what makes an assignment a deadline rather than a suggestion. It drives three things on its own:
- the due-soon reminder the learner gets a few days before (the lead time is a platform setting),
- the overdue reminder if the date passes with the course unfinished, and
- the overdue escalation digest their manager receives, which repeats while the assignment stays overdue.
Until now a due date could only arrive by CSV import, the REST API or a recurring assignment — so a course you assigned by hand had no deadline and none of the three ever fired for it.
Set one while enrolling
The Due date field is optional and appears on every enroll path:
| Where | Applies to |
|---|---|
| Course → Enrollments tab → Enroll users | Everyone in that batch |
| Users → [user] → + Enroll in course | Every course in that selection |
| Course → Enrollments tab → assign to a group | Everyone the assignment enrols — including anyone who joins the group later |
The group case is worth stating plainly: the date is stored on the assignment, so a late arrival inherits the same deadline everybody else was given rather than landing with none.
Change or clear one afterwards
The Due column on the course Enrollments tab and on a user’s enrollment list shows the date, flags it when it has passed, and edits in place:
- Click Set (no date yet) or Change.
- Pick a date and click Save — or click Clear the due date to remove it.
Every change is audit-logged with the old and new dates. Completed and dropped enrollments show their date but cannot be edited.
Moving a date re-arms the reminders
Each reminder is sent at most once per enrollment per phase, so changing a due date resets those markers. That is deliberate and it cuts both ways:
- a learner who was already reminded about the old deadline will be reminded about the new one, and
- they will not get a second copy of the same reminder for the same deadline, because the marker is only cleared when the date actually changes. Re-saving the same date does nothing at all.
The manager digest is re-armed too: a moved deadline is news for the manager as much as for the learner.
A date is a calendar day
The picker takes a day, not a time, and the day is stored as midnight UTC. A deadline of the 30th means the 30th everywhere, rather than the 29th for anyone west of Greenwich.
Enrollment approval
A course can require a decision before anyone joins it. Turn on Require approval in the course’s Settings tab → Enrollment settings. From then on, a learner who enrolls themselves is parked as pending approval instead of being enrolled, and waits for someone to approve or deny the request.
Decide a request
There are two places to do it, and they do exactly the same thing:
- One course at a time — open the course’s Enrollments tab and filter the status to pending approval. Each pending row shows Approve and Deny.
- Everything at once — open Call to Action in the left menu and go to its
Enrollment Requests section. It lists every request waiting for a decision
across all courses, oldest first, with the learner, the course, who asked, and when.
(The old
/admin/enrollment-requestsaddress still works and lands on that section.) While anything waits on you, the menu item shows how many, for example Call to Action (3).
In the Enrollment Requests section you can also tick several rows and use Approve {n} selected to approve them in one action.
What each decision does
| Decision | Effect on the learner | Notification |
|---|---|---|
| Approve | Enrolled immediately — the course appears in their learning and they can start it | ”Enrollment request approved”, in-app and by email, linking to the course player |
| Deny | Not enrolled. The request is closed (the enrollment is recorded as dropped with the reason) | “Enrollment request not approved”, in-app and by email, linking to the course page |
Both decisions are written to the audit log with the before/after status, and the Deny reason is stored on the record as well as sent to the learner.
The deny reason
Denying opens a dialog with an optional Reason box (up to 500 characters). It is worth filling in: it is the only thing the denial message can tell the learner beyond “not approved”, it is shown to them verbatim, and it is kept in the audit log. Leave it blank and they simply see that the request was not approved.
Prerequisites are re-checked on approval
Approving runs the course’s prerequisites check again, against the learner’s record as it is now — not as it was when they asked. If they no longer meet a prerequisite the approval is refused and the request stays pending, so an approval can never place someone into a course they are not eligible for.
Who can decide a request
Deciding a request needs the enrollment:create permission, and the reviewer
must also be able to act on that learner and that course:
| Role | Sees and can decide |
|---|---|
| Owner / Admin | Every request in the tenant |
| Group Admin | Requests from members of their assigned groups |
| Manager | Requests from people in their reporting chain |
| Instructor | Requests from learners, for the courses they are assigned to |
The queue and the buttons apply the same rule, so the page never lists a request the Approve button would then refuse.
Approval and the other enrollment paths
Approval applies to the paths where someone is asking. An enrollment placed directly by an admin (single or bulk), by an automatic rule, by a CSV import, or by the REST API is also parked as pending on an approval-required course — it shows on this queue with Requested by naming the admin or the automatic rule rather than the learner.
Unenroll (drop) a learner
- Open the course’s Enrollments tab (or the user’s Enrollment history).
- Find the learner’s row.
- Click Unenroll (drop) and confirm.
Unenrolling removes the learner’s active enrollment in the course. This requires the
enrollment:delete permission and is audit-logged.
Dropping a learner does not delete historical completion records or certificates the learner already earned — those are preserved.
Upgrade an in-progress learner to the latest version
When you publish a new version of a course, learners who are mid-course stay on the version they started on. The Upgrade action moves an in-progress learner onto the latest published version so they continue on the current content. This is the per-user / per-course manual counterpart to the course-wide “force re-enrollment on version change” toggle.
Upgrade one learner
- Open the course’s Enrollments tab (or the user’s Enrollment history).
- Find an active (in-progress) learner whose enrollment is on an older version. An upgrade button showing the exact version transition (for example v3 → v4) appears on that row — it only renders when the learner is behind the latest published version.
- Click the transition button and confirm.
Upgrade everyone outdated at once
- On the course’s Enrollments tab, click Upgrade outdated (bulk).
- Confirm. Every in-progress enrollment on an older version is moved to the latest published version in one operation.
What upgrade does — and what it never touches
| Behaviour | Detail |
|---|---|
| Eligible enrollments | Active (in-progress) only. Completed enrollments are never upgraded. |
| Certificates | Never disturbed. Existing completions and their certificates are preserved. |
| Progress | Recomputed against the new version’s modules — effectively a fresh start on the new content. |
| History | Historical completions on prior versions are preserved; the upgrade does not erase the learner’s record. |
Why only active enrollments? Upgrading recomputes progress against the new module set. Doing that to a completed enrollment would put a finished learner back into “in progress” and is never desirable, so completed enrollments (and their certificates) are deliberately excluded.
Automatic enrollment rules
Auto-enrollment rules enroll learners into the course automatically when they meet a condition — so you don’t have to enroll each person by hand. Rules are managed from the course’s Enrollments tab.
Add an auto-enrollment rule
- Open the course’s Enrollments tab.
- Open Automatic enrollment rules and click Add rule.
- Choose a rule type and its target (see the reference below).
- Click Save. Users who match the rule are enrolled automatically; the same enrollment guards apply.
Rule types
| Rule type | Trigger | Configuration |
|---|---|---|
Group membership (group_membership) | A user joins the chosen group | groupId — the group |
Course completion (course_completion) | A user completes another course | completedCourseId — the prerequisite/source course |
User attribute (attribute) | A user matches an attribute value | attribute (field) + value (target value) |
Auto-enrollment rules apply going forward — when a user becomes a group member, completes the source course, or matches the attribute. Remove a rule from the same panel to stop future auto-enrollments; it does not unenroll learners already enrolled by the rule.
Managing enrollments from a user’s profile
The same actions are available on a single learner’s record at Users → [user], in the Enrollment history table. The table is actionable when you hold the right permissions:
| Action | Permission | Notes |
|---|---|---|
| Enroll in course | enrollment:create | Opens the course-structure tree picker (see below); the same enrollment guards apply per course |
| Unenroll | enrollment:delete | Drops the user’s active enrollment in that course |
| Upgrade (version-transition button, e.g. v3 → v4) | enrollment:create | Moves an in-progress enrollment to the latest version (same caveats as above); shown only when the enrollment is behind the latest published version |
If the user lacks the permission, these actions are hidden.
Enroll a user from their profile — the course-structure tree picker
Clicking + Enroll in course opens a picker that shows your course folder structure with the published courses nested inside — not a flat search box.
- On Users → [user], click + Enroll in course.
- Browse the folder tree. Courses that are not in any folder appear under Unfiled.
- Tick one or more course checkboxes, or tick a folder checkbox to select every course inside that folder (including its subfolders). A folder with only some of its courses selected shows an indeterminate (partial) state.
- Courses the learner is already enrolled in are disabled and tagged Enrolled — they cannot be selected again.
- The footer shows how many courses are selected. Click Enroll {count} to confirm.
Each selected course runs the same enrollment guards as a single enrollment. The run is partial-failure tolerant: if a course cannot be enrolled (for example a prerequisite is missing), it is skipped and the rest proceed. The confirmation message reports how many courses were enrolled and how many were skipped.
Configuration / field reference
| Field / control | Location | Description |
|---|---|---|
| Search | Enrollments tab | Filter the roster by learner name or email |
| Status filter | Enrollments tab | Active (in-progress), completed, dropped |
| Version filter | Enrollments tab | Show enrollments on a specific course version |
| Enroll users | Enrollments tab | Opens the enroll dialog: a people picker (one or many, up to 500) that offers only people not already enrolled, plus an optional due date |
| Enroll in course | User profile | Opens the course-structure tree picker (folders + published courses, multi-select; already-enrolled courses tagged Enrolled and disabled) |
| Upgrade (e.g. v3 → v4) | Enrollments tab / user profile | Moves one in-progress enrollment to the latest version; the button shows the version transition and only appears when the enrollment is outdated |
| Unenroll | Enrollments tab / user profile | Drops a learner’s active enrollment (enrollment:delete) |
| Upgrade outdated | Enrollments tab | Bulk-moves all outdated in-progress enrollments to the latest version |
| Enrollment opens / Enrollment closes | Settings tab → Enrollment settings | Optional open/close timestamps. Blank = no bound in that direction. Enforced server-side on every enroll path; outside the window the catalog shows Opens <date> / Enrollment closed instead of an Enroll button |
| Automatic enrollment rules | Enrollments tab | Add/remove group_membership, course_completion, attribute rules |
| Due date (optional) | Enroll dialog, user-profile course picker, group assignment | Optional deadline applied to every enrollment that action creates; on a group assignment it is also inherited by future joiners |
| Due column — Set / Change / Clear | Enrollments tab, user profile | Edits one enrollment’s deadline in place; flags a date that has passed; re-arms the reminders when the date changes |
| Require approval | Settings tab → Enrollment settings | When on, a learner who enrolls is parked as pending approval until someone decides |
| Approve / Deny | Enrollments tab (pending rows) and Call to Action → Enrollment Requests | Records the decision, enrolls or closes the request, and notifies the learner |
| Reason | Deny dialog | Optional, up to 500 characters; shown to the learner and kept in the audit log |
| Approve {n} selected | Enrollment Requests section of Call to Action | Approves every ticked request in one action; skips any that stopped being pending |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| ”User already enrolled” on enroll | The learner already has an active enrollment | This is expected — the duplicate guard skips them. In a bulk run the rest still proceed. |
| ”Course is full” / learner was waitlisted | The course’s seat cap is reached | The user is waitlisted if the waitlist is enabled; otherwise raise the seat cap or wait for a seat to free up. |
| Upgrade button not showing | The version-transition button (e.g. v3 → v4) only appears for active (in-progress) enrollments that are on an outdated version | Completed enrollments are never upgraded; an enrollment already on the latest version has nothing to upgrade. |
| Course greyed out in the tree picker | The learner already has a non-dropped enrollment in that course — it is tagged Enrolled | This is expected; the duplicate guard prevents enrolling twice. |
| Course missing from the tree picker | Only published courses appear in the picker | Publish the course first. |
| Can’t enroll in this course | The course is unpublished (Draft) | Publish the course first — learners can only be enrolled into a published course. |
| Enroll blocked — prerequisites | The learner has not completed a prerequisite course or learning path | The learner must complete the prerequisite, or remove it in the course’s Settings → Prerequisites card (see Prerequisites). |
| Enroll blocked — outside enrollment window | The course’s enrollment open/close dates exclude today | Adjust the enrollment window in the course settings. |
A course shows Opens <date> and nobody can enroll | The course has an enrollment open date in the future | Expected. Clear or bring forward Enrollment opens in the course’s Settings tab if you need it available now. |
| A learner says a closed course still works for them | They enrolled while the window was open | Expected. The window governs joining, not access — an existing enrollment is never revoked when the window closes. |
| Enroll/Unenroll action missing on user profile | You lack enrollment:create / enrollment:delete | Ask a tenant admin to grant the permission (or the appropriate role). |
| Some users skipped in a bulk enroll | Per-user guard failed (already enrolled, prerequisites, seat cap) | Review the post-run summary — each skipped user shows its reason; the rest were enrolled. |
| A learner never got a due-soon or overdue reminder | The enrollment has no due date | Set one in the Due column. Reminders are driven entirely by that date. |
| A learner was reminded about a deadline I moved | Expected — moving a date re-arms the reminders on purpose | The new deadline gets its own reminder; the old one is not repeated. |
| Re-saving the same date sent nothing | Expected — an unchanged date is a no-op, so the markers are left alone | Change the date if you want the reminders re-armed. |
| A new group member has no deadline | The assignment was made before due dates existed, or without one | Re-assign the course to the group with a Due date, or set the date on their enrollment row. |
| A learner says enrolling did nothing | The course requires approval, so they are pending approval | Decide the request in Call to Action → Enrollment Requests or on the course’s Enrollments tab. |
| Approve refused — prerequisites | Prerequisites are re-checked at approval time and the learner no longer meets one | The request stays pending. The learner must complete the prerequisite, or remove it in the course’s Settings → Prerequisites card. |
| A request is missing from the queue | The queue is scoped to the learners and courses you can act on | An owner or admin sees every request; ask one to decide it. |
| Bulk approve reports some skipped | Those requests stopped being pending (someone else decided them) or are outside your scope | Expected — reload the page; the rest were approved. |
| The Enrollment Requests section is missing from Call to Action | You lack enrollment:create. Each section of Call to Action appears only to people who hold its permission; the Call to Action item itself is hidden when you hold none of grading:view, enrollment:create or skill:assign | Ask a tenant admin to grant the permission (or the appropriate role). |
Related guides
- Course Management — create, version, and publish courses
- User Management — roles, groups, and the permissions that gate enrollment actions
- Recurring assignments — schedule repeat enrollments for compliance courses
Need help? Contact your EmbayLMS onboarding team or open a support ticket.