Skip to content

Instantly share code, notes, and snippets.

@battis
Last active March 28, 2026 18:26
Show Gist options
  • Select an option

  • Save battis/2c004d1097627e5f124669150694677f to your computer and use it in GitHub Desktop.

Select an option

Save battis/2c004d1097627e5f124669150694677f to your computer and use it in GitHub Desktop.
Blackbaud -> Canvas Export

DRAFT: Exporting LMS data from Blackbaud to Canvas

Basic Workflow

  1. Capture LMS data snapshot(s) using msar snapshot
  2. Archive linked files from snapshot using msar archive
  3. Create historic faculty using SIS Users Import
    1. Use a spreadsheet to generate appropriate sis_user_id values (e.g. usr-123-12345678)
    2. Create a non-conflicting login email (e.g. usr-123-12345678@example.myschoolapp.com) and assign it to both the login_id (for Canvas) and email (for Canvas Studio)
  4. Designate an admin account as the import user (ideally not a person, but a generic IT or Academics account) and assign that account the sis_user_id of @msar/canvas-import (this can be changed after the import is complete)
  5. Import the archived snapshots using canvas-import
    1. When prompted to authorize a user to access the Canvas and Canvas Studio APIs, use the generic user designated in the previous step.

Known Issues

  • Everything listed for @msar/canvas-import
  • Everything listed formsar snapshot and msar archive
  • I stored all of my snapshots and archives on a Google Shared Drive, which was generally fine (other than the bandwidth needed to sync back and forth with the cloud as things changed). The big wrinkle was that periodically teachers uploaded .gdoc or .gsheet files to assignments. These wouldn't have been working links or attachments for the students, of course (they're just web shortcuts), but by storing them on Google Drive, they were automatically removed by that sync, since they didn't match with actual Google Doc or Google Sheets files in those locations. This led to a few missing files (an eventuality handled by @msar/canvas-import but it would have been nice to have them and convert them to actual web links.
  • Enabling Canvas Studio accounts and course lists as-needed is a little janky -- it relies on interactively opening a series of web links, and requires monitoring the scripts. I suspect that this has to be done interactively, but it's not actually so complicated or variable, so it could definitely be scripted using Puppeteer (as the scraping of Blackbaud was done), reducing the monitoring load on running the imports. Alternatively, the interactive steps could also have been front-loaded by scanning the snapshots before beginning.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment