Occasional writing about the unglamorous parts of the work.
Why we stopped using a spreadsheet for invoicing
11 June 2026
For three years our invoices lived in one sheet with a tab per client. It worked, in the sense
that nothing was ever lost and nobody was ever quite sure what had been paid. The replacement is
forty lines of Python and a table. The interesting part was not the code — it was writing down the
rules we had been carrying in our heads, like what happens when a client pays two invoices at once
with one transfer.
A note on retries and idempotency keys
3 February 2026
Every integration we have ever fixed was broken in the same place: a request that timed out,
was retried, and created a second order. If the receiving system accepts a key that means
"this is the same request as before", your retry logic becomes safe and your support load drops.
If it doesn't, you need a reconciliation job, and you should budget for it.