New: two-way inventory sync across Zoho warehouses — see how it works
Inventory Sync

Two-Way Inventory Sync Between Shopify and Zoho

Keep Shopify and Zoho stock in lockstep with true two-way inventory sync. Choose a source of truth, sync per warehouse, and pick real-time, scheduled, or manual updates.

Why two-way matters for stock

Most connectors only push data one way, and for most record types that is exactly what you want. Inventory is the exception. Stock changes happen on both sides of a Shopify–Zoho setup, and they happen constantly. A sale on Shopify lowers available units the instant a customer checks out. Meanwhile a goods receipt, a stock adjustment, a transfer, or a manual recount in Zoho changes the same number from the other direction. If those two systems are not actively reconciled, they drift — and when they drift you either oversell stock you do not have or sit on phantom stock the storefront refuses to sell.

This is why inventory is the only flow Zync syncs in both directions. Product, order, and customer data all move one way, from Shopify into Zoho, because those records have a clear origin. Stock does not. The point of two-way inventory sync is to keep the number a customer sees at checkout aligned with what your warehouse actually holds, no matter which side the most recent change came from.

It sounds simple, but the moment you have more than one sales channel, more than one warehouse, or a busy sales period, the cracks show. The rest of this guide walks through the decisions that make two-way sync reliable rather than a source of new problems.

How Shopify and Zoho model stock differently

Shopify thinks about inventory as available to sell. Each variant has an inventory level per location, and that level ticks down with every order. Shopify's job is to protect the checkout, so its number is optimised for "can I sell this right now?"

Zoho Inventory thinks in accounting and operations terms. Stock lives in a warehouse, it moves through purchase orders, sales orders, transfers, and adjustments, and every change is part of a ledger you can audit later. Zoho's number is optimised for "what do I actually own, and where?"

Those are two valid but different views of the same physical units. A two-way connector has to translate between them without letting either side's assumptions corrupt the other. That translation is why you cannot just point both systems at each other and walk away — you have to tell the connector which view is authoritative and where each number belongs. The two decisions that follow, source of truth and location mapping, are precisely about that.

Product sync and inventory sync are not the same thing

A common early mistake is to treat "sync my products" and "sync my stock" as one task. They are separate, and they behave differently.

  • Product sync creates and maintains the item *record* in Zoho — the title, description, price, SKU, barcode, weight, tags, and image, plus the variant structure. A multi-variant product becomes a Zoho Item Group with each variant as an item inside it; a single-variant product becomes a standard item. This flow runs one way, Shopify to Zoho, and it stores the Zoho item id back on the Shopify product so re-syncs never create duplicates. See product sync or the deeper write-up on variants and item groups.
  • Inventory sync moves only the stock quantity for items that already exist on both sides. This is the flow that runs in both directions.

The practical sequence is: run product sync first so the items exist in Zoho and are linked by item id, then turn on inventory sync to keep quantities aligned. Inventory sync needs that link — it matches on the identity product sync established (and Zync can also auto-match existing Zoho items by SKU, barcode, or name during product sync). Trying to sync stock for an item Zoho has never heard of has nothing to attach the quantity to.

Pick a source of truth — and why one authoritative side matters

Two-way does not mean "let both systems fight." It means changes can originate on either side, but one side is authoritative when there is a conflict. You choose which:

  • Zoho to Shopify (the default) — Zoho Inventory owns the stock number. This is the right choice when a warehouse or operations team manages stock in Zoho through receipts, adjustments, and transfers, and the storefront should simply reflect what the warehouse holds. Most merchants who run real fulfilment operations land here.
  • Shopify to Zoho — Shopify owns the stock number. This fits storefront-led businesses where stock is actively managed in Shopify and Zoho is mainly there for books and reporting.

Why does picking a single authoritative side matter so much? Because stock is a single physical quantity, and two systems both believing they are in charge will overwrite each other in a loop. Imagine Zoho says 40 units and Shopify says 38 after a sale; if both are authoritative, each sync round flips the number back, and you never converge. Designating one source of truth breaks that tie permanently — the authoritative side sets the number and the other side accepts it. That single decision is the foundation everything else rests on, so make it deliberately before you turn sync on, not after you notice numbers bouncing.

A useful test: ask where a staff member goes today to answer "how many do we have?" If the honest answer is the Zoho warehouse screen, keep the Zoho-to-Shopify default. If it is the Shopify admin, choose Shopify-to-Zoho.

