Peppol Error Code 106: How to Fix Schematron Validation Errors

Error code 106 is the most common Peppol rejection. It means your UBL XML invoice failed schematron validation. The document's XML structure is correct, but it violates one or more business rules. The fix depends on which specific rule failed. This guide shows you how to read the error, find the cause, and resolve it.
The error you see
PEPPOL error [code=106]: Schematron validation error. The XML document is not valid according to the schematron.What this error means
When you send a Peppol invoice, your access point validates the UBL XML against three layers of rules. Error code 106 means the document passed XML schema validation (layer 1) but failed at the schematron layer (layers 2 and 3). The schematron checks business logic: tax calculations, code list values, mandatory fields, and cross-field consistency.
The error code 106 alone does not tell you what went wrong. The full error response from your access point includes the specific rule code that failed. That rule code is the key to fixing the problem.
Step 1: Find the specific rule code
The error response from your access point includes the schematron rule that failed. Look for a rule code in the response. It follows one of these patterns:
BR-xxEN16931 business rules. Example: BR-27 (item net price shall not be negative).BR-CO-xxCalculation rules. Example: BR-CO-13 (invoice total with VAT calculation).BR-CL-xxCode list rules. Example: BR-CL-25 (endpoint identifier scheme must be in CEF EAS list).PEPPOL-EN16931-RxxxPeppol-specific rules. Example: PEPPOL-EN16931-R004 (tax amount mismatch).BR-DE-xxCountry-specific rules (Germany). Example: BR-DE-15 (buyer reference required).
Step 2: Read the error response
Here is a typical error 106 response. The important part is the id attribute and the flag attribute in the schematron output:
<!-- Example schematron validation output -->
<svrl:failed-assert
test="(round(cac:TaxTotal/cbc:TaxAmount * 10 * 10) div 100)
= (round(sum(cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount)
* 10 * 10) div 100)"
location="/Invoice"
flag="fatal"
id="PEPPOL-EN16931-R004">
<svrl:text>
[PEPPOL-EN16931-R004] - Tax Amount must equal
the sum of tax subtotal amounts.
</svrl:text>
</svrl:failed-assert>From this response, you can extract:
- Rule ID: PEPPOL-EN16931-R004
- Severity: fatal (the invoice is rejected)
- Location: /Invoice (document-level error)
- Description: Tax Amount must equal the sum of tax subtotal amounts
Step 3: Fix the specific rule violation
Once you know the rule code, you can find the exact fix. Here are the most common rule violations that trigger error 106:
| Rule | Error | Fix |
|---|---|---|
| PEPPOL-EN16931-R004 | Tax amount mismatch | Recalculate tax with correct rounding |
| BR-27 | Negative item net price | Use positive amounts on credit notes |
| EN16931-R008 | Empty elements | Remove empty XML elements |
| BR-CL-25 | Invalid endpoint scheme | Use correct CEF EAS scheme ID |
| BR-CO-13 | Total with VAT mismatch | Verify: total with VAT = total without VAT + VAT amount - prepaid |
| BR-DE-15 | Missing buyer reference (DE) | Add BuyerReference element with Leitweg-ID or order reference |
Step 4: Validate before re-sending
After fixing the issue, validate your corrected XML before sending it again. Do not just re-send and hope. Use the e-invoice.be Peppol Validator to check all rules offline. You can also validate via the API:
curl -X POST https://api.e-invoice.be/validate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/xml" \
-d @invoice.xmlThe validator returns a detailed report showing which rules passed and which failed, with the exact XPath location of each error. Fix all failures before sending to the Peppol network.
Common scenarios that trigger error 106
Tax rounding issues
You calculate VAT per line item and sum the results, but the total differs from calculating VAT on the total. Peppol requires specific rounding rules with a €0.02 tolerance per tax category. See the PEPPOL-EN16931-R004 fix guide.
Credit notes with negative amounts
Your accounting software generates credit notes (type 381) with negative line amounts. Peppol requires positive amounts on credit notes. The document type carries the credit semantics. See the credit note amounts guide.
Empty optional fields
Your XML generator includes elements with empty values for optional fields. Peppol requires that if an element is present, it must contain a value. Either populate the field or remove the element entirely.
Wrong country-specific codes
You use the wrong endpoint identifier scheme for the recipient's country (e.g., sending 9925 instead of 0208 for a Belgian company) or miss a country-specific required field (like BuyerReference for Germany).
Skip the validation headaches
With e-invoice.be, send your invoices as PDF via email or JSON via API. We handle UBL generation, validation, and Peppol delivery. If something would fail validation, we flag it before it reaches the network.
Frequently asked questions
What does Peppol error code 106 mean?
Peppol error code 106 means your XML document failed schematron validation. The document structure is valid XML, but it violates one or more business rules defined in the Peppol BIS Billing 3.0 schematron files. The error response from your access point includes the specific rule code (like BR-27 or PEPPOL-EN16931-R004) that failed.
How do I fix a schematron validation error in Peppol?
First, identify the specific rule that failed from the error response. The rule code (e.g., BR-27, PEPPOL-EN16931-R004) tells you exactly what is wrong. Then fix the specific issue in your UBL XML: it could be a calculation mismatch, a missing field, an invalid code, or a structural problem. Use the e-invoice.be Peppol Validator to test your fix before sending again.
What is schematron validation in Peppol?
Schematron is a rule-based validation language used in Peppol to check business rules that XML schema alone cannot enforce. While XML schema checks structure (correct elements, data types), schematron checks semantics: do the tax amounts add up? Are the required codes from the right code list? Is the document internally consistent? Peppol BIS Billing 3.0 defines hundreds of schematron rules.
Why does my Peppol invoice pass XML validation but fail schematron?
XML schema validation and schematron validation check different things. XML schema validates structure: elements are in the right order, data types are correct, required fields are present. Schematron validates business logic: calculations are correct, code values are from approved lists, cross-field dependencies are met. A document can be perfectly valid XML but still violate business rules.
Where can I find the Peppol schematron rules?
The official Peppol BIS Billing 3.0 schematron files are published on the OpenPeppol GitHub repository and documented at docs.peppol.eu. The rules are organized in two layers: CEN rules (from EN16931) and Peppol-specific rules. You can also use the e-invoice.be Peppol Validator which includes all current rules and explains failures in plain language.
What are the most common causes of error code 106?
The most common causes are: tax calculation rounding errors (PEPPOL-EN16931-R004), negative amounts on credit notes (BR-27), empty XML elements (EN16931-R008), invalid endpoint identifier schemes (BR-CL-25), missing mandatory fields like buyer reference for German recipients (BR-DE-15), and incorrect unit codes (BR-CL-23).