How do you upload a SCORM package to Moodle?
To upload SCORM to Moodle, turn on editing in the course, choose Add an activity or resource, pick SCORM package, drag your zip into the Package file box, and save. That takes about a minute. Getting Moodle to record completion the way you expect is the part that needs attention.
The upload almost never fails in an interesting way. What generates support tickets is the gap between "the learner finished the course" and "Moodle shows it as complete" — and in Moodle that gap is made of settings, not bugs. This walks the upload, then the settings that decide what gets recorded.
Before you upload
Three checks save most of the trouble.
- Build SCORM 1.2, not 2004. Moodle's SCORM module documents support for SCORM 1.2 and AICC. SCORM 2004 is not supported, and packages built to it may import but behave unpredictably at runtime. This is the single most common cause of "it works in other systems but not Moodle". If your course needs completion and pass reported separately, see SCORM 1.2 vs 2004 for what you give up by staying on 1.2.
- Check
imsmanifest.xmlis at the root of the zip. If you zipped the folder rather than its contents, the manifest sits one level down and Moodle rejects the file with a message about not finding a manifest or AICC structure. Open the zip and confirm you seeimsmanifest.xmlat the top level, not a single folder. - Check the upload limit. Moodle caps uploads by site setting, course setting, and the server's PHP
upload_max_filesizeandpost_max_size, whichever is lowest. A video-heavy package can exceed all three. If you cannot raise them, an administrator can place the package on the server and point the activity at an external manifest instead.
Adding the SCORM activity
- Open the course and switch on Edit mode.
- In the section you want, choose Add an activity or resource, then SCORM package.
- Give it a Name. This is what learners click, so name it for the course, not the file.
- Under Package, leave Type as Uploaded package and drag the zip into Package file.
- Under Appearance, set Display package. Current window is the safer default — a new window can be blocked by the browser, and a blocked window means the runtime never initialises and nothing is tracked.
- Save and display, then launch it yourself once before you tell anyone it is ready.
Everything else has a working default. The settings below are the ones worth deciding deliberately rather than accepting.
Completion and grade settings
Moodle has two separate ideas of "done", and confusing them explains most of the complaints.
| Setting | Where | What it decides |
|---|---|---|
| Grading method | Grade | How a score reaches the gradebook: Learning objects counts completed SCOs; Highest grade, Average grade and Sum grade use the scores the content reported |
| Maximum grade | Grade | The scale the gradebook shows. Mismatches here are why a 100% attempt can display as 1.00 |
| Require status | Activity completion | Whether the completion tick needs the package to report Completed, Passed, or either |
| Require minimum score | Activity completion | A score floor for the tick, independent of what the package called itself |
| Require all scos… | Activity completion | Whether every SCO must report, or one is enough. Only matters for multi-SCO packages |
If you set activity completion to Require view alone, Moodle ticks the box when the learner opens the activity — regardless of what the course reported. That tick is a Moodle course-progress marker, not evidence of completion, and it is the setting behind "Moodle says they completed it but they clearly didn't".
Attempts and the review mode
Under Attempts management, Number of attempts caps how many times a learner may start fresh, and Attempts grading decides which one counts — first, last completed, highest, or average. These interact: "highest attempt" with unlimited attempts means a learner can retry until they pass, which may or may not be what your policy allows.
Force new attempt is the one that surprises people. Set to always, every launch starts a clean attempt, so a learner who closes the tab for lunch comes back to the beginning with no resume. Left at no, they resume the existing attempt from the bookmark the content saved. If learners report losing their place, this setting is the first place to look.
Lock after final attempt stops further launches once the cap is reached. Useful for assessments, frustrating on mandatory training where someone needs one more go, so consider who will field that request.
Common Moodle tracking gotchas
- Auto-commit off with content that never commits. Under Compatibility settings, Auto-commit makes Moodle save tracking data even when the content does not call
Commit. Some packages only commit on exit, and lose everything if the learner closes the tab. Turning this on is a reasonable safety net; fixing the content is the real fix, covered in why SCORM completions go missing. - Force completed. A legacy compatibility setting that marks the attempt completed at the end of a session whatever the content said. It makes the numbers look healthy and destroys their meaning. Leave it off unless you know precisely why you need it.
- Popup blocked. With Display package: New window, a blocked popup means the SCO never finds the API and the session is never initialised — the learner sees a page, Moodle sees nothing.
- Suspend data over 4 KB. SCORM 1.2 caps
cmi.suspend_dataat 4,096 characters. Because Moodle is 1.2, a long course storing every answer in that string can silently truncate and lose its resume state. - Re-uploading a package mid-course. Replacing the zip on a live activity can orphan existing attempts when SCO identifiers change in the new build. Keep identifiers stable between versions, or add a new activity.
If the package misbehaves the same way on more than one platform, the problem is the package rather than Moodle — SCORM not working in your LMS covers isolating that.
Verifying it recorded correctly
Do this once per package, before learners touch it. Launch the activity as a test user and complete it properly. Then close the tab abruptly rather than using the course's exit button — that single step catches the most common failure, a course that only saves on a clean exit.
Now open the activity and go to its Reports. The attempts report lists each user's attempts with status, score and time. Confirm four things:
- An attempt exists at all. No row means the runtime never initialised.
- The status is what you expect — not incomplete, and not completed on a course you abandoned halfway.
- The score arrived, and matches the scale in the gradebook column.
- Relaunching resumes where you stopped, if resume is what you intend.
Drilling into a single attempt shows the raw tracked elements the content sent. That view is the honest record: it is what Moodle actually received, as opposed to what the course appeared to do on screen. If the value you expected is not there, the content never sent it, and no Moodle setting will conjure it.
Where SCORM Central fits
SCORM Central converts files you already have — PDF, PowerPoint, Word, or video — into SCORM 1.2, SCORM 2004, cmi5, or xAPI, and shows you the manifest, the full runtime log, and a conformance report on every build, so you can see exactly what a package will report before an LMS does. See how it works, or start with one file.