Why doesn’t my SCORM course track completion?
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.
- 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 templatesUpdated 2026-07-01