GST Compliance Cheatsheet for SaaS Products Serving Indian SMBs
For: A Series A SaaS founder whose product invoices Indian SMB customers and whose finance lead just flagged that their billing engine is generating non-compliant GST invoices for interstate B2B sales — 6 months after launch
If your SaaS billing engine treats GST as a single tax rate applied at checkout, it is generating invoices that block your B2B customers from claiming input tax credit (ITC) — and ITC-blocking invoices are the fastest way to lose an Indian SMB customer. GST on SaaS branches on four axes simultaneously: B2B vs. B2C, interstate vs. intrastate, registered vs. unregistered supplier, and whether the customer intends to claim ITC. Miss one branch and the invoice is non-compliant. This cheatsheet is the mapping between what a CA will demand and what your engineers actually need to build.
The four axes your billing engine must branch on
| Axis | Determined by | Impact on invoice |
|---|---|---|
| B2B vs. B2C | Presence of valid customer GSTIN | Invoice format, GSTIN field, ITC eligibility |
| Interstate vs. intrastate | Place of supply vs. supplier state | IGST (single line) vs. CGST + SGST (split) |
| Registered vs. unregistered supplier | Your annual turnover and voluntary registration | Whether you charge GST at all |
| Domestic vs. imported service | Supplier location | Triggers reverse charge on the customer |
Tax split: interstate vs. intrastate
SaaS is a service. Place of supply for B2B services is the recipient's registered location (GSTIN state). For B2C, it is the recipient's address on record.
- Intrastate (supplier state = place of supply): charge CGST + SGST, each half the total GST rate. Standard SaaS rate is 18%, so 9% CGST + 9% SGST.
- Interstate (supplier state ≠ place of supply): charge IGST at the full 18%.
Your billing engine needs the supplier's registered state as a constant and the customer's place of supply as a per-invoice field. Do not infer place of supply from billing address alone for B2B — use the state code from the validated GSTIN (first two digits).
Minimum fields on a compliant tax invoice
Per Rule 46 of the CGST Rules, every B2B tax invoice must contain:
- Supplier name, address, GSTIN
- Sequential invoice number (unique per financial year, ≤16 chars, alphanumeric + hyphen/slash)
- Date of issue
- Recipient name, address, GSTIN, state, state code
- HSN or SAC code (SAC 998314 for IT software services is the common one for SaaS)
- Description of service
- Taxable value and discount
- Rate and amount of CGST/SGST or IGST — shown separately
- Place of supply (with state name) — mandatory for interstate
- Whether tax is payable on reverse charge
- Signature or digital signature of supplier
For B2C invoices where the value exceeds ₹50,000 to an unregistered recipient, name, address, and state of the recipient are also mandatory.
B2B vs. B2C invoice differences
| Field | B2B | B2C |
|---|---|---|
| Customer GSTIN | Required and validated | Not applicable |
| Invoice type | Tax Invoice | Bill of Supply / Tax Invoice |
| ITC claim by customer | Yes — invoice must be perfect | No |
| Reporting in GSTR-1 | B2B table (invoice-level) | B2C table (aggregated by state + rate) |
| E-invoice (IRN) applicability | Yes, if turnover threshold crossed | No |
The e-invoicing threshold has been progressively lowered. If your aggregate turnover crosses the current threshold (₹5 crore at the time of writing — verify current CBIC notification), you must generate an IRN via the IRP portal for every B2B invoice before issuing it. This is an API integration, not a PDF template change.
GSTIN validation — do not skip this
A GSTIN is 15 characters: 2-digit state code + 10-char PAN + 1-digit entity number + 1 default char + 1 checksum. Client-side regex is not enough. You need live validation because a syntactically valid GSTIN can be cancelled, suspended, or belong to a different legal name.
- Use a GSTIN validation API (KnowYourGST, Signzy, Cashfree, Setu, or the official GSTN public API via a GSP) at the point of customer onboarding and again on every invoice generation.
- Reject or flag invoices where the returned legal name does not match the customer's billing entity.
- Cache the validation response with a TTL — GSTIN status changes are not real-time critical, but a stale cache older than ~30 days is risky.
If you are building the underlying billing plumbing from scratch, look at how GimBooks handled invoice compliance as core product surface rather than a settings screen.
Reverse charge mechanism (RCM) on imported SaaS
This is the axis most foreign-headquartered SaaS founders get wrong. If your Indian customer is buying SaaS from a supplier outside India (or from an Indian entity without GST registration), the customer is liable to pay IGST under reverse charge under Section 5(3)/5(4) of the IGST Act.
- Your invoice must state: "Tax payable on reverse charge basis" and must not charge GST.
- The Indian customer self-declares the IGST in their GSTR-3B and claims ITC in the same return (net-zero cash impact, but a mandatory paper trail).
- If you are an Indian entity supplying to Indian customers, RCM generally does not apply — you charge GST normally.
- OIDAR (Online Information Database Access and Retrieval) rules apply to foreign SaaS selling to Indian unregistered customers — the foreign supplier must register in India and collect GST directly.
Common non-compliance patterns your CA is probably flagging
- Single tax line instead of CGST+SGST split for intrastate invoices. Blocks ITC.
- IGST charged on an intrastate transaction because place of supply logic wasn't wired up. Blocks ITC.
- Missing or wrong SAC code. Blocks ITC.
- Customer GSTIN not printed on invoice PDF even though it was collected. Blocks ITC.
- Invoice numbers not sequential or reset mid-financial-year in a non-compliant way. GSTR-1 filing rejects.
- No IRN when turnover crossed the e-invoicing threshold. Invoice legally invalid.
- Credit notes issued as fresh invoices. Breaks reconciliation on both sides.
Retrofit plan for a live billing engine
Order of operations, from lowest risk to highest:
- Add a compliance audit query that scans the last 6 months of invoices against the Rule 46 field list. This gives you the exact remediation universe.
- Introduce a place-of-supply resolver as pure function — supplier state, customer GSTIN state, customer type in; CGST/SGST/IGST breakdown out. Unit test it exhaustively before touching the invoice path.
- Wire in a GSTIN validation API with response caching. Backfill validation for existing customers.
- Update the invoice template: separate tax lines, SAC code, place of supply, reverse charge declaration where applicable.
- Issue credit notes against non-compliant invoices, then reissue compliant invoices with new numbers. Do not silently overwrite — GSTR-1 amendments have a specific workflow.
- If e-invoicing applies, integrate IRP (via a GSP like ClearTax, Masters India, or IRIS) before month-end.
Teams building or fixing this kind of billing plumbing often pair it with broader financial workflow work — see how we scope this kind of engagement or the India engineering hub if you need on-ground GST domain reviewers.
Frequently Asked Questions
Do I need to charge GST if my SaaS company is registered outside India?
If you sell to Indian B2B customers with a valid GSTIN, they typically discharge GST under reverse charge — you do not charge Indian GST but must mark the invoice accordingly. If you sell to unregistered Indian customers (B2C), OIDAR rules require you to register in India and collect GST directly. Get this reviewed by an Indian tax counsel before your first invoice.
What SAC code should I use for SaaS on my invoices?
SAC 998314 ("Information technology (IT) design and development services") or 998434 ("On-line text based information such as online books, newpapers, periodicals, directories") are commonly used, but the correct code depends on how your service is characterised. Most pure-play SaaS falls under 998314 or 997331. Confirm with your CA — using the wrong SAC is a common ITC-blocker.
Is GSTIN validation via regex enough?
No. Regex only confirms the format is plausible. It does not confirm the GSTIN is active, matches the legal name your customer entered, or belongs to the correct state. Use a live GSTIN validation API at onboarding and periodically thereafter, and store the returned legal name to reconcile against the billing entity.
What happens if a customer's ITC claim is rejected because of my invoice?
The customer loses 18% of the invoice value as an unrecoverable cost until you correct the invoice. In practice, they will demand a credit note and reissuance, delay payment, and escalate — and if the pattern repeats, churn. For an SMB customer, ITC loss on a recurring SaaS bill is a hard commercial trigger to switch vendors.
How long does it take and what does it cost to fix a non-compliant billing engine?
It depends on your invoice volume, the number of edge cases in your customer base (multi-state customers, SEZ customers, foreign customers, RCM cases), and whether e-invoicing applies. Contact CodeNicely for a personalized assessment scoped to your billing architecture and remediation universe.
Found this useful? CodeNicely publishes engineering and product playbooks weekly. Browse the archive or tell us what you're building.
_1751731246795-BygAaJJK.png)