Every GST invoice you issue is either CGST plus SGST, or IGST. It is never both, and which one applies is decided by a single comparison: your state against the place of supply. Get it wrong and the tax total is still right, but it is sitting in the wrong heads, which is visible in your return, and useless to a B2B buyer trying to claim the credit.
The rule
Your state is a setting. Enter your GSTIN and BillNest fills the state in for
you from its first two digits, 27AAPCU0939F1Z1 is Maharashtra, but the field
stays editable, and the setting is what the comparison actually runs on,
not the GSTIN. If the two ever disagree, every invoice you issue splits the
wrong way. It is worth one look in Settings before you switch automatic
generation on.
Then:
- Same state → the supply is intra-state. The rate splits in half: an 18% item becomes 9% CGST plus 9% SGST.
- Different state → inter-state. The same 18% stays whole, on a single IGST line.
The merchant collects the same amount either way. What changes is which government it belongs to and, for a registered buyer, which credit pool they can use it from.
Which address decides it
This is where Shopify orders get interesting, because an order can carry three different states. BillNest takes the first of these that exists:
- The state code in the buyer's GSTIN, when one was captured at checkout.
- The shipping address state.
- The billing address state.
- Your own state, as a fallback, which makes the supply intra-state.
The order of the first two is the part worth understanding. If a registered buyer in Karnataka gives you their GSTIN but ships the goods to a warehouse in Maharashtra where you are also based, the supply is still inter-state and charged IGST. The GSTIN's state wins because the recipient of the supply is the registered entity, not the delivery dock. Charging CGST and SGST there would hand them a credit they cannot use.
The fallback at step 4 is a fallback, not a default. It only applies when an order has no buyer GSTIN, no shipping state and no billing state, which for a real Shopify order is rare.
What it looks like on the document
The same store, two orders. The first went to a buyer in its own state:

The second went to Tamil Nadu, and also carries compensation cess:

Two things to note on the second. IGST is one line at the full rate, there is no half-split to make. And cess is not GST: compensation cess applies to a specific list of goods on top of whatever GST rate they carry, and it appears as its own line in the summary and its own column in your return. Aerated drinks are the textbook case.
Exports, SEZ and the composition scheme
Three cases sit outside the intra-against-inter comparison:
- Exports and SEZ supplies are zero-rated. The place of supply is recorded
as
96, Other Country, and under a LUT or bond no tax is levied at all. If you instead export on payment of IGST, full IGST is charged and reclaimed as a refund later; that is a choice you make once and configure, not per order. - Reverse charge supplies move the liability to the recipient. You do not collect the tax; the invoice says so on its face.
- The composition scheme charges no tax at all, and the document is a Bill of Supply rather than a tax invoice. See GST invoices on Shopify.
Getting it wrong, and fixing it
The two failures look different:
Wrong place of supply on an issued invoice. Correct the setting first, then the route depends on the state of the document:
- Not yet filed, no IRN, no notes against it, regenerate it. It recomputes in place and keeps its number, pinned to the GSTIN that issued it. Cancelling works too, and frees the order to be invoiced again.
- The period is already filed. It can be neither regenerated nor cancelled. Issue a credit or debit note for the difference instead.
- It carries an IRN, cancel or amend it on the e-invoice portal, not here.
Do not raise the note first on a document you could still regenerate. A credit or debit note against an invoice blocks both regenerating and cancelling it, so you would have to cancel the note again to get back to the simple fix.
Missing permissions. If BillNest is missing a Shopify permission it was granted at install, it cannot see which location fulfilled an order, so orders fall back to your default GSTIN. On a multi-GSTIN store that means the wrong registration, the wrong split and the wrong number series, all at once, and all on documents you will file. The app raises this as a critical banner rather than carrying on quietly; re-approve when you see it.
Tax-inclusive pricing is not a failure, just a thing to know: whether a
line's price includes tax is read from the order's own taxes_included flag,
not from a shop setting that might have changed since. An invoice reflects how
the order was actually priced.
Checking your own setup
Generate one invoice for a local order and one for an order from another state, and read both. If the local one shows two tax lines at half the rate and the distant one shows a single IGST line at the full rate, the comparison is working, which is most of GST invoicing correct in one check.
BillNest is on the Shopify App Store. The free plan issues 50 invoices a month, which is more than enough to test both cases.
