What we learned migrating 4,000 student records in one weekend
A field report from a school that moved off eleven years of spreadsheets between a Thursday afternoon and a Sunday night — including the part where we got it wrong.
The school had eleven academic years of history spread across forty-one spreadsheets, two abandoned systems and one filing cabinet that everybody was slightly afraid of. They wanted to open the new term on a single platform. We had a weekend.
This is what actually happened, including the part we would do differently.
Thursday: we stopped trying to migrate everything
The first real decision was a subtraction. The school's instinct — every school's instinct — was to bring across all eleven years. We argued for three: the current year, the one before it, and a frozen archive export of the rest kept as files rather than as records.
The reasoning is unglamorous. Historical data that nobody queries still has to be cleaned, mapped, validated and supported forever. A student who left in 2017 does not need a login, a parent link, an attendance rollup or a fee ledger. They need to be findable. A PDF and a searchable index does that job at a fraction of the cost.
Rule we now apply by default: migrate what the school will act on this year. Archive the rest as documents.
Friday: the import is easy, the identity is hard
Bulk user import is a solved problem — a CSV per role, a mapping, a dry run. What is not solved is deciding who a person is.
In those forty-one spreadsheets we found the same mother recorded four ways: with and without a middle name, once under a maiden name, once with a transliteration that differed by two letters. Three of her children were in the school. Naively imported, she would have become four parent accounts, each seeing one child, none seeing the full picture.
The fix was boring and it took most of Friday: pick one identity key you trust — for this school, the national ID on the enrolment form — and reconcile against it before anything is created. Where the key was missing, we generated a review queue rather than guessing.
We ended up with 4,081 student records, 2,930 parent accounts and 214 rows a human had to look at. That last number is the one that matters. A migration that produces zero exceptions is a migration that has quietly made 214 wrong decisions.
Saturday: the timetable is the spine
Everything downstream hangs off the schedule. Courses, sections, teacher assignments, period structure. Get it wrong and attendance lands on the wrong session, grades attach to the wrong course, and the parent portal shows a child in a class they have never attended.
We built the timetable before we built anything academic, then had the two deputy heads walk the printed version corridor by corridor against the physical room allocation. They found nine errors. Every one of them would have surfaced as a support ticket in week two.
Sunday: the part we got wrong
We turned on parent access at 6pm on Sunday, ahead of a Monday start. Within an hour we had a hundred and forty password reset requests and a very busy front office.
The mistake was sequencing, not technology. Parent accounts should go live after the school has communicated what they are, with a short window where the office is staffed to help, and ideally not the night before term. We now stage it: staff first, then teachers, then a parent cohort by year group across three days.
Nothing was broken. It was just avoidable noise at the worst possible moment, and it cost the school's front office a bad Monday.
Monday: what "done" looked like
The school opened on one platform. Attendance was captured per period from day one. Fee schedules were live and visible to families. Two spreadsheets survived, both belonging to the same person, both retired by half-term.
The five things we would tell the next school
- Migrate two years, archive the rest. History is a document problem, not a database problem.
- Choose your identity key before you touch a file. Everything else is reconciliation against it.
- Expect a manual review queue. If your import has no exceptions, it has hidden them.
- Build and walk the timetable first. It is the spine; verify it physically.
- Stage the parent rollout. Never the night before term.
Three days is enough. It is only enough if you spend the first one deciding what not to do.
See how it works on your own school data
A 30-minute walkthrough with one of our onboarding leads — no slide deck, just the platform.