Toeslagen en kortingen in een UBL-factuur

AllowanceCharge in UBL-facturen: het verschil tussen factuur- en regelniveau, BTW-berekening en XML-voorbeelden.

Vrijwel elke organisatie werkt met kortingen of toeslagen op facturen. Een volumekorting, transportkosten, een vroegeboekingskorting, milieukosten: het zijn allemaal bedragen die het uiteindelijke factuurtotaal beïnvloeden. In een UBL-factuur worden ze vastgelegd via het AllowanceCharge-element, en dat kan op twee niveaus. Het verschil tussen die niveaus is essentieel om de factuurberekening kloppend te houden.

Twee niveaus: factuur en regel

UBL kent toeslagen en kortingen op twee plaatsen:

Factuurniveau: het AllowanceCharge-element staat direct onder het root-element van de factuur, vóór de BTW-totalen. Factuurkortingen verlagen het totale factuurbedrag. Factuurtoeslagen verhogen het. Ze worden meegenomen in de BTW-berekening.

Regelniveau: het AllowanceCharge-element staat binnen een InvoiceLine. Regelkortingen en -toeslagen zijn al verwerkt in het LineExtensionAmount van die regel. Ze beïnvloeden de regelprijs, niet het factuurtotaal als zodanig.

Het verschil is subtiel maar belangrijk. Een korting op factuurniveau wordt apart zichtbaar in de factuurtotalen (in AllowanceTotalAmount). Een korting op regelniveau is verwerkt in het regelbedrag en dus onzichtbaar in de totalen.

AllowanceCharge op factuurniveau

Elke factuurkorting of -toeslag bevat minimaal deze elementen:

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Volumekorting 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>

De ChargeIndicator bepaalt of het een toeslag (true) of een korting (false) is. De AllowanceChargeReasonCode is een code uit de UNCL5189-lijst (voor kortingen) of UNCL7161 (voor toeslagen). Veelgebruikte codes zijn:

CodeTypeBetekenis41KortingBonus bij werkzaamheden voor schema42KortingOverige bonus60KortingProducentenkorting95KortingKorting100KortingSpeciale kortingABLToeslagVerpakkingskostenFCToeslagVrachtkostenAEWToeslagMilieutoeslag

Tip: als geen van de standaardcodes precies past, gebruik dan code 95 (korting) of de meest relevante toeslagcode, en beschrijf de reden in AllowanceChargeReason.

Effect op factuurtotalen

Factuurkortingen en -toeslagen komen terug in de 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>

De berekening: 1.000 (regeltotaal) minus 150 (korting) = 850 exclusief BTW. Plus 178,50 BTW (21% over 850) = 1.028,50 inclusief BTW.

AllowanceCharge op regelniveau

Op regelniveau werkt het anders. De korting of toeslag is al verwerkt in het LineExtensionAmount. Het AllowanceCharge-element op de regel dient als toelichting:

<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>Staffelkorting</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 standaard</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>

Het LineExtensionAmount is hier 850 euro: 100 stuks x 10 euro = 1.000 euro, minus 150 euro staffelkorting. Het BaseAmount in de AllowanceCharge toont het oorspronkelijke bedrag vóór korting. De PriceAmount (8,50) is de effectieve prijs per stuk na korting.

Let op: het LineExtensionAmount moet altijd het nettobedrag na korting/toeslag zijn. De AllowanceCharge op de regel is informatief. Tel hem niet nogmaals af van het regelbedrag, want dan klopt de factuur niet meer.

BTW-berekening bij meerdere kortingen

Als een factuur zowel regelkortingen als factuurkortingen bevat, worden de BTW-grondslagen als volgt berekend:

  1. Per factuurregel: het LineExtensionAmount (al inclusief regelkortingen)
  2. Per BTW-categorie: som van alle regelbedragen in die categorie
  3. Minus factuurkortingen in diezelfde categorie
  4. Plus factuurtoeslagen in diezelfde categorie
  5. Het resultaat is de TaxableAmount in het TaxSubtotal

De BTW wordt berekend over die netto grondslag. Daarom is het essentieel dat elke factuurkorting en -toeslag een BTW-categorie meekrijgt: het systeem moet weten bij welk tarief de korting hoort.

Pro-rata verdeling bij meerdere BTW-tarieven

Wanneer een document-level AllowanceCharge van toepassing is op een factuur met factuurregels in verschillende BTW-tarieven (bijvoorbeeld 9% en 21%), moet het kortings- of toeslagbedrag pro-rata worden verdeeld over de BTW-categorieën. Dat betekent: evenredig aan het aandeel van elke categorie in het totaal van de belastbare bedragen.

