errorcalculationEN 16931

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.

Severity
Fatal
Rule set
EN 16931
Country
All EU
Fix type
AUTO-FIX
Confidence
95%

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

Failing XML
<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>
Corrected XML
<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

SpecEN 16931

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

Share this guide:

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.