PEPPOL-EN16931-R048:Invoice line net amount must equal price * quantity ± allowances/charges
Fix: Recompute BT-131 in the canonical order: gross = round_half_up(qty * price / coalesce(base, 1), 2); net = gross + charges − allowances. Auto-fixed when components are deterministic; downgraded to input when the price base is missing or ambiguous. Upload your invoice to fix this automatically.
PEPPOL-EN16931-R048 is a Schematron calculation rule on the Peppol BIS Billing 3.0 invoice. For each cac:InvoiceLine the rule requires: BT-131 (Invoice line net amount) = (BT-129 Invoiced quantity * BT-146 Item net price / BT-149 Item price base quantity) + sum of BT-141 line-level charges − sum of BT-136 line-level allowances. When the calculated value differs from the value the seller emitted by more than the rounding tolerance, the line is rejected.
Engine Classification
Structural normalization · No financial impact · Safe deterministic remediation
Confidence: 95% · Applied automatically in pipeline
What is PEPPOL-EN16931-R048?
PEPPOL-EN16931-R048 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
Line-level calculation drift cascades into the document totals (BT-106..BT-115). One miscomputed line cents into a footer mismatch, and the buyer cannot post the invoice — the document goes back to the seller for correction days or weeks after issue.
PEPPOL-EN16931-R048 is a hard failure — the invoice must be corrected and re-sent before it can reach the recipient.
Invoice Navigator can automatically correct this error in your pipeline. The fix is applied with full audit evidence, so your compliance trail remains intact.
Validator Behavior
- ·Causes invoice rejection
- ·Error returned: PEPPOL-EN16931-R048
- ·Specification: EN 16931
Before / After
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="H87">3</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">29.99</cbc:LineExtensionAmount>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine><cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="H87">3</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">30.00</cbc:LineExtensionAmount>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>Technical Reference
Seeing this in production? The API handles PEPPOL-EN16931-R048 automatically. See the fix response →
Frequently Asked Questions
The Schematron uses ±0.01 against a value rounded to two decimal places. Differences greater than one cent fail; differences within one cent pass.
Almost always because rounding happens at the wrong step. EN 16931 expects round-after-multiply. Computing the unit price by dividing line subtotal by quantity at high precision and then rounding does not produce the same result.
When BT-149 is present and not 1, the line net is BT-129 * BT-146 / BT-149 (plus charges, minus allowances). A typical case is a price quoted per 100kg with a quantity of 1.5 — the base must be honoured or the calculation diverges by orders of magnitude.
Yes — the recomputed value is deterministic from the line components. Invoice Navigator applies the recomputation and records both before and after values in the evidence pack so the original seller intent is auditable.
Yes — the equivalent rule on Peppol BIS credit notes (PEPPOL-EN16931-R048 with the credit note context) applies the same calculation to cac:CreditNoteLine.
Related Content
Last updated: 5 May 2026
Validate your invoice
Drop your XML here to check for PEPPOL-EN16931-R048
Auto-fix PEPPOL-EN16931-R048 in seconds
Upload your invoice and we fix this error automatically. Financial fields are never touched.