Sync per warehouse, not in aggregate

Stock is meaningless without a location attached. Before inventory sync can run, every Shopify location must be mapped to a Zoho warehouse, so each update lands in the right place. A two-location store collapsed into one shared number will always look wrong somewhere — you will show stock that is actually sitting in the wrong city.

Zync maps each Shopify location to a specific Zoho warehouse. There is a Map All Locations shortcut to wire them up quickly, and Zync can auto-create Zoho warehouses from your Shopify locations if they do not exist yet. One thing to know up front: holding stock in more than one warehouse requires Multi-Warehouse enabled in Zoho — without it, Zoho only supports a single warehouse and per-location syncing has nowhere to route to.

Once mapping is in place, every stock update flows through it. A change at your "Main Warehouse" updates the matching Zoho warehouse and nothing else, so a busy location never silently bleeds into a quiet one. For setup details see multi-location warehouse mapping and the multi-location inventory sync overview.

Choose how often it syncs: the three modes

You control the cadence to match your order velocity and how much Zoho API headroom you have:

  • Real-time (webhooks) — Zync syncs the moment inventory changes on the authoritative side. A webhook fires, the update is queued, and the other system catches up within moments. This is the tightest mode and the best defence against overselling.
  • Scheduled — Zync syncs on a fixed interval, with a minimum of 30 minutes between runs. This suits very large catalogs or steadier stores where a small lag is acceptable and you would rather sync in predictable batches than on every single event.
  • Manual — you trigger a bulk run yourself with the Sync Inventory button. This is ideal for the initial reconciliation, for a one-off correction after a big stock take, or as a deliberate catch-up before a sale begins.

These are not mutually exclusive in spirit: many merchants run real-time day to day and keep the manual bulk sync in their back pocket for corrections. For a head-to-head, read real-time vs scheduled vs manual sync.

A queue that keeps stock updates reliable

Inventory APIs throttle. A naive connector that fires an inline API call on every single change will hit those rate limits during exactly the moments that matter most — a flash sale, a big restock, a bulk edit — and quietly lose updates. That is how silent drift begins.

Zync is built to survive throttling. Every stock job goes onto a Redis/BullMQ queue rather than being fired inline. Each job gets up to three attempts with exponential backoff, so when Zoho or Shopify returns a rate-limit response, the update is delayed and retried a moment later instead of being dropped. Writes are idempotent, meaning a retried update produces the same result as the first attempt — no double-counting, no duplicated adjustments. The combined effect is that the two systems keep *converging* under load instead of *diverging*. The queue is the unglamorous machinery that turns "two-way sync" from a nice idea into something you can trust during your busiest hour.

How this prevents overselling

The whole point of all of the above lands here. Overselling happens when the number a shopper sees at checkout is higher than what you can actually ship. Two-way inventory sync closes that gap from both directions: a sale anywhere decrements the authoritative side, and the corrected figure propagates back to the storefront before the next shopper sees an inflated count.

Real-time mode shrinks the window between "stock changed" and "storefront knows" to moments, which is what you want during a rush. The retry queue makes sure that even when APIs are throttling under that same rush, the decrement is not lost — it is retried until it lands. If overselling during busy periods is the pain you came here to fix, see stop Shopify overselling with Zoho inventory sync and the Shopify overselling fix page.

How to diagnose stock mismatches

When a number looks wrong, resist the urge to hand-edit both sides — that often makes drift worse. Work through the likely causes in order:

  • Check location mapping first. An unmapped Shopify location, or a location mapped to the wrong Zoho warehouse, is the single most common cause of a mismatch. The stock is syncing — just to the wrong place.
  • Confirm your source of truth. If someone has been editing stock on the non-authoritative side, the next sync correctly overwrites their change. That is the system working as designed; the fix is to make edits on the authoritative side.
  • Look for a recent manual edit on the wrong side. A one-off adjustment made directly in the system that is *not* the source of truth will be reverted on the next run. Re-enter it on the authoritative side.
  • Consider Multi-Warehouse. If you expected multiple warehouses but only one is updating, confirm Multi-Warehouse is enabled in Zoho.
  • Run a manual bulk Sync Inventory. This forces a fresh reconciliation from the authoritative side and clears transient drift caused by an earlier throttled run.

In practice, the large majority of "the numbers don't match" tickets resolve at the first two bullets.

What to test before you turn it on

