SCORM Debugging

Why Your SCORM Package Isn't Tracking Correctly in Moodle

A SCORM package that launches in Moodle isn't proof it's tracking correctly. Completion status, scores, and attempt data can all be wrong even when the content opens and plays back exactly as authored in Articulate Storyline, Adobe Captivate, or iSpring. Here's what actually breaks SCORM tracking, and how to debug it properly instead of guessing.

8+ Years in Moodle's SCORM ModuleSCORM 1.2 & 2004Root-Cause Debugging
SCORM API Call Trace

SCORM That Plays Fine Can Still Track Wrong

The SCORM standard was never simple, and Moodle's SCORM module has its own settings that have to match what the authoring tool exported. When they don't line up, the package still launches — but completion, scores, and grades quietly stop reflecting what learners actually did.

Completion Never Fires

Learners finish the content but the activity never marks complete, because the completion trigger Moodle is watching for doesn't match what the package reports.

Grades Don't Match Attempts

The gradebook shows a score that doesn't seem to correspond to any single attempt — usually a grading method mismatch, not a tracking failure.

Package Won't Launch at All

A manifest error or launch mode conflict stops the content from opening, sometimes only in certain browsers or only after an authoring tool update.

Six Places SCORM Packages Actually Break

Most "broken SCORM" reports trace back to one of a small number of known failure points, almost all of them at the boundary between what the authoring tool exported and what Moodle's SCORM module expects.

Manifest Errors

A malformed or incomplete imsmanifest.xml — missing required elements, incorrect organization/item references, or a broken zip structure — causes Moodle to reject the package or read its structure incorrectly.

SCORM Version Mismatch

A package authored as SCORM 2004 but launched against Moodle's SCORM module expecting 1.2 (or vice versa) looks for the wrong JavaScript API object — API for 1.2, API_1484_11 for 2004 — and the handshake never completes.

Completion Criteria Set Wrong at Export

Storyline or Captivate exported with the completion trigger tied to "slides viewed" instead of "quiz result" reports completion the moment a learner clicks through, regardless of whether they passed anything.

JavaScript API Handshake Failures

LMSInitialize (1.2) or Initialize (2004) never succeeds because the content frame can't locate the API object in a parent or opener window — often caused by a popup blocker, an iframe sandbox attribute, or the package being opened directly rather than through Moodle.

Launch Mode Conflicts

The package's own launch settings expect a new window while Moodle's SCORM "display package" setting is set to current window (or the reverse), breaking the window reference the API discovery process depends on.

Mixed Content & HTTPS Errors

Assets or API calls referenced over plain http on an https Moodle site get silently blocked by the browser, breaking playback or tracking calls with no obvious error message to the learner.

How Moodle's SCORM Grading Actually Works

Before assuming a score is wrong, it's worth checking whether the SCORM activity's grading method is doing exactly what it's configured to do. Moodle's SCORM module supports four grading methods across multiple attempts:

  • Highest attempt — the gradebook reflects the best score across all attempts, even if a learner's most recent attempt was worse.
  • Average attempt — every attempt is averaged together, so a mix of low and high scores produces a middling gradebook value.
  • First attempt — only the first attempt ever counts; later retakes don't change the grade at all.
  • Last attempt — only the most recent attempt counts, which is what most people intuitively expect but isn't Moodle's default.

Completion adds a second layer on top of grading: an activity can require view, require a passing grade, or require a specific status value (such as completed or passed) before Moodle marks it done. A package that reports cmi.core.lesson_status = incomplete will never satisfy a "require status: passed" completion rule, no matter how the grading method is set — which is why completion and gradebook issues often need to be diagnosed separately rather than assumed to share one cause.

A Practical Debugging Workflow

Guessing and re-uploading rarely fixes SCORM tracking. This is the order we actually work through.

1

Watch the SCORM API Calls

Open browser dev tools, launch the activity from inside Moodle, and watch the Console and Network tabs for Initialize/LMSInitialize, GetValue/SetValue, periodic Commit calls, and a final Terminate/LMSFinish on exit.

2

Check Moodle's Attempts Report

