errorbusinessEN 16931

PEPPOL-EN16931-R045:Each document level allowance must have a reason or reason code

Fix: Populate either BT-97 (AllowanceChargeReason) with free-text or BT-98 (AllowanceChargeReasonCode) from UNTDID 5189 — common values are 95, 100, 102, 104, TD. Auto-fixed where the source ERP records a reason; otherwise the caller supplies one. Provide the required value in the free validator.

PEPPOL-EN16931-R045 is a Schematron rule on the Peppol BIS Billing 3.0 invoice. It asserts that every cac:AllowanceCharge element where ChargeIndicator = false (i.e. an allowance/discount, not a charge) at document level must carry either a free-text AllowanceReason (BT-97) or a coded AllowanceReasonCode (BT-98), or both. The rule prevents anonymous discounts that the buyer cannot reconcile against a contract or promotion.

Severity
Fatal
Rule set
EN 16931
Country
All EU
Fix type
INPUT REQUIRED
Confidence
65%

Engine Classification

Business data required · Explicit input workflow · No assumptions made

What is PEPPOL-EN16931-R045?

PEPPOL-EN16931-R045 is a fatal validation rule defined in the EN 16931 specification.

When this rule fires, the invoice is rejected by Peppol access points and never reaches the buyer.

Why This Error Matters

Anonymous discounts break buyer-side reconciliation. The buyer cannot match the allowance against a contract clause, rebate scheme, or promotion, so the line is either parked for manual review or rejected outright.

PEPPOL-EN16931-R045 is a hard failure — the invoice must be corrected and re-sent before it can reach the recipient.

Validator Behavior

  • ·Causes invoice rejection
  • ·Error returned: PEPPOL-EN16931-R045
  • ·Specification: EN 16931

Before / After

Failing XML
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:Amount currencyID="EUR">120.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>21</cbc:Percent>
  </cac:TaxCategory>
</cac:AllowanceCharge>
Corrected XML
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Volume discount Q1 2026</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">120.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>21</cbc:Percent>
  </cac:TaxCategory>
</cac:AllowanceCharge>

Technical Reference

SpecEN 16931

Seeing this in production? The API handles PEPPOL-EN16931-R045 automatically. See the fix response →

Frequently Asked Questions

Either is sufficient under R045. Most CIUS layers recommend supplying both — the code for machine processing and the text for human reading — because some downstream Schematron rules (UBL-CR-440 in BIS) prefer the code.

95 (Discount), 100 (Special agreement), 102 (Fixed long term), 104 (Loyalty), TD (Trade discount), 41 (Bonus for works ahead of schedule), 42 (Other bonus), 60 (Manufacturer's consumer discount).

Yes — line-level allowances/charges are governed by the parallel rule PEPPOL-EN16931-R046, with identical reason/code requirements.

Where the source ERP records a free-text reason or a known internal code, we map it to UNTDID 5189 deterministically and auto-fix. When no reason information exists at all in the source document, you must supply one because the business intent cannot be inferred from the amount alone.

No — R045 targets allowances (ChargeIndicator=false). The mirror rule for charges (ChargeIndicator=true) is PEPPOL-EN16931-R044.

Related Content

Last updated: 5 May 2026

Share this guide:

Validate your invoice

Drop your XML here to check for PEPPOL-EN16931-R045

Fix PEPPOL-EN16931-R045 with guided input

Upload your invoice and we'll ask for the missing data, then apply a safe, auditable fix.