July 21, 2026 · 7 min read

Focus on the Harness, Not the Model: How Our Bookkeeping Agent Got Faster, Cheaper, and Safer

The short answer

We ran 11 AI models from five labs through 600+ live QuickBooks runs. The fix for wrong entries was not a smarter model - it was rebuilding every write path so the model only states intent in plain language while code builds the payload. After that, the cheapest model matched the premium one at about a fifth of the cost, with zero incorrect actions staged.

Here's a request our bookkeeping agent handles, typed exactly this sloppily: "inv for bluth 3k recurring services 5/5/26, tag [no-tax-sync]". A few seconds later, the person who typed it is looking at a preview of a fully built QuickBooks invoice - right customer, right product, right amount, the internal tag routed to the private memo where the client will never see it, dated May 5, 2026. One click to confirm, and it's in the books.

Doing that same invoice through the QuickBooks interface takes over a minute on a good day. QuickBooks is slow in exactly the way that compounds: every invoice, edit, void, and journal entry takes just enough clicking and waiting to become a real labor cost, multiplied across everything a bookkeeping firm does in a day.

So we built an agent that works the general ledger through conversation instead. It reads QuickBooks, Stripe, Google Sheets, contract database, and other tools via API; it stages any change it wants to make; a human confirms every single write before it lands. It ran on one of the big, expensive AI models, and it worked.

Then I tried to make it fast, but then it broke.

The obvious speed move was swapping the big model for a small, cheap one. Same agent, same tools, a fraction of the cost, noticeably snappier. We tried it. It made mistakes: picked the wrong product on an invoice, staged journal entries that didn't make sense. We shelved it.

The easy conclusion was "cheap models aren't ready." I almost settled there. But the failures had a pattern: every one happened somewhere we were asking the model to hand-write raw QuickBooks data - the full technical payload, every field, every ID, every tax code, from memory. The big model got that right most of the time. The small one got it right slightly less often.

And that reframes everything, because "most of the time" was never an acceptable standard. The expensive model was making the same class of mistakes - just rarely enough that we hadn't been forced to look. The cheap model didn't create the failure modes. It exposed them.

How do you stop an AI agent from entering the wrong data?

We rebuilt every write path the agent owns - invoices, recurring templates, journal entries, revenue recognition schedules, etc - so that the model no longer authors QuickBooks data on any of them.

Instead, the model states intent in plain terms: "$3,000 invoice for this customer, this product, this date, this tag". Then code does the rest: looks up the real product ID, applies the tax rules, routes tags to the private memo, fills the billing email from the customer record, builds the exact payload QuickBooks expects. Edits work the same way: the model picks operations from a fixed menu (add a line, change a due date, change an amount) and code applies them to the live record.

The important property is what happens when something doesn't check out. A product name that doesn't match anything? The tool refuses and asks. A journal entry that doesn't balance? Impossible to stage: the code enforces debits equal credits before anything exists to confirm. A journal entry with no date? Refused, not quietly defaulted to today.

The rules stopped being advice in a prompt the model could ignore. They became physics.

How do you test whether an AI bookkeeping agent is safe?

Here's the part I'd tell any firm doing this: don't take the rebuild's word for it. We built a test rig that runs scripted requests through the real agent: the same code, the same tools, a dedicated test customer in a live QuickBooks file. It stages every action exactly as production would, confirms the scripted ones for real, then reads QuickBooks back to verify what actually landed, and cleans up after itself. The scripts included polished requests, deliberately messy ones like the shorthand above, and requests modeled on what my team actually types all day.

One design choice mattered more than any other: every prompt runs multiple times, and a model is graded on its worst attempt. An agent that books the right entry four times out of five isn't 80% right. It's broken.

We ran eleven models from five AI labs through this, over six hundred live runs, and graded each one on a scale where only one grade really matters. A model that asks a clarifying question when it should have acted is friction. A model that fails loudly is annoying. A model that stages something incorrect and presents it as done (the silent wrong) is the only outcome that costs money, because it sails through a busy reviewer's confirmation click.

The code underneath this agent already had hundreds of unit tests, all passing. None of them could answer the only question that mattered: given a messy human sentence, does the model reach for the right tool with the right fields? The early rounds answered it. Silent wrongs showed up in nearly every model family we tested, including the premium models I would have trusted before the harness existed.

What mistakes do AI models actually make in QuickBooks?

Three of my favorites, because each taught us something structural:

