Skip to main content

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:

TypeDatesTypical use
FixedPlannedCourseOne start_date and end_date for everyone.Classroom training, cohorts, scheduled online courses.
FlexiblePlannedCourseNo 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_date is the enrollment-specific start, normally the moment the participant enrolled.
  • end_date is start_date plus the edition's duration_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:

  1. Create a single LMS course for the flexible planned course and leave the course dates open, see Sync courses.
  2. On enrollment.created and enrollment.updated, pass the enrollment's start_date and end_date to the LMS as that participant's access window.
  3. Do not wait for the enrollment status to become completed before 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:

LMSPer-enrollment access windowHow
MoodleYestimestart and timeend on the enrolment via enrol_manual_enrol_users. Calling it again for an existing enrolment updates the dates.
CanvasYesstart_at and end_at on the enrollment.
Blackboard LearnNoMemberships 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.
tip

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.