Bulk import takes a spreadsheet of students and turns it into accounts, enrolments and invitation emails in one pass. This article is the file format, the limits, and how to read the result — because a partially successful import is the normal outcome and it tells you exactly what to fix.
The file
- CSV or XLSX — Both are accepted. A spreadsheet exported straight from your student system usually works untouched.
- A header row — The first row names the columns. It is how the importer finds your data.
- An email column — required — The only field that must be present and valid. A row without a usable address is skipped and reported.
- A name column — optional — Used for the account name. Without it the address becomes the name, which is workable but ugly.
- A class column — optional — Enrols each student into a class by name or invite code as they are created.
Five hundred rows at a time
Each import handles up to 500 valid rows. A larger cohort is several imports, which is also easier to verify — a failure in a batch of 500 is findable, and one in a batch of 3,000 is not.
Split by class or by year group rather than arbitrarily, so a re-run is a meaningful unit.
What each row does
- An account is created, or reused — A new student account in an invited state, or the existing account if that address is already here. Existing accounts are never overwritten.
- They are enrolled — Into the class you named on the row, or the one you chose for the whole import.
- An invitation is issued — Valid for seven days. The student uses it to set their own password and claim the account.
- An email goes out — After the import has committed, so a mail failure cannot roll back a successful account.
Reading the result
You get five numbers and a list of errors, and it is worth reading all of them rather than the first:
- imported — Accounts created.
- enrolled — Students placed into a class. Lower than
importedmeans some rows named a class that did not resolve. - skipped_existing — Addresses already on the site. Not an error — they were reused rather than duplicated.
- errors — Per-row reasons. Almost always a malformed address or a missing email column.
- sent — Invitation emails that went out. Lower than `imported` is normal and not a failure — the accounts exist either way, and you can resend.
Before running a big one
- Import five rows first — Your own address among them. It costs a minute and catches a wrong column mapping before it affects a year group.
- Check the addresses are ones students read — A school address nobody logs into produces 200 accounts and no students. This is the commonest cause of a "nothing happened" import.
- Create the classes first — So the class column resolves. An unmatched class name imports the student without enrolling them.
- Warn the students it is coming — A first email from an unfamiliar domain lands in spam. One line in a school newsletter fixes most of the non-arrivals.
Common questions
Up to 500 valid rows per import. Larger cohorts go in several passes, which is easier to verify anyway.