# BR-25: Give every line an item name

Each invoice or credit note line needs a non-empty `cac:Item/cbc:Name`. It is checked per line, and an item description does not stand in for it.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: Core fields, Lines and prices
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-25/
- Explanation last updated: 2026-09-20

## The short answer

`BR-25` fails for a line whose `cac:Item/cbc:Name` is missing or empty. Put a short name for what was sold on every line.

The finding location points at the offending line, for example `cac:InvoiceLine[2]`, and there is one finding for each line that lacks a name.

## What the rule checks

The rule runs once for every `cac:InvoiceLine` or `cac:CreditNoteLine` and fails when the `cbc:Name` directly inside that line's `cac:Item` is absent or contains only whitespace. Two unnamed lines in one document give two findings.

`cbc:Description` is not an alternative. A line whose item has a description and no name still fails.

Missing versus empty: `cac:Item` itself is mandatory in the UBL schema, and a line without it is rejected by the XSD layer before any business rule runs. The `cbc:Name` inside it is optional in the schema, so a line that has an item without a name passes the XSD and reports `BR-25` alone. With the name present but empty, as in the recorded example, `PEPPOL-EN16931-R008` is reported too.

Nothing is checked about the text except that there is some. A name of `-` passes.

| Term | Meaning | UBL element |
|---|---|---|
| BT-153 | Item name | `cac:InvoiceLine/cac:Item/cbc:Name` |
| BG-25 | Invoice line | `cac:InvoiceLine` |

## How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

- Free-text lines such as carriage, a fee or a manual adjustment have an amount and no product behind them, so there is no product name to copy.
- The product was deleted or renamed after the sale and the name is looked up live rather than stored on the invoice line.
- The source system keeps a single long text per line and the mapping sends it to `cbc:Description`, leaving `cbc:Name` out.
- Names are translated per customer language and the translation for this language is blank.

## How to fix it

1. Use the finding location to identify which lines fail.
2. For product lines, map the product name as stored on the invoice line at the time of sale to `cac:Item/cbc:Name`.
3. For lines with no product, write a short label of what the line is for. If the source has only one long text, put a sensible short form in `cbc:Name` and keep the full text in `cbc:Description`.
4. In the XML, `cbc:Description` comes before `cbc:Name` inside `cac:Item`. Keep that order when adding the element, or the XSD layer will reject the line.

## Before and after

These are fragments, not complete documents. The complete synthetic documents they come from are linked below.

Line of the failing invoice: the item has an empty name

```xml
<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <cac:Item>
    <cbc:Name></cbc:Name>
    <!-- tax category omitted from this fragment -->
  </cac:Item>
  <!-- price omitted from this fragment -->
</cac:InvoiceLine>
```

Line of the corrected invoice: the item is named

```xml
<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <cac:Item>
    <cbc:Name>Example service</cbc:Name>
    <!-- tax category omitted from this fragment -->
  </cac:Item>
  <!-- price omitted from this fragment -->
</cac:InvoiceLine>
```

Only `cac:Item/cbc:Name` on line 1 differs: empty in the failing invoice, `Example service` in the corrected one. The failing document also reports `PEPPOL-EN16931-R008`, located at the same `cbc:Name`, because Peppol rejects elements that carry no content. Writing the name clears both.

### What the validator reported

- The failing invoice reports **BR-25** and [PEPPOL-EN16931-R008](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R008.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-25-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/invoice-minimal.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 `cac:InvoiceLine` in a UBL `Invoice` and to `cac:CreditNoteLine` in a `CreditNote`. The `cac:Item` structure is the same in both, and a credit note line with an empty or missing name behaves exactly as described above.
- The rule is about the line item only. Names elsewhere in the document, such as party or contact names, use the same `cbc:Name` element and are not read by it.

## Related rules

- [PEPPOL-EN16931-R008 is reported at the same element when the name is present but empty](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R008.md)
- [BR-27 checks the item net price on the same line](https://ironfang.uk/docs/finance/rules/BR-27.md)
- [BR-CL-23 checks the unit code of the line quantity](https://ironfang.uk/docs/finance/rules/BR-CL-23.md)
- [PEPPOL-EN16931-R120 checks the line net amount against quantity and price](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R120.md)

## 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-24.1: source checked 2026-09-24, explanation last updated 2026-09-20.

[The official definition of BR-25](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-25/) 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.

## Links

- [This rule as a web page](https://ironfang.uk/docs/finance/rules/BR-25)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
