Flexible courses and access windows
Goal: a participant of a self-paced course can access the LMS course exactly during their own access window, even though everyone in that course started on a different day.
What a flexible planned course is
Eduframe has two kinds of course editions:
| Type | Dates | Typical use |
|---|---|---|
FixedPlannedCourse | One start_date and end_date for everyone. | Classroom training, cohorts, scheduled online courses. |
FlexiblePlannedCourse | No edition dates. A duration_in_days instead. | Self-paced e-learning that participants can start any time. |
A flexible planned course stays open for enrollment; each participant starts when they enroll and gets access for the configured duration. The edition itself has no start or end, so start_date and end_date on the planned course are empty.
The access window lives on the enrollment
Every enrollment on a flexible planned course carries its own dates:
start_dateis the enrollment-specific start, normally the moment the participant enrolled.end_dateisstart_dateplus the edition'sduration_in_days.
The enrollment status follows those dates: confirmed before the window opens, active while it is open and completed once it has passed. When an administrator extends a participant's access, the enrollment's end_date changes and Eduframe sends enrollment.updated.
{
"id": 4819,
"student_id": 9021,
"planned_course_id": 4302,
"status": "active",
"start_date": "2026-09-01",
"end_date": "2026-11-30",
"updated_at": "2026-09-01T10:15:22.410Z"
}
How to mirror it in the LMS
Treat a flexible edition as one LMS course and let each enrollment carry its own window:
- Create a single LMS course for the flexible planned course and leave the course dates open, see Sync courses.
- On
enrollment.createdandenrollment.updated, pass the enrollment'sstart_dateandend_dateto the LMS as that participant's access window. - Do not wait for the enrollment
statusto becomecompletedbefore closing access. Use the dates, so the LMS and Eduframe agree on the window even if an event is delayed.
Whether step 2 is possible depends on the LMS:
| LMS | Per-enrollment access window | How |
|---|---|---|
| Moodle | Yes | timestart and timeend on the enrolment via enrol_manual_enrol_users. Calling it again for an existing enrolment updates the dates. |
| Canvas | Yes | start_at and end_at on the enrollment. |
| Blackboard Learn | No | Memberships have no dates. Schedule a job in your middleware that disables the membership once end_date has passed, and re-enables it when the date is extended. |
If your LMS has no per-enrollment dates, you need a different approach. Eduframe also tracks the enrollment status, and when an individual enrollment ends the status changes and Eduframe sends enrollment.updated. You can map that status to an enrollment state in the LMS and update the individual enrollment whenever the status changes in Eduframe.
When the window ends
A participant whose window has passed has enrollment status completed. Keep them enrolled with read access if your LMS supports it, so they can review the material; otherwise disable the enrollment. Do not remove it, so grades and activity remain visible to staff. An extension by an administrator arrives as enrollment.updated with a new end_date; re-open access in the LMS accordingly.