Skip to content

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.

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

Open the EN 16931 validator

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