Free Shopify store auditSpeed, SEO and conversion leaks — no cost, no obligation.
Claim it
Thriftizer Solutions LLPShopify Select Partner
Book a Growth Audit
Shopify Oct 21, 2026 11 min read

GST Invoices on Shopify: HSN Codes, Place of Supply and B2B GSTIN

Shopify prints an order confirmation, not a tax invoice. Here's the build: GSTIN capture at checkout, HSN in a product metafield, CGST/SGST versus IGST, credit notes and where e-way bills go.

GST Invoices on Shopify: HSN Codes, Place of Supply and B2B GSTIN

Shopify will not print a GST-compliant tax invoice. It prints an order confirmation. That document is missing the things a GST officer and your buyer's accountant care about: your GSTIN, a sequential invoice number tied to a financial year, HSN per line item, the place of supply with its state code, and the tax split into CGST plus SGST or IGST. So a working GST invoice setup on a Shopify store in India is always a stack: Shopify holds the order and the tax calculation, an invoicing app or your accounting system issues the actual document, and e-way bills happen somewhere else entirely. The build is about getting clean data into Shopify so the document downstream comes out right the first time.

Here is how we wire it, in the order we usually do it.

What a GST invoice needs that a Shopify order confirmation doesn't carry

Compare the two side by side once and the gaps are obvious. A tax invoice needs the supplier's name, address and GSTIN; a unique invoice number from a series that is consecutive within the financial year; the invoice date; the recipient's name and address; the recipient's GSTIN where they're registered; HSN code per item at the digit length your turnover band requires; taxable value per line; the rate and amount of each tax head; the place of supply with state code when it's an inter-state supply; and a signature or digital signature.

Shopify's order page has roughly half of that. It has no field for HSN, no concept of place of supply as a legal construct, no invoice series separate from the order number, and no credit note. Everything after this section is about filling those holes without making your checkout worse.

Capturing a GSTIN at checkout without hurting conversion

The common mistake is putting a GSTIN field on the checkout for every buyer. On a D2C store where nine out of ten orders are a single consumer paying by UPI, a mandatory extra field is pure friction, and on low-bandwidth mobile it's an extra render and an extra chance to abandon.

Make it opt-in. A checkbox labelled something like "I need a GST invoice (business purchase)" that reveals a single field when ticked. Since checkout.liquid was retired, the supported way to do this is a checkout UI extension, delivered either by an invoicing app you've installed or by a custom app you build. One caveat worth knowing before you plan: hard validation that actually blocks the buyer from completing checkout on a malformed GSTIN is a Plus-level capability in practice. On other plans, validate what you can inside the field and re-check before the invoice is issued.

What to validate:

  • Fifteen characters: two-digit state code, ten-character PAN, one entity number, the letter Z in position fourteen on most registrations, one check character. A regex catches 95% of typos.
  • The state code against the billing state. A GSTIN starting 27 with a Karnataka billing address isn't automatically wrong, but it is a bill-to/ship-to case and the place of supply then follows the registered buyer, not the delivery address. Flag it for a human.
  • The legal name. If the buyer types their trade name and you print that, their input tax credit still works, but they will email you about it.

Store the value in two places: as an order attribute so the invoice tool can read it, and as a customer metafield so a repeat buyer isn't retyping fifteen characters on a phone. For companies that order monthly, that single bit of plumbing removes most of your invoice-correction tickets.

HSN codes live in a product metafield, not a spreadsheet on someone's laptop

Create a metafield definition at product level — namespace custom, key hsn_code, type single line text. Text, not number. Several HSN codes start with a zero and a number field will eat it.

Put it at variant level only where variants genuinely differ, which is rarer than people assume. Sizes of the same shirt share a code. A "with gift box" variant might not.

How many digits you need depends on your turnover band: six digits once you're past the ₹5 crore mark, four below it for B2B supplies. Fill six everywhere anyway. It costs nothing now and saves a catalogue-wide backfill the year you cross the threshold.

Bulk-populate through the admin bulk editor for a small catalogue, or a CSV import for anything over a few hundred SKUs. Then make the metafield visible on the product form for your merchandising team, because the real failure mode isn't the initial load, it's the 200 SKUs added during the festive ramp with the field blank. Add a check to your product-launch checklist and audit it monthly with a filtered view.

