Grunderna i GST-faktura datamodell: minsta fälten, hantering av HSN och adminskärmar som behövs för att skapa compliant fakturor och förenkla avstämning.

De flesta problem med GST-fakturor är inte "komplex skatt"-problem. Det är saknade eller inkonsekventa data. En revision misslyckas när fakturan inte tydligt kan kopplas till vad som såldes, till vem, var det levererades och hur skatten beräknades.
En vanlig orsak är att HSN saknas, är föråldrad eller tillämpas på fel nivå. Team kan lagra en HSN på produkten, men fakturaraden skapas från ett annat SKU-namn eller variant, så HSN aldrig hamnar på det slutliga dokumentet. Ett annat vanligt problem är felaktig skattesplit: att ta ut IGST när det borde vara CGST och SGST (eller tvärtom) eftersom "place of supply" gissades från leveransadressen utan att lagra de delstatskoder som användes för beslutet.
Ekonomiteamen märker detta omedelbart. Avstämning blir ett dagligt städuppdrag: fakturatotaler matchar inte ordern, ordern matchar inte betalningsgatewayens uppgörelse, och återbetalningar blir en kedja av manuella noteringar. Även små avrundningsskillnader på rader kan skapa avvikelser mellan faktura-PDF, GST-rapporter och bokföringen.
Här är mönstren som orsakar mest smärta vid avstämning:
Målet med en GST-faktura datamodell är enkelt: lagra ett minsta uppsättning fält för order, produkt, part, skatt, faktura och kreditnotor så att varje siffra kan reproduceras och förklaras senare. Håll det litet, men släng inte bort juridiskt viktiga fält som bestämmer skatttyp, sats och rapportering.
Om du vill att GST-fakturor ska vara enkla att skapa och enkla att stämma av senare, börja med ett litet antal objekt och låt varje objekt göra ett enda jobb. En ren GST-faktura datamodell handlar mindre om många tabeller och mer om att hålla fakta stabila över tid.
Här är de kärnposter de flesta team behöver från dag ett:
En Invoice bör vara separat från en Order. Ordrar kan ändras (redigerad adress, annullerade artiklar, delvis leverans). Fakturor ska inte göra det. De behöver stabil numrering, datum och totaler som aldrig "driftar" för att någon uppdaterade en order senare.
Ankaret för skattenoggrannhet är Line Items. Varje orderrad (och senare varje fakturarad) bör innehålla exakt kvantitet, enhetspris, rabatt och skatteuppdelning för den specifika artikeln. Där tillämpas HSN/SAC och GST-satserna.
En detalj som räddar ekonomiteam: lagra snapshots. När du genererar en faktura, kopiera produktbeskrivning, HSN/SAC, skattesats och prissättning till fakturaraderna. Lita inte på det aktuella produktregistret, eftersom satser och namn kan ändras.
Valfritt men ofta värt att lägga till tidigt är Returns, Refunds och Credit Notes som separata poster. Exempel: om en kund returnerar en vara från en tvåvarorsorder vill du en kreditnota som hänvisar till originalfakturaraden, medan betalningsåterbetalningen refererar till gateway-transaktionen. Att hålla dessa som explicita objekt förhindrar månadsavsluts-manualer i GST-register.
Om du bygger detta i Koder.ai, behandla varje objekt som en enkel skärm först (skapa, visa, redigera), och lägg till fakturagenerering först efter att snapshots och fälten på radenivå finns på plats.
HSN (för varor) och SAC (för tjänster) är inte "endast faktura"-detaljer. De börjar i produkt- eller tjänstedefinitionen och kopieras sedan till varje fakturarad i det ögonblick du utfärdar fakturan. Detta håller blandade kundvagnar korrekta och gör revisioner enklare eftersom varje rad står för sig.
En praktisk minimum datamodell är:
Att lägga HSN/SAC på produkten hjälper ditt adminteam att underhålla det på ett ställe. Att kopiera det till InvoiceLine är vad som gör gamla fakturor stabila. Även om produkten ändras senare visar fakturan vad som var sant vid försäljningstillfället. Detta är hjärtat i en GST-faktura datamodell som inte går sönder vid avstämning.
För HSN-lagring, håll det enkelt: kod är obligatoriskt, beskrivning är valfri, och ett effective_from-datum är valfritt om du vill ha ändringshistorik. De flesta team behöver inte beskrivningen på varje rad, men den kan hjälpa när ekonomi kontrollerar undantag.
Blandade kundvagnar är normala: en faktura kan ha flera rader och därigenom flera HSN/SAC-koder. Försök inte tvinga en kod per faktura. Totaler summeras på fakturahuvudet medan klassificeringen stannar på radenivå.
Ändringshantering är där folk får problem. Använd enkla regler:
Adminskärm-mässigt behöver du bara ett ställe för att redigera produktens skattefält, plus en skrivskyddad vy på fakturaraden för att bekräfta vad som fångades när fakturan skapades. Om du bygger dessa skärmar snabbt kan verktyg som Koder.ai generera grundläggande CRUD-sidor och datatabeller från denna modell med minimal ansträngning.
En GST-faktura datamodell misslyckas oftast på partinformation. Om köparens eller säljarens identitet är ens något fel, kan din faktura vara giltig på papper men besvärlig i deklarationer och avstämningar.
Börja med att behandla "seller", "buyer" och "ship-to" som separata parter, även när de är samma person. Detta förhindrar senare hack när en kund lägger till en annan leveransadress eller när du säljer från mer än en GST-registrering.
Gör fälten tråkiga och explicita. Dessa är de som vanligtvis behövs på fakturan och i rapporter:
Lagra delstat både som ett läsbart namn och som en delstatskod, eftersom rapportering och place-of-supply-regler ofta bygger på koden.
Fånga både faktura- och leveransadresser på ordern, inte bara i kundprofilen. Profiler förändras; fakturor ska inte göra det.
Place of supply bör lagras som en specifik delstatskod på fakturan (kopierad från ordern vid fakturatid). Räkna inte om den senare. Om din regel är "ship-to state", lagra det resultatet plus den delstat som användes för att avgöra det. Detta förenklar revisioner och tvister.
För B2B är köparens GSTIN normalt obligatoriskt och bör valideras för längd och format vid inmatning. För B2C kan GSTIN vara tomt, men du behöver fortfarande en fullständig adress och delstat för att avgöra om CGST/SGST eller IGST gäller.
En enkel regel som fungerar i de flesta system: om köparens GSTIN finns, behandla som B2B; om inte, behandla som B2C. Om du behöver undantag, lagra ett explicit customer_type-fält.
Om ni har filialer eller affärsenheter med olika GST-registreringar, modellera "Seller Entity" som en egen post med egen GSTIN och adress. Varje order bör referera exakt en seller entity, och varje faktura bör kopiera dessa detaljer så att historiska fakturor förblir korrekta även om säljarens adress ändras senare.
Verktyg som Koder.ai kan generera adminformulär för dessa poster snabbt, men nyckeln är strukturen: separat seller entity, snapshots vid ordertid och en explicit place-of-supply delstatskod.
Den vanligaste uppdelningen är enkel: om place of supply är i samma delstat som leverantören, är skatten CGST + SGST. Om det är en annan delstat, är skatten IGST. Ditt system bör inte "kalkylera om senare från totaler" eftersom små skillnader (avrundning, rabatter, frakt) är exakt vad som skapar avvikelser.
Som minimum, lagra skattebeloppen på fakturaradenivå, inte bara i fakturahuvudet. Då kan du förklara varje krona på fakturan och matcha den tillbaka till produkt, HSN och intäkt.
Ett praktiskt minimum per fakturarad i din GST-faktura datamodell ser ut så här:
Rabatter är där system blir röriga. Bestäm en regel och lagra den tydligt. Om rabatter minskar priset före skatt (typiskt för artikelrabatter och kuponger), lagra ursprungligt brutto, rabattbelopp och det resulterande taxabla värdet. Om du har en ordernivå-kupong, fördela den över rader (vanligtvis proportionellt mot varje rads för-discount-taxable_value) och lagra varje rads fördelade rabatt så att din skattematik förblir förklarbar.
Avrundning bör vara konsekvent och registrerad. Välj om du avrundar på radenivå eller bara på fakturanivå, och lagra sedan de avrundade resultaten du skrev ut. Många team beräknar skatt per rad, avrundar till 2 decimaler, summerar och sedan tillämpar ett slutligt invoice_rounding_adjustment-fält för att nå det exakta betalbara beloppet.
Frakt och hantering ska inte vara en dold tillägg. Behandla dem som en separat fakturarad med egen HSN/tjänstekod och skatteregler. Till exempel blir en order med två produkter och en fraktavgift tre rader, vardera med lagrat taxabelt värde och skattekomponenter, vilket gör avstämningen mycket enklare.
När skatten är beräknad behöver fakturan fortfarande "dokument"-fält som gör den giltig, revisionsbar och enkel att stämma av senare. I en GST-faktura datamodell behandla fakturahuvudet som en juridisk post: det bör vara stabilt även om produkt- eller kunddata ändras i framtiden.
Börja med grundläggande fält i huvudet: fakturanummer, utfärdandedatum (datumet på fakturan), fakturatyp (tax invoice, export, B2B, B2C, etc.) och valuta. Även om ni mest fakturerar i INR, undvik röriga edge-cases för export eller marknadsplatser med flera valutor genom att lagra valuta.
Numrering är där team går i fällan. Ha en serie eller prefix (t.ex. "FY25-INV-"), lagra räkenskapsår och tvinga unikhet på databasenivå. Lagra även "nästa nummer"-kontroller per serie i admin så att två administratörer inte kan utfärda samma nummer samtidigt.
Totaler bör lagras explicit, inte bara härledas. Spara subtotal (taxable value), total skatt och grand total, samt ett separat round-off-belopp. Om du räknar om senare från radposter kan en liten regeländring göra att gamla fakturor slutar matcha den inlämnade deklarationen.
Statusar bör spegla verkliga livscykeln och låsa posten när det behövs:
Slutligen, lagra metadata för genererade artefakter: PDF-mallversion, genereringstidpunkt och en filidentifierare. En hash är valfri men användbar om du behöver bevisa att PDF:en inte ändrats.
Exempel: om en supportagent återgenererar en PDF efter en malluppdatering ska fakturatotaler och nummer förbli identiska, men den lagrade mallversionen förklarar varför PDF-layouten ser annorlunda ut.
Om du vill ha rena GST-fakturor, börja inte i fakturaskärmen. Börja med admin-sidorna som matar den. En bra GST-faktura datamodell förblir liten när dessa indata kontrolleras och är konsekventa.
Produktmasten är där de flesta framtida avvikelser börjar, så var strikt. Varje SKU bör ha exakt en standard HSN (eller SAC för tjänster), plus en standard GST-sats och eventuella undantag som gäller endast för vissa datum.
En praktisk produktskärm behöver vanligtvis:
Undvik ett "kalkylator"-gränssnitt. Lagra i stället indata som ditt system kan tillämpa konsekvent: radsatstabeller, place-of-supply-regler ni följer och hur ni avgör intra-state vs inter-state (vanligtvis genom att jämföra leverantörens delstat och leveransdelstaten).
Håll skattevyn fokuserad på: skattesats per kategori/HSN-grupp, effektiva datum och vad som ska hända när köparen uppger giltig GSTIN vs inte.
Kundskärmen bör fånga GSTIN och dess valideringsstatus, plus standardfakturering och leveransadresser. Låt inte användare skriva fri text för delstater; använd en kontrollerad lista så att "KA" och "Karnataka" inte blir två olika värden.
Företagsprofilskärmen är lika viktig: juridiskt namn, GSTIN, registrerad adress och inställningar för fakturaserier (prefix, nästa nummer och räkenskapsårsgränser). Lås detta med behörigheter eftersom ändringar påverkar alla framtida dokument.
Du behöver inte ett komplext system, men du behöver ett spår. Logga vem som ändrade HSN/SAC, GST-satser, fakturaserieinställningar eller företags-GSTIN, tillsammans med gammalt värde, nytt värde, tidsstämpel och orsak.
Om du bygger dessa skärmar i ett verktyg som Koder.ai, behandla revisionsloggning och effektiva datum som förstklassiga fält från dag ett. De kostar lite att lägga till tidigt och sparar timmar under ekonomigranskningen senare.
En compliant faktura handlar mindre om snygg formatering och mer om att frysa rätt fakta vid rätt tidpunkt. Om du designar din GST-faktura datamodell runt detta flöde blir ekonomiarbetet en enkel matchning, inte en veckovis utredning.
Innan du beräknar skatt, lås en order-snapshot: artiklar, kvantiteter, enhetspriser, rabatter, frakt/hanteringskostnader, kundens GSTIN (om någon), faktura- och leveransadresser och place of supply-signaler. Snapshoten ska inte ändras även om produktpris eller HSN-mappning ändras senare.
Beräkna skatter och generera fakturarader från snapshoten. Varje fakturarad bör kopiera HSN/SAC, skattesats(er), taxable value och använda skattebelopp i det ögonblicket, i stället för att slå upp dem live senare.
Tilldela fakturanummer och utfärdandedatum, markera fakturan som issued. Från denna punkt, blockera ändringar i pris, skattesatser, HSN-koder och adresser på fakturaposten. Om du behöver tillåta något, begränsa det till icke-finansiella anteckningar och interna taggar.
Generera PDF/printvyn från den utfärdade fakturan, och lagra sedan de slutliga totaler du kommer rapportera: taxa total, CGST/SGST/IGST-totalsummor, avrundning och grand total. Om du vill ha extra säkerhet, lagra en dokumentversion eller checksumma så du kan bevisa att utskriften matchar de lagrade siffrorna.
Efter utfärdande bör ändringar följa regler, inte redigeringar:
Om du bygger detta flöde i dina adminskärmar (Koder.ai-style Planning Mode är hjälpsamt för att kartlägga stegen innan bygg), kan ditt team generera fakturor snabbt utan att bryta avstämningen senare.
Avstämning blir rörig när betalningar behandlas som en enkel "betald/obetald"-flagga på ordern. Håll betalningar och återbetalningar som separata poster som pekar på ordern och fakturan, så ekonomi kan matcha bankuppgörelser utan att skriva om historiken.
En utfärdad faktura bör förbli stabil efter utfärdande. Om en kund betalar i delar eller ni återbetalar senare, registrera den rörelsen som en betalnings- eller återbetalningspost, inte som en ändring av fakturatotalerna.
Minsta fält som vanligtvis gör avstämningen enkel:
Om kunden returnerar en vara, minska inte fakturan. Utfärda en kreditnota och länka den till originalfakturan. Fakturaregistret förblir rent och återbetalningen kopplas till kreditnotan.
Ge ekonomi en enda vy som svarar: vad utfärdades, vad betalades, vad är fortfarande öppet och vad vändes tillbaka. Inkludera åldersindelning (0-7, 8-30, 31-60, 60+ dagar) och möjlighet att borra ner till relaterade betalnings- och återbetalningsposter.
Exporterna de flesta team behöver varje månad:
Exempel: en order är Rs 10,000, betalat Rs 6,000 idag och Rs 4,000 nästa vecka. Fakturan förblir Rs 10,000. Er ekonomivy visar balans Rs 4,000 tills den andra uppgörelsen anländer, och markerar den som fullt betald utan att ändra det utfärdade dokumentet.
De flesta GST-fakturaproblem är inte "skattelogiik"-problem. De är bokföringsproblem: siffrorna på PDF:en matchar inte vad ekonomi exporterar, eller fakturan kan inte förklaras månader senare.
Den första fällan är att beräkna GST endast vid visning. Om du beräknar CGST/SGST/IGST varje gång någon öppnar en faktura kommer du så småningom få olika resultat efter en satsändring, avrundningsändring eller buggfix. Lagra den beräknade skatteuppdelningen som användes när fakturan utfärdades, även om du också lagrar indata.
En andra fälla är att tillåta redigeringar av en utfärdad faktura. När en faktura är slutgiltig bör ändringar ske via en kreditnota eller ett ersättningsflöde med revisionsspår. Annars får du argument om "varför skiljer kundens PDF sig från böckerna?".
Här är avvikelsmönstren som oftast visar sig i en GST-faktura datamodell:
Ett snabbt exempel: du säljer till en kund i Karnataka, men leveransadressen är i Maharashtra. Om ditt system väljer faktureringsdelstaten som place of supply av misstag kan du debitera CGST+SGST i stället för IGST. Om du dessutom räknar om skatt live kan det felet tyst "rätta sig" senare, vilket lämnar ekonomi med siffror som inte matchar det utfärdade dokumentet.
När du bygger adminskärmar (antingen anpassade eller via en plattform som Koder.ai), lägg till små skyddsräcken: lås utfärdade fakturor, visa place-of-supply-indata bredvid den beräknade skattypen och behåll en oföränderlig snapshot av HSN, sats och avrundning som användes vid utfärdandet.
Innan du skickar en faktura till en kund eller markerar den som "issued", kör en snabb uppsättning kontroller. Här är de flesta små misstag blir stora avstämningsproblem senare. Om du bygger en GST-faktura datamodell är det värt att baka in dessa kontroller i både valideringsregler och ditt admin-UI.
Ett enkelt exempel: en kund uppdaterar sin leveransadress efter betalning och delstaten ändras. Om du återutfärdar samma fakturanummer med ny skatt slutar ditt register och betalningsposter att matcha. Ett säkrare tillvägagångssätt är att behålla originalfakturan oföränderlig och skapa ett justeringsdokument.
Nästa steg: implementera skärmarna och valideringarna först, och iterera sedan. I Koder.ai, börja i Planning Mode för att skissa poster och adminskärmar (produkter med HSN/SAC-mappning, kund/GSTIN-detaljer, skatregler och fakturor). Generera appen, testa några riktiga ordrar end-to-end och använd snapshots och rollback för att säkert förfina arbetsflödet. När du behöver djupare anpassning eller granskningar, exportera källkoden och fortsätt utveckla den i er vanliga process.