Three ways to keep stock in sync — and why the choice matters
On the surface, "keep my Shopify stock and my Zoho stock the same" sounds like one setting you flip on and forget. In practice, the *cadence* of that sync — how often and how immediately it happens — is one of the most consequential decisions you will make when connecting the two systems. Pick the wrong cadence and you either oversell during your busiest hours or you quietly burn through API allowances and watch jobs back up.
Zync gives you three inventory sync modes: real-time, scheduled, and manual. None of them is universally "best." Each fits a different combination of order volume, catalog size, and how much API headroom you want to leave for everything else your store does. This guide walks through how each mode behaves, when to use it, how to combine modes, and how to confirm your choice is actually keeping stock accurate.
One thing to anchor on first: in Zync, inventory is the only two-way flow. The default direction is Zoho → Shopify, and you can switch it to Shopify → Zoho. The mode you choose governs *how often* that two-way reconciliation fires — it does not change which products or warehouses are involved.
How Shopify and Zoho think about stock differently
Before choosing a cadence, it helps to understand why the two systems can drift apart at all. Shopify tracks inventory per location for the purpose of *selling* — its job is to know how many units are available to a shopper right now. Zoho Books and Zoho Inventory track stock per warehouse for the purpose of *bookkeeping and operations* — receiving stock, fulfilling, and reporting on what you own.
Those are two different jobs with two different sources of truth depending on the moment. A sale changes the number in Shopify first. A supplier delivery or a stock count changes the number in Zoho first. Because each system can be the originator of a change, you need a sync that moves numbers in whichever direction reflects reality — and you need to decide how quickly it moves them. That "how quickly" is exactly what the three modes control.
Sync always runs per mapped warehouse, so the direction and cadence you choose apply to each Shopify location ↔ Zoho warehouse pair you have configured. If you sell from more than one location, the multi-location warehouse mapping you set up determines which stock pools talk to each other.
Real-time: sync the moment stock changes
Real-time mode uses webhooks. A sale, a restock, or a manual adjustment fires an event, and Zync reacts within moments to push the new quantity to the other system. There is no waiting for a clock to tick.
Use real-time when:
- Stock accuracy at checkout is critical. This is the single strongest defense against overselling, because the storefront number is corrected almost immediately after every change.
- Your change volume is steady rather than coming in massive bursts. Real-time thrives on a continuous trickle of individual updates.
- You want the storefront to always reflect reality without anyone remembering to press a button or wait for an interval.
Real-time is the default recommendation for most stores. It keeps the two systems continuously converging, so the gap between "what actually happened" and "what the storefront shows" stays as small as the APIs allow.
Scheduled: a steady, predictable heartbeat
Scheduled mode runs on a fixed interval — minimum 30 minutes — and batches changes together instead of reacting to each one. Rather than firing on every event, it wakes up on a clock, gathers everything that changed since last time, and syncs it in one pass.
Use scheduled when:
- You have a very large catalog that would otherwise generate a high volume of individual webhook-driven updates. Batching turns a storm of small writes into a smaller number of grouped runs.
- You want predictable, gentle pressure on API limits. A scheduled run has a known footprint at known times, which makes it easy to reason about your remaining API headroom.
- A short delay between a stock change and the storefront update is acceptable for your products — for example, slower-moving SKUs where a 30-minute lag will not cause a problem.
Think of scheduled sync as a heartbeat: less reactive than real-time, but easy on rate limits and completely predictable. The 30-minute floor is deliberate. It exists so scheduled mode stays *batched* — if intervals could be set arbitrarily small, you would lose the very benefit (fewer, grouped API calls) that makes scheduled mode worthwhile.
Manual: on-demand bulk control
Manual mode does nothing on its own. It waits until you press Sync Inventory, then performs an on-demand bulk run across your mapped warehouses.
Use manual when:
- You just finished a big stock count and want to push the corrected numbers all at once.
- You are first connecting and want to seed Shopify or Zoho with current stock before turning on an automatic mode.
- A supplier delivery or large adjustment just landed in Zoho and you want it reflected immediately, on your schedule.
- You prefer to control exactly when a large sync happens — for instance, running it outside peak selling hours.
Manual is the right tool for deliberate, one-off reconciliation. It is the wrong tool as your *only* mode, because between manual runs nothing keeps day-to-day sales in sync — and that is precisely the window in which overselling creeps in.
The core tradeoff: accuracy vs. rate-limit pressure vs. control
Every mode lands somewhere on three axes, and choosing well means knowing which axis matters most for your store:
- Accuracy / freshness. Real-time is the most accurate because the storefront is corrected almost immediately. Scheduled is accurate to within its interval. Manual is only as accurate as the time since your last run.
- Rate-limit pressure. Manual and scheduled concentrate work into bounded bursts you can time. Real-time spreads many small writes across the day. A very large catalog on real-time can generate more total calls; the same catalog on scheduled batches them.
- Control. Manual gives you total control over timing. Scheduled gives you predictable timing without intervention. Real-time gives up timing control in exchange for immediacy.
There is no setting that maximizes all three at once. The art is matching the dominant need — usually accuracy for fast-moving stores, rate-limit predictability for huge catalogs — to the mode that optimizes for it.
Choosing by order volume, catalog size, and API headroom
A more concrete decision framework:
- Order volume — high. Fast-moving stock is where overselling hurts most. Favor real-time so each sale corrects availability almost immediately.
- Order volume — low to moderate. Either real-time or scheduled works. Real-time still gives the best accuracy with little downside at low volume.
- Catalog size — small to medium. Real-time comfortably keeps up; the number of updates stays manageable.
- Catalog size — very large. A huge SKU count with frequent changes is the classic case for scheduled, where batching keeps API usage smooth and predictable.
- API headroom — plenty to spare. Real-time is a safe default.
- API headroom — tight (you run other apps or heavy product/order syncs against the same store). Lean toward scheduled to keep inventory's footprint bounded and timed, leaving room for your product sync and order sync work.
When two signals conflict — say, high order volume *and* a very large catalog — weight accuracy where overselling is expensive (your best sellers) and reserve scheduling for the long tail. In practice many merchants land on real-time as the everyday mode and use manual runs as a safety reconciliation, which is the combination we cover next.
Combining modes: real-time day-to-day, manual after counts
The modes are not mutually exclusive in spirit. The most robust everyday setup for many stores is:
- Real-time as the standing mode, so ongoing sales keep availability continuously corrected.
- Manual Sync Inventory after any large offline change — a physical stock count, a bulk receiving, a warehouse correction in Zoho.
The reasoning: webhook-driven real-time sync excellently handles the steady stream of sales, but offline events (someone counting shelves, a delivery logged directly in Zoho) are not always something the day-to-day flow needs to chase the instant they happen. A deliberate manual run after those events reconciles everything in one pass and gives you a clean baseline. You get the accuracy of real-time during selling and the control of manual for big resets.
If your catalog is large enough that real-time pressure is a concern, the equivalent combination is scheduled day-to-day + manual after counts — predictable batched syncing plus an on-demand reset when you need it.
Why the queue makes every mode safe under throttling
Cadence would be a scary choice if a busy moment could silently drop updates. It can't, because of how Zync runs the work underneath all three modes.
Every inventory job — a single real-time webhook, an item in a scheduled batch, or a write inside a manual bulk run — goes onto a queue and is processed with three attempts and exponential backoff. If Shopify or Zoho throttles a write because you have hit a rate limit, the job is not lost. It is delayed and retried, with each retry waiting longer than the last, until it succeeds or exhausts its attempts. Writes are also idempotent, so a retry that lands twice does not double-apply a change.
This is what makes the mode choice about *strategy* rather than *risk*. A heavy scheduled or manual run that briefly bumps into rate limits will spread itself out and complete, rather than abandoning quantities mid-way. Real-time bursts during a flash sale queue up and drain in order instead of colliding. The queue absorbs the throttling so your numbers still arrive.
How cadence relates to overselling risk
Overselling happens in the gap between a stock change and the storefront reflecting it. The wider that gap, the more orders can slip in against inventory that is already gone.
- Real-time keeps the gap as small as the APIs allow — the strongest protection.
- Scheduled caps the gap at your interval. A 30-minute interval means availability can be at most ~30 minutes stale; for slow movers that is fine, for hot SKUs it is a window.
- Manual leaves the gap open until your next run, which is why manual-only is risky for any store that sells while it isn't watching.
If preventing oversells is your top priority, that priority alone argues for real-time. For the deeper mechanics of how syncing stock prevents oversells, see the overselling fix page and our guide to stopping Shopify overselling with Zoho inventory sync.
A decision checklist before you turn it on
Run through this before committing to a mode:
- Have you mapped every Shopify location to a Zoho warehouse? Inventory sync runs per mapped warehouse, so unmapped locations won't sync.
- Have you set the direction correctly — Zoho → Shopify (default) or Shopify → Zoho — for where your source of truth lives?
- Did you do an initial manual Sync Inventory to bring both systems to a clean baseline before enabling an automatic mode?
- For scheduled: is your interval realistic for your products' churn (and at least the 30-minute minimum)?
- Have you checked you have API headroom left over for your other syncs?
- Do you have a plan for offline changes (a manual run after stock counts)?
- After enabling, did you make a test change and confirm it appeared on the other side within the expected window?
Common mistakes to avoid
- Scheduling too frequently. Pushing the interval to its floor for a catalog that doesn't need it just adds API pressure without meaningfully improving accuracy. Match the interval to how fast stock actually moves.
- Relying only on manual sync. Manual is for resets, not for keeping a live store in sync. Between runs, nothing is correcting availability, and that is when oversells happen.
- Ignoring rate limits. Choosing real-time for an enormous, high-churn catalog without considering total call volume can crowd out your other syncs. The queue keeps it safe, but scheduled may be the smarter strategic fit.
- Skipping the initial baseline. Turning on an automatic mode before reconciling current stock means the first state both systems agree on is whatever they happened to hold — do a manual run first.
- Forgetting offline events. Real-time handles sales beautifully but won't know about a shelf count you did on paper until something tells it. Pair it with a manual run.
How to tell your chosen mode is keeping stock accurate
- Spot-check fast movers. After a sale on a hot SKU, confirm the quantity dropped on the other system within your expected window (immediately for real-time, within the interval for scheduled).
- Reconcile after a manual run. Pick a handful of SKUs and confirm Shopify and Zoho show the same numbers right after a Sync Inventory.
- Watch for drift. If a SKU's numbers diverge and stay diverged, that's a signal to investigate mapping or run a manual reconciliation — not to assume the mode is failing.
- Confirm new stock appears. After logging a delivery in Zoho (with Zoho → Shopify direction), verify the increased availability reaches the storefront.
If numbers consistently match within the window your mode promises, it's working as intended.
Final recommendation
For most stores, start with real-time as your standing mode. It gives the best accuracy and the strongest protection against overselling, and the queue with exponential backoff keeps it safe even during busy periods. Add a manual Sync Inventory run after stock counts, deliveries, and other offline events so big changes reconcile cleanly.
Reach for scheduled when your catalog is very large or your API headroom is tight — its batched, predictable runs trade a little freshness for a lighter, more controllable footprint, and the 30-minute floor keeps it efficient. Keep manual in your toolkit for seeding, resets, and reconciliation, but never as your only line of defense on a live store.
To configure your direction and cadence, open the inventory settings and pick the mode that matches your volume, catalog, and headroom. For the full picture, see the inventory sync overview, our guide to two-way Shopify–Zoho inventory sync, and multi-location inventory sync.