Skip to content

BR-26: Add the item net price to every line

Each line needs cac:Price/cbc:PriceAmount, the net price per unit. A line with no cac:Price fails here, and the Peppol line calculation fails with it.

EN 16931Fatal: the document is invalidLines and pricesCore fields

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.

TermMeaningUBL element
BT-146Item net pricecac:InvoiceLine/cac:Price/cbc:PriceAmount (cac:CreditNoteLine/cac:Price/cbc:PriceAmount in a credit note)
BG-29Price detailscac:InvoiceLine/cac:Price
BT-149Item price base quantitycac: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:Price is 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

  1. Find the line from the finding location.
  2. 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.
  3. Write cac:Price after cac:Item in the line, with cbc:PriceAmount in the document currency and, for a price quoted per several units, cbc:BaseQuantity with the same unitCode as the line quantity.
  4. Keep the price zero or positive. A credit or correction line gets a negative quantity and a positive price, otherwise BR-27 fails 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

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:InvoiceLine in a UBL Invoice and cac:CreditNoteLine in a CreditNote, where cac:Price has the same structure. When the price was removed from a credit note line, the same three rules were reported at cac:CreditNoteLine[1].
  • The gross price and price discount in cac:Price/cac:AllowanceCharge are optional and play no part in this rule. When they are present, PEPPOL-EN16931-R046 checks 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-R120 alone.

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.