The Instructure Community will enter a read-only state on November 22, 2025 as we prepare to migrate to our new Community platform in early December. Read our blog post for more info about this change.
Found this content helpful? Log in or sign up to leave a like!
Does Canvas LMS have any type of progress indicator to inform teachers or students of a student's progress as far as percentage of the course that has been completed? In my Canvas course all assignments are prepopulated for the semester.
Do you use modules with module requirements? If not, then Canvas doesn't know how far through the course a student is.
If you're using module with module requirements, then Canvas has that information, but they don't give it to you as a simple percentage.
The option available through the web interface is to go to the Modules page and click View Progress at the top. This is for one student at a time and it just shows the details about that student's progress without giving a percentage. It's just for one student at time.
For students, they see icons on the modules page (or home page if it's set to modules), but they don't see a percentage. They don't get the nice list of requirements like the teacher does.
This is probably not your best option if you're just looking for a percentage.
There is an option available through the REST API called Get bulk user progress. It doesn't give you a percentage, but it gives you the number of requirements and the number of requirements completed. You would need to do the division yourself to get a percentage.
This report can be obtained through your browser, but it limits the results to 100 students at a time. When I tried to fetch this for our orientation course that has about 2500 students, it took over 2 minutes to get the whole dataset, so I looked for faster ways. If you're working with small classes, the REST API is the fastest way to get the data.
I'll describe how to do this using Chrome.
In Firefox, it is automatically pretty-printed, but in Chrome, there's a checkbox at the top to pretty-print the results.
You'll get an object like this:
[
{
"display_name": "James Jones",
"progress": {
"requirement_count": 14,
"requirement_completed_count": 7,
"next_requirement_url": null,
"completed_at": null
}
},
{
"display_name": "Danny Test",
"progress": {
"requirement_count": 12,
"requirement_completed_count": 4,
"next_requirement_url": null,
"completed_at": null
}
}
]
I have completed 7/14 requirements for 50%. Danny has completed 4/12 for 33.3%.
That will only give you the first 10 students. If you have more than 10 students, you can add ?per_page=100 to the end of the URL like <instance>/api/v1/courses/896851/bulk_user_progress?per_page=100.
You cannot go more than 100. Well, you can, but Canvas won't give you more than 100 and it will only confuse people.
If you have more than 100 students, then you'll need to get the next page. Add &page=2 to do this. <instance>/api/v1/courses/896851/bulk_user_progress?per_page=100&page=2
If you have more than 200 students, then change page=2 to page=3 and so on until you have the whole list.
If you want this in a spreadsheet, you can take the output, copy it to your clipboard, then go to a website like ConvertCSV that will convert JSON to CSV. Paste the results into Step 1 and scroll down to the bottom to get the results. You can then bring that into a spreadsheet where you can add a formula to convert the rate into a percentage.
If students attempt this, they will get an unauthorized error.
The third way is that faster way that I found when the bulk_user_progress was too slow for me. That involves using GraphQL. I set it up so that I could give it a list of students, whereas the REST API approach didn't allow me to specify which students I wanted. I was able to narrow down the list of students to just those who had actually spent time in the class and, since we remove students once they're completed, this really sped up the process.
Better yet, it just gives the name and percentage. I did remove the part about specifying the students from the code I'm giving you to simplify things. You could also get the Canvas Student ID and potentially SIS ID, but I removed that from the code I'm giving as well. If you have multiple students with the same name, you would need to look at IDs of some kind.
Go to your Canvas dashboard and add /graphiql at the end. Hit enter.
In the editor section in the middle, paste this code.
query courseCompletionProgress($courseId: ID!, $c1: String) {
course(id: $courseId) {
usersConnection(
filter: {enrollmentTypes: StudentEnrollment, excludeTestStudents: true}
first: 100
after: $c1
) {
nodes {
sortableName
courseProgression {
requirements {
completionPercentage
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
Click on the Variables tab at the bottom and add this JSON object. Change the courseId to match your Canvas course ID instead of the 896851 in my example.
{
"courseId": 896851,
"c1": null
}
Now click the big run icon (pinkish with a white triangle in the middle).
The results will appear on the right side.
Here are the complete results for my sandbox course.
{
"data": {
"course": {
"usersConnection": {
"nodes": [
{
"sortableName": "Jones, James",
"courseProgression": {
"requirements": {
"completionPercentage": 50
}
}
},
{
"sortableName": "Test, Danny",
"courseProgression": {
"requirements": {
"completionPercentage": 33.33333333333333
}
}
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": "Mg"
}
}
}
}
}
We can see that James Jones has 50% complete and Danny Test has 33.33333333333333% complete.
If you take that to the ConvertCSV tool and paste it in for Step 1, you get a nice table at the bottom with some really long names, but the desired data.
If you have more than 100 students in the class, then the pageInfo at the bottom will have hasNextPage as true rather than false. In this case, take the endCursor value and paste it in the variable section for the c1 variable, replacing the null that was there to start with. Make sure that you keep the quotes around the endCursor value. Then run the code again and analyze the results. Keep doing that until you get a hasNextPage that is false.
Students can use this, but they will only get the progression for themselves. If they have permissions to view other students, they will get a list of the entire class, but the courseProgression will be null for everyone else.
I personally think the GraphQL approach is nicer, but there is more work involved than just changing the URL a little. If you want to do this for multiple courses, you can just change the variables section, being sure to reset c1 to null when you switch courseId's.
If you knew that your classes never had more than 100 students, you could remove the pageInfo section, the $c1:String in the first line, the after: $c1 line, and the c1 in the variables section. If you were doing this for just one class, you could just put in the ID on the course line instead of the variable.
Here is the simplified version that you could pass on to your students if you want them to get the percentage (just change the ID before you give it to them).
query courseCompletionProgress {
course(id: 896851) {
usersConnection(
filter: {enrollmentTypes: StudentEnrollment, excludeTestStudents: true}
first: 100
) {
nodes {
sortableName
courseProgression {
requirements {
completionPercentage
}
}
}
}
}
}
There are a few ways you can track progress, however, it is dependent on how your Canvas Course has been set up. In module formats, if pre-requisites have been set up, you can check your progress of completion. This link might assist with modules and progress.
There are tools and technologies, like DesignPlus that can be added as an LTI, this tool has a progress bar that can be added to pages (provided the modules have been set up appropriately).
I hope this helps.
Thanks
Jen
Community helpTo interact with Panda Bot, our automated chatbot, you need to sign up or log in:
Sign inTo interact with Panda Bot, our automated chatbot, you need to sign up or log in:
Sign in