HandbookPeople & money20

Finance, fees & accounting.

A school's money flows through five channels every day: fees billed to families, payments collected by the cashier, expenses paid to suppliers, payroll settled to staff, and the ledger that ties it all together. YESS owns every channel. This handbook walks you through each one — from the bursar opening the first fee structure to the owner reading the P&L on Friday afternoon. By the time you close this book, you will know which screen to open for every money question the school asks.

  • 35finance routes
  • 7actor types
  • 11chapters
  • ≈22 minto read

Prologue

A note on this book and the money#

Money is the most audited thing in any school. A parent disputing an invoice, a government auditor asking for a trial balance, a sponsor wanting to see scholarship impact — every one of them will land on a screen in this handbook. YESS was built so that every one of those conversations can be answered from a single source of truth, in any currency, in any of three languages, without a spreadsheet in sight.

The finance module is deliberately layered. An accountant at a small school can get by with fee structures, invoices, and the payment log. A larger institution can turn on double-entry accounting, the general ledger, bank reconciliation, and VAT reporting. The chapters below move from the simplest layer to the most complete; stop wherever matches your school.

Every franc the school touches, in one place, with a full audit trail.

Chapter one

A morning in the bursary#

It is 08:15 at Greenwood International Academy. Follow this morning end to end and the rest of the book is just detail.

08:15. The bursar opens the Fees hub at /dashboard/fees. The school runs on two fee structures — Junior Secondary and Senior Secondary — each with four components (tuition, transport, ICT levy, and a per-term activity fee). Both structures were built in the previous term and are already assigned to their programmes. She glances at the gold KPI rail: 2 structures · 4 components · 2 active · 2 assigned. Everything looks right for the new term.

08:22. A parent walks in with her daughter who enrolled yesterday. The bursar opens /dashboard/invoices/all, clicks Generate Invoice, selects the student, chooses the Senior Secondary fee structure, sets the due date, and clicks Generate. The system produces invoice INV-2026-0441: total ₦185,000, status Draft, four line items matching the structure's components.

08:29. The parent pays the first installment in cash — ₦60,000. The bursar opens /dashboard/payments/record, selects the invoice, enters ₦60,000, method Cash, and clicks Record. The invoice status shifts to Partially Paid; balance ₦125,000. The general ledger records a debit to Cash on Hand (1100) and a credit to Tuition Revenue (4100). A WhatsApp receipt is dispatched to the parent's phone in Yoruba.

09:10. The principal opens the owner portal on her tablet. The financial overview shows the term's collection rate: 74% — higher than this time last year. She sees three overdue invoices in the gold KPI strip and forwards the list to the bursar with a note.

09:30. A scholarship committee meeting. Three students are awarded the Academic Excellence Scholarship (25% off tuition). The registrar opens /dashboard/fees/scholarships, assigns all three. Where a student has a single open invoice YESS applies the discount to it automatically — total ₦185,000 becomes ₦138,750; otherwise the bursar applies the award to the right invoice in one click. The reduction lands on the invoice itself, not as a separate journal entry — YESS keeps fee revenue on a cash basis, so the books recognise the lower amount when the family pays.

Chapter two

Building the fee catalogue#

Before YESS can generate a single invoice it needs to know what the school charges. Fee structures are the answer: they are named containers that hold fee components and are assigned to programmes or classes. Once a structure is active and assigned, generating an invoice for any student in that programme takes one click.

The fee catalogue lives at /dashboard/fees — a hub of four sections: Fee setup (structures and components), Reductions & aid (discounts and scholarships), Collection (payment schedules and fee compliance), and Policy (the fee-policy settings).