CGST and SGST or IGST: place of supply decides, and Shopify only half knows

For goods, the place of supply is where the movement ends for delivery to the buyer. Ship from Bengaluru to a Bengaluru address and it's intra-state: CGST plus SGST, half the rate each. Ship from Bengaluru to Pune and it's inter-state: IGST at the full rate. Union territories swap SGST for UTGST. Shopify handles this part natively once your store address state is set, applying the split based on the shipping address, with per-collection overrides for the different rate bands.

It breaks the moment you hold stock in two states. Shopify calculates from one store address. If you dispatch a Mumbai order from a Bhiwandi 3PL and a Delhi order from a Gurugram warehouse, the supplier GSTIN, the intra-versus-inter determination and the invoice series all change by fulfilment location, and Shopify will not do that for you. The fix is to pass the assigned location to whatever issues the invoice, and let that system pick the right GSTIN. If your invoicing app can't do multi-GSTIN, you've outgrown it.

The second thing to watch is price-banded rates. Apparel has long been rated by value per piece, and that threshold has moved before. If you've hard-coded a collection-based override around a specific rupee figure, check the current notification rather than trusting a setting someone configured two budgets ago. Also decide, deliberately, whether a discount that pushes a garment under the threshold changes its rate — your CA has an opinion and it should be the one in the code.

Tax-inclusive pricing and the arithmetic your invoice has to show

Indian buyers expect the price on the product page to be the price they pay. So turn on "All prices include tax" in Shopify's tax settings and quote MRP-style. The invoice then has to work backwards.

Take a ₹1,499 product at 18%. Taxable value is 1499 ÷ 1.18 = ₹1,270.34. Tax is ₹228.66. Intra-state, that prints as CGST ₹114.33 and SGST ₹114.33. Inter-state, one IGST line of ₹228.66. Add the two halves back: 114.33 + 114.33 + 1270.34 = ₹1,499.00. It ties.

Where it stops tying is rounding. Shopify rounds per line; most accounting systems round the tax total per invoice and add a round-off line. On a ten-line order you can land a rupee apart, and that one rupee is what your finance team spends a Tuesday on during reconciliation. Pick one method, make the invoice tool match it, and tell your CA which you chose.

Shipping charges carry GST too, at the rate of the goods being shipped on a composite supply. Free shipping has no tax line, which is one more reason to just build it into the price.

Invoice numbering, COD, and when the invoice is actually raised

Your Shopify order number is not an invoice number. Orders cancel, orders fail payment verification, orders sit unfulfilled for four days during Diwali. A GST invoice series has to be consecutive within the financial year and reset on 1 April, and you cannot leave silent gaps in it.

So raise the invoice at dispatch, not at order placement, and keep the series separate — something like INV/25-26/00412 against Shopify order #10342. Map the two in the order's metafields so support can answer "where's my bill" without opening the accounting system.

COD changes nothing about the tax point. Liability arises on supply, not on the rider collecting cash. The invoice goes in the box at dispatch like any other order. What COD does change is your credit note volume, which is the next section.

Credit notes for returns and RTO

A refund in Shopify is a payment event. It is not a GST document. If you invoiced a shipment and the parcel comes back refused, or the customer returns it after delivery, you issue a credit note under section 34, link it to the original invoice number, and report it in your GSTR-1. There's a deadline: the credit note has to be declared by 30 November following the end of that financial year, or the date you file the annual return, whichever comes first. December returns from an October festive order are fine. A March return from the previous year's Diwali is not, and you eat the tax.

For RTO specifically, split the two cases. Undelivered and returning to origin: the goods never reached the buyer, and your process should cancel or credit-note cleanly, with return movement documented on the carrier's side. Delivered and then returned: credit note, full stop. With COD refusal rates where they are on cash orders, this is not an edge case, it's a weekly batch job. Automate the credit note generation off the Shopify refund webhook or you will be doing it by hand in March.

E-way bills, and why they will never happen inside Shopify

An e-way bill is required when consignment value crosses ₹50,000, with intra-state thresholds that vary state by state — several states set a higher floor for movement within the state. Most single D2C parcels sit well under that, which is why a lot of merchants never touch the system.

