Skip to content

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.

Before – invalid
<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>
After – corrected
<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.

Open the EN 16931 validator

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