The five building blocks

  1. 1

    Fee structures

    A structure is assigned to a programme (e.g. JSS, SSS) or a specific class. One structure per assignment — the system rejects duplicates. Status Active means the structure is in use and invoices can be generated from it.

  2. 2

    Fee components

    Each component carries a name, amount, and payment frequency (once, monthly, per-term). Mark a component mandatory so it always appears; mark it optional so the cashier can remove it for partial enrolments.

  3. 3

    Payment schedules

    Attach a schedule to a structure to split the total into named instalments with due dates. When a parent requests a payment plan, this schedule is the default template.

  4. 4

    Discounts

    School-wide reductions — early-payment discount, sibling discount, staff-child concession. Set as a percentage or fixed amount. Discounts apply to invoices automatically when the trigger condition is met.

  5. 5

    Scholarships

    Named aid programmes with a percentage or fixed-amount benefit. Awarding a scholarship records the assignment and reduces the recipient's open invoice — automatically when there is a single open invoice, otherwise applied to the right invoice by the bursar. The discount lands on the invoice; fee revenue is cash-basis, so there is no separate ledger entry at award time.

Chapter three

The invoice lifecycle#

An invoice is a formal demand for payment. In YESS it carries a student, a due date, a set of line items, and a status that moves from Draft → Sent → Partially Paid → Paid (or Overdue, Cancelled, or Voided). The invoice hub lives at /dashboard/invoices and has four sub-surfaces: All invoices, Bulk generation, Overdue & reminders, and Credit notes.

Generating invoices

Two paths: single — pick a student, pick a fee structure, set a due date, click Generate. The system fills in the line items from the structure's components, computes the total, and status is Draft. Bulk — paste a list of student UUIDs (or use the class filter coming in a future release), pick a structure, click Generate. Hundreds of invoices in seconds.

Once generated, click Mark as Sent to move the invoice from Draft to Sent. The parent's portal immediately shows the invoice under Invoices.

Overdue & reminders

