Zuschläge und Rabatte

AllowanceCharge in UBL-Rechnungen: der Unterschied zwischen Dokument- und Positionsebene, MwSt.-Berechnung und XML-Beispiele.

Fast jede Organisation arbeitet mit Rabatten oder Zuschlägen auf Rechnungen. Ein Mengenrabatt, Transportkosten, ein Frühbucherrabatt, Umweltabgaben: Das sind alles Beträge, die die endgültige Rechnungssumme beeinflussen. In einer UBL-Rechnung werden sie über das AllowanceCharge-Element erfasst, und das kann auf zwei Ebenen geschehen. Der Unterschied zwischen diesen Ebenen ist entscheidend, damit die Rechnungsberechnung korrekt bleibt.

Zwei Ebenen: Dokument und Position

UBL kennt Zuschläge und Rabatte an zwei Stellen:

Dokumentebene: Das AllowanceCharge-Element steht direkt unter dem Root-Element der Rechnung, vor den MwSt.-Summen. Dokumentrabatte verringern den Gesamtrechnungsbetrag. Dokumentzuschläge erhöhen ihn. Sie werden in die MwSt.-Berechnung einbezogen.

Positionsebene: Das AllowanceCharge-Element steht innerhalb einer InvoiceLine. Positionsrabatte und -zuschläge sind bereits im LineExtensionAmount dieser Position verarbeitet. Sie beeinflussen den Positionspreis, nicht die Rechnungssumme als solche.

Der Unterschied ist subtil, aber wichtig. Ein Rabatt auf Dokumentebene ist separat in den Rechnungssummen sichtbar (im AllowanceTotalAmount). Ein Rabatt auf Positionsebene ist im Positionsbetrag verarbeitet und daher in den Summen unsichtbar.

AllowanceCharge auf Dokumentebene

Jeder Dokumentrabatt oder -zuschlag enthält mindestens diese Elemente:

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Mengenrabatt Q1 2026</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">150.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>21.00</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>

Der ChargeIndicator bestimmt, ob es sich um einen Zuschlag (true) oder einen Rabatt (false) handelt. Der AllowanceChargeReasonCode ist ein Code aus der UNCL5189-Liste (für Rabatte) oder UNCL7161 (für Zuschläge). Häufig verwendete Codes sind:

CodeTypBedeutung41RabattBonus für vorzeitige Zahlung42RabattEinführungsrabatt60RabattHerstellerrabatt95RabattRabatt100RabattSondervereinbarungABLZuschlagVerpackungskostenFCZuschlagFrachtkostenAEWZuschlagUmweltzuschlag

Tipp: Wenn keiner der Standardcodes genau passt, verwenden Sie Code 95 (Rabatt) oder den relevantesten Zuschlagscode und beschreiben Sie den Grund im AllowanceChargeReason.

Auswirkung auf Rechnungssummen

Dokumentrabatte und -zuschläge erscheinen in der LegalMonetaryTotal:

<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
  <cbc:AllowanceTotalAmount currencyID="EUR">150.00</cbc:AllowanceTotalAmount>
  <cbc:TaxExclusiveAmount currencyID="EUR">850.00</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="EUR">1028.50</cbc:TaxInclusiveAmount>
  <cbc:PayableAmount currencyID="EUR">1028.50</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Die Berechnung: 1.000 (Positionssumme) minus 150 (Rabatt) = 850 netto. Plus 178,50 MwSt. (21 % von 850) = 1.028,50 brutto.

AllowanceCharge auf Positionsebene

Auf Positionsebene funktioniert es anders. Der Rabatt oder Zuschlag ist bereits im LineExtensionAmount verarbeitet. Das AllowanceCharge-Element auf der Position dient als Erläuterung:

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="EA">100</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="EUR">850.00</cbc:LineExtensionAmount>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
    <cbc:AllowanceChargeReason>Staffelrabatt</cbc:AllowanceChargeReason>
    <cbc:Amount currencyID="EUR">150.00</cbc:Amount>
    <cbc:BaseAmount currencyID="EUR">1000.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
  <cac:Item>
    <cbc:Name>Widget Standard</cbc:Name>
    <cac:ClassifiedTaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>21.00</cbc:Percent>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:ClassifiedTaxCategory>
  </cac:Item>
  <cac:Price>
    <cbc:PriceAmount currencyID="EUR">8.50</cbc:PriceAmount>
  </cac:Price>
</cac:InvoiceLine>

Der LineExtensionAmount beträgt hier 850 Euro: 100 Stück x 10 Euro = 1.000 Euro, minus 150 Euro Staffelrabatt. Der BaseAmount im AllowanceCharge zeigt den ursprünglichen Betrag vor dem Rabatt. Der PriceAmount (8,50) ist der effektive Stückpreis nach Rabatt.

Achtung: Der LineExtensionAmount muss immer der Nettobetrag nach Rabatt/Zuschlag sein. Das AllowanceCharge auf der Position ist informativ. Ziehen Sie es nicht erneut vom Positionsbetrag ab, denn dann stimmt die Rechnung nicht mehr.

MwSt.-Berechnung bei mehreren Rabatten

