Skip to content

PEPPOL-EN16931-R044: Mark the price-level adjustment as a discount, or move a surcharge out of the price

Only a discount may sit in cac:Price/cac:AllowanceCharge, so its cbc:ChargeIndicator must be false. A surcharge goes in the net price or a line charge.

Peppol BIS BillingFatal: the document is invalidLines and pricesAllowances and charges

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.

TermMeaningUBL element
-Price allowance indicatorcac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:ChargeIndicator
BT-147Item price discountcac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:Amount
BT-148Item gross pricecac: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:AllowanceCharge is 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 1 and 0 throughout the document.

How to fix it

  1. Open the line named in the finding and look at cac:Price/cac:AllowanceCharge.
  2. If cbc:Amount takes the gross price in cbc:BaseAmount down to the net price in cbc:PriceAmount, it is a discount. Write false and change nothing else.
  3. If it is an addition to the price, delete the price-level cac:AllowanceCharge. Then either send the net price with the surcharge included in cbc:PriceAmount, or keep the base price and add a cac:AllowanceCharge directly inside the line with cbc:ChargeIndicator of true, a reason, and the surcharge amount for the whole line.
  4. With the line charge, recompute cbc:LineExtensionAmount as quantity times price plus the charge, which PEPPOL-EN16931-R120 checks. 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

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 and cac:CreditNoteLine; a credit note with its price discount flagged true reported 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.

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.