Skip to content

For institutions

Importing students

bǎi nián shù rén — “A hundred years to raise a person”

The CSV format, enrolling a whole class at once, and what happens before a student claims their account.

6 min read

Not what you were looking for?

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

  1. 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.
  2. They are enrolled — Into the class you named on the row, or the one you chose for the whole import.
  3. An invitation is issued — Valid for seven days. The student uses it to set their own password and claim the account.
  4. 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 imported means 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

  1. 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.
  2. 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.
  3. Create the classes first — So the class column resolves. An unmatched class name imports the student without enrolling them.
  4. 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.

Continue learning

Setting up your schoolFrom an empty workspace to a running programme, in the order the steps actually depend on each other.Classes and circlesHow your tutors’ classes attach to the school, and which circles do not.