Fee collections.
Every school is owed money it has not yet collected. Some of it walks up to the counter and pays in cash; some of it is thirty days overdue and needs a gentle reminder; some of it needs to be broken into instalments a family can actually manage. This handbook covers the whole collecting side of fees — the cashier till, the overdue queue, the receivables-aging report, payment plans, and the fee-compliance desk — and is honest about which parts run themselves and which still need a human hand.
- 5aging buckets
- 6payment methods
- 5collection surfaces
- ≈11 minto read
Prologue
The unpaid side of the ledger#
Billing a family is easy; collecting from them is the hard part. The finance handbook covers how invoices are raised and how a payment posts to the ledger. This book covers what happens in between — the counter where cash is taken, the queue of invoices that have slipped past their due date, the report that ages every unpaid balance, the plan that lets a struggling family pay in steps, and the compliance desk that decides who gets a little grace.
A word on names first, because YESS is precise about them. The /dashboard/collections screen is the cashier till — front-of-house collection at the counter. The arrears work — overdue, aging, reminders, plans, compliance — lives on a handful of adjacent finance screens. This chapter walks both, and points you at the right screen for each job.
Collect with dignity: know exactly who owes what, and offer a way through before you chase.
Chapter one
Money across the counter#
The most direct collection is the one that walks up to the desk. The cashier till at /dashboard/collections is the unified front-of-house surface: a cashier opens a station, searches for a student, and takes a payment. For the fees station it lists the student's outstanding invoices and settles one; for the other stations it takes an ad-hoc line-item charge.
Stations the cashier is trusted with
A till is scoped to stations — the seven counters a school can run: fees, uniform, transport, canteen, shop, library, and other. A cashier only ever sees the stations they have been granted, and those grants are managed on an admin matrix at /dashboard/collections/stations. Granting and revoking are the only ways to change a till's reach — the grant table takes no direct writes, so access is always deliberate and auditable.
Taking the payment
Collecting calls a database function, collect_payment, which checks the cashier is allowed at that station, records the payment, reduces the invoice balance, posts the ledger entry, and returns a receipt number (in the shape RCP-YYMM-XXXXXXXX). The method must be one of six: cash, bank transfer, MTN Mobile Money, Orange Money, cheque, or other. The whole thing is one atomic step — there is no window in which the payment is recorded but the invoice is not reduced.
The till also carries a cashier-shift panel: the cashier opens the till with a float at the start of a session and closes it with a Z-report at the end. Reconciling those shifts — declared versus expected cash — is the accountant's cashier-shift desk covered in the finance handbook.
Chapter two
Seeing exactly what is owed#
You cannot chase what you cannot see. Two screens make the debt legible — one a working queue, one an analytical report.
The overdue queue
The overdue tab at /dashboard/invoices/overdue lists every unpaid invoice past its due date, each with a days-overdue counter and a running outstanding total. One click flags an invoice as overdue (which shifts its status and colours the parent portal's summary). A daily job can also flip past-due invoices to overdue on its own — more on that in the reminders chapter.
The receivables-aging report
The aging report at /dashboard/finance-overview/aging is where the debt gets bucketed by how old it is. It reads a live view of every unpaid invoice line and sorts each balance into one of five ages:
- Current — not yet due (due date is today or later).
- 1-30 days — one to thirty days past due.
- 31-60 days — a month to two months overdue.
- 61-90 days — the balance that has started to worry you.
- 90+ days — the debt that needs a decision, not another reminder.
The report renders a stacked aging bar, a chip per bucket, and a drill-down table (student, class, invoice, due date, balance, days-overdue badge). The same view feeds the owner's collections panel on the financials dashboard, so the proprietor reads the same aged debt the bursar works.
Chapter three
Reminders, in the parent's language#
A reminder is the gentlest form of collection. YESS has a real reminder engine at the database layer, and this is the chapter where the handbook is most careful to tell you exactly what is switched on.
When an invoice is issued, a trigger notifies the linked parents automatically ("New fee invoice"), skipping drafts, cancelled invoices, and zero-balance rows. Beyond that, a daily job (run_invoice_fee_reminders) can flip past-due invoices to overdue and send a one-time overdue notice. Reminder notices are rendered in each parent's preferred language — English, French, or Arabic — and fan out across the school's configured reminder channels (by default in-app, email, WhatsApp, and push), timed off a configurable schedule of days before the due date (7, 3, and 1 by default).
Chapter four
A way through with a payment plan#
When a family cannot pay in full, the humane answer is a plan. Payment plans are fully wired end to end, from the parent's request to the final instalment.
The plan lifecycle
- 1
Requested
A bursar creates a plan against an invoice, or a parent requests one from their fee portal. The plan opens as 'pending' — the parent's request lands with the status already constrained so it cannot skip approval. A plan carries a total, a number of instalments, and a frequency: weekly, biweekly, monthly, or termly.
- 2
Approved
The bursar approves the plan (status becomes 'active') or rejects it with a reason. On approval, a trigger auto-generates the instalment rows with due dates spaced by the chosen frequency — nobody types the schedule by hand.
- 3
Paid down
Each instalment is marked paid as the money arrives; marking it paid creates a real payment against the invoice — the same payment→invoice chain as any other collection — and stamps the instalment paid with its date. Instalments can also be waived.
- 4
Completed
When the last open instalment clears, a trigger flips the whole plan to 'completed' automatically. A plan whose instalment passes its due date shows as overdue on the instalment, and the plan itself can be marked defaulted.
The plans workspace is at /dashboard/payments/plans; parents request and follow their own plans from the fee portal at /portal/fees. A plan is visible to the school's finance staff and to the requesting family — the database restricts a parent to their own children's plans and instalments.
Chapter five
Compliance, and a little grace#
The fee-compliance desk at /dashboard/fees/compliance is the accountability view. It classifies every active student against what they should have paid by now, sorting them into states like unbilled, underbilled, arrears (paid less than the pro-rated amount due so far), and no structure (no fee structure assigned). It is how a bursar answers "who is behind, and why" without a spreadsheet.
Grace is a first-class action here, not a workaround. A school can grant a moratorium to a student — a documented reason, an optional extended-until date, and a flag for whether it is a full waiver. Only one moratorium can be active per student at a time. While a moratorium (or a timeline hold) is in force, the fee-hold check that would otherwise block a report card or transcript stands down for that student, so a family in genuine hardship is not locked out of their child's results over money.
Chapter six
What makes collections humane#
Five things done with care
- 1
One atomic collection
Every till payment records the payment, reduces the invoice, and posts the ledger entry in a single database function — there is no half-collected state. The receipt number comes back from the same call.
- 2
Debt aged, not just listed
The receivables-aging report buckets every unpaid balance into current / 1-30 / 31-60 / 61-90 / 90+ from a live view, so you triage by age of debt and put a plan where a reminder would be cruel.
- 3
Plans that run themselves
Approving a plan generates its instalment schedule automatically; the final instalment closes the plan automatically. The bursar sets the terms once and the arithmetic looks after itself.
- 4
Grace with a paper trail
A moratorium is a recorded decision — reason, extended-until, waiver flag, one active per student — that stands down the fee-hold on results. Compassion is logged, not improvised.
- 5
The parent's own language
Invoice and reminder notices render in the parent's preferred language across the school's configured channels, so a French- or Arabic-speaking family is never chased in a language they have to translate.
Planned & honest gaps
What is still to come#
Collection in YESS is strong where the money and the maths are — the till, the aging, the plans, the moratoriums are all real and wired. The softer "chase" layer is where the honest gaps sit.
Four honest gaps
- 1
The overdue 'Remind' button
On the overdue tab, the per-invoice Remind button currently shows a confirmation toast without dispatching anything. Wiring it to the real reminder function so a bursar can nudge a single family on demand is planned.
- 2
Reminders on by default
The automated reminder and compliance-alert crons exist but ship off, and the WhatsApp delivery leg is still being wired. Turning these into safe, on-by-default, fully-delivered channels is planned work.
- 3
A dunning / follow-up trail
There is no dedicated collections follow-up log yet — no place to record 'called the parent Tuesday, promised to pay Friday'. Contact outcomes today live only in the generic finance audit trail and notification history. A proper dunning sequence with logged outcomes is planned.
- 4
Plan default automation
Instalments show overdue and a plan can be marked defaulted, but the platform does not yet auto-default a plan when an instalment passes a grace period. Automatic default detection is on the roadmap.
Adjacent modules
Where collections connect#
Collections sit downstream of billing and upstream of the ledger. They lean on finance for the invoice and the posting, and on the notifications fabric and portals for the reminders and the parent request.
Adjacent modules
- 20Finance, fees & accountingInvoices are raised, payments post to the ledger, and cashier shifts are reconciled in the finance module — collections work the balances it produces.
- 16Parent & student portalsParents see their outstanding balance, request a payment plan, and follow its instalments from the fee portal.
- 17NotificationsInvoice, overdue, and compliance notices fan out on each parent's preferred channels in their own language through the notifications fabric.
- 09Report cardsThe fee-hold that a moratorium stands down is the same hold that can gate a report card or transcript when a balance is outstanding.
- 21Budgets & procurementCollection rate and outstanding receivables feed the wider financial picture the CFO and owner plan against.
Tutorial
Do it step by step#
Work the collecting side of a term end to end — from cash at the counter to a plan for the family that cannot pay in one go. Five steps, in the order the bursary actually works them.
- 1
Take the money at the till
Open the cashier till at /dashboard/collections, pick your station, search the student, choose the invoice, enter the amount and method (cash, bank transfer, MTN or Orange Money, cheque), and collect. The invoice is reduced, the ledger is posted, and a receipt number comes back — in one step.A cashier only sees the stations they've been granted. Manage those grants on the admin matrix at /dashboard/collections/stations.
- 2
See what is still owed
Every morning, open /dashboard/invoices/overdue for the working queue, and /dashboard/finance-overview/aging for the aged view — every unpaid balance sorted into current, 1-30, 31-60, 61-90, and 90+ days. - 3
Nudge, in the family's language
Enable the daily reminder engine so past-due invoices flip to overdue and a notice goes out in the parent's language across your configured channels, timed 7, 3, and 1 day before the due date. Verify it is switched on — it ships off by default.The overdue tab's per-invoice Remind button is a placeholder toast today; rely on the reminder engine, not that button, until it is wired.
- 4
Offer a plan the family can keep
For a family that cannot pay in one go, create a plan on /dashboard/payments/plans (or approve the one they requested from /portal/fees). Approving it generates the instalment schedule automatically; mark each instalment paid as the money lands, and the last one closes the plan. - 5
Grant grace where it is due
On /dashboard/fees/compliance, find the students in genuine arrears and, where hardship is real, grant a moratorium — a reason, an optional extended-until date, and a waiver flag — which stands down the fee-hold on their results while it is in force.
Collected at the counter, aged into buckets, reminded with care, and — where it is needed — given a way through. That is collection worked with dignity.