Rule BR-21
Each invoice line must have an identifier
Every line carries an identifier that distinguishes it from the other lines on the same invoice.
Business term BT-126, Invoice line identifier. Source: EN 16931. Our wording, not the normative text, which is published in the Peppol BIS Billing 3.0 rule list and was checked against it on 2026-08-16.
Why it fires on invoices that look fine
Almost nobody hits this rule because they forgot the field exists. They hit it because something between their system and the document dropped it, changed its shape, or filled it with a value that is right somewhere else. These are the causes worth checking first.
- Lines are ordered but not numbered, because the source system relies on array position and the export never materialises it.
- Every line was given the same identifier, often "1" or the invoice number, which satisfies presence but not distinctness.
- Lines were merged from several sources and their identifiers collided.
What to change
- Number the lines 1, 2, 3 in document order. There is no requirement for the identifier to mean anything beyond being unique within the invoice.
- Generate the identifier at export time from the position, rather than trusting an upstream key that may repeat.
The validator runs in your browser. Nothing is uploaded, and you can confirm that yourself with the network panel open.
Rules you are likely to hit next
A document that breaks BR-21 usually breaks one of these too, because the same mapping gap tends to affect neighbouring fields.
Questions people actually ask
- What does BR-21 mean?
- Every line carries an identifier that distinguishes it from the other lines on the same invoice.
- Which field does BR-21 apply to?
- BT-126, Invoice line identifier. That is the name the semantic model uses, which is what you search for in your own system's mapping when the identifier alone does not tell you which field to look at.
- Does our validator check BR-21?
- Yes. Paste your invoice data into the free validator and it reports this rule with the value it actually saw, without the document leaving your browser.