Basis van het GST-factuur datamodel: minimale velden, HSN-afhandeling en benodigde adminschermen om conforme facturen te genereren en reconciliatie te vereenvoudigen.

De meeste problemen met GST-facturen zijn geen “complexe belasting”-kwesties. Het zijn ontbrekende of inconsistente gegevens. Een audit faalt wanneer de factuur niet helder terug te brengen is naar wat er verkocht is, aan wie, waar het geleverd is en hoe de belasting is berekend.
Een veelvoorkomende trigger is dat HSN ontbreekt, verouderd is of op het verkeerde niveau wordt toegepast. Teams slaan soms een HSN op het product op, maar de factuurregel wordt aangemaakt van een andere SKU-naam of variant, waardoor de HSN nooit op het uiteindelijke document terechtkomt. Een ander frequent probleem is de verkeerde belastingverdeling: IGST in rekening brengen terwijl het CGST en SGST had moeten zijn (of andersom) omdat de “plaats van levering” werd gegokt op basis van het afleveradres zonder de gebruikte state codes op te slaan.
Finance-teams voelen dit direct. Reconciliatie wordt een dagelijkse opruimtaak: factuurtotalen kloppen niet met de order, de order komt niet overeen met de betalingsoverzicht van de gateway en terugbetalingen worden een keten van handmatige aantekeningen. Zelfs kleine afrondingsverschillen over regellijsten kunnen mismatches veroorzaken tussen de factuur-PDF, GST-rapporten en het grootboek.
Dit zijn de patronen die de meeste pijn bij mismatches veroorzaken:
Het doel van een GST-factuur datamodel is eenvoudig: bewaar een minimale set order-, product-, partij-, belasting-, factuur- en creditnota-velden zodat elk bedrag later gereproduceerd en verklaard kan worden. Houd het compact, maar verwijder geen wettelijk belangrijke velden die het belastingtype, tarief en rapportage bepalen.
Als je wilt dat GST-facturen makkelijk te genereren en eenvoudig te reconciliëren zijn, begin dan met een kleine set objecten en laat elk object één taak doen. Een schoon GST-factuur datamodel gaat minder over veel tabellen en meer over feiten die stabiel blijven in de tijd.
Hier zijn de kernrecords die de meeste teams op dag één nodig hebben:
Een Factuur moet gescheiden zijn van een Order. Orders kunnen veranderen (adres bewerkt, artikelen geannuleerd, gedeeltelijke levering). Facturen mogen dat niet. Ze hebben stabiele nummering, data en totalen die nooit "afdrijven" omdat iemand later een order bijgewerkt heeft.
Het anker voor belastingnauwkeurigheid zijn Regelitems. Elke orderregel (en later elke factuurregel) moet de exacte hoeveelheid, eenheidsprijs, korting en belastinguitsplitsing voor dat specifieke item bevatten. Daar worden HSN/SAC en GST-tarieven daadwerkelijk toegepast.
Een detail dat finance-teams veel tijd bespaart: sla snapshots op. Wanneer je een factuur genereert, kopieer dan de productomschrijving, HSN/SAC, belastingtarief en prijsstelling naar de factuurregels. Vertrouw niet op de huidige productmaster, want tarieven en namen veranderen.
Optioneel maar vaak vroeg de moeite waard zijn Retouren, Terugbetalingen en Creditnota's als aparte records. Voorbeeld: als een klant één artikel retourneert van een twee-artikelen order, wil je een creditnota die verwijst naar de originele factuurregel, terwijl het betalings-refund record verwijst naar de gateway-transactie. Deze expliciete objecten voorkomen maandafsluitings-“handmatige fixes” in GST-registers.
Als je dit in Koder.ai bouwt, behandel elk object eerst als een eenvoudig scherm (aanmaken, bekijken, bewerken) en voeg factuurgeneratie pas toe nadat snapshots en regel-niveau velden aanwezig zijn.
HSN (voor goederen) en SAC (voor diensten) zijn geen "alleen factuur"-gegevens. Ze beginnen bij de product- of dienstdefinitie en worden vervolgens gekopieerd naar elke factuurregel op het moment dat je de factuur opstelt. Dit houdt gemengde winkelwagens correct en maakt audits eenvoudiger omdat elke regel op zichzelf staat.
Een praktisch minimaal datamodel is:
HSN/SAC op het Product plaatsen helpt je admin-team het op één plek te onderhouden. Het kopiëren naar InvoiceLine is wat oude facturen stabiel maakt. Zelfs als het product later verandert, toont de factuur nog wat waar was op het moment van verkoop. Dit is de kern van een GST-factuur datamodel dat tijdens reconciliatie niet breekt.
Voor HSN-opslag, houd het simpel: code is verplicht, beschrijving is optioneel, en een effective_from datum is optioneel als je een wijzigingshistorie wilt. De meeste teams hebben de beschrijving niet op elke regel nodig, maar het kan helpen bij finance-controles van uitzonderingen.
Gemengde winkelwagens zijn normaal: één factuur kan meerdere regelitems en dus meerdere HSN/SAC-codes bevatten. Probeer niet één code per factuur af te dwingen. Totalen rollen op op factuurniveau, terwijl classificatie op regelniveau blijft.
Change management is waar mensen problemen krijgen. Gebruik een klein regelsetje:
Qua admin-schermen heb je slechts één plek nodig om Product belastingvelden te bewerken, plus een read-only weergave op de factuurregel om te bevestigen wat er werd vastgelegd toen de factuur werd aangemaakt. Als je deze schermen snel bouwt, kunnen tools zoals Koder.ai de basale CRUD-pagina's en datatabellen genereren vanuit dit model met minimale inspanning.
Een GST-factuur datamodel faalt het meest op partijgegevens. Als de identiteit van koper of verkoper ook maar iets afwijkt, kan je factuur wel op papier geldig zijn maar pijnlijk in aangiften en reconciliatie.
Begin met het behandelen van “verkoper”, “koper” en “ship-to” als afzonderlijke partijen, ook als het dezelfde persoon is. Dit voorkomt latere hacks wanneer een klant een ander afleveradres toevoegt of wanneer je verkoopt vanuit meer dan één GST-registratie.
Houd de velden saai en expliciet. Dit zijn de velden die meestal nodig zijn op de factuur en in rapporten:
Sla de staat zowel als mensleesbare naam als als state code op, omdat rapportage en plaats-van-voorziening regels vaak op de code vertrouwen.
Sla zowel factuur- als verzendadressen op de order op, niet alleen in het klantprofiel. Profielen veranderen; facturen niet.
Plaats van voorziening moet als een specifieke state code op de factuur worden opgeslagen (gekopieerd van de order op het moment van facturatie). Bereken deze later niet opnieuw. Als je regel “ship-to state” is, sla dat resultaat op, plus de staat die gebruikt is om die beslissing te nemen. Dit maakt audits en geschillen eenvoudiger.
Voor B2B is de GSTIN van de koper normaal vereist en moet die bij invoer op lengte en formaat worden gevalideerd. Voor B2C kan GSTIN leeg blijven, maar je hebt nog steeds een volledig adres en staat nodig om te bepalen of CGST/SGST of IGST van toepassing is.
Een eenvoudige regel die in de meeste systemen werkt: als buyer GSTIN aanwezig is, behandel als B2B; als niet, behandel als B2C. Als je uitzonderingen nodig hebt, sla een expliciet customer_type veld op.
Als je vestigingen of business units hebt met verschillende GST-registraties, modelleer “Seller Entity” als een eigen record met eigen GSTIN en adres. Elke order moet precies één seller entity refereren en elke factuur moet die details kopiëren zodat historische facturen accuraat blijven, zelfs als het verkoperadres later verandert.
Tools zoals Koder.ai kunnen snel de admin-formulieren voor deze records genereren, maar de sleutel is de structuur: aparte seller entity, order-time snapshots en een expliciete place-of-supply state code.
De meest voorkomende splitsing is simpel: als de plaats van voorziening in dezelfde staat ligt als de leverancier, is de belasting CGST + SGST. Als het een andere staat is, is de belasting IGST. Je systeem moet dit later niet opnieuw berekenen vanuit totalen omdat kleine verschillen (afronding, kortingen, verzending) precies zijn wat mismatches veroorzaakt.
Minimaal moet je belastingnummers op factuurregelniveau opslaan, niet alleen in de factuurheader. Zo kun je elke rupee op de factuur verklaren en terugkoppelen naar product, HSN en omzet.
Een praktisch minimum per factuurregel in je GST-factuur datamodel ziet er zo uit:
Kortingen zijn waar systemen rommelig worden. Bepaal één regel en sla die duidelijk op. Als kortingen de prijs vóór belasting verlagen (typisch voor artikelkortingen en coupons), sla dan het oorspronkelijke bruto bedrag, het kortingsbedrag en de resulterende taxable value op. Als je een order-niveau coupon hebt, wijs deze toe over lijnen (meestal proportioneel aan elke regel's voor-korting taxable value) en sla elke regel's toegewezen korting op zodat je belastingberekening verklaarbaar blijft.
Afronding moet consistent zijn en vastgelegd worden. Kies of je afrondt op regelniveau of alleen op factuurniveau en sla dan de afgeronde resultaten op die je hebt afgedrukt. Veel teams berekenen belasting per regel, ronden op 2 decimalen, tellen op en passen vervolgens een finale invoice_rounding_adjustment toe om tot het exacte betaalbare bedrag te komen.
Verzending en handling mag geen verborgen toeslag zijn. Behandel deze als een aparte factuurregel met een eigen HSN/servicecode en belastingregel. Bijvoorbeeld: een order met twee producten en een verzendkostenregel wordt drie regels, elk met opgeslagen taxable value en belastingcomponentbedragen, wat finance-reconciliatie veel eenvoudiger maakt.
Als belasting eenmaal berekend is, heeft de factuur nog steeds “document” velden nodig die het geldig, controleerbaar en makkelijk te reconciliëren maken. Behandel de factuurheader in een GST-factuur datamodel als een juridisch record: het moet stabiel blijven zelfs als product- of klantgegevens in de toekomst veranderen.
Begin met de header basics: factuurnummer, uitgiftedatum (de datum op de factuur), factuurtype (tax invoice, export, B2B, B2C, enz.) en valuta. Zelfs als je voornamelijk in INR factureert, voorkomt het opslaan van valuta moeilijke randgevallen bij export of multi-currency marktplaatsen.
Nummering is waar teams vaak problemen krijgen. Houd een serie of prefix (bijvoorbeeld “FY25-INV-”), sla het financiële jaar op en handhaaf uniciteit op databaseniveau. Sla ook “next number” controles per serie in admin op zodat twee admins niet tegelijk hetzelfde nummer kunnen toewijzen.
Totalen moeten expliciet worden opgeslagen, niet alleen afgeleid. Bewaar subtotalen (taxable value), totale belasting, eindtotaal en een apart afrondingsbedrag. Als je later uit regellijsten herberekent, kan een kleine regelwijziging ertoe leiden dat oude facturen niet meer overeenkomen met de ingediende aangifte.
Statussen moeten de echte levenscyclus weergeven en het record vergrendelen wanneer nodig:
Tot slot sla gegenereerde artefactmetadata op: PDF-template versie, gegenereerde timestamp en een bestandsidentifier. Een hash is optioneel, maar nuttig als je moet bewijzen dat de PDF niet is aangepast.
Voorbeeld: als een supportmedewerker een PDF opnieuw genereert na een template-update, moeten de factuurtotalen en het nummer identiek blijven, maar de opgeslagen templateversie verklaart waarom het PDF-layout er anders uitziet.
Als je schone GST-facturen wilt, begin dan niet met het factuurscherm. Begin met de adminpagina's die ernaartoe voeren. Een goed GST-factuur datamodel blijft compact als deze invoer gecontroleerd en consistent is.
De productmaster is waar de meeste toekomstige mismatches beginnen, dus houd het strikt. Elke SKU moet precies één standaard HSN (of SAC voor diensten) hebben, plus een standaard GST-tarief en eventuele uitzonderingen die alleen voor bepaalde datums gelden.
Een praktisch productscherm heeft meestal:
Vermijd een “calculator” UI. Sla in plaats daarvan de invoer op die je systeem consequent kan toepassen: tarieftabellen, plaats-van-voorziening regels die je volgt en hoe je intra-state versus inter-state bepaalt (meestal door leverancierstaat en ship-to staat te vergelijken).
Houd het belastingscherm gefocust op: belastingtarief per categorie/HSN-groep, ingangsdata en wat moet gebeuren als de koper een geldige GSTIN opgeeft versus niet.
Het klantscherm moet GSTIN en de validatiestatus vastleggen, plus standaard factuur- en verzendadressen. Laat gebruikers geen vrije tekst voor staten typen; gebruik een gecontroleerde lijst zodat “KA” en “Karnataka” niet twee verschillende waarden worden.
Je bedrijfsprofielscherm is even belangrijk: juridische naam, GSTIN, geregistreerd adres en factuurnummerreeksinstellingen (prefix, next number en grenzen van het financiële jaar). Beperk dit met permissies omdat wijzigingen elke toekomstige document beïnvloeden.
Je hebt geen complex systeem nodig, maar je hebt wel een spoor nodig. Log wie HSN/SAC, GST-tarieven, factuurnummerreeksinstellingen of company GSTIN heeft gewijzigd, samen met de oude waarde, nieuwe waarde, timestamp en reden.
Als je deze schermen in een tool als Koder.ai bouwt, behandel audit logging en effective dates als eersteklas velden vanaf dag één. Ze kosten weinig om vroeg toe te voegen en besparen uren tijdens finance reviews later.
Een conforme factuur gaat minder over mooie opmaak en meer over het bevriezen van de juiste feiten op het juiste moment. Als je je GST-factuur datamodel rond deze flow ontwerpt, wordt finance-werk een simpele match in plaats van een wekelijkse zoektocht.
Voordat je belasting berekent, maak een order-snapshot: items, hoeveelheden, eenheidsprijzen, kortingen, verzend-/handlingkosten, klant-GSTIN (indien aanwezig), factuur- en verzendadressen en place-of-supply signalen. De snapshot mag niet veranderen, zelfs als de productprijs of HSN-mapping later verandert.
Bereken belastingen en genereer factuurregels vanuit de snapshot. Elke factuurregel moet HSN/SAC, belastingtarief(len), taxable value en gebruikte belastingbedragen op dat moment kopiëren in plaats van ze later live op te zoeken.
Wijs het factuurnummer en de uitgiftedatum toe en markeer de factuur als uitgegeven. Blokkeer vanaf dat punt bewerkingen aan prijzen, belastingtarieven, HSN-codes en adressen op het factuurrecord. Als je iets moet toestaan, beperk het tot niet-financiële notities en interne tags.
Genereer de PDF/printweergave van de uitgegeven factuur en sla daarna de finale totalen op die je zult rapporteren: taxable total, CGST/SGST/IGST totalen, afronding en eindtotaal. Als extra zekerheid kun je een documentversie of checksum opslaan zodat je kunt bewijzen dat de print overeenkomt met de opgeslagen cijfers.
Na uitgifte moeten wijzigingen volgens regels gebeuren, niet door bewerkingen:
Als je deze flow in je adminschermen bouwt (Koder.ai-stijl planning mode is nuttig om de stappen in kaart te brengen voordat je bouwt), kan je team facturen snel genereren zonder later reconciliatie te breken.
Reconciliatie wordt rommelig wanneer betalingen worden behandeld als een enkele “betaald/onbetaald” vlag op de order. Houd betalingen en terugbetalingen als aparte records die naar de order en de factuur verwijzen, zodat finance bankafstemmingen kan matchen zonder de geschiedenis te herschrijven.
Een conforme factuur moet stabiel blijven nadat deze is uitgegeven. Als een klant in termijnen betaalt of je later terugbetaalt, registreer die beweging als een betaling of terugbetaling, niet als een wijziging van de factuurtotalen.
Minimale velden die meestal reconciliatie eenvoudig maken:
Als de klant één artikel retourneert, “verminder” de factuur dan niet. Geef een creditnota uit en koppel die aan de originele factuur. Het factuurregister blijft schoon en de terugbetaling koppelt terug naar de creditnota.
Geef finance één scherm dat antwoordt op: wat is uitgegeven, wat is betaald, wat staat nog open en wat is omgekeerd. Voeg ageing toe (0-7, 8-30, 31-60, 60+ dagen) en mogelijkheid om door te klikken naar gerelateerde betaling- en terugbetalingsentries.
Exports die de meeste teams maandelijks nodig hebben:
Voorbeeld: een order is Rs 10,000, betaald Rs 6,000 vandaag en Rs 4,000 volgende week. De factuur blijft Rs 10,000. Je finance-weergave toont een saldo van Rs 4,000 totdat de tweede afwikkeling arriveert en markeert het daarna als volledig betaald zonder het uitgegeven document te wijzigen.
De meeste GST-factuurproblemen zijn geen “belastinglogica”-problemen. Het zijn boekhoudkundige problemen: de cijfers op de PDF komen niet overeen met wat finance exporteert of de factuur kan maanden later niet worden verklaard.
De eerste valkuil is GST alleen bij weergave berekenen. Als je CGST/SGST/IGST elke keer berekent wanneer iemand een factuur opent, krijg je uiteindelijk verschillende resultaten na een tariefwijziging, afrondingsregelwijziging of bugfix. Sla de berekende belastinguitsplitsing op die gebruikt is toen de factuur werd uitgegeven, zelfs als je ook de inputs bewaart.
Een tweede valkuil is het toestaan van bewerkingen aan een uitgegeven factuur. Zodra een factuur definitief is, moeten wijzigingen via een creditnota of vervangingsflow met audittrail gebeuren. Anders krijg je discussies van het type “waarom verschilt de klant-PDF met de boeken?”.
Dit zijn mismatch-patronen die het meest voorkomen in een GST-factuur datamodel:
Een snel voorbeeld: je verkoopt aan een klant in Karnataka, maar het afleveradres is in Maharashtra. Als je systeem per ongeluk de facturatiestaat kiest voor plaats van voorziening, kun je CGST+SGST in rekening brengen in plaats van IGST. Als je daarbij belasting dynamisch opnieuw berekent, kan die fout later stilletjes “genezen”, waardoor finance met cijfers blijft zitten die niet overeenkomen met het uitgegeven document.
Wanneer je adminschermen bouwt (of via een platform zoals Koder.ai), voeg kleine vangrails toe: vergrendel uitgegeven facturen, toon plaats-van-voorziening invoer naast het berekende belastingtype en houd een onveranderlijke snapshot van HSN, tarief en afronding die bij uitgifte is gebruikt.
Voordat je een factuur naar een klant stuurt of markeert als “uitgegeven”, voer een snelle set checks uit. Hier ontstaan de meeste kleine fouten die later tot grote reconciliatieproblemen leiden. Als je een GST-factuur datamodel bouwt, is het de moeite waard om deze checks in zowel validatieregels als je admin-UI in te bouwen.
Een simpel voorbeeld: een klant werkt na betaling zijn afleveradres bij en de staat verandert. Als je hetzelfde factuurnummer opnieuw uitgeeft met nieuwe belasting, stoppen je register en betalingsrecords met overeenkomen. De veiligere aanpak is het oorspronkelijke factuur onveranderlijk te houden en een correctiedocument aan te maken.
Vervolgstappen: implementeer eerst de schermen en validaties, en iterateer daarna. In Koder.ai begin je in Planning Mode om de records en adminschermen te schetsen (producten met HSN/SAC-mapping, klant/GSTIN-gegevens, belastingregels en facturen). Genereer de app, test een paar echte orders end-to-end en gebruik snapshots en rollback om veilig de workflow te verfijnen. Wanneer je diepere aanpassingen of reviews nodig hebt, exporteer de broncode en blijf evolueren volgens je gebruikelijke proces.