Back to Technology

Is AI Bookkeeping GoBD Compliant? Check the Audit Log

AI bookkeeping is GoBD compliant only if your change log can name who made each booking, and most audit logs cannot name a model. Here is what GoBD demands, why the EU AI Act will not help, and what we found in our own production audit trail.

Category
General
Updated

If a Betriebsprüfer opens your change log in 2027 and sees that the category on an expense was set at 03:14 on a Sunday, the question will not be whether an AI was allowed to do that. The question will be who did it. And most bookkeeping systems, including ours until recently, cannot answer.

That is the whole compliance problem with AI bookkeeping in Germany, and it is much narrower and much more solvable than the debate suggests. GoBD does not ban automated booking. It never did. What it demands is that every tax-relevant record be traceable to its origin and unchangeable after the fact. A model that books your coffee receipt to the wrong account is a bookkeeping error. A model that books it and leaves no trace of having decided anything is a GoBD problem.

Is AI bookkeeping GoBD compliant?

It can be, and the requirements have not changed because AI arrived. GoBD compliance rests on the same principles it always has: traceability (Nachvollziehbarkeit), immutability (Unveränderbarkeit), timely posting, receipt-backed booking, and a written process description (Verfahrensdokumentation). None of those clauses cares whether a human or a model proposed the category. All of them care that the decision, and every later change to it, is recorded and cannot be quietly rewritten.

So the practical test for any AI accounting tool is not "does the vendor say GoBD compliant" on a pricing page. It is three questions you can ask about the change log:

  1. When the automation books something, does a row appear in the change log at all?
  2. Does that row identify the automation as the actor, distinctly from the account owner?
  3. Once a period is filed or exported, can anything still be edited in place instead of corrected by a counter-entry?

We have shipped GoBD machinery for our own bookkeeping, and when I put those three questions to our own production data, we passed the third and failed the first two. I will come back to that.

What the EU AI Act actually requires, and what just slipped

If you were waiting for the AI Act to tell you what to log, stop waiting. Two things happened this year.

First, on 7 May 2026 EU lawmakers reached a provisional political agreement to delay the high-risk obligations under the Digital Omnibus. The duties that would have applied to stand-alone Annex III high-risk systems from 2 August 2026, including the automatic record-keeping duty in Article 12, now apply from 2 December 2027. AI embedded in regulated products under Annex I moves to 2 August 2028.

Second, 2 August 2026 arrived anyway, because the Article 50 transparency obligations were left on the original schedule. Those are disclosure duties: tell people when they are interacting with an AI system, label synthetic content. They are not logging duties.

And there is a third point that gets lost. Bookkeeping and tax categorisation are not in Annex III. That list covers biometrics, critical infrastructure, education, employment, essential services, law enforcement, migration and justice. Creditworthiness assessment is in there; deciding whether your laptop purchase is a business expense is not. So for the overwhelming majority of accounting automation, the AI Act's logging article was never going to bite, and now it is delayed for the systems where it would have.

My opinion, and it is falsifiable: for German bookkeeping, the AI Act is a distraction. The binding rulebook is a tax decree from 2019, revised with effect from 1 April 2024, that applies to every business regardless of risk tier, has no transition period left, and has been enforced by people who visit your office.

What GoBD demands that the EU AI Act does not

RequirementGoBDEU AI Act (high-risk)
Legal basis§§ 145–147 AO, §§ 238 ff. HGB, interpreted by the GoBD decreeRegulation (EU) 2024/1689
Applies toEvery business keeping tax records in Germany, including KleinunternehmerOnly systems in Annex I or Annex III
Covers bookkeeping automationYes, any system touching tax-relevant recordsNo, bookkeeping is not an Annex III use case
In forceCurrent version applies from 1 April 2024Annex III duties from 2 December 2027
Logging dutyÄnderungsprotokoll: every change to a record, with the old valueArticle 12: automatic event logs over the system lifetime
ImmutabilityRequired. Corrections by counter-entry, original stays visibleNot addressed
Actor identityRequired as part of traceabilityNot specified for accounting actors
Retention8 years for booking receipts, 10 for balance sheets6 months minimum for logs, unless longer applies
Consequence of failureBooks rejected, revenue and profit estimated by the FinanzamtAdministrative fines

