The job nobody wanted: how I automated our bookkeeping and invoice matching
Bookkeeping takes time, and nobody on a team gets excited about it. Outsourcing doesn’t make it go away either: you still have to upload your PDFs to someone else’s portal or email them over, and it’s easy to lose track of who sent which invoice where, so you stay involved anyway.
In a fast paced startup it gets worse, because you keep trying new services. Some you pay by credit card, others by debit card or PayPal. We want to stay open to new ideas, so we end up with invoices in all kinds of shapes, and we can’t make our suppliers follow our way of invoicing, which these days wouldn’t make sense anyway.
So I built Talos, an agentic bookkeeper, and handed it the job. Nobody misses it. Talos has cut the manual work in our bookkeeping software by 80 to 90 percent. It saves us two to three hours a week and keeps our inbox clean. Talos runs in the cloud and decides on its own, and its one job is to match every invoice with the right amount, journal, currency and GL code, the account in the books where a cost belongs. We’ve been shadowing it, watching what it decides, and it works fine.
The mess it replaced
Every quarter close started with a hunt. Our suppliers each bill their own way: monthly, yearly or whenever we top up our credit, as a PDF, in the email itself, behind a link, only on their own website, or to whichever teammate signed up. Each of us, me included, lost about an hour a week searching inboxes, saving web pages as PDFs, forwarding invoices and chasing the missing ones.
Then came the matching. We pay in different currencies, but our books have to be in one, the euro. A dollar invoice and the euro payment for it never show the same number, so matching them was a very tedious task.
How it works
Its namesake, the bronze giant of Greek myth, ran around Crete three times a day and threw rocks at approaching ships. Ours guards our inbox, a little more politely: Talos only reads mail from suppliers on a list we keep. Teammates forward what reaches them, and Talos finds the real supplier inside the forward. Links and web pages become PDFs, and every PDF is archived in our own cloud storage, so nothing depends on a link that expires.
Everything that comes in then passes through a parsing layer: a private LLM, running in our own cloud account in the EU, that turns each PDF and web page into structured data. It checks that the document is an invoice billed to us, and pulls out what the books need: the supplier, the date, the amounts, the currency and the VAT.
From there Talos only works with structured data. It decides the journal, the GL code and the VAT from how we booked that supplier before, and records the purchase in Exact Online, our bookkeeping software, with the PDF attached.
Last, it pairs every payment in the bank account with the invoice it paid. Talos books a dollar invoice at the euro amount the bank charged for it. A payment with nothing behind it stands out within the month, which is how we catch the invoices that only live behind a supplier’s login. We still download those by hand, but we no longer forget one.
Credit cards and PayPal
Card purchases were the hard part. They sit on the card statement for a month, in whatever currency we paid, each converted to euros at its own rate. Then the card company collects one lump sum from the bank, which is very convenient for the card company. For us it means a month of invoices in several currencies behind a single bank payment.
I gave the credit card its own account in Exact, kept like a second bank account. The parsing layer reads the monthly statement, Talos checks that its lines add up to the statement’s own totals, and then it posts each purchase in euros, paired with its invoice. The bank’s lump sum settles the card.
PayPal is a smaller version of the same problem: the bank only shows a payment to PayPal, not the shop behind it. PayPal does email a confirmation for every purchase, with the supplier’s name, the amount in the original currency and the amount in euros, which is all the matching needs. So Talos reads those emails too. To keep the stack simple, I haven’t built a PayPal integration. It wouldn’t be hard, but the emails already do the job.
What the agent decides
Talos decides on its own, but it has little to decide. Because everything reaches it as structured data, tested programs can do the booking and the matching, and each gives a clear answer. The agent runs them, follows their answers and handles what’s new, like a supplier we’ve never seen. The matching is done by programs, not by the agent, so the agent doesn’t guess. It doesn’t need a very large model, and the few decisions that need a person still come to a person. Next on my list is one command that shows all of those in one place.
I ran each program by hand until I trusted it, and only then handed the routine to the agent. Shadowing an agent turns out to be a lot like onboarding a new colleague, except this one never minds when you check its work twice.
Each command that writes to Exact can show what it will write and run as a dry run first. Talos records every decision in BigQuery, with who made it and why, and reads back from Exact whatever it changed in the books, to confirm it landed. The part that reads the mailbox can’t write to Exact at all, and a write with an unclear outcome waits for a person, so nothing is booked twice. Close to 1,500 automated tests check all of it.
How do bigger companies do this?
If a startup our size already has this much invoice work, it’s no surprise that many companies end up outsourcing it or hiring people for it. I also understand now why an invoice at a large organisation can take forever to get paid: every one of them has to be booked and approved, and that’s tedious work. I’m very curious how bigger companies handle it today, and how much of it AI could take off their hands. If building an application like this sounds familiar, or speaks to you, let’s talk about it whenever we meet face to face at an event, or even online.