GST Compliance Cheatsheet for SaaS Billing Engineers
For: A backend or billing engineer at a mid-stage Indian SaaS company who has just been handed a Zoho/Stripe billing integration and told to 'make it GST-compliant' — with no accountant in the room and a launch date in two weeks
For SaaS sold in India, place of supply is the billing address of the recipient, not your server location or your registered state. That single rule decides whether you charge IGST or CGST+SGST, and getting it wrong on inter-state B2C invoices is the most common billing bug in Indian SaaS. This cheatsheet maps the GST rules you need — invoice fields, tax splits, thresholds, reverse charge — to the decisions in your billing code. No accountant required to read it.
Not legal advice. Rules current as of the latest CGST notifications; confirm edge cases with a CA before go-live.
1. The one rule that drives everything: place of supply
SaaS is treated as an Online Information Database Access and Retrieval (OIDAR) service under GST when delivered over the internet with minimal human intervention. Place of supply is governed by Section 12 (domestic) and Section 13 (cross-border) of the IGST Act.
| Scenario | Place of supply | Tax applied |
|---|---|---|
| Seller in Karnataka, buyer billing address in Karnataka | Karnataka | CGST 9% + SGST 9% |
| Seller in Karnataka, buyer billing address in Maharashtra | Maharashtra | IGST 18% |
| Seller in India, buyer outside India, payment in forex | Outside India | Zero-rated export (LUT) or IGST refundable |
| Seller in India, buyer outside India, payment in INR | Not an export | IGST 18% |
| Unregistered B2C buyer, no address on record | Location of supplier | CGST + SGST |
SaaS falls under HSN/SAC 998434 (software downloads/online) or 997331 (licensing) at 18%. Confirm the SAC with your CA — it affects reporting, not the rate.
2. B2B vs B2C: the field-level split
You need to know the buyer type before generating the invoice, because required fields differ.
| Field | B2B (registered GSTIN) | B2C |
|---|---|---|
| Buyer GSTIN | Mandatory, must validate | Not applicable |
| Buyer legal name | Must match GSTIN record | As provided |
| Buyer state code | From GSTIN (first 2 digits) | From billing address |
| Invoice serial | Unique, sequential, ≤16 chars per series | Same |
| HSN/SAC | 6 digits (turnover > ₹5 Cr) or 4 digits | Same rule |
| Reverse charge flag | Yes/No — usually No for SaaS | N/A |
| E-invoice IRN + QR | Mandatory if turnover > ₹5 Cr | QR only, no IRN |
| Signature | Digital signature or physical | Same |
GSTIN validation logic
- Format:
^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$ - First 2 digits = state code. This overrides the billing address for tax determination on B2B invoices.
- Use the GSTN public API (
api.gst.gov.in) or a licensed aggregator to verify active status. Cache for 24 hours, not longer — GSTINs get suspended.
3. Tax split decision tree (for your billing code)
if buyer.gstin:
pos_state = buyer.gstin[:2]
else:
pos_state = buyer.billing_address.state_code or seller.state_code
if buyer.country != "IN":
if payment_currency == "INR":
apply IGST 18%
else:
apply zero-rated (requires LUT filed)
elif pos_state == seller.state_code:
apply CGST 9% + SGST 9%
else:
apply IGST 18%4. E-invoicing threshold and IRN flow
Mandatory for B2B invoices when aggregate turnover in any preceding FY from 2017-18 onward exceeded ₹5 Cr.
- Applies to: B2B, exports, credit notes, debit notes.
- Does not apply to: B2C invoices (but dynamic QR is required if turnover > ₹500 Cr).
- Flow: generate JSON → POST to IRP (NIC or private) → receive IRN + signed QR → embed both on PDF → then push to GSTR-1.
- Cutoff: IRN must be generated within 30 days of invoice date for turnover ≥ ₹100 Cr. Under that, no hard cutoff yet but treat it as same-day.
5. Reverse charge — when it hits SaaS
Forward charge is the default. Reverse charge triggers you actually need to handle:
- Import of services: you're an Indian buyer paying a foreign SaaS (AWS, Slack, Stripe fees). You pay IGST under RCM, then claim ITC. Not relevant to your outbound invoices, but relevant to your AP module.
- Services from unregistered vendor to registered buyer — narrow list, rarely applies to SaaS.
- If you sell SaaS domestically B2B, RCM flag on your invoice is almost always
No.
6. Credit notes, refunds, and proration
- Refunds and downgrades require a credit note with reference to the original invoice number and date.
- Credit notes must be issued by 30 November following the FY of the original invoice, or by the date of filing the annual return — whichever is earlier.
- Proration for mid-cycle upgrades: treat as a fresh taxable supply on the incremental amount, not an amendment.
- Do not net off refunds against new invoices. Separate documents.
7. Invoice numbering rules that break audits
- Sequential, per financial year, per series. Reset every 1 April.
- Max 16 characters. Alphanumeric, hyphens, and slashes allowed. No spaces.
- If you run multiple series (e.g.,
INV/,EXP/,CN/), each must be independently sequential and disclosed in GSTR-1. - Do not reuse numbers even after cancellation. Cancel + issue new.
8. Common bugs I've seen in production billing engines
- Applying seller-state CGST+SGST to inter-state B2C. A Bangalore-registered SaaS charging Karnataka split to a Mumbai consumer. Legally requires IGST. Fix: derive POS from billing state, not seller state.
- Trusting GSTIN state code against billing address without reconciliation. If they mismatch, log it and use the GSTIN state — but flag for review, because it often signals a wrong GSTIN paste.
- Charging INR to a foreign buyer as zero-rated. Zero-rating requires forex or an LUT-covered INR receipt from a Vostro account. Default INR receipts are taxable at 18%.
- Missing the reverse-charge self-invoice for imported SaaS you consume. GSTR-3B will not reconcile.
- Rounding at line level instead of invoice level. Rule 34 requires rounding at the invoice total, not per line item.
9. Field-by-field invoice checklist
| Field | Mandatory |
|---|---|
| Supplier name, address, GSTIN | Yes |
| Invoice number and date | Yes |
| Recipient name, address, GSTIN (if registered) | Yes |
| Place of supply + state code | Yes for inter-state |
| HSN/SAC | Yes |
| Description, quantity, unit | Yes (quantity often "1" for subscriptions) |
| Taxable value, rate, amount (CGST/SGST/IGST separately) | Yes |
| Whether tax is on reverse charge | Yes |
| Signature / DSC | Yes (auto-fulfilled by IRN QR for e-invoices) |
| IRN + signed QR | If e-invoicing applies |
10. What Zoho, Stripe, and Chargebee actually handle
- Zoho Books / Subscriptions: full GST support, IRN generation via NIC integration, GSTR-1/3B exports. Weakest on custom credit note logic.
- Stripe: does not natively handle Indian GST invoicing (no IRN, no state-level POS logic). You need Stripe Tax + a downstream invoice engine, or a plugin like Recur Grow / Stripe-to-Zoho sync.
- Chargebee: Indian GST module works, but you configure POS rules and jurisdiction mappings yourself. Test the B2C inter-state case before launch.
Teams building custom billing on top of Stripe usually end up writing their own GST layer — invoice numbering, POS derivation, IRN push, credit note tracking. If you'd rather not, that's the kind of work fintech-heavy engineering teams like the one behind GimBooks spend their days on.
Frequently Asked Questions
Do I need to charge GST on SaaS sold to a customer outside India?
Only if you receive payment in INR without an LUT covering that receipt. Payment in convertible foreign exchange (or from a Vostro account under LUT) qualifies as zero-rated export of services. You still issue an invoice — just without tax — and file it under Table 6A of GSTR-1.
What tax do I charge if a customer gives me a GSTIN from a different state than their billing address?
Use the GSTIN's state code (first two digits) as the place of supply for B2B. That determines whether it's IGST or CGST+SGST. Log the mismatch and flag the record — it's a common signal of a mistyped GSTIN, and correcting it after the invoice is filed in GSTR-1 requires an amendment.
Is e-invoicing (IRN) mandatory for my SaaS company?
Yes, for B2B invoices, if your aggregate turnover in any FY from 2017-18 onward crossed ₹5 crore. B2C invoices don't need an IRN but need a dynamic QR if turnover exceeds ₹500 crore. Check the latest CBIC notification before assuming your threshold — the limit has been lowered multiple times.
How do I handle GST on annual subscriptions that span two financial years?
GST is chargeable at the time of supply — earlier of invoice date or payment receipt. For an annual upfront invoice, the entire tax is due in the month of invoicing, regardless of the service period. Refunds mid-year are handled via credit notes referencing the original invoice.
Can you help us build or audit a GST-compliant billing engine?
Yes. For scope, integration complexity, and delivery estimates specific to your stack, contact CodeNicely for a personalized assessment. We can share reference architectures from prior fintech and SaaS billing builds.
Found this useful? CodeNicely publishes engineering and product playbooks weekly. Browse the archive or tell us what you're building.
_1751731246795-BygAaJJK.png)