BR-CO – Conditions and calculations
BR-CO-05: allowance reason and reason code (BT-97, BT-98) do not match
ErrorEN 16931 business rule (CEN)
The rule's own wording
[BR-CO-05]-Document level allowance reason code (BT-98) and Document level allowance reason (BT-97) shall indicate the same type of allowance.Source: CEN EN 16931, version 1.3.16
Meaning of the rule
An allowance granted on the invoice as a whole may carry a reason as text and as a code, for example volume discount and code 95. Both must mean the same thing. The norm states this as a rule, but no automatic validator can check whether a free text matches a code; the rule counts as satisfied. For the recipient it still matters: a code for early payment discount next to the text volume discount confuses their bookkeeping.
What usually goes wrong
- The reason text was changed but the code from the template was not adjusted.
- The software sets one fixed default code for every allowance.
- Code and text come from different fields of the order.
The fix in the XML
Choose the code from UNTDID 5189 that describes your allowance and word the text to match, or leave one of the two out. In UBL they stand in cbc:AllowanceChargeReasonCode and cbc:AllowanceChargeReason.
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>66</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Volume discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">50.00</cbc:Amount>
</cac:AllowanceCharge><cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Volume discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">50.00</cbc:Amount>
</cac:AllowanceCharge>Questions and answers
Why does the validator never report BR-CO-05?
Because checking the meaning of a free text cannot be automated. The rule stands in the norm as a requirement on the issuer, not as a technical check.
Do I have to give a reason at all?
No, reason and reason code are optional. An understandable reason, however, spares the recipient a question about every allowance.
EN 16931 fields
- BT-97
- BT-98
- BG-20
See also
Check your invoice
The EN 16931 validator reports this rule with the line number and location – right in your browser, without upload.
The rule in detail
- UBL · Context (XPath)
/ubl:Invoice/cac:AllowanceCharge[cbc:ChargeIndicator = false()] | /cn:CreditNote/cac:AllowanceCharge[cbc:ChargeIndicator = false()]- UBL · Schematron test
true()- CII · Context (XPath)
//ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ChargeIndicator[udt:Indicator='false']- CII · Schematron test
true()
Explanation written on 14 September 2026