BR-CO – Conditions and calculations
BR-CO-11: sum of allowances (BT-107) does not add up
ErrorEN 16931 business rule (CEN)
Official message
[BR-CO-11]-Sum of allowances on document level (BT-107) = Σ Document level allowance amount (BT-92).Source: CEN EN 16931, version 1.3.16
How to fix it
Calculate BT-107 as the sum of all document level allowance amounts and enter it in cbc:AllowanceTotalAmount; without allowances leave the element out or set 0. Line allowances do not belong in it, they are already inside the line net amount.
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Volume discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">50.00</cbc:Amount>
</cac:AllowanceCharge>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Loyalty discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">25.50</cbc:Amount>
</cac:AllowanceCharge>
<cac:LegalMonetaryTotal>
<cbc:AllowanceTotalAmount currencyID="EUR">50.00</cbc:AllowanceTotalAmount>
</cac:LegalMonetaryTotal><cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Volume discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">50.00</cbc:Amount>
</cac:AllowanceCharge>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Loyalty discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">25.50</cbc:Amount>
</cac:AllowanceCharge>
<cac:LegalMonetaryTotal>
<cbc:AllowanceTotalAmount currencyID="EUR">75.50</cbc:AllowanceTotalAmount>
</cac:LegalMonetaryTotal>What the message means
Your invoice states in the totals a sum of allowances that does not match the individual allowances at document level. The norm requires that this sum equals exactly the addition of all allowance amounts, rounded to two decimals. Even one cent of difference makes the invoice invalid, because the receiving software recalculates the amounts. Typical are roundings per allowance, an allowance changed afterwards, or a line discount wrongly included in the document total.
Common causes
- An allowance was changed or deleted after the totals were calculated.
- Line allowances were included in the document level sum.
- The software rounds each allowance differently from the sum.
Frequently asked
Must BT-107 be given when there are no allowances?
No. Without document level allowances the element may be absent; if present, it must contain 0 or the exact sum.
Are allowances given with a negative sign?
No. Allowance amounts are positive; the flag ChargeIndicator false makes them a deduction. A negative amount would be another error.
Fields concerned
- BT-107
- BT-92
- BG-20
- BG-22
Related rules
Check your invoice
The EN 16931 validator reports this rule with the line number and location – right in your browser, without upload.
Technical details
- UBL · Context (XPath)
cac:LegalMonetaryTotal- UBL · Schematron test
xs:decimal(cbc:AllowanceTotalAmount) = (round(sum(../cac:AllowanceCharge[cbc:ChargeIndicator=false()]/xs:decimal(cbc:Amount)) * 10 * 10) div 100) or (not(cbc:AllowanceTotalAmount) and not(../cac:AllowanceCharge[cbc:ChargeIndicator=false()]))- CII · Context (XPath)
//ram:SpecifiedTradeSettlementHeaderMonetarySummation- CII · Schematron test
(not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false()])and not (ram:AllowanceTotalAmount)) or ram:AllowanceTotalAmount = (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false()]/ram:ActualAmount[1])* 10 * 10 ) div 100)- CII · Context (XPath)
//ram:SpecifiedTradeSettlementHeaderMonetarySummation- CII · Schematron test
(not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false()])and not (ram:AllowanceTotalAmount)) or ram:AllowanceTotalAmount = (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false()]/ram:ActualAmount)* 10 * 10 ) div 100)
Explanation written on 14 September 2026