BT-112Invoice total amount with VATBT-113Paid amountBT-114Rounding amountBT-115Amount due for payment
Official rule text
[BR-CO-16] Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114).
Why this error occurs
The amount due (BT-115) must equal the total with VAT (BT-112) minus the paid amount (BT-113) plus the rounding amount (BT-114). The rule checks cac:LegalMonetaryTotal/cbc:PayableAmount against cbc:TaxInclusiveAmount, cbc:PrepaidAmount and cbc:PayableRoundingAmount (UBL), or ram:DuePayableAmount against ram:GrandTotalAmount, ram:TotalPrepaidAmount and ram:RoundingAmount (CII). It usually fails when software writes the open balance after a partial payment without also writing the prepaid amount, or uses the wrong sign for the rounding amount.
How to fix it
Formula: BT-115 = BT-112 - BT-113 + BT-114, rounded to 2 decimals; a missing BT-113 or BT-114 counts as 0. If a prepayment was received, write it as a positive value in cbc:PrepaidAmount / ram:TotalPrepaidAmount and reduce cbc:PayableAmount / ram:DuePayableAmount accordingly. Use cbc:PayableRoundingAmount / ram:RoundingAmount only for cash rounding, with the sign of the adjustment (e.g. -0.02 or 0.03). For a fully paid invoice PrepaidAmount equals TaxInclusiveAmount and PayableAmount is 0.00.
Example (valid)
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">200.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">200.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">238.00</cbc:TaxInclusiveAmount>
<cbc:PrepaidAmount currencyID="EUR">100.00</cbc:PrepaidAmount>
<cbc:PayableAmount currencyID="EUR">138.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
What the validator checks
Checked element (context):
UBL
cac:LegalMonetaryTotalTest (XPath):
(exists(cbc:PrepaidAmount) and not(exists(cbc:PayableRoundingAmount)) and (xs:decimal(cbc:PayableAmount) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and not(exists(cbc:PayableRoundingAmount)) and xs:decimal(cbc:PayableAmount) = xs:decimal(cbc:TaxInclusiveAmount)) or (exists(cbc:PrepaidAmount) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = xs:decimal(cbc:TaxInclusiveAmount)))CII
//ram:SpecifiedTradeSettlementHeaderMonetarySummationTest (XPath):
(xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount) - xs:decimal(ram:TotalPrepaidAmount) + xs:decimal(ram:RoundingAmount)) or ((xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount) + xs:decimal(ram:RoundingAmount)) and not (xs:decimal(ram:TotalPrepaidAmount))) or ((xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount) - xs:decimal(ram:TotalPrepaidAmount)) and not (xs:decimal(ram:RoundingAmount))) or ((xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount)) and not (xs:decimal(ram:TotalPrepaidAmount)) and not (xs:decimal(ram:RoundingAmount)))
Check your invoice
Drop your XML or PDF on the validator and every failed rule is linked to its page here. Free, no account, the file is not stored.
Same check via API:
curl -F file=@invoice.xml https://einvoicechecker.com/v1/validateRelated rules
BR-CO-15Total with VAT (BT-112) is not net plus VATBR-CO-25Amount due but no due date or payment termsBR-14An Invoice shall have the Invoice total amount with VATBR-15An Invoice shall have the Amount due for paymentBR-DEC-14The allowed maximum number of decimals for the Invoice total amount with VAT is 2BR-DEC-16The allowed maximum number of decimals for the Paid amount is 2BR-DEC-17The allowed maximum number of decimals for the Rounding amount is 2BR-DEC-18The allowed maximum number of decimals for the Amount due for payment is 2
Frequently asked questions
What does BR-CO-16 mean?
BR-CO-16 is a en 16931 core rule: Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114).
Will my invoice be rejected because of BR-CO-16?
Yes. BR-CO-16 is flagged "fatal"; validators (KoSIT, Peppol access points, the German ZRE/OZG-RE portals) reject the invoice until it is fixed.
Which formats does BR-CO-16 apply to?
Every EN 16931 invoice: XRechnung, ZUGFeRD 2.x / Factur-X (profiles EN 16931, EXTENDED, XRECHNUNG), Peppol BIS Billing 3.0, and national CIUS such as the Dutch NLCIUS or the Italian/Spanish profiles. Syntax: UBL and CII.
Source: EN 16931-1:2017 schematron (CEN TC434, via Peppol BIS 3.0.20). Catalogue generated from the official schematron on 2026-10-14.