The SCORM activity's Reports screen shows raw tracking values per attempt, plus an interactions tab with question-level detail — often revealing exactly which data element is missing or unexpected.

3

Compare Against the Authoring Tool's Export Settings

Rather than patching behavior in Moodle, check the tracking, completion, and reporting settings in Storyline, Captivate, or iSpring — this is where most completion and grading mismatches originate.

4

Test Outside Moodle Too

Load the same package in a standalone SCORM test harness to confirm whether the issue lives in the package itself or in Moodle's activity configuration — an important distinction before deciding what to fix.

Authoring Tool Settings Worth Checking First

A large share of SCORM tracking issues are fixed at the export screen, not in Moodle.

Articulate Storyline

Check Player > Tracking: LMS reporting version (1.2 vs 2004), the "Track using" setting (slides vs a specific quiz result), and whether "Completed" also requires a passing score.

Adobe Captivate

In Quiz > Reporting, confirm the SCORM version, the completion criteria ("Mark completed if"), the passing score, and whether the exit behavior sends a final commit before closing.

iSpring Suite

In the LMS publish settings, check the reporting standard, the "report status as" option (passed/incomplete vs complete/incomplete), and the passing score threshold that drives it.

Root-Cause SCORM Debugging, Not Guesswork

We Read the Manifest, Not Just the Symptom

Actual root-cause diagnosis of the package and Moodle's configuration together, instead of re-uploading and hoping.

8+ Years in Moodle's SCORM Module

Real experience with grading methods, completion rules, and attempt-handling edge cases most tickets never surface.

Package and Config Tested Together

Verified in Moodle's own SCORM player and in a standalone SCORM debugger, so we know exactly which side needed the fix.

Fixes You Can Reuse

Documented settings so your next SCORM export doesn't repeat the same failure.

Got Questions About SCORM Tracking in Moodle?

Straight answers to what comes up most often when SCORM content doesn't track the way it should.

Launching only proves the package's files loaded and rendered — it says nothing about whether the JavaScript API handshake succeeded or whether the completion trigger set in the authoring tool matches what actually happened. Most "launches fine but won't complete" cases trace back to a completion criteria mismatch at export or a handshake failure that never gets reported to the learner.

They use different JavaScript API objects (API vs API_1484_11) and different data model elements — for example cmi.core.lesson_status in 1.2 versus cmi.completion_status and cmi.success_status as separate values in 2004. Moodle's SCORM module reads whichever version the package's manifest declares, so the package and the module have to agree on which spec is in play.

This is very often not a tracking bug at all — it's Moodle's SCORM grading method (highest attempt, average attempt, first attempt, or last attempt) doing exactly what it's configured to do across multiple attempts. If a learner scored 60% on attempt one and 90% on attempt two, and the activity is set to "average attempt," a 75% in the gradebook is correct behavior, not broken tracking.

Yes. If the package is set to launch in a new window and the browser blocks that window (or a browser extension interferes with it), the SCORM API discovery process — which walks up the window/opener chain looking for the API object — never finds it, and every LMSSetValue or SetValue call silently fails.

Open the browser's developer tools, launch the SCORM activity from within Moodle, and watch the Console and Network tabs while the content plays. You should see repeated calls to Initialize/LMSInitialize, GetValue/SetValue, and periodic Commit calls, along with a final Terminate/LMSFinish when the learner exits. Missing or erroring calls point to exactly where the handshake or data flow is breaking.

Both, because the two have to match. Sometimes the fix is entirely in Moodle's SCORM activity settings (grading method, completion rules, launch mode). Other times the package needs to be re-exported from Articulate, Captivate, or iSpring with corrected tracking settings. We diagnose which side is actually wrong before touching either.

Any tool that exports a standard SCORM 1.2 or SCORM 2004 package — Articulate Storyline and Rise, Adobe Captivate, iSpring Suite, and Lectora are the ones we see most often. The underlying debugging approach is the same regardless of which tool produced the package, since Moodle is reading the same manifest and API structure either way.

Ready to Get Your SCORM Tracking Fixed?

Send us the package and a description of what's wrong, and we'll tell you exactly where it's breaking.

Get SCORM Tracking Fixed