SCORM is a difficult problem, no doubt. As a content creator, there are countless things that you should do well in every piece of content if you want it to work in as many LMSs as possible.

Today, I’m focusing on particular technical choices at runtime, rather than packaging or “process”. (If process were part of this, I think all five things would be “test your content”.) Without further ado:

1. Find the SCORM API well

Once a piece of SCORM content is launched, its first task should be finding the SCORM API. Without this API, it can’t communicate with the LMS at all. (And a piece of SCORM content that can’t communicate with an LMS is just a webpage with annoying popup error messages…)

Finding the API isn’t a trivial task. It can be located in a parent frame or a parent window. This distinction is a crucial one, and isn’t tested well by the SCORM test suite. If your content adheres to the standard, it will perform well either in a frameset or in its own window. Take the time to get this right, or you’ll suffer the pain of fixing it when you send your content to the second LMS you want it to work in. (And for goodness sake, we’ve provided you with the code for an improved API discovery algorithm. Go ahead and use it. All of you.)

Lastly, if you can’t find the API, be sure to tell the user. The user needs to know right away that they won’t be getting credit for any of the work they’re doing.

2. Set your status right away

The first thing a piece of content should do with the API after it finds it is call GetValue(cmi.completion_status). [Note: This article is not about syntax. I’m intentionally avoiding committing to a version of SCORM.] If the current status is “not attempted”, it’s crucial that the content change it to “incomplete” right away. If the content fails to make this change, the LMS is obligated to consider the content complete on exit, even if it isn’t!

3. For the love of your users, use bookmarks

I suppose this is the least crucial of the elements in this missive, but please take care of your users! SCORM offers a simple concept of bookmarking (cmi.location). As your learner progresses through your content, set a bookmark periodically. Then, when the learner returns, be sure to give them the opportunity to return to where they left off. You would expect that level of courtesy in any piece of content you take, so provide it to your learners.

4. Record completion

The vast majority of SCORM content is taken at the encouragement of another. In a corporate environment, training is pushed on learners for compliance reasons. In the education world, professors often want to know that the learning material has been reviewed. In many ways, SCORM is largely about tracking the completion of training.

The only way the LMS knows that the learner has completed the training is if the content tells the LMS that the learner completed the training. Please tell the LMS.

5. Exit gracefully

top.window.close() is not the right way to exit from a piece of SCORM content. Is that clear? Sometimes, content is opened in its own window. If this is the case, then top.window.close() will probably be just fine. Sometimes, content is opened in a frameset. If this is the case, the world will come to an end.

Section 2.1.3 of the SCORM 2004 3rd & 4th Edition Specs puts it like this:

If the window in which the SCO was launched is a top-level window (i.e., the
window has no parent window, but it has an opener) then the SCO may attempt to
close the window after calling Terminate(“”).


If the window is not a top-level window (i.e., the window has a parent window),
the SCO may not act on the parent window or any window in the chain of parents.
For example, a SCO is not allowed to attempt to close the top window, unless it is
its own window.

This is one to get right. As an LMS vendor, content that obliterates the entire LMS (by closing its window) is annoying both from a user experience perspective and from a data perspective (in poorly implemented LMSs). Put simply, don’t trash the room on your way out the door.


These five things alone won’t make your content conformant, but they will move you a long way down the path to creating interoperable, well liked content. So, what did I miss? Are these things the top 5?

Tim is the chief innovation and product officer with our parent company LTG, though he used to be CEO here at Rustici Software. If you’re looking for a plainspoken answer to a standards-based question, or to just play an inane game, Tim is your person.