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