Showing results for 
Search instead for 
Did you mean: 

SCORM package (via Camtasia 9) not converting to complete/incomplet

Jump to solution

Hello everyone,

I am trying to create video lectures with embedded interactive quizzing that student view and complete via the SCORM tool in Canvas. I have successfully created the lectures and quiz questions in Camtasia 9, exported them to SCORM packages, and uploaded them as Assignments in Canvas. 

The problem I have is that I want Canvas to grade those assignments as complete/incomplete with a possible score of 1 point. When I created the SCORM package I specified a 0% correct threshold as "passing". However, Canvas grades the assignment as "incomplete" if the test student gets 1 out of 3 questions incorrect. That is, Canvas only grades the assignment as "complete" if all quiz questions are answered correctly. (I have also set the % viewed threshold to 0% in case that was the problem.)

I found this forum post: SCORM and Storyline Scoring - Complete/Incomplete 

which as marked as assumed answered but which doesn't have any resolution. Given that I'm having the same problem in Camtasia as was previously posted about Storyline I'm guessing either SCORM or Canvas is the problem. 

One work-around suggested in the previous forum post was to use a custom grading scheme for the SCORM package assignment in which anything > 0% is scored as Pass, 4.0, 1, or A. I have tried that and regardless of the assignment-specific grading scheme Canvas treats the assignment score as .33 in the final grade (see attached screenshot). 

I need a way to grade my SCORM packages based on completion rather than accuracy. Does anyone have any ideas?

Thank you for any help you can provide!


james.vlisidesmiraculously solved this problem with a simple fix. I marked his reply as "Correct" below and have also converted his explanation to step-by-step instructions, pasted here to make them easy to find. Thank you James!

To convert your SCORM package from percentage-based grading in Canvas to completion-based grading (using the SCORM passing threshold):

1. When you create your SCORM package don't bother to create a "zip" version because you will need to edit the files before you can zip the package.

2. Open the folder that you created as your SCORM package. For the purposes of this tutorial we will assume that your SCORM package was called "TestQuiz" Inside you will see a file that has the SAME name as the folder with a type of "JScript Script file" and an extension (possibly hidden) of ".js", e.g. TestQuiz.js