Stel dat een factuur 2.000 euro aan regels met 21% BTW bevat en 1.000 euro aan regels met 9% BTW. Een factuurkorting van 300 euro moet dan als twee afzonderlijke AllowanceCharge-elementen worden opgenomen: 200 euro bij 21% (twee derde) en 100 euro bij 9% (een derde). De BTW-grondslag per categorie wordt vervolgens correct berekend.

AllowanceCharge op prijsniveau

Naast factuur- en regelniveau kent UBL een derde plek voor kortingen: binnen het Price-element van een factuurregel. Dit mechanisme toont het verschil tussen de brutoprijs en de netto eenheidsprijs.

<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 dit voorbeeld is de brutoprijs (BaseAmount) 10,00 euro. Na aftrek van 1,50 euro korting resteert de netto eenheidsprijs (PriceAmount) van 8,50 euro.

Op prijsniveau is uitsluitend ChargeIndicator=false (korting) toegestaan. Toeslagen (ChargeIndicator=true) zijn hier niet mogelijk. Daarnaast geldt validatieregel BR-28: de brutoprijs (BaseAmount) mag niet negatief zijn. Validatieregel BR-27 schrijft hetzelfde voor bij de netto eenheidsprijs (PriceAmount). Als je een toeslag op de eenheidsprijs wilt toepassen, verwerk die dan als AllowanceCharge op regelniveau of neem de verhoogde prijs direct op als PriceAmount.

Korting hoger dan de artikelprijs

Een bijzonder geval doet zich voor wanneer een regelkorting (AllowanceCharge op regelniveau) de artikelprijs overschrijdt. Peppol-validatieregel R120 controleert of LineExtensionAmount = (Quantity × PriceAmount ÷ BaseQuantity) + toeslagen − kortingen. R120 verbiedt niet expliciet negatieve bedragen; de validatie faalt wanneer deze rekensom niet sluitend is. Bij een korting die hoger is dan de prijs is de kans groot dat de berekening niet klopt.

Dit scenario komt in de praktijk voor bij creditnota's met hoge kortingen. De oplossing: gebruik het netto creditbedrag (het verschil tussen prijs en korting) direct als PriceAmount en laat het AllowanceCharge-element op de regel weg. De oorspronkelijke prijs en de toegepaste korting kun je ter referentie vastleggen in het Item/Name-veld of in een Note-element op de factuurregel.

Let op: deze workaround is bedoeld voor situaties waarin de korting de prijs overstijgt. Bij reguliere kortingen die onder de prijs blijven, gebruik je gewoon het AllowanceCharge-element op de regel.

Combineren met betalingskorting

Betalingskorting (skonto) is iets heel anders dan een factuurkorting. Een factuurkorting via AllowanceCharge is onvoorwaardelijk en verlaagt direct het factuurbedrag. Betalingskorting is voorwaardelijk (afhankelijk van de betaaltermijn) en wordt niet in het factuurbedrag verwerkt. Zie het artikel over betalingskorting voor de details.

Tip: als je twijfelt of je AllowanceCharge correct is opgenomen, stuur de factuur dan door de gratis eConnect Validator. Die controleert of de BTW-grondslagen correct worden berekend na aftrek van kortingen en toeslagen.

Veelgestelde vragen
Wat is het verschil tussen een korting op factuurniveau en op regelniveau?

Een korting op factuurniveau wordt apart zichtbaar in de factuurtotalen en verlaagt het factuurbedrag direct. Een korting op regelniveau is al verwerkt in het regelbedrag (LineExtensionAmount) en is informatief; het AllowanceCharge-element op de regel toont de korting maar wordt niet nogmaals afgetrokken.

Wat als mijn regelkorting hoger is dan de artikelprijs?

R120 controleert of de rondrekening klopt en verbiedt niet expliciet negatieve bedragen. Bij een korting hoger dan de prijs is de kans groot dat de berekening niet sluitend is, wat validatiefout PEPPOL-EN16931-R120 triggert. De oplossing: gebruik het netto creditbedrag direct als PriceAmount en laat het AllowanceCharge-element op de regel weg. De oorspronkelijke prijs kun je ter referentie vastleggen in het Item/Name-veld.

Moet elke factuurkorting een BTW-categorie bevatten?

Ja. Elke AllowanceCharge op factuurniveau moet een TaxCategory meekrijgen, zodat het systeem weet bij welk BTW-tarief de korting hoort. Bij facturen met meerdere BTW-tarieven moet de korting pro-rata worden verdeeld over de categorieën.


Valideer je factuur

Gerelateerd