Skip to content

PEPPOL-EN16931-R046: Net price is not gross price minus price discount

Official message

[PEPPOL-EN16931-R046] Item net price MUST equal (Gross price - Allowance amount) when gross price is provided.

XRechnung (CII) · Error · Message language: English · Version: xrechnung-3.0.2-validator-configuration-2026-08-31

[PEPPOL-EN16931-R046] Item net price MUST equal (Gross price - Allowance amount) when gross price is provided.

XRechnung (UBL) · Error · Message language: English · Version: xrechnung-3.0.2-validator-configuration-2026-08-31
Severity
Error The invoice is invalid and may be rejected by the recipient.
Applies to
XRechnung (CII), XRechnung (UBL)

What does this mean?

Item net price MUST equal (Gross price - Allowance amount) when gross price is provided: the item net price (BT-146) must be exactly the item gross price (BT-148) minus the item price discount (BT-147). The net price deviates.
The rule originates from Peppol BIS Billing 3.0 and is applied in the XRechnung validation; there is no rounding tolerance. CII: if ram:AppliedTradeAllowanceCharge/ram:ActualAmount is missing in the gross price, 0 is used, so the net price must then equal the gross price. UBL: checked if cac:Price/cac:AllowanceCharge contains a cbc:BaseAmount.

Typical causes

The price discount was taken into account in the net price but not stated as amount with the gross price.
Gross or net price was rounded differently.

How to fix the error

State the price discount as amount per price unit and calculate the net price as gross price minus discount.
If the gross price is not needed, omit it and state only the net price (BT-148 is optional).
CII: ram:GrossPriceProductTradePrice/ram:ChargeAmount, ram:GrossPriceProductTradePrice/ram:AppliedTradeAllowanceCharge/ram:ActualAmount and ram:NetPriceProductTradePrice/ram:ChargeAmount; UBL: cac:Price/cbc:PriceAmount, cac:Price/cac:AllowanceCharge/cbc:BaseAmount and cbc:Amount.
Generate and validate the invoice again.

In E-Rechnungsfreund

In the invoice form, "Experte" view, section "Rechnungspositionen (BG-25)" (invoice lines), enter the discount per price unit in the field "Preisrabatt (BT-147)" (price discount) of the line (0 if there is none) and state exactly "Bruttopreis (BT-148)" (gross price) minus price discount as "Nettopreis (BT-146)" (net price), without rounding. The application writes the price discount with the gross price into the XML; for XRechnung, a deviating line cannot be saved.
If no gross price is needed, leave the field "Bruttopreis (BT-148)" empty; the rule then does not apply.

Example

Wrong

<ram:GrossPriceProductTradePrice>
  <ram:ChargeAmount>100.00</ram:ChargeAmount>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
  <ram:ChargeAmount>90.00</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>

Correct

<ram:GrossPriceProductTradePrice>
  <ram:ChargeAmount>100.00</ram:ChargeAmount>
  <ram:AppliedTradeAllowanceCharge>
    <ram:ChargeIndicator>
      <udt:Indicator>false</udt:Indicator>
    </ram:ChargeIndicator>
    <ram:ActualAmount>10.00</ram:ActualAmount>
  </ram:AppliedTradeAllowanceCharge>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
  <ram:ChargeAmount>90.00</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
For developers: test expression per syntax

XRechnung (CII) (CII)

Context: rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice

not(ram:ChargeAmount) or xs:decimal(../ram:NetPriceProductTradePrice/ram:ChargeAmount) = xs:decimal(ram:ChargeAmount) - u:decimalOrZero(ram:AppliedTradeAllowanceCharge/ram:ActualAmount[1])

XRechnung (UBL) (UBL)

Context: cac:Price/cac:AllowanceCharge

not(cbc:BaseAmount) or xs:decimal(../cbc:PriceAmount) = xs:decimal(cbc:BaseAmount) - xs:decimal(cbc:Amount)

Related validation rules

Last updated:
Explanation of the validation rule, not legal or tax advice.