# BR-CO-15: Fix a total with VAT that is not the total without VAT plus the VAT total

The total with VAT must equal the total without VAT plus the VAT total in the document currency, rounded to two decimals.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: Totals, VAT
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-CO-15/
- Explanation last updated: 2026-09-20

## The short answer

`BR-CO-15` fails when `cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount` is not `cbc:TaxExclusiveAmount` plus the VAT total. The VAT total is the `cbc:TaxAmount` directly under `cac:TaxTotal` whose `currencyID` matches `cbc:DocumentCurrencyCode`. Add the two, round to two decimals, and write the result as the total with VAT.

It also fails when that VAT total cannot be identified: the document must contain exactly one `cac:TaxTotal/cbc:TaxAmount` in the document currency.

## What the rule checks

The rule runs once on the document root. It first counts the `cbc:TaxAmount` elements directly under a root-level `cac:TaxTotal` whose `currencyID` equals `cbc:DocumentCurrencyCode`. There must be exactly one. None, or two, fails the rule whatever the totals say.

It then adds that amount to `cbc:TaxExclusiveAmount`, rounds to two decimals, and compares the result exactly with `cbc:TaxInclusiveAmount`. A total with VAT of 80.21 where the sum is 80.20 fails.

A second `cac:TaxTotal` in the VAT accounting currency is ignored, because its `currencyID` is not the document currency.

Prepaid and rounding amounts are not part of this figure. They come in afterwards, between the total with VAT and the amount due.

| Term | Meaning | UBL element |
|---|---|---|
| BT-112 | Invoice total amount with VAT | `cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount` |
| BT-109 | Invoice total amount without VAT | `cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount` |
| BT-110 | Invoice total VAT amount | `cac:TaxTotal/cbc:TaxAmount` |
| BT-5 | Invoice currency code | `cbc:DocumentCurrencyCode` |

## How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

- The total with VAT is copied from the source system, where VAT was rounded differently from the VAT total written to the XML.
- One of the two inputs was corrected during mapping, for example the VAT total recomputed from the breakdown, and the total with VAT was left as it was.
- The total with VAT is sent net of a deposit or with cash rounding already applied, which belongs in the amount due instead.
- The `currencyID` on the VAT total is not the same code as `cbc:DocumentCurrencyCode`, so no VAT total is found.
- The `cac:TaxTotal` is missing, or the document-currency tax total is emitted twice.

## How to fix it

1. Make sure the inputs are final: the total without VAT (`BR-CO-13`) and the VAT total (`BR-CO-14`).
2. Check that exactly one `cac:TaxTotal/cbc:TaxAmount` carries the document currency in `currencyID`.
3. Add the total without VAT and that VAT total with decimal arithmetic and round to two decimals.
4. Write the result to `cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount`, then recalculate the amount due from it. `BR-CO-16` checks that next.

The recorded example has a total without VAT of 68.50, a VAT total of 11.70, 10.00 prepaid and a rounding amount of -0.20.

```text
Expected total with VAT: 68.50 + 11.70 = 80.20
Total with VAT sent (BT-112): 80.25, so BR-CO-15 fails
Amount due sent: 70.00, which is 80.20 - 10.00 + (-0.20)
Against the 80.25 that was sent, BR-CO-16 expects 80.25 - 10.00 + (-0.20) = 70.05, so it fails too
```

## Before and after

These are fragments, not complete documents. The complete synthetic documents they come from are linked below.

Fragment of the failing invoice: 68.50 + 11.70 is 80.20, but the total with VAT says 80.25

```xml
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
  <!-- both VAT breakdowns omitted from this fragment -->
</cac:TaxTotal>

<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="GBP">66.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="GBP">68.50</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="GBP">80.25</cbc:TaxInclusiveAmount>
  <cbc:AllowanceTotalAmount currencyID="GBP">1.00</cbc:AllowanceTotalAmount>
  <cbc:ChargeTotalAmount currencyID="GBP">3.50</cbc:ChargeTotalAmount>
  <cbc:PrepaidAmount currencyID="GBP">10.00</cbc:PrepaidAmount>
  <cbc:PayableRoundingAmount currencyID="GBP">-0.20</cbc:PayableRoundingAmount>
  <cbc:PayableAmount currencyID="GBP">70.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
```

Fragment of the corrected invoice: the total with VAT is the total without VAT plus the VAT total

```xml
<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="GBP">66.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="GBP">68.50</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="GBP">80.20</cbc:TaxInclusiveAmount>
  <cbc:AllowanceTotalAmount currencyID="GBP">1.00</cbc:AllowanceTotalAmount>
  <cbc:ChargeTotalAmount currencyID="GBP">3.50</cbc:ChargeTotalAmount>
  <cbc:PrepaidAmount currencyID="GBP">10.00</cbc:PrepaidAmount>
  <cbc:PayableRoundingAmount currencyID="GBP">-0.20</cbc:PayableRoundingAmount>
  <cbc:PayableAmount currencyID="GBP">70.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
```

Only `cbc:TaxInclusiveAmount` differs: 80.25 in the failing document, 80.20 in the corrected one. The failing document also reports `BR-CO-16`, because the amount due of 70.00 was worked out from 80.20 and does not follow from the 80.25 that was sent. Correcting the total with VAT clears both.

### What the validator reported

- The failing invoice reports **BR-CO-15** and [BR-CO-16](https://ironfang.uk/docs/finance/rules/BR-CO-16.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-CO-15-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/invoice-rich.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 `Invoice` and `CreditNote` alike; a credit note with the same mistake reports the same two findings.
- A document with no `cac:TaxTotal` at all reports this rule together with `BR-CO-18` and others about the missing VAT breakdown. Two tax totals in the document currency, or a VAT total whose `currencyID` is not the document currency, each report this rule alongside a Peppol finding of their own.
- When a VAT accounting currency is used, the extra `cac:TaxTotal` in that currency does not disturb this rule.

## Related rules

- [BR-CO-13 checks the total without VAT that this sum starts from](https://ironfang.uk/docs/finance/rules/BR-CO-13.md)
- [BR-CO-14 checks the VAT total against the VAT breakdown](https://ironfang.uk/docs/finance/rules/BR-CO-14.md)
- [BR-CO-16 derives the amount due from the total with VAT](https://ironfang.uk/docs/finance/rules/BR-CO-16.md)

## 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-24.1: source checked 2026-09-24, explanation last updated 2026-09-20.

[The official definition of BR-CO-15](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-CO-15/) 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.

## Links

- [This rule as a web page](https://ironfang.uk/docs/finance/rules/BR-CO-15)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
