Skip to content
Learnomy

Course Completion Rules

A course's completion rule decides when a student counts as finished -- the moment their enrollment flips to completed, progress hits 100%, and any certificate is awarded. You choose one rule per course from four options.

What you can do

  • Complete a course when the student finishes every lesson.
  • Complete a course only when every lesson is done AND the student passes the course's quiz.
  • Complete a course when the student finishes a set percentage of the content, so a long course can finish before the very last lesson.
  • Keep completion manual, so an admin or instructor marks each student complete by hand and the course never auto-completes.

Course Completion Rules first view

How to use it

Step 1 -- open the Completion & Certificate section

Edit the course and open the Completion & Certificate section of the course editor.

Step 2 -- choose a Completion Requirement

The Completion Requirement dropdown offers four rules:

  1. All Lessons Completed -- the enrollment completes when every lesson in the course is marked complete (progress reaches 100%).
  2. Lessons + Final Quiz -- every lesson must be complete AND the student must have at least one passing attempt on a quiz scoped to the course (or one of its lessons). Practice and survey quizzes do not gate completion.
  3. Percentage of Content -- the enrollment completes when the student's progress reaches the percentage you set (see step 3). Useful when the last few lessons are optional.
  4. Manual Completion -- the course never auto-completes. Only an admin or instructor marks a student complete.

Step 3 -- set the percentage (percentage rule only)

When you pick Percentage of Content, a Completion Percentage slider appears. Set the minimum share of lessons a student must finish (1-100). At that threshold the course completes; it does not wait for the last lesson.

Step 4 -- save

Save the course. From then on, whenever a student finishes a lesson or submits a quiz, Learnomy re-checks the rule and completes the enrollment the moment it is satisfied. Completion fires whether the last action was a lesson finish or a quiz pass -- both paths converge on the same check.

Settings and options

  • Where completion is re-checked. Completion is evaluated on two events: a lesson being marked complete, and a quiz being submitted. Either can be the one that finishes the course, so a lessons_and_quiz course that had all lessons done completes the instant the quiz is passed.
  • Manual never auto-completes. With the manual rule, the auto-completion path is skipped entirely; nobody is completed until an admin or instructor does it.
  • Certificates ride on completion. If the course awards a certificate, it is issued when the completion rule is met -- so the rule you pick also controls when the certificate lands.
  • Per-lesson enforcement is separate. The Completion Requirement decides when the whole course finishes. How strictly each individual lesson's watch-time / video-percent / scroll / quiz-pass rules are enforced is a separate control (Per-Lesson Rule Enforcement: inherit / strict / advisory / off).

For developers

Service (Learnomy\Services\Progress_Service):

  • mark_lesson_complete( $user_id, $lesson_id, $bypass_rules, $time_spent_seconds, $client_signals ) -- marks a lesson complete, rolls up course progress, and completes the enrollment when the rule is satisfied.
  • maybe_complete_course( $user_id, $course_id ) -- idempotent re-check called from both the lesson-complete and quiz-submit paths; returns true when the call resulted in completion.
  • calculate_course_progress( $user_id, $course_id ) -- the 0-100 progress figure the rules read.

The lrn_courses.completion_type column holds one of all_lessons, lessons_and_quiz, percentage, manual; completion_value holds the percentage threshold (1-100) for the percentage rule.

Hooks: learnomy_lesson_completed (fires per lesson), learnomy_course_completed (fires when an enrollment completes). REST: POST /learnomy/v1/progress/sync posts { item_type: 'lesson', item_id, status: 'completed' } and runs the same completion logic.

Related