Canvas enrollment and roster manager for add and drop week

By General Input

See every course, section, and person in one table, compare it against your roster spreadsheet, and fix enrollments without opening each course.

Integrations

  • Canvas
  • Google Sheets

Type

App

Categories

  • Operations

Build an internal app that our program coordinators open during add and drop week to manage who sits in which Canvas course and section, without clicking through every course one at a time. It has two main views, a live enrollment board and a roster reconciliation screen, plus a shared confirmation step that every change has to pass through before it touches Canvas.

The first view is the enrollment board. Let me pick the courses I manage and save that selection, then for each selected course pull its sections with Canvas List Course Sections and its people with List Enrollments in a Course, using List Enrollments in a Section when a single section needs to be loaded on its own. Render one table grouped by course and then by section, with a row per person showing name, email or SIS id, role (student, TA, observer, teacher), enrollment state (active, invited, inactive, concluded) and section. Show counts per section broken out by role plus a course level total, so I can spot an empty section or an overloaded one at a glance. Include filters for role and state and a search box across name, email and SIS id. Canvas paginates enrollment lists, so request a large page size and follow the next link until the list is exhausted before rendering any counts.

The second view reconciles Canvas against our roster of record, which lives in Google Sheets. Let me enter the spreadsheet and the tab or range, read it with Google Sheets Get Values, and map the columns: person name, email or login, student or SIS id, course, section, and role. Save that mapping so I do not redo it on every visit. Match roster rows to Canvas people by SIS id first and email second, since Canvas accepts prefixed lookups such as sis_user_id: and sis_login_id: wherever a user id is expected. Show which identifier produced each match, so I can tell why someone did not match.

Present the differences in exactly three buckets: people on the roster but missing from Canvas, people in Canvas but no longer on the roster, and people enrolled in the wrong section. Each row shows the person, the course, the roster section versus the Canvas section, and the role, so I can judge it without opening Canvas. Rows are selectable individually and in bulk. Roster differences during add and drop are frequently legitimate, for example a late add that has not reached the sheet yet, a student auditing, or a TA added on purpose, so let me dismiss a row as a known exception and persist those dismissals rather than fighting the same three names every morning.

From a single row or a multi select I can act. Add a person with Enroll a User in a Course, or with Enroll a User in a Section when the roster names a specific section. Remove or pause someone with Conclude, Deactivate, or Delete an Enrollment. Move someone between sections by enrolling them in the new section and then concluding the old enrollment. Canvas requires a disposition on that destructive call, so always pass task explicitly as conclude, inactivate, deactivate or delete, and surface those in the UI as distinct plain language choices rather than raw API words, for example "Remove from course, keeps their grades" for conclude, "Mark inactive, easy to undo" for inactivate, and "Delete enrollment permanently" for delete. Offer Reactivate an Enrollment as the undo for anyone who was marked inactive.

Nothing is applied until I see a plain confirmation summary. Before any batch, list exactly what is about to change in ordinary language, one line per person, for example "Add Maria Lopez to BIO 210 section B as a student" or "Move Chen Wu from section A to section C in BIO 210, enroll in C then conclude A". Group the summary by action type and show a total count. Treat full deletion as destructive and keep it separate: deletes never ride along in the same confirmation as concludes, they get their own confirmation step with an explicit acknowledgement that grades and submission history go with them.

When the roster names a section Canvas does not have yet, let me spin it up in place with Create a Section without leaving the reconciliation view, and offer Update a Section when the mismatch is only a naming difference so I rename the existing section instead of creating a duplicate. A newly created section should appear immediately in the enrollment board and become a valid target for the pending changes.

After applying, show a per person result list covering what succeeded and what failed and why, for example a person who does not exist in Canvas, a permission error, or a rate limit. Keep failed rows selected so I can retry them, and keep a running log of applied changes for the term recording who applied what and when. Canvas rate limits per token, so apply changes sequentially rather than in a burst and show progress while a batch is running.

Everything I choose should stick between visits: the selected courses, the spreadsheet and column mapping, the dismissed exceptions, and the change log.

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 engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads