Menu
Features

Shopify GST accounting features, shown by workflow.

GST-correct bookkeeping for a Shopify seller is genuinely fiddly: place of supply, B2B vs B2C, exports under an LUT, returns that shouldn’t net against sales, multiple GST rates in one day. Start with the path that matches your setup, then use the detailed sections to verify the edge cases and posting controls relevant to your books.

Ledgeree accounting illustration covering gift cards, payments and COD, returns, B2B and exports, mapping and reconciliation
GST accuracy

Get the tax treatment right first

Resolve place of supply, GST rates and product tax data before anything reaches the books.

GST place-of-supply & tax split

All plans

The core mechanic everything else builds on -- get this wrong and every downstream number is wrong too.

Ship-to state, not billing state

Place of supply for goods is the customer's ship-to state -- a gift order, a different delivery address on file, or a centrally-billed corporate purchase never changes this.

Per-fulfillment ship-from state

The seller-side state is resolved from the specific warehouse that actually fulfilled that order, not a single shop-wide constant -- a genuinely multi-warehouse seller gets the right split even when different orders ship from different states on the same day.

Same state -> CGST+SGST, different state -> IGST

Each half of the applicable rate for intra-state, full rate as IGST for inter-state -- computed per fulfillment, then grouped for posting.

Multiple GST rates within one state-day

A state's daily aggregate can span 5%, 12%, 18%, 28% items in the same day -- each rate gets its own Sales + CGST/SGST(or IGST) line-group within the one voucher, never blended into a single number.

Return dates and source tax treatment

Later returns remain dated accounting events. Their tax and location allocation follows the recorded source and configured return workflow.

Product mapping & GST rates

Configuring GST% shouldn't mean filling in a spreadsheet row for every SKU you sell.

Three-tier GST rate resolution

Set a shop-wide default GST rate, override it per Shopify product type, or override it per individual SKU -- resolved in that order, so you only configure exceptions, not every product.

HSN/SAC code per SKU

Mapped alongside each SKU so it can be included where the applicable invoice and reporting rules require it -- captured once per product, not re-entered per order.

Blocks, never guesses, on missing configuration

If a SKU truly has no resolvable GST rate (no per-SKU, no product-type, no shop default), the order is blocked with a clear error rather than posted at an invented rate.

See the output

Features are useful only when the accounting result is visible.

Switch scenario and presentation to see how tax, shipping and discounts become ledger lines.

Shopify input

₹1,000 gift-card product

Uses the configured Gift Card Liability account.

Accounting output

  • Gift-card liability ₹1,000
  • Separate from merchandise revenue
Special order types

Handle orders that cannot be blended together

Keep B2B, exports and returns visible in the accounting shape each workflow needs.

B2B orders & GSTIN handling

All plans

The moment an order carries a buyer GSTIN, it needs to become a completely different kind of invoice -- not a variant of the same one.

Full B2B deep dive
Configurable business names

Resolve the native B2B Company name, then shipping-address Company, with a configurable note-attribute or metafield fallback.

Keep manual B2B invoicing separate

Exclude B2B orders you invoice yourself. Disabling B2B party creation instead gives B2C treatment; it is not an existing-parties-only mode.

Three ways to capture a GSTIN

Shopify's checkout has no native GSTIN field -- Ledgeree reads it from a checkout note attribute, an order or company metafield, or Shopify's native B2B/Wholesale company (Shopify Plus), configurable per shop.

Matched by GSTIN, never by name

Customer names vary and typo across orders ("Acme Pvt Ltd" vs "ACME Private Limited") -- the one reliable identifier is the GSTIN, so party-ledger lookup is always keyed on it, checked before ever creating a new ledger.

Auto-created Sundry Debtor / Contact

The first order from a new B2B customer creates their dedicated ledger (name + GSTIN + state) on the fly -- idempotent, so a hundred repeat orders from the same customer never create a hundred ledgers.

Never folded into the B2C aggregate

B2B orders are excluded from the standard state-day gateway/website aggregate entirely and post against the customer's own ledger, preserving the GSTIN-linked party treatment needed for review.

One voucher per fulfillment, never aggregated

Unlike the B2C daily aggregate, every B2B fulfillment gets its own voucher -- so a tax-credit invoice always maps to exactly one real shipment, never a blended multi-order total.

Its own Sales / Sales Return ledger pair

B2B sales and returns post to dedicated ledgers, kept separate from ordinary retail Sales/Sales Return -- your B2C and B2B revenue never mix in one account.

Configurable GSTIN-source-not-enabled fallback

If auto-ledger-creation is switched off, a captured GSTIN is simply ignored and the order falls back to plain B2C -- a deliberate escape hatch, not a silent failure.

Export orders

All plans

Zero-rated, but not a simple 'set GST to 0%' toggle -- exports have their own invoicing rules and their own failure modes.

Full export deep dive
Automatic detection by ship-to country

Any order shipping outside India is treated as an export -- no manual flagging per order.

Zero-rated under your LUT, blocked without one

Every line item is posted at 0% GST regardless of its normal domestic rate -- but only once a valid LUT (Letter of Undertaking) number is configured; without one, the export order is blocked (not silently posted at the wrong rate).

