For fourteen years a small UK consultancy ran its invoicing through a Mac application called Billings Pro. It did the job well, but its development stopped years ago, and every operating-system update became a gamble on whether fourteen years of sales history would still open. We migrated the lot and built a replacement shaped around how the business actually bills.
14 years
migrated intact, back to 2012
2,200+
invoices, plus nearly 10,000 work entries
Whole pence
no floating point in a financial system
None
work arrives by email as it happens
Billings Pro was good software in its day, and its day ended. Development stopped, updates dried up, and each new version of macOS became a coin toss over whether the accounts would still open. The obvious fix, a move to a subscription product, meant adopting someone else’s idea of how a consultancy bills.
And the billing refuses the standard template. Most clients pay a fixed monthly retainer with hours billed on top. One pays a fixed fee that includes an hour of work, with anything beyond it billed at their own rate. Others have no retainer and are billed as work happens. A generic invoicing product handles one of those patterns cleanly and needs contortions for the rest, and contortions are where billing errors come from.
There was a records problem too. The raw material for a month’s invoices, meaning what was done and for whom and when, lived in emails and text messages. Retyping it at month end was slow and error-prone.
The replacement is a web application holding the complete sales ledger, with the full history migrated intact: more than 2,200 invoices and nearly 10,000 work entries reaching back to 2012. Each client’s billing agreement is recorded once, covering the retainer, the time it includes and the rate beyond it. A monthly billing run turns agreements and logged work into draft invoices on its own, netting included hours off timed work at each entry’s own rate.
Some rules are load-bearing in a financial system, so the system itself enforces them. Invoice numbers come from a locked sequence, and a number can never be issued twice. An issued invoice can be voided but never silently altered. Money is held as whole pence throughout, so nothing ever rounds.
Work now arrives by email. A client’s request gets forwarded straight into a capture inbox the moment it lands, so at month end the material is already in the system instead of scattered across two inboxes and a phone. Invoices leave the same way, generated as PDFs from the company’s own template and sent directly from the application.
AI takes the judgement-heavy chores, on a suggest-then-confirm basis: reading a photographed receipt into a draft expense, sorting business from personal lines on a card statement, and matching incoming bank payments to open invoices. It proposes and a person approves; nothing enters the ledger without confirmation. The same rule sits in everything we build.
Under the bonnet it’s a deliberately boring, dependable stack: a PostgreSQL database, sign-in restricted to named accounts, and encrypted nightly backups held off-site. The ledger exports in neutral formats at any time, so this system can never hold the accounts hostage the way its predecessor did.
A bespoke invoicing system is usually the wrong call. A £30-a-month product fits most businesses fine, and when it fits we say so. This build earned its keep twice over. The old app was abandoned with fourteen years of records inside it, and the billing arrangements never matched a template. One of those alone might have been survivable. Both together made it the right kind of heavy.