Skip to content

Handling GST returns

Two monthly returns:

  • GSTR-1 — outward supplies (what you sold). Due by the 11th of the following month.
  • GSTR-3B — monthly summary + liability payment. Due by the 20th of the following month.

The app generates the JSON payloads for both returns in the GSTN offline-utility format. The actual upload to the GSTN portal is manual — you download the JSON from our app, then upload it via the portal's offline-utility tool, then file.

GSTN upload integration is not live

The direct-to-portal upload path is stubbed pending production credentials (see gst.md §5). The "File to GSTN" button in the UI is always disabled today. Until those credentials arrive and the OTP handshake is implemented, treat GST filing as a two-tool workflow: our app generates the JSON; you file via the GSTN portal.


Monthly GSTR-1 workflow

Pre-check: is the data clean?

Before you generate the return:

  1. Every invoice for the month has a GSTIN where one applies. Pull the sales register (Reports → GST Summary or the invoices listing). Any B2B sale missing the customer's GSTIN will end up in the wrong GSTR-1 section (B2CS instead of B2B) and be harder to correct later.
  2. Every line item has HSN or SAC. The HSN summary section aggregates by HSN × rate; lines without an HSN roll into a blank bucket.
  3. Every invoice has place-of-supply set correctly. This drives IGST vs CGST+SGST split. A wrong POS means the wrong tax split was recorded — you'll need to issue a credit note and re-invoice.

Generate and download GSTR-1

  1. Finance → Reports tab.
  2. Click GST Returns. (Permission: finance.reports.gst_summary.view.)
  3. Select Month (e.g. April 2026).
  4. Click GSTR-1. The preview pane shows section counts — B2B, B2CL, B2CS, CDNR, HSN.
  5. Glance at the numbers. Do they make sense for the month? If you see zero invoices in B2B and you know you had partner bookings, something is wrong — stop and investigate.
  6. Click Download JSON. Save the file as GSTR1-FY26-04-Apr.json (any name — just be consistent).
  7. The JSON uses the GSTN v2 offline-utility schema — section names match (b2b, b2cl, b2cs, cdnr, hsn).

Reconcile against the sales register

Before uploading anything, sanity-check the GSTR-1 totals against your own numbers:

  1. Reports → GST Summary. Note the output CGST / SGST / IGST totals for the month.
  2. Open the GSTR-1 JSON. Sum the tax amounts across sections.
  3. These should match to the paise.

If they don't, most common causes:

  • An invoice was reversed mid-month and the reversal hasn't been approved yet.
  • A credit note was issued but marked as a different type (kind) and isn't landing in CDNR.
  • An invoice's POS code is different on Invoice vs SalesRegister view (data bug — raise a ticket).

Upload to GSTN portal (manual today)

  1. Open https://services.gst.gov.in/services/login and sign in as the filing user.
  2. Go to Returns Dashboard → select period → GSTR-1 → Prepare Offline.
  3. Download the GSTN offline utility (first time only — it's an MS-Access-based tool, Windows only).
  4. In the offline utility, click Import → pick the JSON file you downloaded from our app.
  5. The utility validates the JSON. If it flags errors (bad GSTIN checksums, missing fields), fix in our app, regenerate, re-import.
  6. Once clean, click Generate Summary in the utility.
  7. Upload the generated JSON via the portal's Upload page.
  8. File the return on the portal (digital signature or EVC).
  9. Download the filed acknowledgement receipt (ARN) and save it with the month-end files.

Save the filed JSON

Save the exact JSON you actually uploaded (not just the one our app generated). If the portal validator rejects something and you hand-edit the JSON to get it through, the hand-edited version is what matters for audit.

Your checklist for GSTR-1

  • [ ] Sales register for the month reviewed — no invoices missing.
  • [ ] JSON downloaded from our app.
  • [ ] Section totals match our GST Summary report.
  • [ ] JSON imported into GSTN offline utility — no validation errors.
  • [ ] Uploaded to portal, filed, ARN saved.
  • [ ] Filed JSON saved in the month-end folder.

Monthly GSTR-3B workflow

GSTR-3B is the summary return + the liability payment. Simpler data, but you actually pay tax here so get the numbers right.

Generate and download GSTR-3B

  1. Finance → Reports tab → GST ReturnsGSTR-3B.
  2. Select Month.
  3. The preview pane shows:
    • Section 3.1 — Output tax liability (CGST, SGST, IGST, Cess).
    • Section 4 — ITC available (CGST, SGST, IGST input credits).
    • Net liability — output minus ITC.
  4. Click Download JSON.

Reconcile against the ledger

  1. Open Reports → Trial Balance for the month.
  2. Output GST accounts (usually 2401 Output CGST, 2402 Output SGST, 2403 Output IGST): these balances should match GSTR-3B §3.1 totals exactly.
  3. Input GST accounts (1402 Input CGST, 1403 Input SGST, 1404 Input IGST): these should match GSTR-3B §4 ITC.
  4. Net liability (§3.1 minus §4) is what you are about to pay.

ITC mismatches are an audit flag

If your books show more ITC than what the portal's GSTR-2B (auto ITC statement from supplier's GSTR-1 filings) shows, you have an ITC mismatch. The portal will only let you claim the lower of the two. Document the difference; chase suppliers who haven't filed.

