Attestwire › Rule reference › PEPPOL-EN16931-R002
PEPPOL-EN16931-R002 Peppol's CII binding allows no subject code on the document note
noun · Peppol BIS · warning · BT-21
For a sample invoice, the library reports: The document note subject code (BT-21) is "AAI", and Peppol's CII binding forbids it.
- Business term
BT-21- Severity
warning
The fix
Remove noteSubjectCode if you intend to send CII over Peppol, and fold whatever it qualified into the note text itself — the code is a UNTDID 4451 subject qualifier, and Peppol takes the view that a free-text note on a Peppol invoice needs no machine-readable subject. Keep it if you are generating UBL, which is Peppol's mandatory syntax and where the code is carried losslessly.
A passing value
"note": "Delivery in two parts, the second on 2026-09-01."What the library returns
The full error returned by @attestwire/en16931. It includes the rule ID,
affected field and suggested correction. Developers can use this object in their application:
{
"rule": "PEPPOL-EN16931-R002",
"field": "BT-21",
"severity": "warning",
"message": "The document note subject code (BT-21) is \"AAI\", and Peppol's CII binding forbids it. The rule is titled \"No more than one note is allowed on document level\", which is not what its second half does: the test is count(ram:IncludedNote) <= 1 and not(ram:IncludedNote/ram:SubjectCode), so a document carrying exactly one note still fails if that note has a subject code. This is a warning rather than an error because it depends on the syntax you emit, which \"peppol-bis-3\" does not state. generateXRechnungUBL is unaffected — UBL has no element for BT-21, so its binding folds the code into the note text as \"#AAI#…\" and Peppol's UBL R002 tests only the note count. generateCii omits the element under this profile, so BT-21 will be absent from the CII document you get back. This is a Peppol BIS Billing 3.0 profile rule: it applies because profile is \"peppol-bis-3\". It does not apply to the en16931, xrechnung-ubl or xrechnung-cii profiles, whose validators will accept the same document.",
"fix": "Remove noteSubjectCode if you intend to send CII over Peppol, and fold whatever it qualified into the note text itself — the code is a UNTDID 4451 subject qualifier, and Peppol takes the view that a free-text note on a Peppol invoice needs no machine-readable subject. Keep it if you are generating UBL, which is Peppol's mandatory syntax and where the code is carried losslessly.",
"example": "\"note\": \"Delivery in two parts, the second on 2026-09-01.\"",
"xpath": "/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IncludedNote/ram:SubjectCode",
"docsUrl": "https://attestwire.com/rules/PEPPOL-EN16931-R002"
}
xpath is always a UBL path. On a CII invoice, look for the
matching CII field instead.