A model picked the wrong product on an invoice. It didn't invent nonsense. It picked a real product from our catalog, which is worse, because the confirmation preview looked completely plausible. The cause wasn't randomness: the conversation was full of that customer's history, and the model reached for the product this customer usually buys instead of the one the user actually typed. Familiarity beat instructions, and no prompt wording fixes a bias that lives in the context itself. So matching moved into code: the user's own words are matched against the catalog deterministically, and a genuine tie goes to a second AI whose entire world is the user's phrase and the tied names, with no history to be biased by.

A model booked journal entries that balanced perfectly and were still wrong. Asked to recognize $1,500 per month across twelve entries, it put $18,000 on every one: debits equaled credits on each entry, and revenue recognition was overstated twelvefold. A balanced entry is not a correct entry, and any control that only checks balance will wave this straight through. The fix: the amount field was split into two mutually exclusive fields, total versus per-entry, so the ambiguity that caused it can no longer be expressed. Another model collapsed an entry's two legs onto the same account, an entry that nets to nothing and sits there until an auditor finds it. The tools now refuse that shape outright.

And the harness caught us, not just the models. One of our own fixes, a smarter account matcher, introduced a new failure of its own: it made several models produce that same collapsed-legs entry. The next eval run flagged it, we rolled the change back, rebuilt it with a guard, and re-ran. Without live testing, our safety improvement would have shipped a new way to be silently wrong.

Notice the shape of every fix: not "tell the model to be more careful." Make the mistake impossible to express, for every model at once.

Can a cheap AI model be as safe as an expensive one?

After each fix, we re-ran the field. Silent wrongs went from scattered across model families to zero. On the final run, every finalist, premium and budget alike, staged not a single incorrect action across the whole battery. The differences that remained were speed, cost, and how often a model asked a question it didn't strictly need to ask.

Which means the model choice stopped being a safety decision and became a shopping decision. We switched production to the small, fast model: the same one that had failed the first time, and the cheapest one in our final field. It ran the identical battery to the same score as the premium model at roughly a fifth of the cost, and responded faster. Safe by the measure that matters, zero silent-wrong writes, because safety no longer depends on the model knowing QuickBooks mechanics.

What does an AI bookkeeping agent actually save a firm?

My team barely opens the QuickBooks interface for ledger work anymore. Create an invoice, fix an amount, void and rebook, stage a twelve-entry recognition schedule: it's a sentence in a chat panel, a few seconds of waiting, and one confirmation click on a preview that shows exactly what will land. The minute-per-action tax that QuickBooks charges on everything is gone, across hundreds of actions a month. And every write still passes through a human.

But the durable lesson is the one I'd offer anyone building with AI right now. The instinct is to ask "which model is smart enough for my work?" The better question is "how small can I make the job I'm handing the model?" Every mechanical decision you move out of the model and into code makes the model more interchangeable, and models getting cheaper and faster is the one trend you can count on. Build so the cheap model is just as safe as the expensive one, and every future price drop becomes operating leverage instead of a new safety project.

What's the part of your workflow where you're still trusting the model with mechanics that code should own?

Frequently asked questions

Can a cheap AI model be trusted with accounting data?

Yes, once the model is no longer the thing enforcing correctness. After every mechanical decision moved into code, the cheapest model in the field staged zero incorrect actions across the whole test battery - the same score as the premium model, at roughly a fifth of the cost.

What is a "silent wrong" in an AI agent?

An action the agent stages incorrectly and presents as done. It is the only failure mode that reliably costs money, because it sails through a busy reviewer's confirmation click - unlike an agent that fails loudly or asks a question.

How do you test an AI agent against real accounting data?

With a harness that runs scripted requests through the real agent against a dedicated test customer in a live QuickBooks file, then reads QuickBooks back to verify what landed. Every prompt runs multiple times and the model is graded on its worst attempt, not its average.

Does the agent write to QuickBooks without approval?

No. Every write is staged and a human confirms it against a preview showing exactly what will land. Unbalanced journal entries and unmatched products are refused by the code before anything exists to confirm.

Why grade a model on its worst run instead of its average?

Because an agent that books the right entry four times out of five is not 80% right - it is broken. Averages hide exactly the failures that reach the ledger.

Ori Goldman · Founder, CleanBooks
Ori Goldman runs CleanBooks, an AI-native bookkeeping and FinOps firm. He builds and maintains the agents, evaluations and dashboards the firm runs on, and writes about what actually works. Connect on LinkedIn.

A version of this article first appeared on LinkedIn.

Want this running on your books?

We clean them up, then automate what happens next.

Book a free call