Weekly Canvas grading backlog report in Slack and Sheets
Every Monday at 8am, see exactly which assignments have work waiting, sorted worst first, posted to Slack and logged to a spreadsheet.
Every Monday at 8am, build me a deterministic grading backlog report so I know exactly which assignments to grade first. Run this on a cron trigger. Every step is a fixed lookup, some arithmetic on counts Canvas already returns, a sort, and two writes, so build it as a node based workflow rather than an agent.
Start in Canvas with List Courses to get my active courses. For each course, call List Assignments. For each assignment, call Get Submission Summary, which returns the counts of graded, ungraded, and not submitted submissions directly. Use those returned counts rather than walking every individual submission, since the summary makes the whole report cheap to compute.
Canvas list endpoints paginate through the RFC 5988 Link response header and default to only 10 results per page, so do not assume a single page. Follow the rel="next" URL verbatim until no next link is present, and do not construct page numbers yourself, because many Canvas endpoints use bookmarked cursors and omit rel="last". Raising per_page to 100 cuts the number of round trips. Canvas also rate limits per access token using a leaky bucket, and concurrent requests drain it fastest, so issue these calls sequentially rather than firing them all in parallel.
Skip any assignment whose ungraded count is zero. For every remaining assignment, produce a row with the course name, the assignment name, the due date, and the graded, ungraded, and not submitted counts. Sort all rows by ungraded count descending so the biggest backlog sits at the top, and compute a total ungraded figure across all courses.
Mark any assignment that still has ungraded submissions and whose due date is more than 7 days before the run date, since that work has been sitting too long. Make the marker obvious in the table, for example a warning emoji or an overdue label in its own column, and include how many days past due it is. Assignments with no due date should show a blank due date and must never be flagged as overdue.
Post the finished table to my teaching channel using Slack Bot Send a Message, leading with the total ungraded count across all courses so I get the headline before the detail. If the table is long enough to risk hitting Slack message size limits, keep the top rows in the message body and note how many additional assignments were omitted.
Then append the same rows to a tab in Google Sheets using Append Values, adding the run date to every row so we can chart grading turnaround over the term. Append rather than overwrite, since the whole value of the sheet is the week over week history.
If a course has no assignments, or every assignment in it is fully graded, leave it out of the table rather than emitting an empty section for it. If every course is completely caught up, still post a short message confirming there is nothing waiting to grade, so I know the workflow ran.
Example output
Additional information
What does this prompt do?
- Checks every course you are actively teaching each Monday morning and counts how much work is still waiting to be graded
- Builds one table sorted by the biggest backlog first, showing each assignment's due date alongside its graded, ungraded, and not submitted counts
- Flags any assignment where work has been sitting ungraded for more than a week past its due date
- Posts the table to your teaching channel and adds the same rows to a spreadsheet so you can track grading turnaround across the term
What do I need to use this?
- A Canvas account at your school with access to the courses you teach
- A Slack workspace and the channel where you want the report posted
- A Google account and a spreadsheet with a tab set aside for the grading log
How can I customize it?
- Change the day and time it runs, for example Friday afternoon instead of Monday morning
- Adjust the 'sitting too long' threshold from 7 days to whatever matches the turnaround you promise students
- Limit the report to specific courses, or keep fully graded assignments in the table instead of skipping them
FAQs
Will this work if I teach several courses at once?
Does it change any grades in Canvas?
What happens to assignments that are fully graded?
Why does it write to a spreadsheet as well as Slack?
Do my students see any of this?
Related templates
Every weekday, find every unpaid JobNimbus invoice, email each customer one reminder that gets firmer as it ages, and post a receivables summary to Slack.
Every weekday at 7am, your active courses are checked for missing work, silent logins, and slipping grades, with a ranked list sent to your advising channel.
Every hour, find the tickets closest to breaching, leave a nudge on each one, and post a ranked at-risk list to your support channel.
Every weekday afternoon, each student who is behind gets a warm, personal message in their Canvas inbox listing exactly what they owe.
Every weekday morning we compare your password vault against your HR records and suspend access for anyone who has already left.
When someone asks a library or framework question in your help channel, they get a straight answer with working code and a source link, right in the thread.
Stop guessing what to grade first.
Get a ranked grading backlog waiting in Slack every Monday morning, before office hours start.