Skip to content

BR-CO – Conditions and calculations

BR-CO-12: sum of charges (BT-108) does not add up

ErrorEN 16931 business rule (CEN)

Official message

[BR-CO-12]-Sum of charges on document level (BT-108) = Σ Document level charge amount (BT-99).

Source: CEN EN 16931, version 1.3.16

What the message means

In the totals of your invoice stands a sum of charges that differs from the individual charges at document level. The norm requires the sum to equal exactly the addition of all charge amounts, rounded to two decimals; the receiving software recalculates it and rejects the invoice on any difference. Usually a charge was added afterwards, a line charge was counted in, or the VAT on the charge was included in the sum.

Common causes

  • A charge such as shipping costs was added after the totals were calculated.
  • Line charges were included in the document level sum.
  • The sum contains the gross amount of the charge instead of the net amount.

How to fix it

Calculate BT-108 as the sum of all document level charge amounts, net and rounded to two decimals, and enter it in cbc:ChargeTotalAmount. Without charges leave the element out or set 0.

Before – invalid
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReason>Shipping costs</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">12.90</cbc:Amount>
</cac:AllowanceCharge>
<cac:LegalMonetaryTotal>
  <cbc:ChargeTotalAmount currencyID="EUR">15.35</cbc:ChargeTotalAmount>
</cac:LegalMonetaryTotal>
After – corrected
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReason>Shipping costs</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">12.90</cbc:Amount>
</cac:AllowanceCharge>
<cac:LegalMonetaryTotal>
  <cbc:ChargeTotalAmount currencyID="EUR">12.90</cbc:ChargeTotalAmount>
</cac:LegalMonetaryTotal>

Frequently asked

Does the VAT on the shipping costs belong in BT-108?

No. BT-108 is a net sum. The tax on charges flows into the total through the VAT breakdown.

What if a charge was calculated in another currency?

All amounts of the invoice stand in the invoice currency BT-5; convert the charge before entering it, otherwise the sums never match.

Fields concerned

  • BT-108
  • BT-99
  • BG-21
  • 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:ChargeTotalAmount) = (round(sum(../cac:AllowanceCharge[cbc:ChargeIndicator=true()]/xs:decimal(cbc:Amount)) * 10 * 10) div 100) or (not(cbc:ChargeTotalAmount) and not(../cac:AllowanceCharge[cbc:ChargeIndicator=true()]))
CII · Context (XPath)
//ram:SpecifiedTradeSettlementHeaderMonetarySummation
CII · Schematron test
(not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true()])and not (ram:ChargeTotalAmount)) or ram:ChargeTotalAmount = (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true()]/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=true()])and not (ram:ChargeTotalAmount)) or ram:ChargeTotalAmount = (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true()]/ram:ActualAmount)* 10 * 10 ) div 100)

Explanation written on 14 September 2026