Official rule text
[PEPPOL-EN16931-R046] Item net price MUST equal (Gross price - Allowance amount) when gross price is provided.
Why this error occurs
When a gross price (BT-148) is given, the net price (BT-146) must be exactly the gross price minus the item price discount (BT-147); there is no tolerance. In UBL the rule compares cac:Price/cbc:PriceAmount with cac:Price/cac:AllowanceCharge/cbc:BaseAmount minus cbc:Amount; in CII ram:NetPriceProductTradePrice/ram:ChargeAmount with ram:GrossPriceProductTradePrice/ram:ChargeAmount minus ram:AppliedTradeAllowanceCharge/ram:ActualAmount. It fails when the discount is derived from a percentage and rounded separately, or when net and gross prices use a different number of decimals.
How to fix it
Formula: PriceAmount = BaseAmount - Amount (UBL) / NetPrice ChargeAmount = GrossPrice ChargeAmount - ActualAmount (CII), compared as exact decimals. Compute the discount amount first, then derive the net price from it, using the same number of decimals for all three values (up to four are common for prices). If you cannot reproduce the gross/discount pair exactly, drop the price-level allowance and the gross price and give only the net price, which is always sufficient.
Example (valid)
<cac:Price>
<cbc:PriceAmount currencyID="EUR">85.50</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="EUR">4.50</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">90.00</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>
What the validator checks
Checked element (context):
UBL
cac:Price/cac:AllowanceChargeTest (XPath):
not(cbc:BaseAmount) or xs:decimal(../cbc:PriceAmount) = xs:decimal(cbc:BaseAmount) - xs:decimal(cbc:Amount)CII
rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePriceTest (XPath):
not(ram:ChargeAmount) or xs:decimal(../ram:NetPriceProductTradePrice/ram:ChargeAmount) = xs:decimal(ram:ChargeAmount) - u:decimalOrZero(ram:AppliedTradeAllowanceCharge/ram:ActualAmount[1])
Check your invoice
Drop your XML or PDF on the validator and every failed rule is linked to its page here. Free, no account, the file is not stored.
Same check via API:
curl -F file=@invoice.xml https://einvoicechecker.com/v1/validateRelated rules
PEPPOL-EN16931-R001Business process identifier (BT-23) is missingPEPPOL-EN16931-R002No more than one note is allowed on document level, unless both the buyer and seller…PEPPOL-EN16931-R003Neither buyer reference nor purchase order reference givenPEPPOL-EN16931-R004Specification identifier is not the Peppol BIS Billing 3.0 identifierPEPPOL-EN16931-R005VAT accounting currency equals the invoice currencyPEPPOL-EN16931-R006Only one invoiced object is allowed on document levelPEPPOL-EN16931-R007Business process identifier has the wrong formatPEPPOL-EN16931-R008Document contains empty elements
Frequently asked questions
What does PEPPOL-EN16931-R046 mean?
PEPPOL-EN16931-R046 is a peppol bis billing 3.0 rule: Item net price MUST equal (Gross price - Allowance amount) when gross price is provided.
Will my invoice be rejected because of PEPPOL-EN16931-R046?
Yes. PEPPOL-EN16931-R046 is flagged "fatal"; validators (KoSIT, Peppol access points, the German ZRE/OZG-RE portals) reject the invoice until it is fixed.
Which formats does PEPPOL-EN16931-R046 apply to?
Invoices and credit notes sent over the Peppol network (UBL) and, because XRechnung embeds the Peppol rule set, every XRechnung as well. Syntax: UBL and CII.
Source: Peppol BIS Billing 3.0.20 (November 2025). Catalogue generated from the official schematron on 2026-10-14.