Where it bites:

  • Stock transfers. Moving inventory to a 3PL before the festive peak is a movement of goods and usually well over the threshold.
  • High-ticket orders. Electronics, furniture, bulk B2B. One order, one bill.
  • Return legs. A returning consignment above the threshold needs its own document.

One useful exemption: goods under Chapter 71 — jewellery and goldsmiths' wares — sit outside the e-way bill requirement, which saves the jewellery trade a great deal of paperwork on exactly the orders that would otherwise need it.

Mechanically, you fill Part A with invoice and consignment detail; the transporter fills Part B with the vehicle number. Delhivery, Blue Dart and the carriers behind Shiprocket handle Part B as a matter of course on bulk movements. Generation happens on the e-way bill portal or through a GSP's API from your accounting system. Nothing on Shopify produces one, and no app on the App Store makes that true. Plan for it to live in the ERP.

Picking a GST invoice app for an India store, or skipping straight to accounting software

There are several India-specific invoicing apps on the Shopify App Store and most handle the basic case well: pull the order, apply CGST/SGST or IGST, print a PDF, email it. If you're a single-GSTIN B2C brand under ₹5 crore, that's genuinely enough, and we'd tell you to spend the money on page speed instead of a heavier stack.

Check four things before you commit:

  • Does it read HSN from your product metafield, or does it expect its own separate catalogue you now have to maintain twice?
  • Multiple GSTINs and separate invoice series per state. Ask directly. Many don't.
  • Credit notes linked to the original invoice, generated from a Shopify refund.
  • Exports your CA can actually use — B2B and B2C summary tables plus an HSN summary, not just a folder of PDFs.

Past roughly ₹5 crore, or once B2B is a real share of revenue, the invoice should come out of Zoho Books, Tally or a similar system with Shopify feeding it through a connector. That's also where e-invoicing lives: once you're required to report B2B invoices to the IRP and carry an IRN and QR code, you need a GSP integration and a reporting habit, because larger taxpayers face a hard window between invoice date and reporting. Monthly batching stops working. If the connector doesn't exist for your combination, a small custom middleware app is usually cheaper than the manual process it replaces — that's the kind of job we scope under Shopify app development.

B2B orders: what changes on the build

Shopify's native B2B — company profiles, locations, price lists, net terms — is Plus-only. It gives you a clean place to store a company's GSTIN as a company-location metafield, so it's attached to the account rather than retyped per order. Below Plus, the workable pattern is tagged customers plus draft orders, with the GSTIN on a customer metafield and copied onto each draft.

Either way, Shopify still doesn't produce the invoice. What B2B changes is how much the invoice matters: your buyer's input tax credit depends on you filing that GSTIN correctly in GSTR-1. Get a digit wrong and they can't claim it, and you'll hear about it the following month. If you're weighing the upgrade purely for this, it isn't worth it on its own — we go through the actual threshold in our note on when Plus starts paying for itself.

The order we build it in

  1. HSN metafield defined and backfilled across the catalogue, six digits.
  2. Tax settings: store state correct, prices inclusive, collection overrides matching each rate band, verified against a real order to each of an intra-state and an inter-state address.
  3. GSTIN capture at checkout, opt-in, validated, stored on both order and customer.
  4. Invoice tool or accounting connector configured with the right series, financial-year reset, and multi-GSTIN if you have more than one.
  5. Credit note automation on the refund webhook.
  6. E-way bill process documented for stock transfers and high-value orders, owned by a named person in operations.

Steps one and two take a day. Step three takes longer than anyone budgets for, because validation edge cases are where the time goes. We get the bill-to/ship-to handling wrong on the first pass more often than we'd like, and only catch it when a Maharashtra-registered buyer ships to their Hyderabad site.

If you're going into a festive quarter with GST invoicing held together by a spreadsheet and a part-time accountant, the time to fix it is August, not the week of Dhanteras. Send us the store and we'll tell you which of the six steps above are actually broken — that's what a free audit covers.

Previous postNext post

Ready to scale your D2C brand profitably?

Let's build a growth engine that drives more traffic, more conversions and more profit.

Book a Growth Audit
📅 Free Audit💬 WhatsApp