Pay the liability

  1. On the GSTN portal, go to Services → Payments → Create Challan.
  2. Enter the net liability amounts split across CGST / SGST / IGST.
  3. Generate challan (Form GST PMT-06).
  4. Pay via the portal (net banking / NEFT / counter payment).
  5. Once paid, the amount is available in the electronic cash ledger.
  6. Go back to GSTR-3B on the portal → Offset liability → select the challan → file.

Record the payment in our books

  1. Finance → Vouchers → Payment.
  2. Party: choose the GST account (or leave blank and use Journal).
  3. Debit: 2401 Output CGST, 2402 Output SGST, 2403 Output IGST (the output GST liability accounts, reducing them to zero for the month).
  4. Credit: 1402 Input CGST, 1403 Input SGST, 1404 Input IGST for the ITC you used.
  5. Credit: the bank account for the net cash paid to the portal.
  6. Memo: GSTR-3B filing, April 2026 — net paid via challan CIN-xyz.

Your checklist for GSTR-3B

  • [ ] JSON downloaded from our app.
  • [ ] §3.1 totals match Output GST ledger balances.
  • [ ] §4 ITC matches Input GST ledger balances.
  • [ ] GSTR-2B downloaded from portal, compared against our ITC, any mismatches documented.
  • [ ] Challan generated and paid on portal.
  • [ ] Liability offset and return filed on portal. ARN saved.
  • [ ] Payment recorded in our books — output GST and input GST ledgers zeroed out for the month.

What the app does vs what's manual

Task App does it? Notes
Capture GSTIN on parties Yes Customer / Supplier / Agent all have gstNumber.
Capture HSN/SAC on invoice lines Yes Required for GSTR-1 HSN section.
Validate GSTIN shape Yes isValidGstin() — shape check only, not checksum.
Generate GSTR-1 JSON Yes Sections B2B, B2CL, B2CS, CDNR, HSN.
Generate GSTR-3B JSON Yes Simple liability + ITC summary.
Validate GSTIN checksum No GSTN portal's job at upload.
Reverse-charge handling Partial Basic flag only.
Exports section Stubbed Only a placeholder.
Direct upload to GSTN portal No Stubbed until production credentials arrive — see gst.md.
Download offline utility compatible JSON Yes This is how you file today.

Reconciliation — does GSTR-1 sum = our GST summary?

The sanity check

After generating GSTR-1:

Sum of taxable values across all sections   = Reports → GST Summary → Total Taxable
Sum of CGST + SGST + IGST across all sections = Output GST ledger totals

If they match to the paise, you're clean.

Common causes of mismatch

  1. Reversals not yet approved. A reversed invoice still shows in the sales register but shouldn't be in GSTR-1. Check Approvals tab.
  2. Credit notes posted outside the month. If an invoice from March has a credit note dated April, it lands in April's CDNR section. Check credit note dates.
  3. Place-of-supply mismatch. The POS on the invoice vs the POS derived from the party can differ if you changed a party's state mid-month.
  4. Rounding. Per-invoice rounding in the JSON can accumulate. A difference of under ₹5 per 100 invoices is typically rounding; bigger differences are real.

If you can't find the discrepancy

  1. Export both the sales register and the GSTR-1 JSON.
  2. Walk through invoice-by-invoice. For each invoice:
  3. Does it appear in the GSTR-1?
  4. In which section?
  5. Does the taxable value and tax split match?
  6. The first row where they disagree is your bug. Fix it (edit the invoice or post a correcting journal), regenerate GSTR-1, re-check.

See also