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.
| Term | Meaning | UBL element |
|---|---|---|
| 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:
- 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
- Work out what the price in
cbc:PriceAmountis for: one unit, or a batch of units. - For a price per single unit, write a base quantity of 1 or do not emit
cbc:BaseQuantityat all. For a price per batch, write the batch size. - 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.
- Re-check the line arithmetic afterwards.
PEPPOL-EN16931-R120divides 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
- The failing invoice reports PEPPOL-EN16931-R121. 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 UBL
InvoiceandCreditNotelines 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-R120as well, on both document types, because that rule does use a negative base quantity and the expected line amount becomes -25.00. - Leaving
cbc:BaseQuantityout 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:BaseQuantitynever reaches this rule. The XSD layer refuses the document and the EN 16931 and Peppol layers are skipped.
Related rules
- PEPPOL-EN16931-R120 uses the base quantity when it calculates the line net amount
- PEPPOL-EN16931-R046 checks the net price against the gross price and price discount
- BR-27 rejects a negative net price
- Browse every rule in the reference
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.
