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:
| Syntax | Element |
|---|---|
| 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:
- 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.
- VAT Clause Translation — the clause description in the document language. VAT Clauses → Translation.
- Description on the VAT clause itself, with Description 2 appended when filled.
- VAT Clause Code — the last resort, when the clause carries no text at all in any of the steps above.
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 Code | Extended Text (step 1) | Translation (step 2) |
|---|---|---|
filled, e.g. ENU | that language → entry flagged All Language Codes | that language → next step |
| empty | company language → entry without a language code → entry flagged All Language Codes | company 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:
- VAT Clauses: create the clause, e.g. code
AE, description Steuerschuldnerschaft des Leistungsempfängers. - VAT Posting Setup: enter that code as VAT Clause Code on every combination that posts
reverse-charge lines (its Tax Category must be
AE). - 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.
- 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.