Bank Statement Reconciliation for School Fees: From Highlighter to Receipts
On the first Monday of term, the bursar prints the bank statement. It runs to several pages. Each line is a credit with a narration that may or may not help: "FEES", "ADM 1043 GRADE 8", "JOHN K", "SCHOOL", or nothing at all. Armed with a highlighter, a class list and a calculator, the bursar matches lines to learners one by one, writes receipts, and puts a question mark beside the lines nobody can identify. It takes days, and the question marks never fully disappear.
Many Kenyan schools, public and private, collect a large share of their fees through the bank: deposits at the counter, transfers from parents' accounts, agency banking, and payments routed to the bank from mobile money. Banks rarely give schools a live connection to their systems. What they give is a statement, usually downloadable from internet banking as a spreadsheet or CSV file. Turning that file into accurate fee records is one of the most time-consuming jobs in a school office.
This article explains how to make reconciliation faster without making it riskier: why matching must be conservative, how to get parents to write narrations that can be matched, what to do with the lines that cannot, and how to avoid the worst mistake, crediting the wrong child.
Why reconciliation goes wrong
Reconciliation fails for predictable reasons. The parent writes the child's name rather than admission number, or writes the number wrongly. A parent with two children pays one amount for both. A relative pays and puts their own name. The bank truncates the narration. The bursar is working from a printout, so a line can be missed or entered twice. And by the time the statement is processed, a parent may already have been told their child owes money they have paid.
Each of these errors has a cost. A missed payment means a child sent home over fees already cleared, and a family that loses trust in the school. A payment credited to the wrong child creates two problems at once: one family shows as paid when it is not, and another shows as owing when it has paid. Sorting that out means awkward conversations and corrections across two accounts.
In reconciliation, a wrong match is worse than no match. An unmatched line is a question; a wrong match is a dispute.
Make the narration do the work
The single biggest improvement a school can make costs nothing: tell parents exactly what to write as the payment reference, and repeat it everywhere.
The best reference is the learner's admission number, written in a consistent form, such as "ADM 1043". Put that instruction on the fee structure, the invoice, the term letter, the school's notice board and every message about fees. Explain why: the admission number is unique, a name is not. A school with three learners called Brian Otieno cannot match "BRIAN OTIENO" with confidence, but it can match "ADM 1043".
Parents paying for two children should be asked to make separate payments, one per admission number, or to tell the office how a single payment should be split. It is worth accepting that some parents will not follow the instruction. The aim is to make the matchable lines the majority, so the bursar's time goes on the few that need judgement.
Import the statement, do not retype it
Retyping a bank statement into a fee system is where many errors start. A digit is swapped, a line is skipped, a page is entered twice. The safer approach is to download the statement from internet banking as a file and import it.
Different banks lay their files out differently, with different column names and orders. A sensible import does not assume a layout. It looks for the date, the narration and the credit amount by their column headings, and refuses the file if it cannot find all three, rather than guessing and reading the wrong column. Debit lines, such as bank charges and payments the school made, are not fee income and should be ignored.
Each statement line should also carry a reference that the system remembers once it has been processed. Then importing an overlapping statement, last week's and this week's together for instance, does not credit the same payment twice.
Match conservatively, review the rest
Automatic matching should be strict on purpose. A line should match a learner only when its narration contains that learner's admission number exactly, as a complete token. "ADM 0042" matches learner 0042. A bare "42" should not, because many narrations contain the number 42 for reasons that have nothing to do with that child.
Strict matching will leave some lines unmatched. That is the system working correctly. The unmatched lines go back to the bursar with their narration, date and amount, to be resolved by a human: a phone call to the parent, a check against the deposit slip, or a look at which family has a balance of exactly that amount. When the bursar identifies the learner, the payment is recorded against them like any other.
A good rule of thumb: if the bursar would need to think about a line, the system should not decide it.
Payments should allocate the same way every time
When a payment is recorded, from a statement or at the counter, it should be applied to the learner's account in a consistent, explainable order, usually to the oldest outstanding invoice first. This means a parent's statement always tells a coherent story: old arrears are cleared before new charges, and the school can explain any balance.
Each recorded payment should also produce a receipt the parent can be given, whether printed or shared, so that the family has proof and the school has a record that matches the bank.
A weekly rhythm beats a term-opening marathon
Reconciliation is easiest in small batches. A bursar who downloads and imports the statement every few days, clears the unmatched lines while memories are fresh, and confirms balances weekly will never face the multi-day backlog of the first week of term. Parents get receipts sooner, and the list of families genuinely in arrears is accurate when it matters.
A final monthly check closes the loop: the total fee income recorded in the system for the month should agree with the fee credits in the bank statement for the same period. If it does not, the difference is a list of lines to investigate, not a mystery.
Reconcile weekly and the first week of term is just another week. Reconcile termly and it becomes a crisis.
Where Opero fits
Opero imports bank statements downloaded as CSV files from internet banking. It finds the date, narration and credit columns by their headings, and refuses a file where any of the three cannot be found. Each credit line is matched to a learner only when the narration contains an admission number of that school exactly; anything else is returned to the bursar, with its narration, to resolve by hand. Matched lines are recorded through the same payment process the counter uses, so they allocate to the oldest invoice first, produce a receipt, and a line already imported is never credited twice.
Opero does not connect to any bank directly; the school downloads the statement and imports it. For mobile money, Opero supports M-Pesa payments started from an STK prompt, which needs the school's own Safaricom Daraja setup; it does not automatically match payments parents make to the Paybill on their own. For the wider picture of fee collection, see our guide to M-Pesa fee collection.
Key takeaways
- A wrong match is worse than no match. Keep automatic matching strict and review the rest by hand.
- Ask parents, everywhere and repeatedly, to use the admission number as their payment reference.
- Import the statement file rather than retyping it, and make sure lines cannot be credited twice.
- Allocate payments the same way every time, oldest invoice first, and issue a receipt for each.
- Reconcile weekly, and check monthly totals against the bank statement.
Frequently asked questions
Can a school system connect directly to our bank? Most Kenyan banks do not offer schools a live connection to their account data. The practical route is to download the statement from internet banking and import the file. Ask your bank what export formats it provides.
What should we do with payments we cannot identify? Keep them on an unmatched list with the date, amount and narration. Contact the parent, check deposit slips, and record the payment against the right learner once you know. Never guess.
A parent paid one amount for two children. How should it be recorded? Ask the parent how they want it split, then record two payments, one per child. In future, ask families to pay separately per admission number.
How do we avoid crediting the same payment twice? Import statements rather than retyping them, and use a system that remembers each statement line it has processed, so overlapping statements do not create duplicates.
See it with your own statement
The fastest way to see whether this saves time is to import a real statement and see how many lines match by admission number and how many come back for review.
Book a demo and we will walk through a statement import, the unmatched list, and how each matched line becomes a receipt on the learner's account.