The short answer
PEPPOL-EN16931-R044 fails when the cac:AllowanceCharge inside a line's cac:Price has a cbc:ChargeIndicator other than false. That element exists only to carry the item price discount and the gross price. If the entry is a discount, set the indicator to false, as the corrected invoice does.
A genuine surcharge on the unit price cannot be sent there. Remove the price-level element and either include the surcharge in the net price or send it as a charge on the line with its own reason.
What the rule checks
Each cac:Price/cac:AllowanceCharge is checked, on invoice and credit note lines. After trimming, its cbc:ChargeIndicator must read exactly false.
true fails, and so does 0. When tried, the schema accepted 0 in the price-level element but this rule rejected it, because it compares text rather than boolean values; 1 was rejected the same way.
The amounts are not examined here. The failing invoice still satisfies PEPPOL-EN16931-R046, which subtracts the amount from the gross price whatever the indicator says.
Entries directly on the line or under the document root, where charges are allowed, are outside this rule; their spelling is checked by PEPPOL-EN16931-R043.
| Term | Meaning | UBL element |
|---|---|---|
| - | Price allowance indicator | cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:ChargeIndicator |
| BT-147 | Item price discount | cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:Amount |
| BT-148 | Item gross price | cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:BaseAmount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The indicator is set from the sign of a price adjustment, and a positive adjustment is read as a charge.
- A shared routine that writes every
cac:AllowanceChargeis passed the wrong flag for the price-level one. - The source price list holds a base price and a mark-up, and the mapping models the mark-up as a charge on the price.
- Booleans are written as
1and0throughout the document.
How to fix it
- Open the line named in the finding and look at
cac:Price/cac:AllowanceCharge. - If
cbc:Amounttakes the gross price incbc:BaseAmountdown to the net price incbc:PriceAmount, it is a discount. Writefalseand change nothing else. - If it is an addition to the price, delete the price-level
cac:AllowanceCharge. Then either send the net price with the surcharge included incbc:PriceAmount, or keep the base price and add acac:AllowanceChargedirectly inside the line withcbc:ChargeIndicatoroftrue, a reason, and the surcharge amount for the whole line. - With the line charge, recompute
cbc:LineExtensionAmountas quantity times price plus the charge, whichPEPPOL-EN16931-R120checks. When tried on the recorded line, a price of 10, a quantity of 2 and a line charge of 5.00 for a line net amount of 25.00 validated cleanly.
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: the price discount of 2.5 is flagged as a charge
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:Amount currencyID="GBP">2.5</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">15</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>Fragment of the corrected invoice: the same figures with the indicator set to false
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="GBP">2.5</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">15</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>Only the indicator in the price-level cac:AllowanceCharge differs: true in the failing invoice, false in the corrected one. The failing document reports only PEPPOL-EN16931-R044, because the figures were already those of a discount: 15 less 2.5 is the net price of 12.5. When tried as a real surcharge, with a gross price of 10 and the same 2.5 flagged as a charge, PEPPOL-EN16931-R046 was reported as well, since it expects 10 minus 2.5.
What the validator reported
- The failing invoice reports PEPPOL-EN16931-R044. 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:InvoiceLineandcac:CreditNoteLine; a credit note with its price discount flaggedtruereported this rule alone when tried. - This is a Peppol restriction. The EN 16931 layer passed in the recorded example.
- Nothing in the totals depends on the price-level element. The line net amount is calculated from
cbc:PriceAmount, so removing the element leaves every amount as it was.
Related rules
- PEPPOL-EN16931-R046 checks that the net price is the gross price minus the price discount
- BR-28 rejects a negative gross price in the same element
- PEPPOL-EN16931-R120 checks the line net amount once a surcharge moves to a line charge
- PEPPOL-EN16931-R043 checks the indicator spelling on document and line entries
- Browse every rule in the reference
- Background: How Peppol invoice validation actually works
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 PEPPOL-EN16931-R044 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.
