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.

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
- Open the module's list page (e.g. Students, Classes) and click Import / Export (admin only).
- Download the template CSV from the drawer.
- Fill in your data. The required columns are listed in the drawer's description.
- 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.
- 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
| Module | Required columns | Optional columns |
|---|---|---|
| Students | firstName, lastName, className | gender (male|female), admissionNumber, dateOfBirth, address, email, guardianName, guardianPhoneCode, guardianPhone, guardianEmail, guardianRelation |
| Teachers | firstName, lastName, email | phoneCode, phoneNumber, departmentName, qualification, dateJoined |
| Classes | name | level, section, classTeacherEmail, room |
| Subjects | name | code, departmentName, description, isActive |
| Grades | admissionNumber, subject, term, session, score | class, maxScore (defaults to 100) |
| Attendance | admissionNumber, class, date (YYYY-MM-DD) | term, session, status (present|absent|late|excused; default present), note |
| Parents | name, admissionNumber, and an email address or a phone number | title, email, phoneCode, phoneNumber, relationship |
| Timetable | class or group, day, period, subject | teacherEmail, room, span, notes |
| Payments | invoiceNumber, 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.
guardianPhoneCodeis 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.
phoneCodeis 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,maleandMALEare one gender;Father,fatherandFATHERare one relationship. - A title is the same with or without its full stop.
MrandMr.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 7206and08107907206are 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.