The short answer
BR-CO-16 fails when cbc:PayableAmount is not cbc:TaxInclusiveAmount minus cbc:PrepaidAmount plus cbc:PayableRoundingAmount, all inside cac:LegalMonetaryTotal. Recalculate the amount due from those figures as they appear in the XML.
If the amount due is right and reflects a payment already received or a cash rounding, the missing piece is usually the element that explains it. Send the prepaid amount or the rounding amount rather than forcing the amount due back to the total.
What the rule checks
The rule reads four elements of cac:LegalMonetaryTotal and nothing else. It requires the amount due minus the rounding amount to equal the total with VAT minus the prepaid amount, working to two decimals. The comparison is exact: an amount due of 70.01 where 70.00 is expected fails.
The prepaid amount and the rounding amount are each optional, and an omitted one counts as nothing. With both left out, the amount due must equal the total with VAT. Sending either as 0.00 gives the same result as omitting it.
The rounding amount is added, so its sign matters. With a total with VAT of 80.20 and 10.00 prepaid, a rounding amount of -0.20 goes with an amount due of 70.00, and a rounding amount of 0.20 goes with 70.40.
The amount due does not have to be positive. A fully prepaid invoice with 0.00 due passes, and so does an overpayment that leaves a negative amount due.
| Term | Meaning | UBL element |
|---|---|---|
| BT-115 | Amount due for payment | cac:LegalMonetaryTotal/cbc:PayableAmount |
| BT-112 | Invoice total amount with VAT | cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount |
| BT-113 | Paid amount | cac:LegalMonetaryTotal/cbc:PrepaidAmount |
| BT-114 | Rounding amount | cac:LegalMonetaryTotal/cbc:PayableRoundingAmount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The amount due is the open balance from the ledger after a deposit or part payment, but
cbc:PrepaidAmountis not sent, so the rule expects the full total with VAT. - Cash rounding is applied to the amount due without sending
cbc:PayableRoundingAmount, or the rounding amount is sent with the opposite sign. - The amount due is populated from the total without VAT, or from a total with VAT that was later recalculated.
- A prepaid amount is sent but the amount due still shows the full total.
- A placeholder or default value reaches
cbc:PayableAmountbecause the source field was empty.
How to fix it
- Confirm the total with VAT first;
BR-CO-15checks it. - Decide from the business facts whether anything was paid in advance and whether the amount due was rounded. Send
cbc:PrepaidAmountandcbc:PayableRoundingAmountaccordingly, or leave them out. - Compute total with VAT minus prepaid amount plus rounding amount with decimal arithmetic and round to two decimals.
- Write the result to
cac:LegalMonetaryTotal/cbc:PayableAmount.
The recorded example has no prepayment and no rounding; both are sent as 0.00.
Expected amount due: 30.00 - 0.00 + 0.00 = 30.00 Amount due sent (BT-115): 999.99, so BR-CO-16 fails For comparison, the larger valid fixture has 80.20 - 10.00 + (-0.20) = 70.00
Validate your corrected invoice
Before and after
These are fragments, not complete documents. The complete synthetic documents they come from are linked below.
Fragment of the failing invoice: the total with VAT is 30.00 with nothing prepaid, but the amount due says 999.99
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">30.00</cbc:TaxInclusiveAmount>
<!-- allowance and charge totals omitted from this fragment -->
<cbc:PrepaidAmount currencyID="GBP">0.00</cbc:PrepaidAmount>
<cbc:PayableRoundingAmount currencyID="GBP">0.00</cbc:PayableRoundingAmount>
<cbc:PayableAmount currencyID="GBP">999.99</cbc:PayableAmount>
</cac:LegalMonetaryTotal>Fragment of the corrected invoice: the amount due equals the total with VAT
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">30.00</cbc:TaxInclusiveAmount>
<!-- allowance and charge totals omitted from this fragment -->
<cbc:PrepaidAmount currencyID="GBP">0.00</cbc:PrepaidAmount>
<cbc:PayableRoundingAmount currencyID="GBP">0.00</cbc:PayableRoundingAmount>
<cbc:PayableAmount currencyID="GBP">30.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>Only cbc:PayableAmount differs: 999.99 in the failing document, 30.00 in the corrected one. The document reports only this rule. The amount due is the last figure in the chain, so no other total is calculated from it.
What the validator reported
- The failing invoice reports BR-CO-16. The corrected document passes every layer with no findings.Download the failing XMLDownload the corrected XML
Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.
Where it applies
- Applies to UBL
InvoiceandCreditNotealike; the recorded credit note with the same mistake also reports only this rule. cbc:PayableAmountitself cannot be left out. The XSD layer rejects a document without it, and the EN 16931 and Peppol layers are then skipped, so this rule is never reached.- An error further up the chain shows here as well: a wrong total with VAT reports
BR-CO-15together with this rule. Fix that one first.
Related rules
- BR-CO-15 checks the total with VAT that the amount due starts from
- BR-CO-14 checks the VAT total that feeds the total with VAT
- BR-CO-13 checks the total without VAT, one step further back in the chain
- Browse every rule in the reference
Scope and source
Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-20.1: source checked 2026-09-20, explanation last updated 2026-09-20.
The official definition of BR-CO-16 carries the normative wording and test. This page is our explanation of it, not a copy.
Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.
