Guide

BR-CO-15 error: Invoice total amount with VAT explained and fixed

BR-CO-15 fires when BT-112 does not equal BT-109 plus BT-110, or the UBL has more than one VAT total in the invoice currency. Causes, tests and fixes with UBL.

Published 5 min readBy

BR-CO-15 means the VAT-inclusive total on your invoice does not equal the net total plus the VAT total. The rule text is: "Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110)." In UBL, it can also fire when the arithmetic is right but the invoice has more than one VAT total in the invoice currency, or the VAT total carries the wrong currencyID.

It is a fatal EN 16931 rule, so a Peppol Access Point will reject the invoice. Here is exactly what it checks and how to fix each cause.

What the rule actually tests

In UBL the three amounts live here:

Business term UBL element
BT-109 Invoice total amount without VAT cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount
BT-110 Invoice total VAT amount cac:TaxTotal/cbc:TaxAmount
BT-112 Invoice total amount with VAT cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount

The published Peppol test for BR-CO-15 (context: the Invoice or CreditNote root) is:

every $Currency in cbc:DocumentCurrencyCode satisfies
  (count(cac:TaxTotal/xs:decimal(cbc:TaxAmount[@currencyID=$Currency])) eq 1)
  and (cac:LegalMonetaryTotal/xs:decimal(cbc:TaxInclusiveAmount) =
       round((cac:LegalMonetaryTotal/xs:decimal(cbc:TaxExclusiveAmount)
              + cac:TaxTotal/xs:decimal(cbc:TaxAmount[@currencyID=$Currency])) * 10 * 10) div 100)

That gives two conditions, and both must pass:

  1. Exactly one cac:TaxTotal/cbc:TaxAmount whose currencyID equals cbc:DocumentCurrencyCode.
  2. TaxInclusiveAmount equals TaxExclusiveAmount + TaxAmount, rounded to 2 decimals. There is no tolerance.

We reproduced each cause below by changing one thing in an otherwise valid UK invoice and running the EN 16931 and Peppol validation artefacts.

Cause 1: the sum is out by a penny

The most common case. Our test invoice had TaxExclusiveAmount 925.00 and VAT 173.00. Changing TaxInclusiveAmount to 1098.01 produced:

[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
[BR-CO-16]-Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114).

BR-CO-16 usually comes along, because PayableAmount was derived from the wrong total.

Typical root causes:

  • Gross prices. The system stores VAT-inclusive prices and backs out net and VAT per line, then rounds each part separately.
  • Line-level VAT. The system computes VAT per line, rounds each line and sums them, while also calculating the gross total some other way. HMRC allows line-level rounding (VAT Notice 700, paragraph 17.5.1), but in the e-invoice the totals must still add up.
  • Three or more decimals in an intermediate total that gets rounded differently in two places.

Fix: build the totals in one direction only, from the lines up:

BT-106 LineExtensionAmount  = sum of line net amounts (BT-131)
BT-109 TaxExclusiveAmount   = BT-106 - AllowanceTotalAmount + ChargeTotalAmount
BT-110 TaxTotal/TaxAmount   = sum of TaxSubtotal/TaxAmount
BT-112 TaxInclusiveAmount   = BT-109 + BT-110
BT-115 PayableAmount        = BT-112 - PrepaidAmount + PayableRoundingAmount

Never compute BT-112 from gross line prices. Always add BT-109 and BT-110 after both are rounded to 2 decimals:

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">173.00</cbc:TaxAmount>
  <!-- TaxSubtotal(s) summing to 173.00 -->
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="GBP">910.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="GBP">925.00</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="GBP">1098.00</cbc:TaxInclusiveAmount>
  <cbc:ChargeTotalAmount currencyID="GBP">15.00</cbc:ChargeTotalAmount>
  <cbc:PayableAmount currencyID="GBP">1098.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

If you want the customer to pay a rounded figure, use cbc:PayableRoundingAmount (BT-114). Do not adjust TaxInclusiveAmount.

Cause 2: two VAT totals in the invoice currency

Adding a second cac:TaxTotal with a TaxAmount in GBP, as some systems do to "repeat" VAT, triggered BR-CO-15 even though every amount was correct:

[BR-CO-15]-Invoice total amount with VAT (BT-112) = ...
PEPPOL-EN16931-R054 Only one tax total without tax subtotals MUST be provided when tax currency code is provided.