Read the immutability row twice. That is the one no AI framework asks for and every German tax audit assumes. It is also the one that is hard to build, because it fights every instinct a product team has about letting users fix their own data.

The column our audit log did not have

We built the GoBD machinery in April. A Transaction carries an is_locked flag described in the code as "GoBD locked (immutable)" and a record_hash, a SHA-256 over the twelve fields that determine the booking: amount, value date, VAT rate and amount, cashflow type, category, supplier country, reverse charge, sale type, description. Attempting to unverify a locked transaction raises an error telling you to post a Storno instead. There is an AuditLog model whose docstring says, in as many words, GoBD-compliant audit trail (Änderungsprotokoll), recording create, update, delete, verify and export with a field-level diff of old and new values, plus the user and the IP address.

Then I ran the three questions against production. Four months of audit rows, close to two hundred thousand of them.

Question two first, because the answer is the cleanest. The AuditLog table has exactly one actor column: a nullable foreign key to a user. There is no column for what kind of actor made the change. For transaction rows the user is almost always filled in. For invoice rows and attachment rows, it is empty in every single row, several thousand of them, because those are written from a database signal handler that has no request and no user to pass. An auditor reading those rows learns that something changed and what it changed to. Not who.

Question one is worse. Our automated categorisation runs in an import post-processing service that sets the category, the VAT rate, the VAT amount and the categorisation status, then saves. It does not touch the audit trail at all, and it cannot do so by accident: transaction audit rows are written explicitly from services, with a comment in the signal handlers warning developers not to add a signal for Transaction. So the arithmetic across four months is that the better part of a million transactions were created, and roughly one in fifty of them has a creation entry in the change log. About half were categorised. Fewer than one in forty of those categorisations points at a named deterministic rule, which is the only decision path that leaves a durable pointer to its own reasoning.

The rest were decided by company memory, a deterministic lookup of counterparties this business has corrected at least twice, or by the model. Both are defensible bookkeeping. Neither is distinguishable afterwards from the record itself.

The shape of the failure is what I find instructive. The change log faithfully records the human correcting the machine, and says nothing about the machine's original decision. It is exactly backwards from what traceability means.

What we got wrong: verified is not immutable

The postmortem is short and slightly embarrassing.

Our first attempt at immutability locked a transaction when the user verified it. That seemed right: the user has confirmed the booking, so seal it. It was wrong in both directions at once. Verifying is a workflow step users take casually and reverse often, so locking on verify broke ordinary editing. And it does not correspond to anything GoBD cares about, because the moment that matters legally is when the numbers leave your system into a filing or an export, not when someone ticks a box.

So a later migration unlocked every verified transaction, with a note that is_locked should only be set explicitly, for example after a DATEV export. Correct diagnosis. Except that in the code as it stands, nothing calls the method that sets it. lock() has readers, an integrity-check command, guards that refuse to delete an attachment belonging to a locked transaction, but no caller. Across the entire production database, not one transaction is locked. The Storno-only correction path, the part that actually implements Unveränderbarkeit, has never once executed.

The lesson generalises past us. Immutability is not a boolean on a row that you flip when a user feels confident. It is a consequence of an event that leaves your system: a VAT return submitted, a DATEV export pushed, a period closed. Model those events and the locking follows from them. Model it as a user preference and you will end up either fighting your users or, like us, with a flag nobody sets.

The actor problem has the same shape. An audit log built around a request from a logged-in human has one actor column because there was only ever one kind of actor. The fix is not clever. It is a second column, filled in on every write path, distinguishing the account owner from a deterministic rule from a model, with the rule or model identified. That is what we are adding, and I would ask any vendor whose product books on your behalf whether their log has it.

