BR-DE-18: Cash discount (Skonto) in BT-20 badly formatted
Cash discounts go into the payment terms in a fixed syntax: #SKONTO#TAGE=14#PROZENT=2.00#.
Fact sheet
- Rule
BR-DE-18- Severity
- Error – the invoice is invalid
- Rule set
- XRechnung 3.0 (KoSIT)
- Affected fields
- BT-20
- Syntax
- CII & UBL
Check your invoice now
Upload a PDF or XML – free, without sign-up, against the official rule sets.
Open the online validatorOfficial wording
[BR-DE-18] … 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. …
Source: official KoSIT Schematron for XRechnung 3.0.
What the rule requires
XRechnung has no dedicated field for cash discounts (German: Skonto). To keep them machine-readable, they go into the payment terms (BT-20) in a fixed syntax – with German keywords:
#SKONTO#TAGE=14#PROZENT=2.00#
- Each discount line starts and ends with
#; the segments areSKONTO,TAGE=(days) andPROZENT=(percent) – in capitals. - Percentages always with a dot and exactly two decimals:
2.00, not2or2,00. - If the discount applies to part of the amount only, add
#BASISBETRAG=300.00#(base amount). - The last discount line must be followed by a line feed. Several tiers go on separate lines.
- No spaces inside the entry. Free text is allowed, but only on separate lines that do not start with
#.
Common causes
- A comma instead of a dot (
PROZENT=2,00) or missing decimals (PROZENT=2) – often from formatting with a German culture. - The trailing line feed is missing because the software trims the text.
- Lower case or spaces, e.g.
#Skonto#or#SKONTO# TAGE=14. - Discount and free text on the same line.
Plain free text such as “2 % discount if paid within 14 days” does not trigger BR-DE-18, but the recipient cannot process it automatically.
What it looks like in XML
<ram:SpecifiedTradePaymentTerms>
<ram:Description>#SKONTO#TAGE=14#PROZENT=2,00#</ram:Description>
</ram:SpecifiedTradePaymentTerms>
<ram:SpecifiedTradePaymentTerms>
<ram:Description>#SKONTO#TAGE=14#PROZENT=2.00#
Payable within 30 days without deduction.</ram:Description>
<ram:DueDateDateTime>
<udt:DateTimeString format="102">20261120</udt:DateTimeString>
</ram:DueDateDateTime>
</ram:SpecifiedTradePaymentTerms>
In UBL the same text goes into cac:PaymentTerms/cbc:Note.
Fix in C#
In the Facturexa Creator you pass the payment terms text as is. Format
percentages with CultureInfo.InvariantCulture and the format "0.00", not with the
culture of the machine.
// Every discount line ends with a line feed, including the last one.
invoice.AddSpecifiedTradePaymentTerms(
"#SKONTO#TAGE=7#PROZENT=3.00#\n" +
"#SKONTO#TAGE=14#PROZENT=2.00#\n" +
"Payable within 30 days without deduction.",
dueDate: invoice.InvoiceDate.Value.AddDays(30));