Skip to content

PEPPOL-EN16931-R121Use a price base quantity above zero, or leave it out

If a line price states a base quantity, it must be greater than zero. Zero and negative values fail; omitting the element is fine.

Peppol BIS BillingFatal: the document is invalidLines and prices

The short answer

PEPPOL-EN16931-R121 fails when cac:Price/cbc:BaseQuantity on a line is 0 or negative. The base quantity is the number of units the price is for, so write 1 for a price per single unit, the real number for a price per 100 or per 1000, or leave the element out.

What the rule checks

The rule runs on every cac:InvoiceLine and cac:CreditNoteLine. If the line price has no cbc:BaseQuantity, it passes. If it has one, the value must be strictly greater than zero.

Any positive decimal is accepted, including values below 1: a base quantity of 0.5 with the price adjusted to match passes.

The comparison is numeric, so 0.00 fails just as 0 does.

TermMeaningUBL element
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:

  • The base quantity is an unset numeric field that serialises as 0.
  • The source system has a price-per column that is empty for ordinary items, and empty is converted to 0 instead of omitting the element.
  • A return or correction line flips the sign of every quantity on the line, the price base quantity included.
  • The field was mapped from something unrelated, such as a stock level or pack count, that happens to be zero for this item.

How to fix it

  1. Work out what the price in cbc:PriceAmount is for: one unit, or a batch of units.
  2. For a price per single unit, write a base quantity of 1 or do not emit cbc:BaseQuantity at all. For a price per batch, write the batch size.
  3. Keep the base quantity positive on negative lines. The sign of a line belongs on the invoiced or credited quantity, not on the base quantity.
  4. Re-check the line arithmetic afterwards. PEPPOL-EN16931-R120 divides the price by the base quantity, so moving from 0 to anything other than 1 changes the expected line net amount.

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: a price base quantity of 0

<cac:Price>
  <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
  <cbc:BaseQuantity unitCode="C62">0</cbc:BaseQuantity>
</cac:Price>

Fragment of the corrected invoice line: the price is per 1 unit

<cac:Price>
  <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
  <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
</cac:Price>

Only cbc:BaseQuantity differs: 0 in the failing document, 1 in the corrected one. The failing document reports only PEPPOL-EN16931-R121. The line calculation rule PEPPOL-EN16931-R120 does not fire as well, because it reads a base quantity of 0 as 1, and 2 x 12.5 matches the line net amount of 25.00.

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 UBL Invoice and CreditNote lines alike. A base quantity of 0 on a credit note line reports only this rule, the same as on an invoice.
  • A negative value is different from zero in its side effects. With -1 on the recorded line, the validator reports PEPPOL-EN16931-R120 as well, on both document types, because that rule does use a negative base quantity and the expected line amount becomes -25.00.
  • Leaving cbc:BaseQuantity out passes this rule and every other layer on both the invoice and the credit note fixture; the line calculation then treats the price as per 1 unit.
  • A non-numeric or empty cbc:BaseQuantity never reaches this rule. The XSD layer refuses the document and the EN 16931 and Peppol layers are skipped.

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

The official definition of PEPPOL-EN16931-R121 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.