PowerSchool to Canvas Migration: Complete Guide
Contents
PowerSchool to Canvas Migration Overview
PowerSchool is one of the most widely used Student Information Systems (SIS) in North America, serving over 45 million students across more than 13,000 school districts. Canvas, by Instructure, is a leading Learning Management System (LMS) with over 30 million active users globally.
Many schools transitioning from PowerSchool as their primary SIS to Canvas as their LMS need to migrate student, course, enrolment, and grade data. This guide provides a step-by-step approach for that migration.
Migration Methods: CSV vs API
There are two primary methods for migrating data from PowerSchool to Canvas:
Method 1: CSV File Import (Recommended for most schools)
- Process: Export CSV files from PowerSchool, format them according to Canvas SIS Import specifications, and upload via Canvas Admin interface
- Best for: One-time migrations, schools without developer resources, smaller datasets (under 50,000 students)
- Time required: 2-4 weeks including testing
- Cost: $0 (just staff time)
Method 2: Canvas API Integration
- Process: Write scripts that use the Canvas API to create users, courses, and enrolments programmatically
- Best for: Ongoing sync between PowerSchool and Canvas, very large districts, custom workflows
- Time required: 4-8 weeks for development and testing
- Cost: $5,000 - $20,000 for developer or consultant
PowerSchool Data Export Preparation
Before exporting from PowerSchool, you'll need appropriate permissions. PowerSchool access is typically controlled by role:
- PowerSchool Administrator: Can access all system data export functions
- District Administrator: May have broader export capabilities
- Data Export Manager: A specific permission that can be assigned to non-admin users
Required Exports from PowerSchool
Navigate to System → Page and Data Management → Export in PowerSchool to access export tools. Export the following data sets:
1. Student Export
Use the "Student" export template or create a custom export with these fields:
- student_number — Unique student ID (maps to Canvas integration_id)
- last_name — Student surname
- first_name — Student given name
- grade_level — Numeric grade (e.g., 9,10,11,12)
- schoolid — School identifier (for multi-school districts)
- email_addr — Student email (if available)
- dob — Date of birth (optional but helpful for matching)
2. Staff Export
- teacher_number — Staff ID
- last_name — Teacher surname
- first_name — Teacher given name
- email_addr — Teacher email (required for Canvas login)
- schoolid — Primary school assignment
3. Course Export
- course_number — Course code
- course_name — Course title
- department — Subject area
- credits — Credit value
- grade_level — Which grades can take this course
4. Section Export (Classes)
- section_number — Unique section ID
- course_number — Links to course export
- teacher_number — Primary teacher of record
- termid — Term identifier (e.g., 2024-Fall)
- room — Classroom assignment
- period — Class period
5. Enrolment Export
- student_number — Student ID
- section_number — Section ID
- date_enrolled — Enrolment date
- date_left — Withdrawal date (if applicable)
- grade_received — Final grade
PowerSchool to Canvas Field Mapping
Canvas SIS Import expects specific CSV column headers. Here's the mapping from PowerSchool fields to Canvas columns:
User Import (Students & Teachers)
| Canvas CSV Column | PowerSchool Field | Transformation |
|---|---|---|
| user_id | student_number or teacher_number | No transformation |
| login_id | student_number or teacher_number | May need prefix like "student_" |
| password | N/A | Generate temporary password or use SSO |
| first_name | first_name | No transformation |
| last_name | last_name | No transformation |
| email_addr | No transformation | |
| status | N/A | Set to "active" for all active students |
Course Import
| Canvas CSV Column | PowerSchool Field | Transformation |
|---|---|---|
| course_id | course_number | No transformation |
| short_name | course_number | Same as course_id |
| long_name | course_name | No transformation |
| status | N/A | Set to "active" |
Section Import
| Canvas CSV Column | PowerSchool Field | Transformation |
|---|---|---|
| section_id | section_number | No transformation |
| course_id | course_number | No transformation |
| name | course_name + period | Combine: "Algebra 1 (Period 3)" |
| status | N/A | Set to "active" |
Enrolment Import
| Canvas CSV Column | PowerSchool Field | Transformation |
|---|---|---|
| section_id | section_number | No transformation |
| user_id | student_number | No transformation |
| role | N/A | Set to "student" |
| status | N/A | Set to "active" |
# Example CSV format for Canvas SIS Import (users.csv) user_id,login_id,password,first_name,last_name,email,status 12345,student_12345,tempPass123,John,Smith,john.smith@school.edu,active 67890,teacher_67890,pass456,Jane,Doe,jane.doe@school.edu,active
Canvas SIS Import Configuration
Once your CSV files are formatted correctly, follow these steps to import them into Canvas:
Step 1: Access SIS Import Tool
- Log into Canvas as an Admin
- Navigate to Admin → [Your Account] → SIS Import
- You'll see the SIS Import interface with options for file upload
Step 2: Configure Import Settings
- Import Type: Choose "CSV"
- Content: Upload files in this order: users.csv → courses.csv → sections.csv → enrollments.csv
- Override UI settings: Check "Override term dates" if your academic calendar differs from Canvas default
Step 3: Run Test Import First
Canvas allows you to run a "dry run" import that validates your CSV files without actually creating records. Always do this first.
- Click Choose File → select your CSV
- Enable "Preview and validate only" (dry run mode)
- Click Process Data
- Review the validation report for errors
Step 4: Full Import After Validation
- Once validation passes, disable "Preview and validate only"
- Upload files in the correct order
- Monitor the import progress in the SIS Import History section
- Resolve any errors that appear in the import log
Validation Checklist
After the import completes, validate these items:
User Validation
- ☐ Record counts match — Number of users created in Canvas equals number of students + teachers exported from PowerSchool
- ☐ Test login for sample users — Try logging in as 3-5 students and 3-5 teachers
- ☐ Check email addresses — Verify that email fields were imported correctly
Course and Section Validation
- ☐ Verify course listings — Check that all courses from PowerSchool appear in Canvas
- ☐ Check teacher assignments — Verify that each section has the correct teacher associated
- ☐ Validate section names — Ensure period/room information is present
Enrolment Validation
- ☐ Spot-check student rosters — Pick 5 random sections and verify the student list matches PowerSchool
- ☐ Check for orphaned enrolments — Ensure every enrolment has a valid student and section
- ☐ Test student access — Log in as a student and verify they see their correct courses
Common Issues and Solutions
Issue #1: "Invalid user_id" errors during enrolment import
Cause: Students exist in your enrolments.csv but their user records haven't been created yet (import order issue).
Solution: Always import users.csv BEFORE enrollments.csv. Canvas processes imports in the order you upload files.
Issue #2: Duplicate user records in Canvas
Cause: Running the same user import multiple times without updating existing records.
Solution: In Canvas SIS Import settings, select "Update existing users" rather than "Create new users." Canvas will match based on user_id.
Issue #3: Login failures for imported users
Cause: Password field requirements not met (Canvas requires minimum length, complexity).
Solution: If using a temporary password, ensure it meets Canvas password policy (typically 8+ characters). Better yet, integrate Single Sign-On (SSO) so passwords aren't stored in Canvas.
Issue #4: Term date mismatches
Cause: Canvas term dates don't match PowerSchool termid values.
Solution: Create matching term definitions in Canvas Admin → Terms before importing sections. Map PowerSchool termid values to Canvas term names.
Issue #5: Special characters in names
Cause: CSV files saved in ANSI/ASCII encoding instead of UTF-8.
Solution: Always save CSV files as "UTF-8" (not ANSI). In Excel, use Save As → CSV UTF-8. In Google Sheets, export as CSV and verify encoding.