On this page
The short answer
UBL-SR-48 fails for each line whose cac:Item does not contain exactly one cac:ClassifiedTaxCategory. In the recorded example the item carries the same Standard rated category twice. Remove the extra block, so that one category with its code, rate and VAT tax scheme remains.
A line with no category at all fails this rule too, alongside BR-CO-04. The fix is then the opposite: add the category the line was taxed in.
What the rule checks
The rule runs on every cac:InvoiceLine and cac:CreditNoteLine and counts the cac:ClassifiedTaxCategory children of its item. The count must be exactly 1, and the finding is located at the line.
Every category is counted, whatever it says. When tried, a second category identical to the first, a second Standard rated one at 5 percent, and one under a tax scheme other than VAT each reported this rule and nothing else.
The VAT breakdown rules notice only some second categories. When tried, a Zero rated second category also brought BR-Z-01, and an Exempt one BR-E-01, because each introduced a category with no matching VAT breakdown.
When tried, removing the only category from the line reported this rule with BR-CO-04, BR-S-01 and BR-S-08.
| Term | Meaning | UBL element |
|---|---|---|
| BG-30 | Line VAT information | cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory (cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory in a credit note) |
| BT-151 | Invoiced item VAT category code | cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The item master holds several tax codes, such as VAT and a local levy, and the export writes one
cac:ClassifiedTaxCategoryfor each. - The category is written once from the product and again from the tax calculation, duplicating the block.
- A line that mixes items taxed at different rates is exported as one line carrying the categories of both.
How to fix it
- Use the finding location to see which line is affected.
- Keep one
cac:ClassifiedTaxCategoryin its item: the VAT category and rate the line was actually taxed at, under theVATtax scheme. - If the line really covers items taxed differently, split it into one line per category, so that each falls into its own VAT breakdown.
- Leave other taxes out of the item category. They are not line VAT information; if one has to appear on the line, show it as a line charge.
Validate your corrected invoice
Before and after
These are fragments, not complete documents. The complete synthetic documents they come from are linked below.
Fragment of the failing invoice: the Standard rated category appears twice in the item
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<!-- quantity and line net amount omitted from this fragment -->
<cac:Item>
<cbc:Name>Example service</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>20</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>20</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- price omitted from this fragment -->
</cac:InvoiceLine>Fragment of the corrected invoice: one Standard rated category at 20 percent
<cac:Item>
<cbc:Name>Example service</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>20</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>The failing invoice repeats the Standard rated cac:ClassifiedTaxCategory of its only line; the corrected invoice has it once. The duplicate is identical, so the VAT breakdown, the line net amount and every total still agree, and UBL-SR-48 is the only finding, located at cac:InvoiceLine[1].
What the validator reported
- The failing invoice reports UBL-SR-48. The corrected document passes every layer with no findings.Download the failing XMLDownload the corrected XML
Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.
Where it applies
- Applies to
InvoiceandCreditNote. When tried, a credit note line with the duplicated category reported this rule atcac:CreditNoteLine[1]. - Reported by the EN 16931 layer; the Peppol layer passed the recorded failing invoice.
- Document-level allowances and charges carry their category in
cac:TaxCategory, notcac:ClassifiedTaxCategory, and are not counted here.
Related rules
- BR-CO-04 requires the VAT category code inside the one category this rule allows
- BR-Z-01 is reported too when the extra category is Zero rated and has no breakdown
- BR-CL-18 checks that the category code of the line is a permitted one
- Browse every rule in the reference
- Background: Understanding EN 16931 validation errors
Scope and source
Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.
The official definition of UBL-SR-48 carries the normative wording and test. This page is our explanation of it, not a copy.
Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.

