All Docs
FeaturesCSI Teachable Replacement AppUpdated March 13, 2026

Course Completion Detection & Certificate State

Course Completion Detection & Certificate State

Available from: v1.0.40

The platform now automatically detects when a learner finishes all lessons in a course, records the completion timestamp, and surfaces that event on the learner dashboard. This is the foundation for certificate issuance, completion badges, and any downstream automation you want to trigger on course completion.


How It Works

Completion detection is fully automatic — no configuration is required.

Completion Flow

  1. Lesson-level tracking — The system already records each lesson a learner completes.
  2. Threshold check — Every time a lesson is marked complete, the system evaluates whether every lesson in the course has now been finished by that learner.
  3. Milestone event — When all lessons are complete, two things happen simultaneously:
    • The enrollments.completed_at column is set to the current UTC timestamp.
    • A completion record is written and made available to the learner dashboard.

The enrollments.completed_at Field

FieldTypeDescription
completed_attimestamp (UTC)Set once, when all lessons in the course are finished. null if the course is not yet complete.

This field is the canonical source of truth for whether a learner has completed a course. Downstream features — certificates, dashboard badges, reporting — should key off this value.


Learner Dashboard

Once completed_at is set, the learner's dashboard reflects the completion state. This enables:

  • A visual completion indicator or badge on the course card.
  • A certificate state that can be rendered or downloaded (certificate generation is a separate feature).
  • A permanent record the learner can refer back to.

Important Behaviour Notes

  • Idempotent — If a completion check runs more than once, completed_at is only written on the first detection. Subsequent checks do not overwrite the original timestamp.
  • Existing enrollments — Enrollments where all lessons were completed before v1.0.40 will not be back-filled. The completed_at timestamp will be recorded the next time the completion check is triggered for that learner (e.g. if they revisit a lesson).
  • New enrollments — Completion detection applies automatically with no additional setup.

Blog Post

See the v1.0.40 blog post for a product-level overview of this feature.