Account
English

BR-DE-18: Cash discount (Skonto) lines in payment terms are malformed

XRechnung rule · Error · UBL / CII

StandardXRechnung 3.0.2 (KoSIT, German CIUS of EN 16931)SeverityError: the invoice is rejectedSyntaxUBL, CIIBusiness terms
  • BT-20 Payment terms
  • BT-115 Amount due for payment
Applies toXRechnung in UBL or CII syntax, including ZUGFeRD / Factur-X PDFs with the XRECHNUNG profile. Invoices to German public authorities (federal, state and municipal) must pass it.

Official rule text

[BR-DE-18] Cash discount (Skonto) lines in … must match this regular expression: … . The information on the granting of a cash discount must be transmitted in the element "Payment terms" (BT-20) as follows: the first segment must state "SKONTO", the second "TAGE=n", the third "PROZENT=n". Percentages must be given without a sign and with two decimal places separated by a point. If the amount to be calculated is not based on BT-115, "Amount due for payment", but only on a part of the amount due of the invoice, the base value for calculating the cash discount must be given as a fourth segment "BASISBETRAG=n" in accordance with the semantic data type Amount. Each entry begins with a #, the segments are separated by a # and a line ends with a #. A complete cash discount statement must be followed by an XML-conformant line break. All information on the granting of a cash discount must be given in upper case. Additional whitespace (spaces, tabs or line breaks) is not permitted. Characters or text other than those specified above are not permitted.

Official text (German): Skonto Zeilen in … müssen diesem regulärem Ausdruck entsprechen: … . Die Informationen zur Gewährung von Skonto müssen wie folgt im Element "Payment terms" (BT-20) übermittelt werden: Anzugeben ist im ersten Segment "SKONTO", im zweiten "TAGE=n", im dritten "PROZENT=n". Prozentzahlen sind ohne Vorzeichen sowie mit Punkt getrennt von zwei Nachkommastellen anzugeben. Liegt dem zu berechnenden Betrag nicht BT-115, "fälliger Betrag" zugrunde, sondern nur ein Teil des fälligen Betrags der Rechnung, ist der Grundwert zur Berechnung von Skonto als viertes Segment "BASISBETRAG=n" gemäß dem semantischen Datentypen Amount anzugeben. Jeder Eintrag beginnt mit einer #, die Segmente sind mit einer # getrennt und eine Zeile schließt mit einer # ab. Am Ende einer vollständigen Skontoangabe muss ein XML-konformer Zeilenumbruch folgen. Alle Angaben zur Gewährung von Skonto müssen in Großbuchstaben gemacht werden. Zusätzliches Whitespace (Leerzeichen, Tabulatoren oder Zeilenumbrüche) ist nicht zulässig. Andere Zeichen oder Texte als in den oberen Vorgaben genannt sind nicht zulässig.

Why this error occurs

XRechnung defines a machine-readable format for cash discount terms inside the payment terms text (BT-20): each discount is one line of the form #SKONTO#TAGE=n#PROZENT=n.nn# with an optional fourth segment #BASISBETRAG=n.nn#, terminated by a line break. The rule tokenises cac:PaymentTerms/cbc:Note (UBL) or ram:SpecifiedTradePaymentTerms/ram:Description (CII) by line, checks every line starting with # against the official regular expression, and requires a line break after the last complete Skonto entry. It fires on lowercase, missing decimals (PROZENT=2), comma decimals, spaces around the = sign, or a missing final line break; it is commonly produced by hand-written terms or templates that print Skonto in prose starting with #.

How to fix it

Write each discount on its own line exactly as #SKONTO#TAGE=14#PROZENT=2.00# followed by a newline (CRLF is accepted); add #BASISBETRAG=1000.00# as fourth segment only if the discount applies to part of the amount due. Use upper case, a point with exactly two decimals for the percentage, no spaces or tabs, and nothing else on those lines. Free-text terms are allowed in the same note on lines that do not start with #. Ensure the note ends with a line break after the last Skonto line, not with the closing tag directly.

Example (valid)

<cac:PaymentTerms>
  <cbc:Note>Zahlbar innerhalb von 30 Tagen.
#SKONTO#TAGE=14#PROZENT=2.00#
#SKONTO#TAGE=7#PROZENT=3.00#
</cbc:Note>
</cac:PaymentTerms>

What the validator checks

Checked element (context):

UBL

/ubl:Invoice | /cn:CreditNote

Test (XPath):

every $line in             cac:PaymentTerms/cbc:Note[1]/tokenize(. , '(\r?\n)')[starts-with( normalize-space(.) , '#')]              satisfies matches ( normalize-space ($line), $XR-SKONTO-REGEX)                                  and                                 matches( cac:PaymentTerms/cbc:Note[1]/tokenize(. ,  '#.+#')[last()], '^\s*\n' )

CII

/rsm:CrossIndustryInvoice

Test (XPath):

every $line                        in rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:Description[1]/tokenize(. , '(\r?\n)')[starts-with( normalize-space(.) , '#')]                        satisfies matches ( normalize-space ($line), $XR-SKONTO-REGEX ) and                     matches( rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:Description[1]/tokenize(. ,  '#.+#')[last()], '^\s*\n' )

Check your invoice

Drop your XML or PDF on the validator and every failed rule is linked to its page here. Free, no account, the file is not stored.

Check your invoice →

Same check via API:

curl -F file=@invoice.xml https://einvoicechecker.com/v1/validate

Related rules

Frequently asked questions

What does BR-DE-18 mean?

BR-DE-18 is a xrechnung rule: Cash discount (Skonto) lines in … must match this regular expression: … . The information on the granting of a cash discount must be transmitted in the element "Payment terms" (BT-20) as follows: the first segment must state "SKONTO", the second "TAGE=n", the third "PROZENT=n". Percentages must be given without a sign and with two decimal places separated by a point. If the amount to be calculated is not based on BT-115, "Amount due for payment", but only on a part of the amount due of the invoice, the base value for calculating the cash discount must be given as a fourth segment "BASISBETRAG=n" in accordance with the semantic data type Amount. Each entry begins with a #, the segments are separated by a # and a line ends with a #. A complete cash discount statement must be followed by an XML-conformant line break. All information on the granting of a cash discount must be given in upper case. Additional whitespace (spaces, tabs or line breaks) is not permitted. Characters or text other than those specified above are not permitted.

Will my invoice be rejected because of BR-DE-18?

Yes. BR-DE-18 is flagged "fatal"; validators (KoSIT, Peppol access points, the German ZRE/OZG-RE portals) reject the invoice until it is fixed.

Which formats does BR-DE-18 apply to?

XRechnung in UBL or CII syntax, including ZUGFeRD / Factur-X PDFs with the XRECHNUNG profile. Invoices to German public authorities (federal, state and municipal) must pass it. Syntax: UBL and CII.

Source: XRechnung 3.0.2, schematron 2.6.0 (KoSIT, September 2026). Catalogue generated from the official schematron on 2026-10-14.