BT-20Payment termsBT-115Amount due for payment
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:CreditNoteTest (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:CrossIndustryInvoiceTest (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.
Same check via API:
curl -F file=@invoice.xml https://einvoicechecker.com/v1/validateRelated rules
BR-DEX-09Amount due for payment = Invoice total amount with VAT - Paid amount + Rounding amount…BR-DE-1Payment instructions (BG-16) are missingBR-DE-2Seller contact (BG-6) is missingBR-DE-3Seller city (BT-37) is missingBR-DE-4The element "Seller post code" must be transmittedBR-DE-5Seller contact point (BT-41) is missingBR-DE-6Seller contact telephone number (BT-42) is missingBR-DE-7Seller contact email address (BT-43) is missing
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.