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

- Canonical URL: https://einvoices.uk/news/peppol-validation-error-br-co-15
- Published: 20 October 2026 (2026-10-20)
- Last updated: 20 October 2026 (2026-10-20) (not updated since publication)
- Author: Floris Lindenaar, Editor, e-invoicing expert (https://einvoices.uk/authors/floris-lindenaar)
- Publisher: einvoices.uk (https://einvoices.uk)
- Type: Guide
- Topics: Validation, Technical, Peppol, VAT
- Language: en-GB (UK English); covers the United Kingdom

## Sources

- [BR-CO-15 – EN16931 model bound to UBL, Peppol BIS Billing 3.0](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-CO-15/)
- [Peppol BIS Billing 3.0 (May 2026 release, version 3.0.21)](https://docs.peppol.eu/poacc/billing/3.0/bis/)
- [Rules for Peppol BIS 3.0 Billing](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/)
- [ConnectingEurope/eInvoicing-EN16931 validation artefacts](https://github.com/ConnectingEurope/eInvoicing-EN16931)
- [VAT guide (VAT Notice 700), 17.5 Calculation of VAT on invoices – rounding of amounts – GOV.UK](https://www.gov.uk/guidance/vat-guide-notice-700)

---

**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:

```text
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:

```text
[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:

```text
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:

```xml
<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:

```text
[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:

```xml
<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](https://einvoices.uk/news/multi-currency-e-invoices-gbp).

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

## Related errors

- [Common Peppol validation errors explained](https://einvoices.uk/news/common-peppol-validation-errors)
- [UK VAT category codes in Peppol](https://einvoices.uk/news/uk-vat-category-codes-peppol)
- [A complete UK Peppol invoice XML example](https://einvoices.uk/news/e-invoice-xml-example-uk)

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.

---

How to cite: "BR-CO-15 error: Invoice total amount with VAT explained and fixed", einvoices.uk, 20 October 2026, https://einvoices.uk/news/peppol-validation-error-br-co-15

einvoices.uk is an independent publication and is not affiliated with HMRC or the UK Government. Nothing here is tax advice; check the sources and official GOV.UK guidance before acting.
