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.
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.
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:
Tip: als geen van de standaardcodes precies past, gebruik dan code 95 (korting) of de meest relevante toeslagcode, en beschrijf de reden in
AllowanceChargeReason.
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.
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
LineExtensionAmountmoet 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.
Als een factuur zowel regelkortingen als factuurkortingen bevat, worden de BTW-grondslagen als volgt berekend:
LineExtensionAmount (al inclusief regelkortingen)TaxableAmount in het TaxSubtotalDe 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.
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.
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.
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.
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.
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.
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.
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