Fix: one cac:TaxTotal with the cac:TaxSubtotal breakdowns. Peppol rule PEPPOL-EN16931-R053 says "Only one tax total with tax subtotals MUST be provided." A second cac:TaxTotal (amount only, no subtotals) is allowed only when you invoice in a foreign currency and set cbc:TaxCurrencyCode, and it must then be in that tax currency, such as GBP on a EUR invoice.

Cause 3: wrong currencyID on the VAT total

On a EUR invoice with GBP as the VAT accounting currency, putting currencyID="GBP" on the main TaxTotal/TaxAmount instead of EUR produced BR-CO-15, plus PEPPOL-EN16931-R051 ("All currencyID attributes must have the same value as the invoice currency code (BT-5), except for the invoice total VAT amount in accounting currency (BT-111).") and R055.

Fix: the main VAT total, with subtotals, is in the invoice currency. The sterling figure goes in a separate TaxTotal with no subtotals:

<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>GBP</cbc:TaxCurrencyCode>
<!-- ... -->
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="EUR">173.00</cbc:TaxAmount>
  <cac:TaxSubtotal><!-- in EUR --></cac:TaxSubtotal>
</cac:TaxTotal>
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">149.65</cbc:TaxAmount>
</cac:TaxTotal>

More in multi-currency e-invoices.

Cause 4: header VAT does not match the breakdown

If TaxTotal/TaxAmount is not the sum of the TaxSubtotal amounts, you get BR-CO-14 ("Invoice total VAT amount (BT-110) = Σ VAT category tax amount (BT-117).") and often BR-CO-15 too. In our test, changing only the header VAT to 173.01 fired both. Fix BR-CO-14 first. BR-CO-15 often clears with it.

Why the VAT breakdown passes but BR-CO-15 fails

The VAT breakdown rules have a tolerance. The UBL tests for BR-S-09 and BR-CO-17 accept a breakdown tax amount within 1 (one currency unit) of taxable amount × rate. So line-level VAT rounding that differs by a few pence from breakdown-level calculation passes those rules. In our tests, a breakdown of £173.01 on £865.00 at 20% passed, and £174.50 failed. BR-CO-14 and BR-CO-15 have no such tolerance: the header totals must agree with each other to the penny.

So the safe pattern for UK systems that calculate VAT per line is:

  1. Sum the line VAT per category and rate into each TaxSubtotal/TaxAmount (small differences from rate × base are tolerated).
  2. Set TaxTotal/TaxAmount to the exact sum of the subtotals.
  3. Set TaxInclusiveAmount to TaxExclusiveAmount + TaxTotal/TaxAmount.

Checklist

  • One cac:TaxTotal with subtotals, in the invoice currency
  • A second cac:TaxTotal only if cbc:TaxCurrencyCode is set, with no subtotals, in that currency
  • TaxTotal/TaxAmount = sum of TaxSubtotal/TaxAmount
  • TaxInclusiveAmount = TaxExclusiveAmount + TaxTotal/TaxAmount, to the penny
  • All amounts have at most 2 decimals
  • PayableAmount derived from TaxInclusiveAmount, with PayableRoundingAmount for any rounding

These rules come from Peppol BIS Billing 3.0 as published in May 2026. The UK's own e-invoice specification has not been published. It could add rules, but BR-CO-15 is a core EN 16931 rule, and any EN 16931-based UK standard would be expected to keep it. That is our expectation, not a confirmed UK rule.

Frequently asked questions

What does BR-CO-15 mean?

"Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110)." In UBL: TaxInclusiveAmount must equal TaxExclusiveAmount plus TaxTotal/TaxAmount.

My totals add up but I still get BR-CO-15. Why?

In UBL the rule also needs exactly one cac:TaxTotal/cbc:TaxAmount with a currencyID equal to the invoice currency. A second TaxTotal in the same currency, or a wrong currencyID, triggers BR-CO-15 even when the arithmetic is right.

Is there a rounding tolerance for BR-CO-15?

No. The sum is rounded to two decimals and must match exactly. Unlike the VAT breakdown rules BR-S-09 and BR-CO-17, there is no tolerance.

Is BR-CO-15 a Peppol rule or an EN 16931 rule?

It is an EN 16931 rule, applied in Peppol BIS Billing 3.0 through the UBL binding. It is fatal, so the invoice is rejected.

Spotted a mistake? Report an error. einvoices.uk is an independent publication and is not affiliated with HMRC. Details of the mandate may change; check the sources and official GOV.UK guidance before acting.