From a full working day to under two minutes: automating an accountant's quarter

Some projects you finish and move on. This one I still open sometimes just to watch it run.
First, what a BAS actually is
If you are not Australian, this will be new, so here is the thirty-second version.
Four times a year, every Australian business has to tell the tax office what happened: how much it sold, how much GST it collected on those sales, how much GST it paid on its purchases, what it paid in wages, and how much tax it withheld from those wages. Add it up and you get one number: what the business owes, or is owed. That declaration is the Business Activity Statement, the BAS.
Most businesses do not file it themselves. Their accounting firm does, and the firm signs off on it. Which means that before anything is lodged, somebody at that firm has to go through the books line by line and catch what the spreadsheet will never volunteer: the subscription that got imported four times, the liquor store receipt filed under office supplies, the payroll figure that does not quite match the payroll report.
At the firm I built this for, that review was one accountant, one client, one full working day. Every quarter. Six hours of scrolling, and the six hours were not the hard part. The hard part was that after six hours of scrolling, you have to be sure.
Today that review takes under two minutes and the accountant never had to learn a new tool.
Here is how we got there, and I say we deliberately.
The interface is an email address
This is the decision I am proudest of, and it is not a technical one.
There is no app. No dashboard, no login, no onboarding session, no "just upload your file here". The accountant exports the spreadsheet from their system, in their own firm's template, unchanged, and emails it to an address. Ninety seconds later the full review lands in their inbox.
Every tool you bring into a small firm competes with the way people already work, and most of them lose. An email address competes with nothing. Zero learning curve. Works from a phone on the train. Works for the colleague who missed the meeting where the tool was announced. Nobody has to remember a password, and nobody has to be convinced.
Behind that address sits an n8n workflow watching the mailbox. The accountant has never needed to know that, and that is exactly the point.
What the AI never sees
Now the part that makes it actually work, because this is where most AI projects quietly fail.
The tempting approach is to hand the spreadsheet to a language model and ask it to review the BAS. And it looks like it works. You get back something fluent, confident and beautifully formatted. Then you check the arithmetic and find an invented figure, twelve missed duplicates, and a total that is off by a rounding you cannot trace.
A language model is not a calculator and it is not a rules engine. Asking it to be both produces a document that reads wonderfully and cannot be trusted, which in accounting is worse than no document at all.
So the spreadsheet never reaches the model in its raw state. Before anything goes near an API, ordinary code does the unglamorous work.
It validates. Is this the expected template? Are the columns where they should be? Does the file cover the period it claims to? A malformed file fails right here, loudly, with a message the accountant can act on, instead of producing a confident review of nothing.
It refines. Transactions parsed, normalised, classified, totalled. Sales separated from expenses. GST pulled out of both.
It does the arithmetic. GST collected, minus GST paid, plus tax withheld from wages, plus any instalment. That is the amount owed. Compared against the declared figure, it either reconciles or it does not. No model involved. No judgement. No room for a plausible-sounding wrong answer. The final report shows that calculation as a table, line by line, so the accountant can follow it instead of trusting it.
It runs the checks. Duplicate detection across the whole transaction set. Ratio checks, like whether the withholding rate sits in the range you would expect for a business of that shape. Category rules that flag transactions looking more personal than professional. These are rules. Written down, identical every run, and when one fires the report says which one fired.
Only then, with clean structured data and the exceptions already isolated, does anything reach the model.
What the AI is actually for
The model does the part that is genuinely a judgement call, and only that part.
A hardware store purchase might be a legitimate business expense or somebody's weekend. The rules can flag it as worth a look. What the model does is read it in context, phrase the question a human should be asked about it, and decide whether it goes in the pile you chase today or the pile you mention in passing.
It also writes the summary at the top: what this quarter looks like, what needs attention before lodgement, in the register of a colleague talking to a colleague rather than a system printing a status code.
Narrow job. Narrow is the whole trick. The numbers were already right before the model saw them, so it cannot make them wrong.
The months nobody sees
Here is the honest part, and the reason this worked.
Writing the code took days. Getting the rules right took months.
Because a firm's rules are not written down anywhere. They live in the accountant's head, built over years, and most of them have never been said out loud because nobody ever needed to say them. "That supplier is always personal." "If wages jump like that, check whether someone left." "This client codes things differently, ignore the category."
You cannot extract that in a kickoff call. You extract it by running real quarters in staging, side by side, with a client patient enough to check every single finding against what he would have caught himself. Then telling you, calmly, what the tool missed. And doing it again next quarter.
That is what happened here, for months, and it is entirely to his credit. He treated a tool that was not yet good enough as something worth making good. Plenty of clients would have concluded after two rounds that it did not work.
The report that goes out today is version fourteen. Fourteen is not thirteen bugs. Fourteen is fourteen rounds of "you missed this", each one turned into a rule that will never miss it again.
The report is written for two different people
That collaboration shows in the shape of the output, and this part came from him, not from me.
The findings are not one undifferentiated pile. There is a preparer's checklist with priorities, to work through. And the open questions are split into what the firm needs to ask its own staff, and what the firm needs to ask the client. Those are genuinely different conversations, on different timelines, and merging them means somebody unpicks the list by hand every quarter.
Every flag carries a code tied to a specific rule. Not "the AI found this odd" but an identifier you can trace. A finding you cannot explain to a client is a finding that gets quietly ignored by the third quarter.
And every report ends by saying it is an automated review and that findings should be verified before lodging. That is not legal throat-clearing, it is the design. The tool does not file anything and does not replace anyone's judgement. It does the six hours of looking and hands back the twenty minutes of deciding.
This has nothing to do with Australia
The BAS is just the example. The shape is everywhere.
In France it is the CA3, the DSN, the liasse fiscale. Across Europe it is VAT returns and Intrastat. In the US it is sales tax filings, 1099s, quarterly estimates. Outside accounting entirely: expense reports checked line by line, supplier invoices matched against purchase orders, payroll run against contracts, insurance claims screened before they go out, compliance reviews before an audit.
Same anatomy every time. A file arrives on a rhythm. Somebody opens it. Somebody scrolls. Somebody applies rules that exist in their head. Somebody gets tired around item four hundred, and the cost of a miss is real.
Repetitive, tedious, predictable. When a process has those three properties, it can be automated with a very high success rate, and faster than most people expect. Not because AI is magic, but because the boring parts are boring precisely because they are regular, and regular is what machines are for.
Here is the test I use. If you can answer yes to all four, your process is a candidate:
- It happens on a rhythm. Every month, every quarter, every Monday.
- The input has a shape. A file, a form, a folder, an inbox.
- The rules exist, even if nobody has ever written them down.
- Someone is currently doing it by scrolling.
If you answered yes four times, that process is not part of the job. It is a tax on the job, and it is payable in the hours of whoever is best at it.
Tell me about yours
I do not need you to know how it should work. That is my part.
Describe the thing that eats a day of somebody's month, and I will tell you honestly whether it is worth automating, and what it would take. Some of them are not worth it. The ones that are, you feel the difference the first quarter.


