Skip to main content

xInvoice VAT Exemption Reason

EN16931 field BT-120 (VAT exemption reason text) explains, in plain language, why a VAT breakdown group carries no tax — for example a reverse-charge invoice, an intra-community supply or an export. mseDoc365 emits it per VAT breakdown group (BG-23), in both syntaxes and for both document types:

SyntaxElement
CII (XRechnung)ApplicableTradeTax/ExemptionReason
UBL (XRechnung-UBL / Peppol)TaxCategory/TaxExemptionReason

A reason is expected whenever the group's tax category is not a plain standard rate — categories AE (reverse charge), E (exempt), K (intra-community supply), G (export) and O (not subject to VAT). For category O mseDoc365 stops the export with an error when no reason can be resolved, because the receiver would reject the document anyway.

Where the text comes from

Everything starts on the VAT Posting Setup (MwSt.-Buchungsmatrix) of the invoice line: its VAT Clause Code names the VAT clause whose text is used. Without a VAT Clause Code there is nothing to resolve — BT-120 stays empty (and category O raises the error mentioned above).

From that clause, the text is resolved in this order — the first step that finds something wins:

  1. Extended Text on the VAT clause — the Textbaustein. VAT Clauses → Extended Texts. Several lines are joined with a line break, which makes this the right place for multi-line legal wording.
  2. VAT Clause Translation — the clause description in the document language. VAT Clauses → Translation.
  3. Description on the VAT clause itself, with Description 2 appended when filled.
  4. VAT Clause Code — the last resort, when the clause carries no text at all in any of the steps above.
tip

Step 4 is a safety net, not a setup option: a receiver shown AE instead of a sentence has no usable reason. Maintain step 1, 2 or 3 for every clause you use.

The standard Description by document type (VAT Clauses → Description by document type) is not evaluated for BT-120 — use the Extended Text's document-type flags instead, see below.

Which language is used

The document's Language Code decides which entry is picked. A document without a Language Code runs in the company's default language, which mseDoc365 reads from Company Information → Alternative Language Code.

Document Language CodeExtended Text (step 1)Translation (step 2)
filled, e.g. ENUthat language → entry flagged All Language Codesthat language → next step
emptycompany language → entry without a language code → entry flagged All Language Codescompany language → entry without a language code → next step

So a single Extended Text with All Language Codes set covers every language, while an entry for a specific language always takes precedence over it.

Validity dates and document type

The Extended Text header's Starting Date and Ending Date are honoured against the document date of the invoice or credit memo, and they are checked at every step of the language ladder: an expired entry is skipped and the resolution simply continues — it never blocks a valid entry further down. This lets you prepare new wording in advance, or retire old wording, without touching the clause itself.

Equally, an Extended Text is only used for the document type it is flagged for — Sales Invoice for invoices, Sales Credit Memo for credit memos. A text flagged for credit memos only is ignored on an invoice, which then falls through to the translation or the clause description.

Worked example: reverse charge (AE)

Setup for a German reverse-charge clause used on invoices and credit memos:

  1. VAT Clauses: create the clause, e.g. code AE, description Steuerschuldnerschaft des Leistungsempfängers.
  2. VAT Posting Setup: enter that code as VAT Clause Code on every combination that posts reverse-charge lines (its Tax Category must be AE).
  3. Optional, for longer wording: VAT Clauses → Extended Texts, tick All Language Codes, Sales Invoice and Sales Credit Memo, and write the paragraph as text lines.
  4. Optional, for foreign-language customers: VAT Clauses → Translation, one line per language.

An invoice with a reverse-charge line then carries <ram:ExemptionReason>Steuerschuldnerschaft des Leistungsempfängers</ram:ExemptionReason>.

What changed

Earlier versions resolved the Extended Text only, and emitted the bare VAT Clause Code whenever none was maintained — receivers saw AE where a sentence belongs. The translation and the clause description are now used before falling back to the code, and the Extended Text language matching was completed (company default language, entries without a language code, and the All Language Codes flag, each within the validity dates).

No setup migration is needed: the resolution is code, not schema data, so existing installations benefit as soon as the app is updated. Clauses that already carry an Extended Text keep emitting exactly that text.