Why doesn’t my SCORM course track completion?

Quick answer

Almost always the course never calls the LMS API to set a completion status. It loads fine but reports nothing. Initialize the SCORM API, set cmi.completion_status (2004) or cmi.core.lesson_status (1.2), and Commit — or use a wrapper that does it for you.

Key facts
  • SCORM 1.2 uses cmi.core.lesson_status; SCORM 2004 uses cmi.completion_status + cmi.success_status.
  • A course that never calls SetValue/Commit will show 0% complete forever.
  • “Loads fine in a browser” ≠ “tracks in an LMS” — the LMS API only exists inside the LMS.

The usual cause

The content renders, but no completion call is made — the single most common way AI-generated courses silently fail. The LMS never hears that the learner finished.

The fix

Find the LMS API, initialize it, set completion, and commit:

import { createTracker } from '@coursetemplates/scorm'
const course = createTracker()
course.complete()      // or course.passed({ scaled: 1 })
course.commit()

Catch it before you upload

Run the free linter — it flags a missing completion call as a SILENT FAILURE:

npx coursekit check ./my-course

FAQ

Do I need to set a score too?

Not for completion, but for pass/fail set cmi.success_status (2004) or a passed/failed lesson_status (1.2). course.passed() sets both.

Why does it work locally but not in the LMS?

The LMS injects the API object (window.API_1484_11 or window.API) only inside the LMS frame. Locally there’s nothing to call, so nothing is recorded.

Start with a course that already works. Download it, tell your AI what to change, and it tracks in your LMS without you configuring anything.

Browse the templates

Updated 2026-07-01