How to evaluate GoBD compliance in an AI accounting tool

Skip the compliance badge. Ask for a screenshot of the change log for one transaction that the automation categorised, and check three things: that a row exists for the automation's own decision, that the row names the automation rather than showing you or nobody, and that the old value is preserved next to the new one. Then ask what event seals a period, and whether a sealed period can be edited or only corrected by counter-entry. Then ask for the Verfahrensdokumentation template, because you owe the Finanzamt a written description of exactly this process, and a vendor who has thought about the first four questions will already have written it down.

A credible, lived process description is worth more than the paperwork suggests. Under the reform of the German audit process, a tax control system whose effectiveness has been confirmed in an audit can earn documented relief in later ones. Automation makes that easier to earn, not harder, because a machine follows the documented process more reliably than a person does. But only if it writes down what it did.

For the underlying obligations, our guide to GoBD-compliant bookkeeping covers the ten principles, the retention periods and the Z1 to Z3 data access rights. On the engineering side, how we trace agent runs without storing the data and how our categorisation learns from corrections describe the two mechanisms that make the actor question answerable at all.

Frequently asked questions

Is there bookkeeping software that is GoBD compliant and usable without technical knowledge?

Yes, and the usability question is separate from the compliance one. GoBD compliance is a property of how the system records and seals data, not of how hard it is to operate. What you should verify is that the tool keeps an Änderungsprotokoll with old and new values, prevents in-place edits after a period is filed or exported, and ships a Verfahrensdokumentation template, since the written process description is your obligation, not the vendor's.

What criteria should guide a German company evaluating AI-assisted tax technology?

Four, in order. Can the change log attribute a booking to the automation specifically, not just to your account? What event seals a period against further edits, and are corrections then made by counter-entry? Is the data export in a format a Betriebsprüfer can actually read under Z1 to Z3 access? And does the vendor supply a process description matching what the software really does? Model quality matters less than these, because a wrong category is cheap to fix and an unauditable ledger is not.

Legal certainty comes from three separable things, so evaluate them separately. GoBD compliance is testable in the change log and the export, as described above. Data protection is about where data is processed and what a subprocessor list looks like. Keeping current with new law is a release-cadence question: ask when the vendor shipped support for the last statutory change that affected you, such as the e-invoicing obligations, and how you found out.

Does the EU AI Act apply to accounting automation?

Mostly not in the way people expect. Bookkeeping and tax categorisation are not listed in Annex III, so the high-risk duties, including the Article 12 logging requirement, generally do not apply, and those duties were in any case postponed to 2 December 2027 by the provisional Digital Omnibus agreement of 7 May 2026. The Article 50 transparency duties did apply from 2 August 2026, but they concern disclosing that a system is AI, not keeping bookkeeping records. GoBD is the binding constraint.

Can an AI make the booking decision, or does a human have to confirm it?

GoBD does not require human confirmation of each booking. It requires that the booking be traceable, receipt-backed, timely and unchangeable after the fact, and that your process description accurately describe how bookings are made. If your Verfahrensdokumentation says that an automated categorisation is posted without review, that can be compliant, provided the change log records the decision and the correction path is a counter-entry. What is not compliant is a process description that claims human review which does not happen.

Conclusion

The interesting question about AI in accounting was never whether the regulator permits it. It is whether your system can still explain itself afterwards. GoBD asked for that in 2019, in a way that happens to be exactly right for machine actors: name the origin, keep the old value, never overwrite in silence. We found two gaps in our own implementation by asking three questions of our own data, and both were in the boring direction, a missing column and an uncalled method, not in the model. That is where I would expect everyone else's gaps to be too.

Norman handles the operational finance work behind the scenes

From invoicing to bookkeeping, Norman keeps recurring finance work organized so you can stay on top of deadlines with less manual effort.