Skip to content
Browse documentation
All documentation

Bulk Operations

Bulk Import & Export (CSV/XLSX)

Upload students, teachers, grades, and attendance in bulk from CSV or XLSX, with per-row validation, dry-run preview, and one-click export.

The Import / Export slide-over drawer for Students, listing the required and optional columns, with buttons to download the template CSV or export existing records, and a file picker that validates the chosen file automatically
Each module's own drawer names the columns it needs and validates your file before anything is saved.

Every module has its own Import / Export button, whether that is Students, Teachers, Classes, Subjects, Grades, Attendance, Parents or Timetable, and each opens a slide-over drawer with the same validate-then-import flow, template download, and one-click export, scoped to that module.

How to import

  1. Open the module's list page (e.g. Students, Classes) and click Import / Export (admin only).
  2. Download the template CSV from the drawer.
  3. Fill in your data. The required columns are listed in the drawer's description.
  4. Select your file. It is validated automatically the moment you choose it, and nothing is saved at this stage. Any errors are shown per row with the affected field; fix the file and choose it again to re-validate.
  5. If there are no errors, click Looks good, import to write the data to the database.

Imports are all-or-nothing: if any row in the file is invalid, the import is rejected and nothing is written, so you can never end up with half a file imported. Fix the reported rows and upload again.

Supported formats

CSV, XLSX, and XLS files are accepted, up to 5 MB each. A file larger than that is refused as soon as you choose it rather than after it uploads. Split a very large roster into a few files and load them one after another, which is safe to do because each import is checked on its own. Column headers must match the required names (case-insensitive, trimmed). Every reference to another record, whether a class, subject, department, term, session or teacher, is matched by name rather than by internal ID. Teachers are the exception and are matched by email, since they have no unique display name.

Column specs

ModuleRequired columnsOptional columns
StudentsfirstName, lastName, classNamegender (male|female), admissionNumber, dateOfBirth, address, email, guardianName, guardianPhoneCode, guardianPhone, guardianEmail, guardianRelation
TeachersfirstName, lastName, emailphoneCode, phoneNumber, departmentName, qualification, dateJoined
Classesnamelevel, section, classTeacherEmail, room
Subjectsnamecode, departmentName, description, isActive
GradesadmissionNumber, subject, term, session, scoreclass, maxScore (defaults to 100)
AttendanceadmissionNumber, class, date (YYYY-MM-DD)term, session, status (present|absent|late|excused; default present), note
Parentsname, admissionNumber, and an email address or a phone numbertitle, email, phoneCode, phoneNumber, relationship
Timetableclass or group, day, period, subjectteacherEmail, room, span, notes
PaymentsinvoiceNumber, amount, paymentMethod, paymentDate (YYYY-MM-DD)receiptNumber, note

A few module-specific notes:

  • Students. Every guardian column is optional. A row carrying guardianName and guardianPhone also creates the guardian's own parent account and invites them to set a password; a row carrying neither of those records whatever it has as contact details and creates no account. So a roster whose guardian phone numbers are missing imports fine. It simply does not invite anybody, and you can add the accounts later. guardianPhoneCode is optional even alongside a number and falls back to your school's own dialling code.
  • Teachers. An invite email is sent to each new teacher.
  • Classes and Subjects. Rows whose name already exists are skipped rather than rejected.
  • Parents. One row = one parent-student link, so a parent with several children needs one row per child. The parent's name is a single column, and either an email address or a phone number will do, since plenty of schools know only "Mrs. Okafor" and a number. A row whose contact is new creates the parent and emails a set-password invite; one that matches a parent already on file links another child to them without changing their details. phoneCode is optional even alongside a number and falls back to your school's own dialling code, the same way the guardian column does on the students import.
  • Timetable. The one import addressed to something smaller than the whole school: it fills a draft version, chosen in the Timetable workspace, and can never write into a published week. Its drawer is on the Versions tab rather than on a list page. Each row names either a class or a merged teaching group, never both, and the period column takes either the period's name ("Period 1") or its start time ("08:00"), matched inside the bell schedule that class runs to. Leave room blank for the class's own room. Rows are added to the draft, so start a new draft when you mean to replace a week rather than add to it. Every row is put through the same clash rules the builder enforces, so a file cannot import a week you could not have built by hand.
  • Payments. Lives on the Payments tab of the Finance Workspace rather than on a list page, and has its own set of rules because it writes money. See Importing payments in bulk.

How values are read

Columns are matched by name, and the values are read the way people write them:

  • Capitalisation does not matter in a column with a fixed set of answers. Male, male and MALE are one gender; Father, father and FATHER are one relationship.
  • A title is the same with or without its full stop. Mr and Mr. are the same honorific, and so are Mrs, Ms, Dr, Prof, Engr, Barr, Rev and Hon.
  • Phone numbers may be written in groups. 0810 790 7206, +234 (0)810 790 7206 and 08107907206 are the same number, so a column pasted from a contacts export needs no tidying up.

What is not guessed at is anything that is not the word itself: M is not a gender and Dad is not a relationship, and a row using one is reported by name rather than filed under something nobody chose.

Exporting records

Click Export CSV in any drawer to download that module's records as a CSV file. Grades and Attendance exports respect the page's current class/term/session filters. Timetable exports the whole of the version you have open, in the same columns that import one back, so you can export a week, edit it in a spreadsheet and bring it in as a new draft. Parents export one row per parent-student link, matching the import shape exactly for a clean round trip.

On the mobile app

Import and export are on the phone too, on each module's own list: Students, Teachers, Parents, Classes, Subjects, Grades, Attendance and Payments. Open the list and tap the import/export icon in the header, then Import from file or Export as CSV.

The flow is the browser's: choosing a file validates it first and writes nothing, the per-row errors are listed the same way, and the button that commits appears only once the file is clean. An export opens your phone's share sheet, so the file can go to Drive, email or a spreadsheet app, and covers the whole list rather than the filters on screen.

Each half is shown only to somebody who holds its permission, so a member of staff who may download the roster but not replace it sees Export as CSV on its own.

Ready to try it with your school?

Free for schools up to 40 students. No credit card required.