Skip to content

Episodes and video tracking

Split a course into multiple video episodes when one long video is not enough. The learner sees episodes as a checklist; each episode is tracked independently and the next one plays automatically when the current one finishes.

Prerequisite: The course exists (see Create a course) and is open in the detail view under Courses → Select course.

When to use episodes

  • The course has natural chapters (e.g. four 15-minute lectures).
  • The course has optional intro/outro segments you want the learner to see separately.
  • You want to show progress per chapter instead of one big bar.

If the course is a single video, leave the episodes list empty and use the Video URL field on the General tab.

1. Open the Episodes sub-tab

Inside the course detail view switch to the Episodes sub-tab. If no episodes exist yet, the list shows an empty state.

Empty episodes list with New Episode button

2. Add an episode

Click New Episode. A modal opens with three fields:

Episode modal with title, HLS URL, duration
FieldPurpose
TitleShown as the chapter heading in the player.
Video URL (m3u8)HLS stream URL for the episode.
Duration (seconds)Episode length in seconds. Used for progress and for the 95 percent completion threshold.

Click Save. The episode appears at the end of the list.

3. Reorder episodes

Use the up/down arrow buttons in the first column to move an episode. The position updates immediately — no extra save needed.

Episode list with reorder buttons

4. Edit or delete

Use the pen icon to edit and the red trash icon to delete. Deleting an episode removes it permanently; tracking records for that episode stay in the audit log but no longer count toward progress.

How tracking works

The frontend player sends a heartbeat every 30 seconds (batched every 60 seconds). The server stores:

  • watched_seconds — total time the learner actually watched.
  • max_watched_position — furthest point reached. Protects against fast-forwarding.
  • A row in the append-only tracking log.

A progress update is only accepted if at least 15 seconds have passed since the last one. The new watched-seconds value may not grow more than 5 percent faster than real elapsed time — this blocks client-side tampering.

An episode is marked completed when watched_seconds reaches at least 95 percent of its configured duration (per episode, or of the main video when the course has no episodes). The course is marked completed when every episode is complete.

When a learner switches tabs

The player pauses tracking while the tab is hidden. The learner does not lose watched-seconds, but the server does not advance progress either.

Progress display in the backend

You cannot edit a learner's progress. To spot-check how a course is doing, switch to the Statistics tab — it shows totals for sales, average exam score, and issued certificates across all courses.

Common issues

The next episode does not autoplay. Check the Duration (seconds) field. If it is 0, the player cannot calculate the 95 percent completion point and does not trigger the next episode.

A learner says their progress reset. Progress is append-only on the server. If the player shows the start position, the browser likely lost its local cache — the server still has the correct max_watched_position. Ask the learner to reload the detail page.

Certificate refuses to issue. The certificate endpoint requires watched_seconds >= 95 percent of the configured Content duration for each episode (or the main video, if no episodes exist). If a learner scrubbed past parts, watched-seconds never reached the threshold.

See also