Implementation
Switch school software without your parents noticing
The disaster story of a school software migration is never "we lost the data". It is the test import that fired 400 fee reminders at 11 p.m., to families who had already paid, from a system nobody had told them about.
The failure mode nobody plans for
The failure people remember from a school software migration is rarely the missing record. It is the message. A batch of legacy dues imported on a Tuesday looked, to the new system, exactly like 400 freshly issued invoices — so the reminder engine did what it was built to do. Or a welcome notification went to every guardian number in the import, including the twelve belonging to former parents, at an hour when nobody was in the office to explain.
That is a reputational event, and it is entirely avoidable. Data can be re-imported; a message cannot be un-sent. So the whole design of a safe migration is: get the records in, keep the system silent, verify, then choose the day it starts speaking.
Six rules for a quiet migration
- An import is a proposal, not a commit. Uploading a file should produce a reviewable mapping and a validation report — not rows in your live student table. A person decides to commit, after reading what will happen.
- Validate deterministically, before the commit. Date of birth that is a placeholder, a missing guardian name, a mobile number that is not ten digits, a duplicate admission number: these are checkable rules, and they should be checked by a rule rather than by a model that is sometimes right.
- Every imported record carries its run. Stamp each row with which import it came from and when. Without that you cannot answer "where did this student come from" three months later, and you cannot roll a bad batch back.
- An imported student must not look like a new admission. Automations that fire on a new admission — the welcome message, the document checklist, the fee demand — must not fire on a bulk import. That means the import emits a distinct event, not the same one a real admission does.
- Numbers come from your allocator, not the spreadsheet. Admission and registration numbers should be minted by one per-school series that knows what has already been issued. Carrying in whatever the old sheet had is how schools end up with two students holding the same number.
- Legacy dues are history until you say otherwise. Invoices that predate your go-live date should be visible but excluded from automatic recovery. You want the outstanding figure on screen; you do not want it dialling parents.
The sequence that works
- Set the school up first. Board, academic year, class and section structure, fee heads. Import into a shape, not into an empty space — otherwise the mapping step has nothing to map onto.
- Import one class, not the whole school. Thirty rows will surface every structural problem in your data: the two students with the same name, the sections written three different ways, the guardian column that is sometimes a name and sometimes a phone number. Fix the source file, not the imported rows.
- Read the validation report properly. It is the only moment in the project where the cost of a bad record is measured in minutes rather than in a parent phone call.
- Import the rest, then reconcile counts. Students per class-section against your own register. Guardian phone coverage as a percentage. Number of records missing a date of birth. Write those numbers down before go-live; they are your baseline.
- Enter opening balances deliberately. Outstanding dues are the highest-risk data in the whole migration, because they are the data that generates messages and arguments. Import them, check a sample of ten against the old ledger by hand, and mark the date from which the new system is allowed to chase anything.
- Run the school in parallel for a short window. A fortnight of doing attendance and fee receipts in both places is tedious and it is worth it. It is also the only honest way to discover which of your daily workflows the new system does not yet cover.
- Go live as an explicit action, on a date you announce. Not "whenever the import finished". Tell parents the day before, in your own words, through the channel they already trust.
How this works in Vidyapeeth360
A new self-serve workspace starts in quiet mode. Non-essential outbound messaging is held at a single point every channel passes through, so a rule, a campaign or a reminder engine cannot reach a parent while you are still setting up. Transactional messages a person explicitly triggers — a sign-in code, a staff invite — still go, because those are the ones you need during setup. Going live is a separate, audited action with its own date, not a side effect of finishing an import.
The import helper covers student records. It proposes a column mapping over the file's structure, validation is deterministic, and the commit is a human action. Every imported row is stamped with its run and its timestamp, and the import raises an event of its own rather than the one a real admission raises — so parent-facing automations cannot fire on a batch. A batch can be rolled back. Admission numbers are minted by the school's own sequential allocator on every path, including import.
For money, you set a date from which recovery is allowed to act. Invoices that came in through an import, or that predate that date, are excluded from automatic reminder ladders and dunning — they still show in the outstanding figure and staff can still act on any individual invoice deliberately. Both the fee reminder and WhatsApp alerts surfaces honour this, because they share one outbound funnel rather than each having their own.
Before you announce go-live
- Student counts per class-section match your own register, exactly.
- No duplicate admission or registration numbers anywhere in the school.
- You know the percentage of students with at least one reachable guardian number, and you are comfortable with it.
- A sample of ten outstanding balances has been checked against the old ledger by hand, by someone who knows those families.
- The date from which the system may chase dues is set, and it is not in the past.
- Someone has sent themselves a test message on every channel you intend to use.
- You have told parents, in your own words, what changes for them and what does not.
If you are moving from another ERP rather than from spreadsheets, the same sequence applies, with one addition: export everything you can from the old system before you give notice, including the exports you think you will never need. Access ends on a date somebody else controls. The full migration path we run with schools is described on the switching page, and the first ninety days are laid out under implementation.