A client once asked me why their mandatory bloodborne-pathogens refresher had a 41% completion rate when "everyone has to take it." The LMS gave them one number and no story. So I did the thing SCORM is bad at: I lined up the launches and watched where people actually left. The same curve showed up that I've seen in nearly every self-paced module since — across more launches than I can count at this point. It has three features, and once you can see them you can design against them.
The shape is almost boringly consistent: a sharp cliff in the first minute, a long flat middle where the few who survived grind forward, and a second small decision pointright before the finish. SCORM's final-state reporting smears all of that into a single completion percentage. xAPI is how you get it back.
SCORM tells you whether they finished. It will never tell you where they left. That gap is the whole game.— the thesis in one line
The 60-second cliff.
The biggest single drop almost always happens before any learning does. People launch, the player loads, and a meaningful slice leaves inside the first sixty seconds — before slide two. In every module I've watched this way, that early cliff is consistently the steepest part of the whole curve, and it's the one most teams never see because the learner never reached a tracked interaction.
The causes are unglamorous and technical more often than they are motivational. A title slide that sits on a spinner while a 200MB video preloads. An "allow audio" gate the learner doesn't understand. A resume prompt that dumps them back into slide 38 of a course they barely remember. None of that is a content problem. It's a launch problem, and it reads as "low engagement" on a dashboard that can't see the first minute.
Watch the first sixty seconds before you touch anything else. The earliest part of the curve is where the most people leave and where the cheapest wins live — a faster first slide, a smaller hero video, a clearer audio prompt. Polishing slide 30 while slide 1 leaks is rearranging furniture in a room nobody enters.
The long flat middle.
If a learner clears the first minute, the curve goes calm. The middle of a module is remarkably flat — the people who stayed tend to keep going, slide after slide, with only a gentle decline. This is the part designers obsess over and it is, perversely, the part that matters least for raw completion. The audience here has already self-selected into "I'm doing this."
Flat is not the same as healthy, though. The flat middle is where quality drains even when quantityholds. Learners click Next without reading. They guess on the embedded check and move on. SCORM will happily mark all of this "complete." The completion percentage looks fine; the learning does not. The only way to tell the difference is to track what happens insidea slide — time-on-screen, answered-versus-skipped, first-try correctness — and SCORM's cmi model was never built to carry that.
Watch for the false-flat.
Occasionally the middle isn't flat — there's one slide where a chunk of people quit mid-course. When that happens it is almost always a single, identifiable obstacle: a video that won't play on locked-down hospital tablets, a quiz that won't accept a correct answer, a drag-and-drop that breaks on touch. One bad slide can masquerade as "learners lost interest." Statement-level data names the slide so you stop guessing.
The decision point near the end.
The third feature is the cruelest. Right before the end — often at the final assessment or the last required interaction — there's a second, smaller dip. People who have invested ten, twelve, fifteen minutes get to the finish line and don't cross it. From a completion standpoint, these are the most expensive learners you can lose: they did almost all the work and you got zero credit for it.
The pattern under this dip is usually a specific friction at the boundary. A final quiz that gates completion behind a passing score with no obvious retry. A "you may now close this window" instruction that fires before SCORM commits the final LMSSetValue/LMSFinish, so the learner closes the tab and the completion never records. A certificate step that throws an error. The learner thinks they're done; the LMS disagrees; both are technically right.
Treating the end-of-course dip as a motivation problem and bolting on a congratulations animation. Nine times in ten it's a commit-timing or pass-gate problem— the completion call never fired, or the learner hit a wall they couldn't get past. Confirm the final LMSFinish actually lands before you redesign the encouragement copy.
Instrument it with xAPI.
Here's the part the curve forces you to accept: you cannot diagnose any of this with SCORM alone. SCORM reports a destination. xAPI reports the journey — a stream of actor / verb / object statements ("Devon experiencedslide 12," "Devon answered question 3 incorrectly," "Devon suspendedat 14:02") written to a Learning Record Store. That stream is the curve.
You don't have to throw SCORM away to get it. Most modern authoring tools — Storyline, Rise, Captivate, iSpring — can publish SCORM and xAPI from the same project. Keep SCORM for the LMS that needs a pass/fail; emit xAPI to an LRS for the analytics. Host on something that speaks both and you get the completion record and the drop-off story from one upload.
// Slide-level "experienced" statements give you the survival curve. // Every learner, every slide — this is what SCORM can't show you. sendStatement({ actor: { name: "Devon Rhee" }, verb: { id: ".../verbs/experienced", display: "experienced" }, object: { id: ".../module/bloodborne#slide-12" }, }); // "answered" statements expose the flat-middle quality drain: // who's actually getting it right vs. clicking through. sendStatement({ verb: { id: ".../verbs/answered", display: "answered" }, result: { success: false, response: "B" }, }); // "suspended" + "completed" timestamps locate the end-of-course dip. sendStatement({ verb: { id: ".../verbs/suspended" } });
Once those statements are flowing, the three features stop being folklore and become a chart you can act on. The cliff is a bar at slide one. The flat middle is a gentle slope you can check for quality, not just attendance. The end dip is a measurable gap between "reached the assessment" and "passed it." You stop arguing about whether the content is "engaging" and start fixing named, specific slides.
You'll keep reporting a single completion percentage to a stakeholder who reasonably asks "why?" — and you'll have no answer. A completion rate without a curve is a thermometer with no thermostat. It tells you the room is cold and nothing about which window is open.
TL;DR — what to fix first.
Fix the first minute before anything else.The early cliff is the steepest part of every launch curve I've looked at. Shrink the hero video, speed up slide one, make the audio and resume prompts unmissable. This is the highest-leverage change you will make.
Audit the flat middle for quality, not quantity.Completion holding steady doesn't mean learning is. Track first-try correctness and time-on-slide to catch the click-through drain — and the occasional single broken slide hiding as "lost interest."
Treat the end dip as a plumbing problem first. Confirm the final completion call commits before the learner can close the window, and give failed assessments an obvious retry. Most of that lost credit is recoverable with a timing fix, not a pep talk.
And to see any of it, instrument with xAPI.Publish SCORM and xAPI in parallel, send statements to an LRS, and let the curve tell you where to spend your next hour. If you're still deciding where the package itself should live, our guide on where to host a SCORM coursecovers the hosts that give you both records from one upload — and if it's going on a marketing site, see embedding a SCORM course in WordPress.
Frequently asked questions.
Why does SCORM hide where learners drop off?
SCORM mostly reports a final state — complete, incomplete, a score, some suspend data. It was built to tell an LMS whether someone passed, not to narrate the path they took. Slide-by-slide drop-off lives in xAPI statements, not in cmi.completion_status.
Can I get drop-off data without rebuilding my course in xAPI?
Partly. Most authoring tools can publish SCORM and xAPI in parallel, so you keep SCORM for the LMS and emit xAPI statements to an LRS for the analytics. You do not have to abandon SCORM to start seeing the curve.
What is a normal completion rate for a self-paced compliance module?
There is no universal number — it depends on whether the course is mandated, how long it is, and where it is launched from. The more useful question is the shape of the curve: a steep early cliff and a dip near the end are common, and both are fixable once you can see them.
Where do I send xAPI statements?
To a Learning Record Store. SCORM Cloud bundles one, Training OS logs and exports statements through its own pipeline, and self-hosters often run Learning Locker. Pick the LRS first, then point your published package at it.
/06 Try it for free
Drop a SCORM file. See it live in 11 minutes.
Free for 3 modules. No card. Lifetime is $149 once. You read the article, you know how this is supposed to work — see it in your own browser.
About the author
Devon Rhee · Healthcare ID.
How to host a SCORM file (without an LMS).
Tutorial · 14 min read
How to actually host a SCORM file. Without an LMS.
Free SCORM hosting that actually works in 2026.
Tutorial · 8 min read
The five "free SCORM hosting" tools, ranked.
21 instructional designer portfolio examples we steal from.
Examples · 12 min read