Official rule text
[PEPPOL-EN16931-R040] Allowance/charge amount must equal base amount * percentage/100 if base amount and percentage exists
Why this error occurs
When an allowance or charge states both a base amount and a percentage, the amount must equal base x percentage / 100, with a tolerance of 0.02. The rule checks cbc:Amount against cbc:BaseAmount and cbc:MultiplierFactorNumeric in cac:AllowanceCharge at document and line level (UBL), or ram:ActualAmount against ram:BasisAmount and ram:CalculationPercent in ram:SpecifiedTradeAllowanceCharge (CII). It fails when the percentage is written as a fraction (0.10 instead of 10), when the base amount refers to a different base than the one the amount was computed from, or when the amount was rounded differently.
How to fix it
Formula: Amount = round(BaseAmount x MultiplierFactorNumeric / 100, 2). Write the percentage as a number of percent (10 for 10 %). Set BaseAmount to the amount the discount was actually applied to (usually the sum of the affected lines) and compute Amount from it. If you cannot provide a consistent base, omit both cbc:BaseAmount and cbc:MultiplierFactorNumeric and give only cbc:Amount, which is always allowed.
Example (valid)
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
<cbc:MultiplierFactorNumeric>10</cbc:MultiplierFactorNumeric>
<cbc:Amount currencyID="EUR">25.00</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">250.00</cbc:BaseAmount>
<cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:TaxCategory>
</cac:AllowanceCharge>
What the validator checks
Checked element (context):
UBL
ubl-invoice:Invoice/cac:AllowanceCharge | ubl-invoice:Invoice/cac:InvoiceLine/cac:AllowanceCharge | ubl-creditnote:CreditNote/cac:AllowanceCharge | ubl-creditnote:CreditNote/cac:CreditNoteLine/cac:AllowanceChargeTest (XPath):
not(cbc:MultiplierFactorNumeric and cbc:BaseAmount) or u:slack(if (cbc:Amount) then
cbc:Amount
else
0, (xs:decimal(cbc:BaseAmount) * xs:decimal(cbc:MultiplierFactorNumeric)) div 100, 0.02)CII
ram:SpecifiedTradeAllowanceChargeTest (XPath):
not(ram:CalculationPercent and ram:BasisAmount) or u:slack(if (ram:ActualAmount) then
ram:ActualAmount
else
0, (xs:decimal(ram:BasisAmount) * xs:decimal(ram:CalculationPercent)) div 100, 0.02)
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-R040 mean?
PEPPOL-EN16931-R040 is a peppol bis billing 3.0 rule: Allowance/charge amount must equal base amount * percentage/100 if base amount and percentage exists
Will my invoice be rejected because of PEPPOL-EN16931-R040?
Yes. PEPPOL-EN16931-R040 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-R040 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.