Account
English

PEPPOL-EN16931-R040: Allowance or charge amount does not match base amount times percentage

Peppol BIS Billing 3.0 rule · Error · UBL / CII

StandardPeppol BIS Billing 3.0 (OpenPeppol)SeverityError: the invoice is rejectedSyntaxUBL, CIIApplies toInvoices and credit notes sent over the Peppol network (UBL) and, because XRechnung embeds the Peppol rule set, every XRechnung as well.

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:AllowanceCharge

Test (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:SpecifiedTradeAllowanceCharge

Test (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.

Check your invoice →

Same check via API:

curl -F file=@invoice.xml https://einvoicechecker.com/v1/validate

Related rules

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.