The short answer
BR-26 fails when a line has no cac:Price/cbc:PriceAmount. Add a cac:Price block after cac:Item, holding the net price per unit in cbc:PriceAmount, plus a cbc:BaseQuantity if the price is quoted for more than one unit.
The price is the net amount for one unit, or for the base quantity, after any price discount. It is not the line total: the recorded line of 2 units worth 25.00 has a price of 12.5.
What the rule checks
The rule runs on each cac:InvoiceLine or cac:CreditNoteLine and passes when the line has a cac:Price containing a cbc:PriceAmount. The amount is not judged here; a price of 0 passes.
In practice this finding means the whole cac:Price is missing. The UBL schema lets a line leave out cac:Price, but once cac:Price is there it must contain a numeric cbc:PriceAmount. When tried, a cac:Price holding only a base quantity, an empty cac:Price, and an empty cbc:PriceAmount were all refused at the XSD layer, so none of them reached this rule.
Two other rules fail on the same line whenever the price is missing. BR-27 compares the price with zero, and a price that does not exist does not pass that comparison. PEPPOL-EN16931-R120 treats a missing price as 0, so it expects the line amount to be just the line charges minus the line allowances.
| Term | Meaning | UBL element |
|---|---|---|
| BT-146 | Item net price | cac:InvoiceLine/cac:Price/cbc:PriceAmount (cac:CreditNoteLine/cac:Price/cbc:PriceAmount in a credit note) |
| BG-29 | Price details | cac:InvoiceLine/cac:Price |
| BT-149 | Item price base quantity | cac:InvoiceLine/cac:Price/cbc:BaseQuantity |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- Lines for a fixed fee or a one-off charge are held as an amount only, and the export writes no price because the source has no unit price for them.
- The price block is emitted only when a price list entry exists, and this line was priced by hand.
- The mapping was written against the UBL schema alone, where
cac:Priceis optional, so it was never added. - The price is taken from the order line, and lines added at invoicing time have no order line to take it from.
How to fix it
- Find the line from the finding location.
- Take the net unit price from the source line: the price per unit after any price-level discount. If the source holds only a quantity and an amount, divide the amount before line allowances and charges by the quantity, keeping enough decimals that quantity x price comes back to it within 0.02.
- Write
cac:Priceaftercac:Itemin the line, withcbc:PriceAmountin the document currency and, for a price quoted per several units,cbc:BaseQuantitywith the sameunitCodeas the line quantity. - Keep the price zero or positive. A credit or correction line gets a negative quantity and a positive price, otherwise
BR-27fails in its place.
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: line 1 ends after the item, with no price
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Example service</cbc:Name>
<!-- tax category omitted from this fragment -->
</cac:Item>
</cac:InvoiceLine>Fragment of the corrected invoice: a price of 12.5 per 1 C62 follows the item
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Example service</cbc:Name>
<!-- tax category omitted from this fragment -->
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
</cac:Price>
</cac:InvoiceLine>The corrected invoice has a cac:Price block with a cbc:PriceAmount of 12.5 and a cbc:BaseQuantity of 1; the failing invoice has no price on line 1 at all. The failing document also reports BR-27, because the check that the price is not negative has no value to compare and fails, and PEPPOL-EN16931-R120, because with the price counted as 0 the line should come to 0.00, not 25.00. Restoring the price clears all three.
What the validator reported
- The failing invoice reports BR-26, BR-27 and PEPPOL-EN16931-R120. 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
cac:InvoiceLinein a UBLInvoiceandcac:CreditNoteLinein aCreditNote, wherecac:Pricehas the same structure. When the price was removed from a credit note line, the same three rules were reported atcac:CreditNoteLine[1]. - The gross price and price discount in
cac:Price/cac:AllowanceChargeare optional and play no part in this rule. When they are present,PEPPOL-EN16931-R046checks that the net price follows from them. - A price of zero counts as present. On a line whose net amount is not zero it still fails the line calculation: when tried on the recorded line, a price of 0 reported
PEPPOL-EN16931-R120alone.
Related rules
- BR-27 rejects a negative item net price and is reported with this rule when the price is missing
- PEPPOL-EN16931-R120 checks the line net amount against quantity and price, reading a missing price as 0
- PEPPOL-EN16931-R121 checks the price base quantity inside the same price block
- BR-22 requires the quantity that the price is multiplied by
- Browse every rule in the reference
- Background: Understanding EN 16931 validation errors
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-24.
The official definition of BR-26 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.
