Sector Wholesale distribution
Team size 140 staff
Duration 9 weeks
Year 2024
Bank reconciliation for a distributor with four bank accounts
Two people in accounting spent roughly three days each month matching bank statement lines against the ledger across four accounts and two currencies. The matching rules were real but undocumented, held between the two of them.
We sat with both of them, wrote the rules down, and built a matcher that clears the unambiguous lines automatically and puts everything else into a review queue with the candidate matches ranked. Roughly eighty percent of lines clear without a human. The exceptions still need judgement, which was always the point.
python · postgresql · ofx and csv statement parsing · internal web queue
Sector Not for profit
Team size 60 staff
Duration 12 weeks
Year 2023
Grant reporting pipeline against three funder templates
The organisation reported quarterly to three funders, each wanting the same underlying expenditure in a different structure. Every quarter the finance lead rebuilt three workbooks by hand from an accounting export, and every quarter the numbers took a week to agree.
We built one canonical expenditure model loaded from the accounting system nightly, then three mappings on top of it that generate each funder's format on demand. Preparing a quarter now takes an afternoon, and when a funder queries a figure there is a lineage view showing which transactions rolled into it.
python · postgresql · scheduled extracts · xlsx generation · lineage view
Sector Professional services
Team size 320 staff
Duration 7 weeks
Year 2024
Supplier invoice matching against receiving records
Invoices arrived by email as PDFs and were keyed into the finance system by hand, then checked against receiving notes in a separate application. Errors surfaced weeks later at payment run.
We built an intake that reads the invoices, extracts line items, and matches them against receiving before anything is keyed. Anything ambiguous goes to a person with both documents shown side by side. The measurable outcome was payment run exceptions dropping from around forty a month to under ten.
python · ocr and layout extraction · postgresql · typescript review interface
Sector Municipal
Team size 90 staff
Duration 6 weeks
Year 2022
Permit intake and approval queue replacing a shared mailbox
Applications came into a shared mailbox. Status was tracked in a spreadsheet that three people edited, and applicants phoned in to ask where their file was.
We built a small intake form, a queue with assignment and status, and an automatic acknowledgement with a reference number. Deliberately narrow: no payments, no document management, no integration with the records system. Those were quoted separately and the client chose not to proceed, which was the right call.
typescript · postgresql · server rendered pages · smtp notifications