Run this checklist on a quiet day, ideally against a small set of products first:

  • Product sync has run, so the items exist in Zoho and carry a stored Zoho item id.
  • Every active Shopify location is mapped to a Zoho warehouse — use Map All Locations and confirm each row.
  • Multi-Warehouse is enabled in Zoho if you have more than one warehouse.
  • The source of truth direction is set deliberately (Zoho→Shopify default, or Shopify→Zoho).
  • You have chosen a sync mode that matches your volume (real-time, scheduled ≥30 min, or manual).
  • You ran one manual bulk sync and spot-checked a few SKUs on both sides to confirm they match.
  • You tested one real change end to end: adjust stock on the authoritative side and watch it land on the other.

Common mistakes to avoid

  • Treating product sync and inventory sync as one step. Sync products first; then sync stock.
  • Leaving a location unmapped. Unmapped locations are the top cause of mismatches.
  • Editing stock on both sides. Pick one source of truth and make every adjustment there.
  • Forgetting Multi-Warehouse. More than one warehouse needs it switched on in Zoho.
  • Choosing real-time without the headroom, or scheduled when you need speed. Match the mode to your actual order velocity.
  • Skipping the initial manual reconciliation. Always do one bulk sync and spot-check before relying on automatic mode.

How to tell it's working

You do not need invented metrics to know two-way sync is healthy. Watch a few practical signals:

  • Spot-checks match. Pick a handful of SKUs across different warehouses and confirm Shopify and Zoho agree.
  • A test change propagates. Adjust the authoritative side and see the change appear on the other within the expected window for your mode.
  • No overselling incidents. The storefront stops accepting orders for genuinely out-of-stock items.
  • Numbers stay converged over time. The gap does not slowly widen day over day — the sign the queue and retries are doing their job under load.

Final recommendation

For most merchants, keep the Zoho-to-Shopify default: let the warehouse own stock and let the storefront reflect it. Map every Shopify location to a Zoho warehouse, enable Multi-Warehouse if you need more than one, run product sync first, then turn on real-time inventory sync if your volume warrants it or scheduled if you prefer predictable batches. Do one manual bulk reconciliation before you trust automation, and make all stock edits on your chosen source of truth.

Get those decisions right and two-way inventory sync becomes invisible — the storefront and the warehouse simply agree. Start from the inventory sync overview, see how it fits the wider Zoho Shopify integration, or review pricing when you are ready.

TopicsInventory SyncTwo-WayZoho InventoryStockSource of TruthMulti-LocationOverselling
FAQ

Common questions

Is inventory sync really two-way?
Yes. Inventory is the one flow Zync syncs in both directions. You pick which system is the source of truth — Zoho to Shopify (the default) or Shopify to Zoho — and stock changes propagate accordingly across mapped warehouses. Product, order, and customer sync remain one-way (Shopify to Zoho).
Do I have to choose one source of truth?
Yes, per the direction you set. Picking a single source of truth for stock prevents two systems from overwriting each other. Most warehouse-led merchants keep Zoho as the source; storefront-led merchants choose Shopify. You set one direction, and that side wins.
How fast does stock update?
In real-time mode, stock syncs via webhooks within moments of a change. You can also run scheduled syncs (minimum 30-minute interval) or trigger a manual bulk sync with the Sync Inventory button. The right mode depends on your order velocity and Zoho API headroom.
What is the difference between product sync and inventory sync?
Product sync creates and updates the item record — title, SKU, price, variants — in Zoho, and it runs one way from Shopify to Zoho. Inventory sync only moves the stock quantity, and it is the one flow that runs in both directions. You generally run product sync first so the items exist, then let inventory sync keep quantities aligned.
Why does stock still drift between Shopify and Zoho?
Drift almost always traces to one of a few causes: a Shopify location that was never mapped to a Zoho warehouse, two people editing stock on both sides when only one should be authoritative, or a manual edit made directly in the non-authoritative system that the next sync overwrites. Checking your location mapping and confirming a single source of truth resolves the large majority of mismatches.
Does inventory sync prevent overselling?
That is its main job. By keeping the number a shopper sees at checkout aligned with what your warehouse actually holds, Zync stops the storefront from promising units you do not have. Real-time mode closes the window fastest, and the retry queue makes sure throttled stock updates are not silently dropped.

Connect Shopify and Zoho in an afternoon

Start a free trial, connect your Zoho org, and bulk-sync your catalog the same day. No engineering required.