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 XLSXBoth are accepted. A spreadsheet exported straight from your student system usually works untouched.
  • A header rowThe first row names the columns. It is how the importer finds your data.
  • An email column — requiredThe only field that must be present and valid. A row without a usable address is skipped and reported.
  • A name column — optionalUsed for the account name. Without it the address becomes the name, which is workable but ugly.
  • A class column — optionalEnrols 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 reusedA 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 enrolledInto the class you named on the row, or the one you chose for the whole import.
  3. An invitation is issuedValid for seven days. The student uses it to set their own password and claim the account.
  4. An email goes outAfter 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:

  • importedAccounts created.
  • enrolledStudents placed into a class. Lower than imported means some rows named a class that did not resolve.
  • skipped_existingAddresses already on the site. Not an error — they were reused rather than duplicated.
  • errorsPer-row reasons. Almost always a malformed address or a missing email column.
  • sentInvitation 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 firstYour 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 readA 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 firstSo the class column resolves. An unmatched class name imports the student without enrolling them.
  4. Warn the students it is comingA 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.