3. Open TestQuiz.js in a simple text editor (I used Notepad++ by right-clicking the file and choosing "Edit with Notepad++". It may or may not work to use Word since complex text editors sometimes add odd characters to simple text files.

4. Search for "!isNaN".

5. Insert a blank line AFTER this line and paste this code: if ( nScore >= scoreNeeded ) { nScore = 100; }

6. Save the TestQuiz.js file. [I wouldn't recommend doing "SaveAs" since you want the script to have exactly the same name, file extension, and location as the original TestQuiz.js file.

7. Zip the folder that contains your SCORM package (in this example folder: TestQuiz). I did this by right-clicking the folder and selecting "send TestQuiz to .zip"

8. Upload the zip file to Canvas and proceed. Now the SCORM result will convert to 100% if it is above the passing threshold that you set when you created the package, which means that Canvas will mark it as "complete" when the passing threshold is set.

1 Solution

Accepted Solutions

 @rdiana , Sorry about that. I got pulled in on something I know nothing about and I'm trying to find solutions. Did I mention I've been sick?

Admitting that I'm not fully recovered, I don't see how it changes the big picture though. Canvas only interprets 1 as being 'completed'. Canvas does not know about a threshold that Camtasia may or may not have set up. The only passback is that score, so it's up to Camtasia to do something with that threshold before it gets sent back to Canvas.

I still think modifying the JavaScript so that it passes back a 1 if the threshold has been met is the way to go. I took another look at the JavaScript that Ken posted and noticed that I was in the section on percentage complete, which would be consistent with my misunderstanding of the problem, but also would explain why changing it didn't make any difference.

I will say, as a non-professional JavaScript programmer, that their code is poorly written. I'm sure they have a reason for it, but

if ( nScore >= scoreNeeded )
    passingStatus = 'passed';
    apiCall( 'setValue', 'cmi.success_status', passingStatus );   
    apiCall( 'setValue', 'cmi.success_status', passingStatus );   

is functionally equivalent to

if ( nScore >= scoreNeeded )
    passingStatus = 'passed';
apiCall( 'setValue', 'cmi.success_status', passingStatus );   

Of course, I'm not a professional JavaScript programmer, so people probably think the same thing when they look at code I've written. I'm just saying that extra verbiage makes it harder for me to follow what they're trying to do.

But all of that is an illusion -- a red herring. The 'passed' isn't used anywhere. It's the cmi.core.score.scaled value that gets passed back to Canvas.

They've also got essentially the same code duplicated for whether the API is at least version 1 that they do if it's not version 1. It seems that the quickest solution (unverified since I can test the SCORM) is to fix the score before it gets there.

This amounts to a one-line change to the code in the userSubmitToLMS function.

if ( nScore >= scoreNeeded ) { nScore = 100; }

Here's the whole thing in context so you can tell exactly where it should go. In the following code, lines 1-5 and 8 are already there, all you should need to do is insert line 7 (and the comment in line 6 if you like).

function userSubmitToLMS( nScore , isComplete )
   var scoreNeeded = scoPassingScore;
   if ( !isNaN( nScore ) ) {
      // Adjust the score to be 100% if mastery is shown
      if ( nScore >= scoreNeeded ) { nScore = 100; }
      if ( apiVersion >= 1 )

What it does is say if you met the threshold, then change the score to be 100. In other words, it forgets about what the old score (based on the percentage correct) was and just call it 100. Then, that gets translated to a scaled score of 1 in a couple of lines and so Canvas thinks they score 1.

If you change the sliders in Camtasia, it will reset the JavaScript and you'll need to reapply the patch, but it should honor what the sliders say. If it doesn't, then it's the value right before the function that is not getting set properly. I think the 0 in the file Ken sent was just what he was playing with.

/******************** SCORM Related Calls ***********************************/
var scoPassingScore = 0;

You'll need to repackage the SCORM (I don't know if that's as simple as rezipping) and re-upload it.

Note that you will lose the ability to give a score based on percentage correct, so if you use this SCORM package in multiple places, one as Complete/Incomplete and another as a score, you'll have to upload two copies of it -- one with the modification and one without.

 @kblack  seems to know how to test this, so perhaps he could verify (if he can look past my previous ill-ness induced gaffes.) ??? (I don't want to throw more work on him if he's busy).

I hope this works -- I normally like to test things before writing and I definitely don't like being sick.

View solution in original post

25 Replies

This is definitely just a workaround but you could mute the assignment before they take it and then when your window for submission closes, Curve the assignment.   So if you curve it to 1, it will make all the grades of those who completed a 1.  I realize it is an extra step for you but it would correct all the grades at once.

Thank you so much Teri, this might be just the solution I need (at least until Canvas' ability to interpret SCORM output is corrected). Unfortunately I've never used the "curve" option before and I'm having trouble figuring out how to make it do what you suggested.

I will essentially have a list of entries in the gradebook ranging from [empty] (if they didn't complete the video package) to 0% through 100% and my goal will be to convert anything that IS a grade (even if it is 0% correct) to 1 point or 100% while leaving the empty values as empty (since I can easily convert those to zero with Canvas' gradebook functions) or changing those empty values to 0.

In my test so far I haven't succeeded...

If anyone has any advice I would very much appreciate the help!

Thank you!


Community Member

 @rdiana ‌ - The excellent suggestion from tross‌ is likely the less painful solution and most elegant one for this.  As a fellow Camtasia Studio user, I checked the TechSmith forums and this is apparently not a unique problem, as this thread indicates.  (Be sure to expand it to show additional replies.)  I thought that thread had the best answer by adjusting the SCORM options in Camtasia, but even setting the slider all the way down to 0% as the pass rate does not change the results for students who miss a question, based on my own experiments with this:

220088_quiz success setting in camtasia.jpg

The most likely culprit--based on my own somewhat limited understanding of both SCORM and (even less) of Javascript--is within the .js file that is output within the SCORM zip file named your_project_name.js.  You MAY be able to change parts of this Javascript file in Notepad or similar editor to get it to do what you want, but for that you would need to rely on the likes of  @James ‌ , awilliams‌ or anyone else in the Community who can make heads or tails out of it. 

In the area commented out with the title SCORM Related Calls it clearly makes API calls to Canvas and places the scores on a scale of 100.  (Don't forget--this file is generated BEFORE you import it to Canvas as a SCORM file, so it must make the API call to figure out the score, which in your case is 1 point.)   I am linking to a sample output that Camtasia produces in this .js file if anyone is interested or (Rachel), if you wanted to pursue this further with the help of other Community members:

sample javascript file.txt - Google Drive 

I tried my own feeble attempts at this by changing some of the variables I thought made the most sense and was completely unsuccessful, so I will have to pass this along--if you indeed are interested in changing the .js file on your end with the SCORM--to others in the Canvas Community.

Otherwise, as I said at the beginning, Teri's answer may be the most elegant one to use.

Hey awilliams, share one script and all of sudden you're an expert --- same thing happened to me.

I haven't read up or researched this, so it might already be addressed somewhere and I don't use Camtasia and the only SCORM product I've used (not with Canvas) is Respondus StudyMate. But in the file that  @kblack  posted, there's a comment

        // In 1.2, lesson_status hold both complete/incomplete and pass/fail.

        // So if we've already used it for pass/fail, we don't want to

        // overwrite with 'completed'

That makes it sound like they're doing something special with 1.2. That's SCORM 1.2, but I'm not sure if that's what they mean by api version (probably).

There's a check to see if the API version is at least 1 right before that. However, the comment and the code that it refers to is part of the ELSE block, which means that if it's the API version that's 1.2, then it would never get executed because 1.2 is at least 1 portion and never gets to the part where the code is.

It seems like that should be <= instead of >= but someone would need to look at the SCORM 1.0 vs 1.2 standard to see which commands are supported with which version. It might be that the block following the comment needs moved up to the >= 1 section. It also looks like the SCORM started with 1.0, so the check to see if it's >= 1 is useless, while checking that it's <= 1 would catch version 1. 

You might try changing

if (apiVersion >= 1) {


if (apiVersion <= 1) {

Again, that's just a quick cursory glance over the code looking for things that don't look right.

It may be unrelated, but internally (and within LTI grade passback), scores are sent back as decimals between 0 and 1. That means that 1 is not 1% but 100%. Just keep that in mind when you're reading the JavaScript. It's potentially confusing because it's called percentage in the source code.

var minimumCompletionRequired = 1.000000;

Means that you must complete 100%

  percentageComplete  = initialPercentageComplete + value;

  percentageComplete  = Math.max( 0, Math.min( 1, percentageComplete ) );

Means add the value to the initial proportion completed but then cap it at 100% (the 1 is 100%)

Community Member

 @James  Thank You for sharing your expertise--yet again! I did try changing the apiversion to <=1 and while it had no ill effect on the video running properly, the quiz results were the same with giving the students an Incomplete if they answered any questions incorrectly on the embedded quiz answers.

I am not knowledgeable on the SCORM standards, and as awesome as it is when a SCORM object works properly, there are times that I think SCORM should also stand for Sometimes Courseware Objects Result in Mayhem.  If I have the time, I may play around with this a bit more just to satisfy my own curiosity.    Thanks again.

 @kblack ,

Do you possibly have a small SCORM package I could test things with (I don't have Camtasia)? The link in the thread that  @rdiana  mentioned results in a 404 not found error.

Community Member

Sent to your email,  @James ‌ .  Please let me know if it did not go through for some reason.

Hi Ken & James,

Thanks so much for your help on this issue! I've been going back and forth with support at Camtasia/Techsmith, SCORM, and Canvas for the past several days and have reached the conclusion (which Canvas support agrees with) that everything is working as intended in Camtasia 9 and SCORM. The problem is that Canvas ONLY interprets the percentage that is passed from the SCORM package and ignores the "pass/fail" outcome. Unfortunately that means that the complete/incomplete assignment grading option only marks "complete" when the percentage is 100.

I was able to test the SCORM package in their cloud sandbox and got the following outcome:


So my conclusion is that Canvas needs to somehow access the "passed" result when grading is complete/incomplete rather than the percentage result. I've suggested this to support and am hoping to hear an ETA on when that might be corrected.

In the meantime it certainly sounds like this could be consistent with what you are finding in the Java script.

Thanks again for your help!


Community Member

Thank you for the update, Rachel!