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.
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.
What does this prompt do?
- 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 do I need to use this?
- 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
How can I customize it?
- 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
FAQs
Will it change anything in Canvas without asking me first?
What is the difference between removing someone and marking them inactive?
Can I match people by student ID instead of email address?
What if my roster names a section that does not exist in Canvas yet?
Does this work if my school already pushes enrollments from a student information system?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.
See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.
Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.
Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.
Stop opening every Canvas course one at a time.
Set the screen up once, then work through add and drop week from a single reviewed table.