# Canvas enrollment and roster manager for add and drop week

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

- Workflow type: app
- Services: Canvas, Google Sheets
- Categories: Operations
- Published: 2026-08-16

## What it does

- One table showing the courses you pick, their sections, and everyone in them, with counts of students, TAs, and observers per section
- A side by side check against your roster spreadsheet, sorted into three lists: people missing from Canvas, people in Canvas who are no longer on the roster, and people sitting in the wrong section
- Fix rows one at a time or in bulk: add people, move them between sections, mark them inactive, or remove them from a course
- A plain confirmation summary of every change before anything is applied, with permanent deletions kept behind their own separate confirmation

## What you'll need

- A Canvas login with permission to view and change enrollments in the courses you manage
- A Google account with access to the spreadsheet that holds your roster of record
- A roster sheet with one person per row, including a name, an email or student ID, the course, the section, and their role

## Prompt

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.

## How to customize

- Choose which courses show up on the main screen and save that selection for the rest of the term
- Point it at a different roster tab or range, and tell it which columns hold email, student ID, course, section, and role
- Decide what your team's default removal action is, ending someone's enrollment versus simply marking them inactive

## FAQ

### Will it change anything in Canvas without asking me first?

No. Nothing is applied until you read a plain summary of exactly what is about to happen, one line per person, and approve it. Permanently deleting an enrollment is kept behind its own separate confirmation so it can never ride along with a routine change.

### What is the difference between removing someone and marking them inactive?

Removing someone ends their enrollment but keeps their grades and submitted work on record, which is the normal choice for a student who drops. Marking someone inactive just hides them from the course and is easy to undo, which suits a student who might come back. Deleting an enrollment outright wipes the record and is treated as the destructive option.

### Can I match people by student ID instead of email address?

Yes. The reconciliation screen matches your spreadsheet rows against Canvas by student or SIS ID first and email second, so either column works. It also shows you which one it used, so you can tell why a particular person did not match.

### What if my roster names a section that does not exist in Canvas yet?

You can create the missing section right from the reconciliation screen and then enroll people into it, without leaving the app. If the section already exists under a slightly different name, you can rename the existing one instead of creating a duplicate.

### Does this work if my school already pushes enrollments from a student information system?

You can view everything either way, but it is most valuable where a spreadsheet is genuinely the source of record, such as continuing education, bootcamps, K-12 electives, and corporate training. If your registrar pushes enrollments automatically, changes made here can be overwritten by the next automated sync.

Use this prompt in General Input: https://www.generalinput.com/prompts/canvas-enrollment-and-roster-manager-for-add-and-drop-week