# 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.

- Workflow type: code
- Services: Canvas, Slack Bot, Google Sheets
- Categories: Personal Productivity, Operations
- Published: 2026-08-04

## What it does

- 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 you'll need

- 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

## Prompt

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.

## How to customize

- 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

## Example output

Grading backlog: 47 ungraded across 3 courses

Course    | Assignment      | Due    | Graded | Ungraded | Not submitted
BIO 201   | Lab Report 3    | Mar 14 | 12     | 22       | 4   (!) 9 days overdue
BIO 201   | Midterm Essay   | Mar 20 | 25     | 13       | 0
CHEM 110  | Problem Set 6   | Mar 22 | 30     | 9        | 2
ENG 105   | Peer Review     | Mar 21 | 18     | 3        | 1

(!) marks work sitting ungraded more than 7 days past its due date.

## FAQ

### Will this work if I teach several courses at once?

Yes. It looks at every course you are actively teaching and combines them into a single table sorted so the biggest backlog is at the top, with a total count across all of your courses.

### Does it change any grades in Canvas?

No. It only reads the counts of graded, ungraded, and not submitted work and reports them back to you. Nothing is graded, posted, or edited on your behalf.

### What happens to assignments that are fully graded?

They are left out so the report stays short and focused on what actually needs your attention. If you would rather see everything, that is easy to change.

### Why does it write to a spreadsheet as well as Slack?

Each run adds new rows instead of overwriting the old ones, so you build up a history over the term and can chart whether your grading turnaround is getting faster.

### Do my students see any of this?

No. The report goes only to your Slack channel and your spreadsheet. Nothing is visible to students in Canvas.

Use this prompt in General Input: https://www.generalinput.com/prompts/weekly-canvas-grading-backlog-report-in-slack-and-sheets