Skip to content

BR-33: Document level allowance reason (BT-97/BT-98) is missing

Official message

[BR-33] Each Document level allowance (BG-20) shall have a Document level allowance reason (BT-97) or a Document level allowance reason code (BT-98).

EN 16931 (CII) · Error · Message language: English · Version: xrechnung-3.0.2-validator-configuration-2026-08-31

[BR-33] Each Document level allowance (BG-20) shall have a Document level allowance reason (BT-97) or a Document level allowance reason code (BT-98).

EN 16931 (UBL) · Error · Message language: English · Version: xrechnung-3.0.2-validator-configuration-2026-08-31

[BR-33] Each Document level allowance (BG-20) shall have a Document level allowance reason (BT-97) or a Document level allowance reason code (BT-98).

Factur-X / ZUGFeRD EN 16931 · Error · Message language: English · Version: Factur-X 1.08 / ZUGFeRD 2.4
Severity
Error The invoice is invalid and may be rejected by the recipient.
Applies to
EN 16931 (CII), EN 16931 (UBL), Factur-X / ZUGFeRD EN 16931
Affected fields
BG-20, BT-97, BT-98

What does this mean?

Every document level allowance (BG-20) must have a reason: as text (Document level allowance reason, BT-97) or as a code (Document level allowance reason code, BT-98). Both are missing for at least one allowance.

Typical causes

The allowance was output with amount and VAT category only.
The reason only appears in an invoice note, not on the allowance itself.

How to fix the error

State a reason as text for every allowance, e.g. "Loyalty discount", and/or a code from the UNTDID 5189 list, e.g. 95 (discount). If both are given, they must have the same meaning.
CII: ram:SpecifiedTradeAllowanceCharge/ram:Reason or ram:ReasonCode, UBL: cac:AllowanceCharge/cbc:AllowanceChargeReason or cbc:AllowanceChargeReasonCode.
Generate and validate the invoice again.

In E-Rechnungsfreund

In the invoice form ("Experte" view), section "Zu-/Abschläge auf Dokumentenebene (BG-20/BG-21)" (document level allowances and charges), fill in the field "Begründung" (reason) and/or select a reason in the field "Code" for every entry of type "Abschlag (BG-20)" (allowance).

Example

Wrong

<ram:SpecifiedTradeAllowanceCharge>
  <ram:ChargeIndicator>
    <udt:Indicator>false</udt:Indicator>
  </ram:ChargeIndicator>
  <ram:ActualAmount>25.00</ram:ActualAmount>
  <ram:CategoryTradeTax>
    ...
  </ram:CategoryTradeTax>
</ram:SpecifiedTradeAllowanceCharge>

Correct

<ram:SpecifiedTradeAllowanceCharge>
  <ram:ChargeIndicator>
    <udt:Indicator>false</udt:Indicator>
  </ram:ChargeIndicator>
  <ram:ActualAmount>25.00</ram:ActualAmount>
  <ram:ReasonCode>95</ram:ReasonCode>
  <ram:Reason>Loyalty discount</ram:Reason>
  <ram:CategoryTradeTax>
    ...
  </ram:CategoryTradeTax>
</ram:SpecifiedTradeAllowanceCharge>
For developers: test expression per syntax

EN 16931 (CII) (CII)

Context: //ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ChargeIndicator[udt:Indicator='false']

(../ram:Reason) or (../ram:ReasonCode)

EN 16931 (UBL) (UBL)

Context: /ubl:Invoice/cac:AllowanceCharge[cbc:ChargeIndicator = false()] | /cn:CreditNote/cac:AllowanceCharge[cbc:ChargeIndicator = false()]

exists(cbc:AllowanceChargeReason) or exists(cbc:AllowanceChargeReasonCode)

Factur-X / ZUGFeRD EN 16931 (CII)

Technical ID in the source: FX-SCH-A-000063

Context: //ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ChargeIndicator[udt:Indicator='false']

(../ram:Reason) or (../ram:ReasonCode)

Related validation rules

  • BR-01: Specification identifier (BT-24) is missing
  • BR-02: Invoice number (BT-1) is missing
  • BR-03: Invoice issue date (BT-2) is missing
  • BR-04: Invoice type code (BT-3) is missing
  • BR-05: Invoice currency code (BT-5) is missing
  • BR-06: Seller name (BT-27) is missing

Last updated:
Explanation of the validation rule, not legal or tax advice.