Build the GSTR-9 Annual Return JSON
Skill: Convert a financial year's GST data into the GSTR-9 offline-utility JSON
Region: India Category: Tax — GST annual return Does: Takes a financial year's outward supplies, ITC, tax paid and prior-year amendment figures and maps them onto the GSTR-9 JSON in the GST offline-utility format — Part II tables 4–5, Part III tables 6–8, Part IV table 9, and Part V tables 10–13 — for upload to the GST portal. System: GST portal (gst.gov.in) — Returns, Annual Return GSTR-9 (offline tool)
GSTR-9 is the annual return consolidating the twelve monthly/quarterly GSTR-1 and GSTR-3B filings for a financial year (1 April–31 March). It is due by 31 December following the FY (e.g. FY 2024-25 due 31 December 2025); filing is optional for taxpayers with aggregate turnover up to ₹2 crore. Much of the form is auto-populated from filed GSTR-1/3B and GSTR-2A/2B and is partly editable. The JSON top level carries
gstin,fp(MMYYYY, always the period 032025 for FY 2024-25) andgt/gross_turnover. Table numbers and offline-tool schema change between releases — always generate against the current GSTR-9 offline tool and validate on the portal before filing.
When this applies
- A regular registered taxpayer (not composition — they file GSTR-9A; e-commerce TCS operators file GSTR-9B) who was registered for any part of the FY.
- Filing is optional where aggregate turnover ≤ ₹2 crore; mandatory above. The reconciliation statement GSTR-9C is additionally required where turnover exceeds ₹5 crore.
- Once filed, GSTR-9 cannot be revised — reconcile every table before upload.
- Late fee applies per day of delay (see calculation rules), capped by turnover slab.
Conversion procedure
- Read the source — accept the FY summary as CSV, JSON, pasted trial-balance/GST workings, or the downloaded GSTR-9 System Computed values plus the taxpayer's books. Identify the GSTIN and the FY.
- Extract fields — gather, table by table: table 4 taxable outward supplies (B2B, B2C, exports, SEZ, RCM, advances, credit/debit notes, amendments); table 5 nil-rated/exempt/non-GST and outward RCM; table 6 ITC availed (inputs/capital goods/services, import, RCM, ISD, TRAN credit); table 7 ITC reversed (Rule 37/39/42/43, section 17(5)); table 8 ITC reconciliation with GSTR-2A/2B; table 9 tax paid; tables 10–13 prior-year amendments declared in Apr–Nov of the next FY. If a figure is missing or ambiguous, ask — do not guess.
- Normalize — amounts in rupees with 2 decimals, dot separator, no thousands separator; rates as plain numbers;
fp=032025for FY 2024-25;gstin15 chars. - Compute — recompute every total from the books and cross-check against the system-computed values; compute net ITC (table 6 − table 7), table 8 differences (8D = 8A − 8B − 8C), and any late fee. Flag every mismatch.
- Emit the output — assemble the GSTR-9 JSON following the document structure and the worked example as the template.
- Validate — run the validation checklist before upload.
Source → GSTR-9 field map
| From the source | → Target table / field |
|---|---|
| GSTIN | gstin |
Filing period (032025 for FY 24-25) |
fp |
| Aggregate turnover | gt (Pt I) |
| B2C outward taxable | table 4 → t4 row A (txval, iamt, camt, samt, csamt) |
| B2B outward taxable | t4 row B |
| Exports on payment of tax | t4 row C |
| SEZ supplies on payment | t4 row D |
| Deemed exports | t4 row E |
| Advances received (tax paid, no invoice) | t4 row F |
| Inward RCM supplies (tax payable) | t4 row G |
| Credit notes issued (−) | t4 row I |
| Debit notes issued (+) | t4 row J |
| Amendments to 4 (+/−) | t4 rows K/L |
| Exports without payment (zero-rated) | table 5 → t5 row A |
| SEZ without payment | t5 row B |
| Outward RCM (recipient pays) | t5 row C |
| Exempted supplies | t5 row E |
| Nil-rated supplies | t5 row F |
| Non-GST supplies | t5 row G |
| ITC availed per GSTR-3B (auto) | table 6 → t6 row A |
| Inward inputs ITC | t6 row B (iamt,camt,samt,csamt) |
| Inward capital-goods ITC | t6 row C/D |
| Import of goods/services ITC | t6 rows E/F |
| Inward RCM ITC | t6 row D |
| ISD credit | t6 row G |
| ITC reversed (Rule 37/39/42/43, 17(5)) | table 7 → t7 rows A–H |
| ITC as per GSTR-2A/2B | table 8 → t8 row A |
| ITC availed (from 6B+6H) | t8 row B |
| ITC on inward RCM/import | t8 row C |
| Tax payable / paid through cash & ITC | table 9 → t9 (tx_pay, paid_cash, paid_itc) |
| Prior-year supplies declared Apr–Nov | tables 10/11 → t10, t11 |
| Prior-year ITC availed/reversed | tables 12/13 → t12, t13 |
| Late fee payable / paid | table 9 lf heads |
Every required table appears above. Many rows are split by tax head (iamt/camt/samt/csamt) and taxable value (txval).
Document structure (offline-utility JSON)
{
"gstin": "29AABCU9603R1ZM",
"fp": "032025", // FY 2024-25 → 032025
"gt": 52000000.00, // aggregate turnover (Pt I)
"sgt": 50000000.00, // sum of turnover declared in returns
// Part II — Outward supplies
"t4": { "a": {..b2c..}, "b": {..b2b..}, "c": {..exports..}, ... ,
"n": { "txval", "iamt", "camt", "samt", "csamt" } }, // 4N = total
"t5": { "a": {..exp wopay..}, "e": {..exempt..}, "f": {..nil..}, "g": {..non-gst..},
"n": { "txval" } }, // 5N = total
// Part III — ITC
"t6": { "a": {..3B ITC..}, "b": {..inputs..}, "c": {..capital goods..},
"d": {..RCM..}, "e": {..import..}, "o": { "iamt","camt","samt","csamt" } },
"t7": { "a": {..rule37..}, "c": {..rule42..}, "h": {..others..},
"j": { "iamt","camt","samt","csamt" } }, // 7J = total reversed
"t8": { "a": {..as per 2A/2B..}, "b": {..6B+6H..}, "c": {..RCM/import..},
"d": {..difference A-(B+C)..}, "e","f","g","h","i","j","k" },
// Part IV — Tax paid
"t9": [ { "ty": "IGST", "tx_pay": 7200000.00, "paid_cash": 1200000.00, "paid_itc": 6000000.00 },
{ "ty": "CGST", ... }, { "ty": "SGST", ... }, { "ty": "CESS", ... },
{ "ty": "I_LF", "tx_pay": 0, "paid_cash": 0 }, // interest / late fee heads
{ "ty": "LF", "tx_pay": 0, "paid_cash": 0 } ],
// Part V — Prior-year transactions declared Apr–Nov of next FY
"t10": { "txval","iamt","camt","samt","csamt" }, // additions (+)
"t11": { ... }, // reductions (−)
"t12": { ... }, // ITC reversed for prior FY
"t13": { ... } // ITC availed for prior FY
}
Part II/III rows are auto-populated from GSTR-1/3B and are partly editable. Part V (tables 10–13) captures prior-FY transactions declared between April and November of the following FY (amendments and ITC availed/reversed in the subsequent year's returns).
Code tables
Tax heads (ty in table 9 / row keys)
| Key | Meaning |
|---|---|
iamt / IGST |
Integrated GST |
camt / CGST |
Central GST |
samt / SGST |
State / UT GST |
csamt / CESS |
GST Compensation Cess |
I_LF |
Interest |
LF |
Late fee |
Table 7 — ITC reversal reasons
| Row | Reason |
|---|---|
a |
As per Rule 37 (non-payment to supplier within 180 days) |
b |
As per Rule 39 (ISD credit note) |
c |
As per Rule 42 (input/input services — exempt/non-business) |
d |
As per Rule 43 (capital goods — exempt/non-business) |
e |
As per Section 17(5) (blocked credits) |
f |
Reversal of TRAN-I credit |
g |
Reversal of TRAN-II credit |
h |
Other reversals |
j |
Total ITC reversed (= a+…+h) |
Table 8 — ITC reconciliation rows
| Row | Meaning |
|---|---|
a |
ITC as per GSTR-2A / 2B (auto) |
b |
ITC as per sum of 6(B) and 6(H) |
c |
ITC on inward RCM / import not in 8A |
d |
Difference [8A − (8B + 8C)] |
e |
ITC available but not availed |
f |
ITC available but ineligible |
k |
Total ITC to be lapsed (8E + 8F) |
Calculation rules
- Table 4N (total outward taxable) = Σ(rows 4A…4G) + 4J (debit notes) − 4I (credit notes) ± amendments 4K/4L, per tax head.
- Table 5N = Σ(rows 5A…5G) taxable values (zero-rated, exempt, nil, non-GST).
- Table 6O (total ITC availed) = Σ(rows 6B…6H), per tax head; 6A is auto from GSTR-3B and should reconcile.
- Table 7J (total reversed) = Σ(rows 7A…7H).
- Net ITC available = 6O − 7J; must reconcile to the net ITC claimed across the year's GSTR-3B.
- Table 8D = 8A − (8B + 8C); 8K (lapsed) = 8E + 8F.
- Table 9 tax paid: for each head,
paid_cash + paid_itc = tx_pay; reconcile to the cash + credit ledgers. - Late fee (if filed late): ₹200/day (₹100 CGST + ₹100 SGST), capped — 0.04% of turnover (0.02% CGST + 0.02% SGST) for turnover up to ₹5 crore, 0.08% (0.04% + 0.04%) above ₹5 crore up to ₹20 crore, and the standard 0.50% cap above (verify current notification slabs).
- All amounts rounded to 2 decimals; recompute every total from the books — never blindly copy the system-computed figure; flag any mismatch.
Worked example (end-to-end)
Lakshmi Traders (GSTIN 29AABCU9603R1ZM, Karnataka) for FY 2024-25 (fp = 032025): aggregate turnover ₹5.20 crore. B2B outward taxable base ₹4,00,00,000 (IGST ₹40,00,000; CGST ₹16,00,000; SGST ₹16,00,000 — 18% blended); B2C ₹50,00,000 (CGST ₹4,50,000 + SGST ₹4,50,000). Exempt supplies ₹70,00,000. ITC availed per GSTR-3B: IGST ₹30,00,000, CGST ₹12,00,000, SGST ₹12,00,000; section 17(5) reversal CGST ₹50,000 + SGST ₹50,000. Tax paid as below. No prior-year amendments; filed on time (no late fee).
{
"gstin": "29AABCU9603R1ZM",
"fp": "032025",
"gt": 52000000.00,
"sgt": 52000000.00,
"t4": {
"a": { "txval": 5000000.00, "iamt": 0.00, "camt": 450000.00, "samt": 450000.00, "csamt": 0.00 },
"b": { "txval": 40000000.00, "iamt": 4000000.00, "camt": 1600000.00, "samt": 1600000.00, "csamt": 0.00 },
"n": { "txval": 45000000.00, "iamt": 4000000.00, "camt": 2050000.00, "samt": 2050000.00, "csamt": 0.00 }
},
"t5": {
"e": { "txval": 7000000.00 },
"n": { "txval": 7000000.00 }
},
"t6": {
"a": { "iamt": 3000000.00, "camt": 1200000.00, "samt": 1200000.00, "csamt": 0.00 },
"b": { "iamt": 3000000.00, "camt": 1200000.00, "samt": 1200000.00, "csamt": 0.00 },
"o": { "iamt": 3000000.00, "camt": 1200000.00, "samt": 1200000.00, "csamt": 0.00 }
},
"t7": {
"e": { "iamt": 0.00, "camt": 50000.00, "samt": 50000.00, "csamt": 0.00 },
"j": { "iamt": 0.00, "camt": 50000.00, "samt": 50000.00, "csamt": 0.00 }
},
"t8": {
"a": { "iamt": 3050000.00, "camt": 1210000.00, "samt": 1210000.00, "csamt": 0.00 },
"b": { "iamt": 3000000.00, "camt": 1200000.00, "samt": 1200000.00, "csamt": 0.00 },
"c": { "iamt": 0.00, "camt": 0.00, "samt": 0.00, "csamt": 0.00 },
"d": { "iamt": 50000.00, "camt": 10000.00, "samt": 10000.00, "csamt": 0.00 }
},
"t9": [
{ "ty": "IGST", "tx_pay": 4000000.00, "paid_cash": 1000000.00, "paid_itc_igst": 3000000.00 },
{ "ty": "CGST", "tx_pay": 2050000.00, "paid_cash": 900000.00, "paid_itc_cgst": 1150000.00 },
{ "ty": "SGST", "tx_pay": 2050000.00, "paid_cash": 900000.00, "paid_itc_sgst": 1150000.00 },
{ "ty": "CESS", "tx_pay": 0.00, "paid_cash": 0.00 },
{ "ty": "I_LF", "tx_pay": 0.00, "paid_cash": 0.00 },
{ "ty": "LF", "tx_pay": 0.00, "paid_cash": 0.00 }
],
"t10": { "txval": 0.00, "iamt": 0.00, "camt": 0.00, "samt": 0.00, "csamt": 0.00 },
"t11": { "txval": 0.00, "iamt": 0.00, "camt": 0.00, "samt": 0.00, "csamt": 0.00 },
"t12": { "iamt": 0.00, "camt": 0.00, "samt": 0.00, "csamt": 0.00 },
"t13": { "iamt": 0.00, "camt": 0.00, "samt": 0.00, "csamt": 0.00 }
}
Normalisations and checks shown: FY 2024-25 → fp 032025; turnover ₹5.20 cr → 52000000.00; 4N = 4A + 4B per head (450000 + 1600000 = 2050000 CGST); 7J = 7E (only 17(5) reversal); net ITC = 6O − 7J = CGST 1200000 − 50000 = 1150000; 8D = 8A − (8B + 8C) = 3050000 − 3000000 = 50000 IGST; table 9 paid_cash + paid_itc = tx_pay per head. Upload via the GSTR-9 offline tool; the portal recomputes and presents the summary for filing with DSC/EVC.
Validation checklist
- All required figures extracted; AI asked about anything missing or ambiguous (no invented turnover, ITC, or tax amounts)
- Current GSTR-9 offline-tool version/schema used;
gstincorrect andfp=032025(FY 2024-25) - Part II: 4N = Σ(4A…4G) + 4J − 4I ± amendments per head; 5N totals exempt/nil/non-GST
- Part III: 6O = Σ(6B…6H) and reconciles to 6A (GSTR-3B); 7J = Σ(7A…7H); section 17(5) shown in 7E
- Table 8: 8D = 8A − (8B + 8C); 8K = 8E + 8F; ITC reconciled to GSTR-2A/2B
- Table 9: per head
paid_cash + paid_itc = tx_pay; reconciles to cash & credit ledgers and to GSTR-3B - Part V tables 10–13 carry only prior-FY transactions declared Apr–Nov of the next FY
- Late fee (if applicable) computed at ₹200/day within the turnover-slab cap
- Recomputed totals match the system-computed values or discrepancy flagged; filed by 31 December with DSC/EVC
Last updated: 2026-06-13 — confirm the active GSTR-9 offline-tool schema/version, table structure, late-fee slabs, and turnover thresholds against the current GSTN (gst.gov.in) specifications before use.