The first thing most schools tell us is that their information is correct — it is just in the wrong places. Admissions live in one spreadsheet, results in another, fees in a ledger and parent contact in a phone. Each is accurate on its own; none of them agree with each other.
Our school platforms, Techmiary Cloud and WDA SMS, are built around a different rule: every module works from the same student record. Results are entered against it. Fees are billed against it. Hostel charges, exeats and incidents attach to it. When a parent receives an SMS, it is about that record.
Fees are where this matters most. Each student has a wallet that parents fund, and fees are paid from it. Every credit and debit is recorded as a transaction against the wallet, so a balance can always be explained line by line.
Payments are not applied the moment they are recorded. They move through an approval step — pending, then approved — so the accounts office confirms a payment before it changes what a parent owes. Approval updates the payment, the wallet and the ledger inside a single database transaction: it completes fully or not at all. Receipts are generated as PDFs, and the billing report shows every student's status at once.
The same principle carries into communication. Because contact details, fees and results share a record, a fee reminder goes only to parents with an outstanding balance, and result notifications go out when results are published — without anyone building a mailing list by hand.
None of this is exotic engineering. It is the decision to model the school once, correctly, and let every feature read from that model.
Get new articles by email
Occasional notes on building and running business software.
Related reading
Building a result manager that works without the internet
Why we built a school's result software as an offline desktop program, and the details that matter when every student needs a correct, prin…
Keeping every player on the same clock with Django Channels
LiveQuiz runs multiplayer quiz rooms in real time. The design choice that makes it fair: the server, not the browser, owns the timer.