Why Your Shopify Inventory Is Wrong and How to Find Out
Shopify says 40. The warehouse counted 31. Somebody suggests the sync app is broken and somebody else suggests switching apps. Both are guesses. Inventory drift has a small number of causes, they leave different fingerprints, and you can identify which one you have in about an hour without writing any code. Work through them in this order, because the cheap checks eliminate the expensive explanations.
First, decide which number is actually wrong
Before diagnosing a sync, confirm there is one to diagnose. Do a physical count of five or six fast moving SKUs and compare against Shopify.
If the physical count matches Shopify but disagrees with your ERP or warehouse system, the problem is downstream and Shopify is fine. If the physical count disagrees with both, you have a receiving or picking accuracy problem and no software will fix it. Only when Shopify and the physical count disagree, with the other system matching reality, are you looking at a sync issue. A surprising share of "sync problems" turn out to be counting problems, and this check costs twenty minutes.
Second, read the adjustment history
This is the single most useful screen in the admin for this problem and most merchants have never opened it. For an affected product variant, look at the inventory adjustment history. It shows what changed, when, and what caused it.
You are looking for a pattern, not a value:
- Rapid back and forth changes from different sources. One app sets 100, another sets 95, the first sets 100 again. That is two apps fighting, covered below.
- A large correction at a fixed time each day. A batch sync overwriting rather than reconciling.
- Nothing at all since a certain date. A sync that silently stopped. Check the app's connection status and its authentication.
- Manual adjustments. Someone in the admin fixing numbers by hand, which usually means the real fix never happened.
Nine times out of ten the history names your culprit before you have opened anything else.
Cause one, two apps writing to the same inventory
This is the most common cause in stores with a mature app stack, and it is invisible until you look for it. Count how many installed apps can write inventory: a fulfilment or 3PL app, a returns app, a marketplace connector, a forecasting tool, a POS integration, a bundling app. Each believes it knows the correct quantity.
Two systems that disagree will keep overwriting each other indefinitely, and the number you see depends on which one wrote last. The fix is not technical. It is deciding which single system is the source of truth for stock and removing write access from everything else. Almost every store with this problem has never made that decision explicitly.
Cause two, bundles that do not deduct components
If you sell bundles or kits, check this before anything else. Shopify does not automatically deduct component stock when a bundle sells unless the bundle is built with something that handles it.
The fingerprint is distinctive. Component SKUs show healthy stock in Shopify while the shelf is empty, and the gap grows in proportion to bundle sales. Stores selling combo packs, festive hampers and gift sets in India hit this constantly, usually discovering it during the season when it costs the most.
Cause three, location mapping
Multi-location is where quiet failures live. Stock exists, but at the wrong location, so Shopify's routing will not allocate it to the orders you expect.
Check that every location in Shopify maps to exactly one real place, that no legacy location is still active from a 3PL you stopped using, and that your integration writes to the location it thinks it does. A store running a warehouse, a retail counter and a 3PL has three chances to get this wrong, and a store that added a dark store last quarter has four.
Cause four, missed events with no reconciliation
Most integrations are event driven, and merchants assume events are reliable. Shopify does not make that promise. Its webhook documentation states that "Webhook delivery isn't always guaranteed, and your app can miss or mishandle events," and separately that "Shopify doesn't guarantee ordering within a topic, or across different topics for the same resource."
So events can be lost and events can arrive out of order. A single missed inventory event produces a gap that never closes on its own, because nothing goes back to check. The fingerprint is drift that appears without any visible adjustment, and that grows slowly rather than jumping.
The fix is a reconciliation job that pulls current state on a schedule and compares it against the other system. Shopify's own documentation recommends exactly this rather than trying to make webhooks perfect.
Cause five, you are reading the wrong number
Sometimes nothing is broken and the report is lying. Shopify tracks quantities per location across several named states, including on_hand, available, committed and reserved. On hand equals committed plus unavailable plus available, so a product can show plenty on hand while very little is sellable.
This bites hardest when someone compares a warehouse total against Shopify's available figure and concludes there is a sync problem. There is not. There is an unfulfilled order backlog. This got more confusing in August 2026 when draft order holds moved from reserved to committed, which changed what bucket-level reports show without changing what is sellable.
Cause six, SKU mismatches
Last on the list because it is easy to check and boring, but it is the leading cause in stores with any external integration. Export SKUs from both systems and compare exactly. Look for case differences, trailing spaces from spreadsheet pastes, duplicates, and products with no SKU at all.
An integration cannot match what it cannot identify, so unmatched SKUs simply do not sync and nothing raises an error. If your match rate is below 95 percent, stop diagnosing and fix the data. We go deeper on this in our piece on what breaks in Shopify ERP integrations.
What a store that does not drift looks like
Once you have fixed the immediate problem, three things keep it fixed, and none of them require new software.
One system owns stock and everything else reads from it. That decision is written down somewhere, so the next app anyone installs does not quietly become a second writer. A scheduled reconciliation compares the two systems and reports the gap to a person, not just to a log file nobody opens. And someone counts a rotating sample of SKUs on a schedule rather than waiting for the annual stocktake, because a physical count is the only check that catches errors both systems share.
Stores with those three habits still get drift. They just find it in a day, when it is a rounding problem, instead of in a quarter, when it is a purchasing decision made on bad numbers. That difference is worth more than any app on the list.
How do I check inventory adjustment history in Shopify?
Open the product, select the variant, and view its inventory history. It lists adjustments with the time and the source that made them. Comparing the source column against your installed apps is usually enough to identify which system is overwriting the others.
Why does Shopify show stock when the warehouse is empty?
The usual causes are bundles that never deducted their components, a sync that stopped without alerting anyone, stock sitting at a different location than you expect, or a SKU that never matched between systems so it was never being updated at all. Check the adjustment history first, since a variant with no recent entries points straight at a stopped sync.
Can two apps overwrite each other's inventory?
Yes, and it is common. Any app with inventory write permission can set quantities, and two apps with different views will keep correcting each other. Pick one source of truth and remove write access from everything else. This is a configuration decision, not a bug in any of the apps.
Does Shopify deduct bundle components automatically?
Not on its own. Unless your bundles are built with something that handles component deduction, selling a bundle will not reduce the stock of its parts. Verify this with a test order before your next campaign rather than after it.
How often should inventory reconcile?
Daily is enough for most Indian D2C brands, and hourly during peak periods or campaigns. The point is not frequency, it is that a scheduled comparison exists at all, so a gap is caught in a day instead of at the next stock count.
Get your inventory drift diagnosed
Free diagnosis. Email hello@exactwhy.com with subject "Inventory drift" and a screenshot of the adjustment history for one affected variant, plus a list of apps with inventory access. We tell you within 4 hours which of the causes above you have. Most of the time it is one of the first three and you can fix it yourself.
Paid integration work, Rs 40,000 to Rs 1.5 lakh. We establish a single source of truth, fix location and SKU mapping, handle bundle deduction properly, and add a reconciliation job so the next gap surfaces in a day.
Ongoing Shopify development, Rs 20,000 to Rs 50,000 a month. Including monitoring so drift is caught before a customer finds it.
The reason to work through this in order is that the expensive answer, replacing your integration, is almost never the right one. Most drift traces back to two apps disagreeing or a few hundred SKUs that never matched, and both are configuration problems you can solve this week.