Weekly Canvas grading backlog report in Slack and Sheets

By General Input

Every Monday at 8am, see exactly which assignments have work waiting, sorted worst first, posted to Slack and logged to a spreadsheet.

Integrations

  • Canvas
  • Slack Bot
  • Google Sheets

Type

Deterministic Code

Categories

  • Personal Productivity
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensStop cold emails to anyone with a live deal in PipedriveLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasoniMessage campaign console with pre-flight checks and delivery board