Wenn eine Rechnung sowohl Positionsrabatte als auch Dokumentrabatte enthält, werden die MwSt.-Bemessungsgrundlagen wie folgt berechnet:

  1. Pro Rechnungsposition: der LineExtensionAmount (bereits inklusive Positionsrabatte)
  2. Pro MwSt.-Kategorie: Summe aller Positionsbeträge in dieser Kategorie
  3. Minus Dokumentrabatte in derselben Kategorie
  4. Plus Dokumentzuschläge in derselben Kategorie
  5. Das Ergebnis ist der TaxableAmount im TaxSubtotal

Die MwSt. wird auf diese Netto-Bemessungsgrundlage berechnet. Deshalb ist es unerlässlich, dass jeder Dokumentrabatt und -zuschlag eine MwSt.-Kategorie enthält: Das System muss wissen, zu welchem Steuersatz der Rabatt gehört.

Anteilige Verteilung bei mehreren MwSt.-Sätzen

Wenn ein AllowanceCharge auf Dokumentebene für eine Rechnung mit Positionen in verschiedenen MwSt.-Sätzen gilt (z. B. 9 % und 21 %), muss der Rabatt- oder Zuschlagsbetrag anteilig auf die MwSt.-Kategorien verteilt werden. Das bedeutet: proportional zum Anteil jeder Kategorie an der Gesamtsumme der steuerpflichtigen Beträge.

Wenn eine Rechnung beispielsweise 2.000 Euro an Positionen mit 21 % MwSt. und 1.000 Euro an Positionen mit 9 % MwSt. enthält, muss ein Dokumentrabatt von 300 Euro als zwei separate AllowanceCharge-Elemente aufgenommen werden: 200 Euro bei 21 % (zwei Drittel) und 100 Euro bei 9 % (ein Drittel). Die MwSt.-Bemessungsgrundlage pro Kategorie wird dann korrekt berechnet.

AllowanceCharge auf Preisebene

Neben Dokument- und Positionsebene kennt UBL eine dritte Stelle für Rabatte: innerhalb des Price-Elements einer Rechnungsposition. Dieser Mechanismus zeigt den Unterschied zwischen dem Bruttopreis und dem Nettoeinheitspreis.

<cac:Price>
  <cbc:PriceAmount currencyID="EUR">8.50</cbc:PriceAmount>
  <cbc:BaseQuantity unitCode="EA">1</cbc:BaseQuantity>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="EUR">1.50</cbc:Amount>
    <cbc:BaseAmount currencyID="EUR">10.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>

In diesem Beispiel ist der Bruttopreis (BaseAmount) 10,00 Euro. Nach Abzug von 1,50 Euro Rabatt verbleibt der Nettoeinheitspreis (PriceAmount) von 8,50 Euro.

Auf Preisebene ist ausschließlich ChargeIndicator=false (Rabatt) zulässig. Zuschläge (ChargeIndicator=true) sind hier nicht erlaubt. Außerdem gilt Validierungsregel BR-28: Der Bruttopreis (BaseAmount) darf nicht negativ sein. Wenn Sie einen Zuschlag auf den Einheitspreis anwenden möchten, verarbeiten Sie diesen als AllowanceCharge auf Positionsebene oder nehmen Sie den erhöhten Preis direkt als PriceAmount auf.

Rabatt höher als der Artikelpreis

Ein Sonderfall tritt ein, wenn ein Positionsrabatt (AllowanceCharge auf Positionsebene) den Artikelpreis übersteigt. Peppol-Validierungsregel R120 prüft, ob LineExtensionAmount = (Quantity × PriceAmount ÷ BaseQuantity) + Zuschläge − Rabatte. R120 verbietet nicht explizit negative Beträge; die Validierung schlägt fehl, wenn diese Berechnung nicht aufgeht. Bei einem Rabatt, der höher ist als der Preis, ist die Wahrscheinlichkeit groß, dass die Berechnung nicht stimmt.

Dieses Szenario kommt in der Praxis bei Gutschriften mit hohen Rabatten vor. Die Lösung: Verwenden Sie den Netto-Gutschriftsbetrag (die Differenz zwischen Preis und Rabatt) direkt als PriceAmount und lassen Sie das AllowanceCharge-Element auf der Position weg. Den ursprünglichen Preis und den gewährten Rabatt können Sie als Referenz im Item/Name-Feld oder in einem Note-Element auf der Rechnungsposition festhalten.

Achtung: Dieser Workaround ist für Situationen gedacht, in denen der Rabatt den Preis übersteigt. Bei regulären Rabatten, die unter dem Preis bleiben, verwenden Sie ganz normal das AllowanceCharge-Element auf der Position.

Kombination mit Skonto

Skonto ist etwas völlig anderes als ein Rechnungsrabatt. Ein Rechnungsrabatt über AllowanceCharge ist unbedingt und reduziert direkt den Rechnungsbetrag. Skonto ist bedingt (abhängig von der Zahlungsfrist) und wird nicht im Rechnungsbetrag verarbeitet. Weitere Details finden Sie im Artikel über Skonto.

Tipp: Wenn Sie sich nicht sicher sind, ob Ihr AllowanceCharge korrekt aufgenommen ist, schicken Sie die Rechnung durch den kostenlosen eConnect Validator. Dieser prüft, ob die MwSt.-Bemessungsgrundlagen nach Abzug von Rabatten und Zuschlägen korrekt berechnet werden.


Rechnung validieren

Verwandt