Flow: payment & reconciliation

The family pays one balance by mobile money; the payment reconciles itself to the invoice and updates the statement — and anything outstanding drives the aging report and reminders.

ParentPayment rail (M-Pesa /Airtel / …)Fees (ep.fee.payment)Invoice / installmentsStatement & portal1Pay by mobile money /USSD2Rail confirms thetransaction3ep.fee.payment created4Matched toep.fee.invoice5Installment scheduleupdated6Receipt + newstatement730/60/90 aging →reminder
Payment & reconciliation — the rail confirms, ep.fee.payment reconciles, the portal reflects it.

The finance models

ModelRole
ep.fee.assignment / .lineWhat a student owes this year, line by line (incl. bridge lines).
ep.fee.invoiceThe billable document the family pays.
ep.fee.paymentA received payment, matched to an invoice; reconciliation lives here.
ep.fee.installmentA payment plan / schedule for families paying over time.
ep.fee.payment.auditTamper-evident audit trail of every payment event.
ep.fee.invoice.tokenA secure token so a parent can pay a specific invoice from a link.

How reconciliation works

  1. The parent pays from their phone; the rail (mobile money) confirms the transaction.
  2. An ep.fee.payment is created and matched to the ep.fee.invoice by reference.
  3. If the family is on a plan, the ep.fee.installment schedule is updated.
  4. The family gets an SMS receipt; the statement reflects the new balance immediately.
  5. Whatever remains rolls into the 30/60/90-day aging report, which fires dunning reminders.

Edge cases

  • Duplicate / double payment: caught at matching; the overpayment becomes a credit on the family ledger.
  • Unmatched payment: held for manual allocation at the bursary rather than silently lost.
  • Scholarship / bursary: award rules reduce the invoice before the family pays, with an approval trail.
Was this page helpful?