Skip to content
Asghar (Saeid) Kaleji
Go back

Correction Invoices and Storno in German E-Invoicing

In German accounting workflows, invoices are not always final. Suppliers issue correction invoices (Rechnungskorrektur) to fix errors and Storno documents (Stornierungen) to cancel invoices entirely. If your system treats each document as independent, you end up with double-counted amounts, confused exports, and audit problems.

This post covers how corrections and cancellations work in structured e-invoices (XRechnung and ZUGFeRD), how to link them reliably, and what Kanzlei offices need to handle them correctly.

Table of contents

Open Table of contents

The three document roles

Every e-invoice document falls into one of three roles:

The supplier issues corrections and cancellations. The receiving side (your Kanzlei or AP team) needs to detect the role, link it to the right original, and ensure accounting exports reflect the correct effective amounts.

How corrections and cancellations appear in XRechnung

Both UBL and CII provide structured reference fields to indicate that a document relates to an earlier invoice.

In UBL, a correction invoice may include a BillingReference element pointing to the original invoice number. The InvoiceTypeCode can also indicate a credit note (code 381) versus a standard invoice (code 380).

In CII, the equivalent mechanism uses InvoiceReferencedDocument within the header, referencing the original invoice number and optionally the issue date.

In practice, these references are not always present or complete. Some ERP systems omit them. Some suppliers include a reference in free-text notes instead of structured fields. This means detection needs a fallback strategy:

  1. Structured reference in the XML (highest confidence)
  2. Heuristic matching — same supplier + referenced invoice number in text + matching amounts
  3. Manual linking — a user selects the original invoice when automatic detection fails

Document chains

When a correction is linked to an original, they form a document chain:

Original Invoice #2024-001
  └── Correction Invoice #2024-001-K1 (supersedes original)
        └── Correction Invoice #2024-001-K2 (supersedes K1)

Or for cancellations:

Original Invoice #2024-002
  └── Storno #2024-002-S (cancels original)

Chains can also combine both — a supplier cancels an invoice and then issues a new corrected version.

The critical concept is the effective version: at any point, only one document in a chain should be treated as the active invoice for accounting purposes. Earlier versions are superseded or canceled.

The double-counting problem

If corrections and originals are both included in an accounting export without chain awareness, amounts get counted twice. This is the most common operational error.

Consider a simple example:

If both appear in the monthly DATEV export, the books show 19,500 EUR instead of 9,500 EUR. For Kanzlei offices processing hundreds of invoices per month across multiple mandants, catching these manually is unreliable.

Effective version rules for accounting

A sound system needs clear rules for what appears in accounting exports:

Corrections

Cancellations (Storno)

For Kanzlei workflows, this should be a configurable setting per mandant, since different clients may follow different accounting conventions.

What Kanzlei offices need

Kanzlei offices processing invoices for multiple mandants have specific requirements around corrections and cancellations:

Visibility — when viewing an invoice, it must be immediately clear if it has been superseded or canceled. Banners like “This invoice was superseded by Correction #X on DATE” prevent staff from accidentally working on outdated documents.

Chain navigation — staff need to see the full document chain (original, corrections, cancellations) with key fields (amounts, dates, status) at a glance, and navigate between documents.

Export safety — batch exports per mandant must automatically exclude superseded and canceled originals. Manual overrides should be restricted to admin roles and audit-logged.

Unresolved references — when a correction references an invoice number that doesn’t exist in the system (maybe the original was processed before the system was adopted), this should be flagged as a warning so staff can investigate.

Detection confidence

Not all links are equally reliable. A system should track detection confidence:

Low-confidence links should be flagged for manual review rather than applied automatically. This is especially important in Kanzlei workflows where incorrect linking could affect a mandant’s books.

Audit trail

Every linking decision — whether automatic or manual — must be recorded:

This is non-negotiable for Kanzlei offices where audit readiness is a core requirement.

Building this into RechnungRadar

Handling corrections and cancellations reliably was one of the more nuanced features to build in RechnungRadar. The system detects document roles from XML references, links them into chains, tracks effective versions, and ensures accounting exports only include the correct documents — with full audit trail and per-mandant policy configuration.

The key design decision was making linking an orthogonal concern to validation: a correction invoice goes through the same parse-validate-policy pipeline as any other invoice, and the linking/chain logic operates alongside it rather than replacing it.


Share this post on:

Previous Post
How XRechnung Validation Works in Germany
Next Post
Building a Deterministic Invoice Validation Pipeline in Kotlin