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.
<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><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.
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