Catching billing errors before families see them

A proof of concept for private-school incidental billing. Built end to end on synthetic data — no real family information was used, at any point, for any purpose.

The problem

Most of a school's tuition billing runs itself once it's set for the year. The recurring monthly work — and most of the errors — live in incidental billing: hot lunch, after-care, field trips, classroom fees, athletics.

Each month someone in the office gathers those charges from several places. A lunch spreadsheet. After-care sign-in sheets. Field-trip envelopes. Notes from teachers. They line each charge up against the right family and key it in. It's slow, it's manual, and every hand-off is a chance for a wrong bill — a fee on the wrong family, a duplicate, a fat-fingered amount, a charge for a student who withdrew in October.

Those mistakes usually surface when a parent calls.

The bottleneck isn't the billing system. It's everything upstream of it.

The approach

Diagnose before building. Map where each charge originates and who touches it before it becomes a bill — half the fix is usually the process, not the code.

Prove it on synthetic data. To demonstrate the method without touching anyone's family information, I generated a realistic but entirely fake school: 150 families, a full month of incidental charges, deliberately seeded with the kinds of messes a real office produces.

Catch errors before they go out, not after a parent calls.

What I built

  1. A synthetic test dataset. A full month of charges seeded with missing amounts, mixed date formats, duplicates, miscoded fees, and charges against withdrawn families. Every planted error is recorded in a separate answer key the validator never sees while it runs.

  2. A validation pipeline. Ingests the raw charges, checks every row, auto-corrects what's safe, holds what isn't, and writes a clean import-ready file plus an exception report.

  3. A reconciliation dashboard. One self-contained page: what's billable, what's held and why, dollar totals, and the office's worklist. It opens offline, emails cleanly, and prints.

The results

One run over a realistic month of 425 charges. The seed is fixed, so these numbers reproduce exactly.

27 of 27 seeded errors caught, verified against a known answer key.

Zero good charges wrongly blocked.

15 problem charges held before billing — each one a wrong or questionable bill that would otherwise have reached a family.

$30,815.50 in valid charges prepared and fully reconciled, every row accounted for as billed, held, or a duplicate removed.

The second number matters as much as the first. A checker that catches everything by stopping everything is useless — it just moves the manual work somewhere else. The zero is the proof it didn't cheat.

How it decides

Every finding lands in one of two buckets, and that split is the whole idea.

Corrected automatically — safe to fix without asking anyone. Date formats normalized. Stray whitespace and inconsistent casing cleaned up. Currency symbols stripped. Exact duplicate lines removed.

Held for the office — will not be billed until a person resolves it. Missing or unparseable amounts. Implausible amounts. Unknown charge codes, or a code that doesn't match its description. Charges for a family not on the roster. Charges for a family that withdrew.

The safe work flows through untouched. The risky work stops before a family gets a wrong bill, with a logged reason attached for the annual audit.

The dashboard

The reconciliation view the office would actually use. Self-contained — it opens in any browser with no internet connection and no software to install.

15 charges held, 16 findings: one charge had two separate problems.

Open the dashboard

View the code on GitHub

How data is handled

This demonstration uses only synthetic, generated data.

On a real engagement, data stays in your environment: processed on your machine or your own cloud, nothing copied off-site, nothing retained after the job is done, deleted on request. The tool prepares your data to go into your billing system — it doesn't replace that system and it doesn't transmit anything on its own. Your families' information stays yours.

This is one example of the work: finding the data an organization already has, checking it, and cutting out the manual steps between where it lives and where it needs to go.

Not IT consulting.