Bulk upload
Loading teachers, students and enrolments from CSV, with a dry run before anything is written.
How it works
- 1Download the template
Use the template for the entity you are loading. Column names are exact; do not rename them.
- 2Fill it in
One record per row.
- 3Upload — nothing is written yet
The file is parsed and validated first.
- 4Read the dry-run result
Per-row outcomes: what would be created, updated, skipped or rejected, and why.
- 5Commit
Only valid rows are written.
What validation catches
ProblemOutcomeFix
Duplicate emailOutcome: Skipped: The account already exists. Remove the row or accept the skip.
Missing required fieldOutcome: Rejected: Fill it in and re-upload.
Unknown sectionOutcome: Rejected: Create the section first; rostering depends on it.
Malformed emailOutcome: Rejected: Correct the address.
Trailing blank rowOutcome: Skipped: Accepted and skipped since 2026.06.1 — earlier versions rejected the whole file.
Doing it safely
Upload ten rows first, confirm they landed as expected, then upload the rest. A thousand-row file that validates cleanly but maps students to the wrong sections is far more work to unpick than to re-upload.