The Overdue tab at /dashboard/invoices/overdue shows every unpaid invoice past its due date, sorted oldest-first, with a days-overdue counter. One click flags an invoice as Overdue (shifts the status and colours the parent portal's summary red); another sends a reminder notification in the parent's preferred language.

Credit notes

A credit note is issued when a school owes money back to a family — an overpayment, a withdrawal mid-term, a billing correction. Open /dashboard/invoices/credits, click Issue Credit Note, attach it to the original invoice, enter the amount and reason.

Two outcomes: Applied — the credit offsets the student's outstanding balance; the invoice total drops immediately and the ledger books the adjustment. Refunded — cash leaves the school; the ledger records a debit to revenue and a credit to the bank account.

Chapter four

Recording and reconciling payments#

The payments hub at /dashboard/payments has five surfaces. Most schools use Record and History every day; Online, Reconcile, and Plans come into daily use once the school scales.

Record payment

Open /dashboard/payments/record. Select the student's invoice (the balance auto-fills), enter the amount received, choose the method — Cash, Bank transfer, MTN Mobile Money, Orange Money, Cheque, or Stripe — and enter any reference number. Click Record. The invoice balance updates atomically; the ledger posts Dr cash / Cr revenue in the same transaction. A receipt is dispatched to the parent.

Online payment requests

Open /dashboard/payments/online. Create a payment request for a student's invoice; the system generates a secure link through the school's configured payment aggregator — Notchpay, CamPay, Stripe, or mobile money — chosen server-side, so the bursar doesn't pick a gateway per request. Share the link by SMS or WhatsApp. When the parent pays, the system records the payment automatically.

Payment plans

A family that cannot pay in full requests an instalment plan from the parent portal. The request arrives in /dashboard/payments/plans. The bursar reviews the request, approves or rejects it with a reason. On approval, the system generates the instalment schedule automatically. When an instalment is marked paid, YESS records the payment against the invoice — same chain as a direct payment, same ledger posting.

Reconciliation

Open /dashboard/payments/reconcile. This is a read-only matching view: every recorded payment is checked against its invoice and shown as Matched or Unmatched, alongside a settlement summary for the online gateways. It surfaces the payments that still need an invoice attached — it does not store a reconciled state of its own. The till-level cash variance flow (declared versus expected, marked Reconciled or Disputed) is the cashier-shift desk in the next chapter; bank-statement reconciliation persists separately at /dashboard/accounting/bank.

Chapter five

The cashier's till#

Every point-of-sale in YESS — the canteen counter, the school shop, the library fine desk — works through a cashier shift. The cashier opens the till at the start of their session with an opening float; the system tracks every sale; the cashier declares their closing cash at the end; YESS computes the expected takings and surfaces any variance.

The accountant's view lives at /dashboard/finance/cashier-shifts. The KPI strip shows pending variances, open shifts, total shortage, and reconciled count. The filter buttons narrow to the queue that needs attention: variance shifts first, then closed-pending-reconcile.

Reconciling a shift takes thirty seconds: open the shift row, enter reconciliation notes, choose Reconciled or Disputed, click Confirm. A disputed shift creates a flag for the finance manager to investigate — the shift cannot be deleted until the flag is resolved.

Chapter six

Tracking and approving expenses#

All money that leaves the school — whether it's diesel for the generator, caterer invoices, or stationery for the admin office — is recorded in the expense module at /dashboard/expenses. Expenses have a category, a vendor, a payment method, and a status lifecycle: Draft → Pending approval → Approved → Paid.

The expense log at /dashboard/expenses/log is where expenses are created. Any staff member with the finance_expenses.create permission can log an expense; it lands in Draft. The finance manager or principal opens the Pending Approval filter and either approves or rejects it with a reason.

Vendors are managed at /dashboard/expenses/vendors — name, contact, payment terms. Categories at /dashboard/expenses/categories — use the chart-of-accounts codes to link categories to GL accounts for automatic ledger posting when the expense is approved.

The Analytics tab at /dashboard/expenses/analytics shows a category breakdown pie chart and a month-by-month trend bar. Useful for budget review meetings.

Chapter seven

The double-entry ledger#

YESS implements a full double-entry general ledger. The money events that move cash — a completed fee payment, a voided payment, a canteen sale, an approved expense — each post a balanced journal entry automatically, via database triggers. The accountant never needs to post these routine entries by hand; manual journals exist for adjustments and audit corrections. (Scholarships are the exception: they reduce the invoice rather than the ledger, because fee revenue is recognised on payment.)

The accounting hub at /dashboard/accounting has five surfaces: Chart of accounts, Journal entries, Bank accounts, Financial statements, and VAT/Tax.

Chart of accounts

Open /dashboard/accounting/chart. YESS seeds a default education-sector chart on first setup — Assets (1xxx), Liabilities (2xxx), Equity (3xxx), Revenue (4xxx), Expenses (5xxx). Add accounts, set their normal balance (debit or credit), and link them to expense categories or fee components. Account balances are computed live from posted journal entries — there is no stored balance column to get out of sync.

Journal entries

View all posted and draft journals at /dashboard/accounting/journal. Every automatic entry (fee receipt, payment void, scholarship, canteen shift) carries a reference type and reference id — drill down to the source transaction in one click. Manual entries require a balanced debit/credit — YESS rejects unbalanced entries before they reach the database.

Financial statements

The statements surface at /dashboard/accounting/statements renders a live P&L and balance sheet from the posted journal entries. Figures update in real time as payments and expenses are recorded. The balance sheet equation (Assets = Liabilities + Equity) is checked on every render — if it doesn't balance, a warning appears.

Chapter eight

Planning and tracking budgets#

Budgets let the school plan spend before the term starts and track it in real time as expenses are approved. The budgets hub at /dashboard/budgets has three surfaces: the budget list, budget lines, and a spend report.

Create a budget for a period (a term, a year) and a department. Add budget lines — one per expense category, each with a planned amount. As expenses are logged and approved under that category, the utilisation bar on the budget line fills up. Lines over 90% turn red; the finance manager receives a notification before the budget is breached.

The third tab on the budgets page, Budget vs Actual, overlays planned against actual spend across every budget, with over-budget alerts. For a wider consolidated view that pulls billing, collection and spend together, open /dashboard/finance-overview/reports.

Chapter nine

The parent's fee portal#

Every parent with a YESS portal account can see their child's complete financial picture at /portal/fees. The portal has three surfaces: Overview, Transactions, and Plans.

Overview

The overview shows total billed, total paid, outstanding balance, and number of payments — the four numbers a parent asks every term. If there is an overdue balance, a red alert strip appears at the top with the amount and a link to pay.

Transactions

Three sub-views: Invoices (every invoice for this child, with status, amount, and due date), Payments (every payment recorded, with method, date, and reference), and Credits (any credit notes issued for this child). Parents cannot dispute from this screen — disputes are raised by message to the bursar.

Payment plans

A parent who cannot pay in full opens the Plans tab and clicks Request a payment plan. They select the invoice, propose a number of instalments and a start date, and add a note. The request lands in the bursar's payment plans queue for approval or rejection. Once approved, the instalment schedule appears in the parent's portal and the parent can pay each instalment via the online payment link.

Chapter ten

The owner's dashboard#

The school owner — the proprietor or board — has their own portal at /owner/financials. This is not an operational surface; it is a strategic one. The owner does not process invoices; they read the margin.

The page opens with a verdict, not a grid: a margin ring showing the gross-margin and collection rates read against the owner's own targets. Below it, the money story — revenue, expenses and profit on one chart — then a fee-integrity panel that lines up expected versus billed versus collected and calls out the billing gap.

The collections panel buckets the unpaid balances by age (current / 1–30 days / 31–60 / 61–90 / 90+, with 90+ flagged urgent) beside the collection-rate track. Where the money goes breaks expenses down by category with the payroll trend alongside, and a budgets block shows utilisation.

The per-student economics panel is the number the owner shares at board meetings: revenue per student, cost per student, and profit per student. At a well-run school, all three should be stable or improving term-on-term.

Chapter eleven

What makes the finance module elite#

Six things that make this elite

  1. 1

    Ledger by trigger, not by hand

    A completed fee payment, a void, an approved expense — each posts a balanced journal entry automatically the moment it is recorded, through database triggers rather than application code, and each posting is idempotent (a posted_journal_entry_id guards against double-posting). The books and the source transaction never disagree. Scholarships are the deliberate exception: they reduce the invoice, not the ledger.

  2. 2

    Three-language, any-currency receipts

    Every receipt dispatched to a parent is rendered in the parent's preferred language — English, French, or Arabic — and in the school's configured currency. No hardcoded dollar signs; no English-only templates for French-speaking families.

  3. 3

    Scholarship impact on the bill

    When a scholarship is awarded, YESS applies the discount to the recipient's open invoice, so the family is billed the net amount. Because fee revenue is recognised on payment, the P&L naturally reflects what the school actually collects rather than the gross billed before aid — no separate journal entry to reconcile.

  4. 4

    Append-only audit trail

    No journal entry is ever edited or deleted. Voids create reversing entries; every reversal carries the original entry's reference. The trial balance at any point in time is reconstructable from the entry sequence alone.

  5. 5

    Live financial statements

    The P&L and balance sheet are computed from posted journal entries on demand. The balance sheet equation is checked on every render. The accountant never produces a month-end statement — the statement is always current.

  6. 6

    Owner visibility without ops access

    The owner portal gives the proprietor a clear strategic view — margins, collection rate, scholarship impact, payroll ratio — without granting access to individual student records or payment transactions. Governance and privacy in the same screen.

Planned features

What comes next#

The features below are planned for YESS Finance and will be added in upcoming releases. They appear here so you can plan around them.

Six features coming next

  1. 1

    Atomic payment→invoice trigger

    Recording a payment posts the ledger entry through a database trigger today, but the invoice balance is still recomputed in application code. The planned upgrade moves the balance recompute behind a row-locked trigger too, so that two simultaneous payments on the same invoice can never produce an incorrect balance.

  2. 2

    Wallet completeness

    Student wallets support top-up and spending today. The planned additions are: refund flows (money back to the wallet on order cancellation), adjustment entries, and a parent-facing wallet statement screen. The canteen auto-deduct-from-wallet toggle is configured but not yet consumed.

  3. 3

    Cashier-match persistence

    The payments reconcile view matches each recorded payment to its invoice but is read-only — it doesn't yet save a reconciled set. The planned upgrade persists the day's match and a PDF export. (Bank-statement reconciliation already persists at /dashboard/accounting/bank; this item is about the payment-to-invoice matching view.)

  4. 4

    Plan status automation

    Payment plans currently stay active until manually closed. The planned scheduler marks plans completed when all instalments are settled and defaulted when an instalment passes its due date by more than the school's configured grace period.

  5. 5

    Multi-currency support

    YESS is used in schools that bill in XAF, NGN, USD, and GHS. The platform_billing_ledger and FX-rate tables are scaffolded. The planned feature adds a school-level base currency, per-invoice currency, and FX conversion on the P&L.

  6. 6

    Invoice auto-generation on enrolment

    When a student completes enrolment, the planned flow automatically generates their first invoice from the assigned fee structure — no bursar action required. The enrolment module already triggers a notification; the invoice generation is the next step.

The full lifecycle

A term, invoice one to close#

Week 1 (term start). Bursar reviews and activates fee structures. Enrolment completes; invoices are generated in bulk. Parent portal opens — every family sees their balance.

Weeks 1–12 (collection). Payments arrive daily — cash at the counter, mobile money from the parent portal, bank transfers from corporate sponsors. Each payment posts to the ledger in real time. The overdue queue grows as due dates pass; the bursar works through it every morning.

Mid-term. Scholarship committee meets; awards are applied; discounts hit the ledger. Payment plan requests arrive from parents who missed the deadline; the bursar reviews and approves instalment schedules.

Week 13 (term close). Bursar runs the collection report — total billed, total collected, outstanding. Accountant reviews the trial balance. Principal presents the P&L to the board at /owner/financials. Budget utilisation for the term is reviewed; next term's budgets are set.

Year-end. Accountant closes the books — posts any year-end adjusting entries, archives the GL, produces the audited financial statements from the YESS statements screen. Auditor gets view-only access to the journal entries and the trial balance.

Adjacent modules

Where finance connects#

Tutorial

Do it step by step#

Collect a term's fees end to end, from the first fee structure to the receipt on the parent's phone. Six steps, in the order the bursary actually works.

  1. 1

    Build the fee catalogue

    Open /dashboard/fees/structures and create one structure per programme (Junior Secondary, Senior Secondary). Add its charges at /dashboard/fees/components — tuition, transport, ICT levy — each with an amount and a frequency, then mark the structure Active and assign it.

    Start with one structure per programme and one component per fee type. You can always split later; a simple catalogue keeps the first invoice run clean.

  2. 2

    Generate the invoice

    For a single family, open /dashboard/invoices/all, click Generate Invoice, pick the student, the fee structure and a due date — the line items fill in from the structure's components. For many students at once, use /dashboard/invoices/bulk and paste their student IDs, one per line. Then click Mark as Sent so it surfaces in the parent portal.
  3. 3

    Record the payment

    Open /dashboard/payments/record, select the invoice (the balance auto-fills), enter the amount, choose the method — Cash, Bank transfer, MTN or Orange Money, Cheque, or a card via Stripe — and click Record. The invoice balance and a balanced ledger entry (Dr cash / Cr revenue) are written in the same transaction, and a receipt is dispatched to the parent.

    Never delete a payment to fix a mistake — use Void. Voiding reverses both the invoice balance and the journal entry so the trial balance still explains itself.

  4. 4

    Work the overdue queue

    Every morning, open /dashboard/invoices/overdue — unpaid invoices past their due date, oldest first, with a days-overdue counter. One click sends a reminder in the parent's language. Families who ask to pay in instalments are approved at /dashboard/payments/plans.
  5. 5

    Reconcile the till

    At the end of each banking day, open the cashier-shift desk at /dashboard/finance/cashier-shifts and reconcile each closed shift — the system compares declared cash against expected takings. Zero variance → mark Reconciled. A difference → flag it Disputed with a note for the accountant. (The payments reconcile view is a separate, read-only payment-to-invoice match.)
  6. 6

    Read the books

    The live P&L and balance sheet render from posted journal entries at /dashboard/accounting/statements — no month-end export needed. The proprietor reads the same numbers as margin, collection rate and per-student economics at /owner/financials.

Every franc the school touched today is now on a balanced ledger — and the owner can see it on Friday afternoon.