Skip to content

Ironfang Finance - Rule reference

UBL-SR-48: Give each invoice line exactly one classified tax category

The item of an invoice line has two or more cac:ClassifiedTaxCategory elements, or none. Keep exactly one: the VAT category the line is taxed in.

EN 16931Fatal: the document is invalidVATLines and prices

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.

TermMeaningUBL element
BG-30Line VAT informationcac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory (cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory in a credit note)
BT-151Invoiced item VAT category codecac: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:ClassifiedTaxCategory for 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

  1. Use the finding location to see which line is affected.
  2. Keep one cac:ClassifiedTaxCategory in its item: the VAT category and rate the line was actually taxed at, under the VAT tax scheme.
  3. If the line really covers items taxed differently, split it into one line per category, so that each falls into its own VAT breakdown.
  4. 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

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 Invoice and CreditNote. When tried, a credit note line with the duplicated category reported this rule at cac: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, not cac:ClassifiedTaxCategory, and are not counted here.

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.