[devloop]

Selected work

Four engagements, described plainly

Client names are withheld by agreement. The descriptions below are accurate about the problem, the approach and the scale of the result. We can talk through any of them in more detail on a call, including the parts that went badly.

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

Common thread

None of these were technically difficult. In each case the hard part was getting a clear written answer to what the current process actually does, including the exceptions people had stopped noticing they were handling. That is where the time goes and it is where we spend it.