LUT financial-year staleness handling

A LUT is filed per financial year and goes stale every April 1st. Ledgeree records which FY your LUT covers, blocks an export order whose FY doesn't match, and nudges you every January-March to file the next year's LUT before the current one expires.

One voucher per shipment, never aggregated

Like B2B, export orders are never folded into a daily aggregate -- a Shipping Bill (customs) is issued per physical shipment, so one voucher always maps to exactly one shipping bill, never several blended together.

Its own export Sales / Sales Return ledger pair

Kept out of your domestic Sales accounts entirely, same principle as B2B.

Shipping Bill number & port code, recorded after the fact

A Shipping Bill doesn't exist until customs actually clears the shipment, days after the order syncs -- so Ledgeree lets you record the Shipping Bill number, date, and port code against the already-posted voucher once you have them, for your Rule 46 compliance records.

Foreign-currency total captured for your records

When a customer is charged in a foreign currency, that currency and total are recorded alongside the INR figures your books actually need (already correctly converted by Shopify's own payment processing) -- so you have both figures on file without a manual note.

Skip toggle if you invoice exports manually

Don't want export orders synced at all? A single toggle excludes them from sync entirely, with no blocking errors generated for orders you've chosen to handle yourself.

Returns & credit notes

All plans

A return is not a reversal -- your books need to show what actually happened, when it happened.

Partial, repeated and shipping refunds

Handle partial goods returns, monetary-only refunds, repeated events and partial shipping refunds. Later credits respect remaining booked value; monetary-only refunds carry no inventory quantities.

Full and partial same-day returns

Before eligible same-day posting, fully returned value can be excluded and partial returns retain the remaining sale. Already-posted work follows the applicable correction path.

Next-day-or-later returns become real Sales Return vouchers

Posted as a separate return-date aggregate -- gross sales and returns stay visible on separate lines instead of being silently netted against the original entry.

Dedicated Sales Return ledger, never the Sales ledger

Later goods returns use the configured return accounting so gross sales and returns can be reviewed separately; assess both to understand net revenue.

Refunds follow the money back

For a split-payment order, Ledgeree uses the refund's successful Shopify transactions to reverse the clearing ledgers that actually funded the refund, including refunds spread across multiple fulfillments.

No-restock refunds are not treated as returned stock

When Shopify marks a refund as no-restock, Ledgeree can route the value through the configured goodwill write-off treatment instead of pretending inventory came back. Detailed Zoho behaviour should be verified in your own organisation during setup.

Cancelled fulfillments resync safely

A fulfillment cancellation triggers a pull-based order resync with an idempotency guard, so the changed shipment state is re-evaluated without creating duplicate accounting work.

Book structure

Choose how much accounting detail you need

Control party granularity, item-level posting and voucher numbering without changing the underlying tax logic.

Party ledger granularity

Optional

How finely your B2C sales get broken out by payment method or courier -- a bookkeeping-depth choice, not a correctness one.

Gateway and COD ledger deep dive
Single ledger (default)

Every B2C sale posts against one default party/clearing ledger -- simplest books, right for most sellers.

Per-gateway ledgers

Route B2C receivables to separate clearing ledgers for Razorpay, Shopify Payments, PayPal, COD and other gateways, keeping the books structured for subsequent settlement review.

Per-gateway + per-COD-courier clearing ledgers

COD receivables can be split again by the courier or tracking company collecting the cash. These are clearing ledgers, distinct from shipping-fee or delivery-expense ledgers.

Mixed payments stay split

When one Shopify order uses more than one payment method, Ledgeree preserves each successful amount instead of assigning the whole order to the first gateway. Returns reverse the successful refund methods in the same accounting structure.

Graceful fallback, never a blocked sync

An unmapped gateway or carrier falls back to the next level up (carrier -> gateway -> shop default) automatically -- routing granularity is a bookkeeping preference, never allowed to block a real sync.

Itemized billing (optional)

OptionalTally + Zoho

Choose aggregate rate-group accounting or itemized billing in Tally Prime and Zoho Books.

Off by default: one Sales figure per state/day/rate

The simplest, fastest-to-reconcile posting shape -- right for sellers who don't need per-product inventory tracking inside Tally itself.

On: every order line item becomes its own inventory line

Post SKU-level lines referencing Tally Stock Items or real Zoho Items. Inventory treatment follows the selected ERP and item setup.

Map and check your ERP items

Map SKUs to existing Tally or Zoho items. Add SKU mappings and use the read-only Tally stock-item check to identify missing names.

Choose whether missing items are created

Enable supported item creation explicitly: Tally Stock Items use Nos and Primary; Zoho items are created as tracked Goods. With creation off, missing required items must be resolved before posting.

Voucher numbering & multi-company

Configurable

Invoice sequences are expected to be gap-free and explainable -- not an accident of retry timing.

Shop defaults and company overrides

Configure defaults once, override by company, and maintain separate Sales and Credit Note counters per company. Custom numbers require the matching Tally numbering setting.

Tally's own auto-numbering, or an app-controlled sequence

Default lets Tally number vouchers itself; switch to app-controlled numbering for a custom prefix/suffix/padding and your own counter.

Monthly or financial-year counter resets

An app-controlled sequence can restart every calendar month or every FY (1st April) -- configurable per voucher type.

Numbering follows confirmed posting

Ledgeree advances its counter on confirmed posting. Review the numbering mode and Tally setup together; do not rely on a blanket gap-free guarantee.

Multi-company / FY-rollover routing

For sellers who create a new Tally company every financial year, vouchers route to the correct company automatically based on a configurable naming pattern -- no manual company-switching.

Multi-instance / multi-port Tally routing

Running more than one Tally instance (or company on different ports) on the same machine or network -- Ledgeree probes and posts to the right one automatically.

Connectivity & controls

Keep posting observable and recoverable

Connect the right accounting destination and surface problems before they become silent bookkeeping gaps.

Reliability & safety guards

Built in

The parts you never see until something would otherwise go quietly wrong.

Schedule, Resume and historical backfill

Choose a shop-timezone daily start, attempts and retry interval. Correct errors and Resume, re-sync eligible recent activity, or backfill up to 60 days subject to volume and pricing checks. Full push is a separate opt-in after clearing corresponding ERP entries.

Review in a separate Tally test company

Configure test and live companies. Test mode posts actual vouchers to the designated test company so you can review accounting before switching to live.

Tally connection without a public port

Ledgeree’s cloud service communicates with the local relay, which connects to Tally on your network. You do not need to expose Tally’s port publicly.

20% headroom and a clear upgrade path

Get an early warning at 80% and 20% headroom above your shipment allowance. Posting pauses above 120% until you choose a higher-capacity plan that covers usage. Capture continues for the first 60 days of that pause; Pricing explains delayed-upgrade charges and the reminder timeline.

Automatic retry with backoff, then a clear failure log

A failed push retries automatically; if it keeps failing, sync pauses and the real ERP error message is logged -- not just "something went wrong."

Reconciliation view

Compare expected Shopify accounting with recorded Tally or Zoho figures, including supported shipping, discount, tax, goodwill, gift-card and settlement-ledger checks. Itemized shops can also compare stock quantities. Bank deposits and payout matching remain separate.

Operational exceptions dashboard

See paid orders still unfulfilled beyond your configured window and failed Shopify refund transactions in one place. Ledgeree surfaces the exception; it does not guess the corrective action or silently create a journal entry.

ERP-master-aware ledger validation

Ledger and Stock Item choices can be checked against synced Tally or Zoho master data, reducing spelling drift and preventing a free-text mapping from quietly pointing at the wrong account.

Tally Prime or Zoho Books

Connection choice

One canonical order model, two very different ERPs underneath.

Compare integrations
Tally Prime: local Ledgeree Agent, no cloud API required

Tally has no cloud API of its own -- the Ledgeree Agent bridges your local Tally installation to Ledgeree's sync engine.

Zoho Books: direct cloud API, no local agent needed

Zoho's own REST API is called directly -- GST itself is computed by Zoho from each line's tax percentage, so the same canonical order model drives both adapters without duplicating tax logic.

Shared rules, ERP-specific output

Both integrations use the shared accounting model. Tally vouchers and Zoho invoices, credit notes, payments and inventory mechanisms represent that model differently.

The flow

From fulfillment to booked voucher

  1. 01

    Connect

    The Shopify App Store listing is pending. Contact Ledgeree about access, then choose Tally Prime or Zoho Books and pair the local Ledgeree Agent (Tally) or authorize your organisation (Zoho).

  2. 02

    Map once

    Tell Ledgeree which Shopify location maps to which warehouse/state, and your GST rates per product or product type. Most of this only needs setting up once.

  3. 03

    Ship orders as usual

    The moment an order is fulfilled, it's captured. Nothing posts on unfulfilled or pre-ship edits -- only what actually shipped.

  4. 04

    Wake up to booked vouchers

    Each day's shipments post as correctly GST-split vouchers in your books, with returns credit-noted separately -- ready for your accountant, not a pile of CSVs.

Don’t run Tally or Zoho at all?

Ledgeree Books is the standalone answer.

Sole proprietors and partnerships without any accounting software get a read-only daybook, a running GST-liability tracker, and a downloadable Shopify sales and GST-liability data for return preparation -- no Ledgeree Agent, no ERP required.

See Ledgeree Books
Questions

Frequently asked about the feature set

Does every Shopify order post immediately?+

Ledgeree captures fulfilment events and prepares the configured accounting result. Posting timing depends on the selected workflow, readiness checks, ERP availability and retry state.

Can shipping and discounts use separate ledgers?+

Yes. The posting presentation can keep shipping income and discounts allowed as separate lines while preserving the same taxable value and GST calculation.

What happens when configuration is incomplete?+

The affected work is blocked with a visible reason instead of guessing a GST rate, ledger, state or destination.

Do Tally Prime and Zoho Books behave identically?+

They share the same classification model, but their connection and posting adapters differ. Tally uses a local relay; Zoho Books uses its authenticated cloud API.

See it against your own orders.

A 7-day free trial is enough to watch a real day’s shipments post correctly.

Start free trial