Shopify inventory not syncing: which layer is actually wrong
Published September 25, 2026 by Adot Technologies Inc, the team behind Arvio: AI Store Operator. Every sentence quoted from Shopify's documentation below was read on September 25, 2026 and is reproduced word for word; quotation marks are also used for the things merchants say, which are ours, not Shopify's. Where Shopify does not document something, this article says so instead of guessing.
Someone counted the shelf. The admin disagrees. Or the admin looks right and the product page says sold out anyway.
The word people reach for is "syncing", and it points at the wrong thing most of the time. A sync failure means a number left one system and did not arrive in the other. That happens, and there is a section on it below. But in most stores the number arrived fine — it is just not the number you were looking at, because Shopify keeps several and shows you different ones in different places.
So the first job is not fixing anything. It is working out which of the six things below you have. Four of them are settings you can rule out in about a minute each; the fifth takes a test import to confirm, and the sixth is not something you fix in the admin at all.
Key takeaways
- Check On hand against Available before anything else. They are different numbers on purpose. Shopify: "On hand inventory is made up of the total of your Committed, Unavailable, and Available inventory." An order that came in and has not shipped yet moves units into Committed, so Available drops while the shelf has not changed.
- If your storefront says sold out and the admin says you have stock, look at locations before you look at your theme. Inventory at a location that does not fulfil online orders is "still counted in your total inventory, but not in your online quantity" — and the online quantity is the one shoppers see.
- A dash instead of a number means the product is not active at that location, which is not the same as having zero there.
- A CSV import can blank a field you did not mean to touch. Shopify: "If a non-required column in the import CSV file is blank, then the matching value in the product list is overwritten as blank." Note the trap in that sentence: a column that is present but empty is destructive, while a column left out entirely is safe.
- Where Shopify does not document something, this article says so rather than guessing. Three of the checks below end with "go and look in your own admin" for exactly that reason: the official pages do not settle them.
- There is exactly one cause here that loses units silently, and it is two systems writing the same inventory level without concurrency control. Shopify's own worked example ends: "Result: The final available inventory value is 90, but it should be 70 (20 units lost)." No error is raised anywhere.
Your storefront number is right; your mental model of it is what is off
Most of the causes below are settings you can check yourself in about a minute. Working through a catalogue afterwards is the slow part: Arvio reads your products one at a time, drafts changes, and applies nothing you have not approved.
The quick version
Open one product in your admin, on the variant that is wrong, and answer three questions in this order. Each one eliminates a whole family of causes.
- Does On hand match the shelf? If yes, nothing was lost — skip to the Available question. If no, you have either an untracked item, a CSV that overwrote it, or a genuine write conflict.
- Does Available match On hand? If Available is lower, look at Committed and Unavailable on the same card. That gap is orders you have not shipped, or stock an app has set aside.
- Is the number you are comparing the online quantity? The inventory card lists every location. If some of that stock sits at a location that does not fulfil online orders, the storefront never counted it.
In our experience most "not syncing" reports die at question 2 or 3 — we have no figure for that, it is a pattern from reading them.
Cause 1: Available and On hand were never the same number
This is the most common one, and it is not a fault. Shopify holds inventory in states, and the definitions are worth reading once because they explain nearly every discrepancy people report:
"On hand inventory refers to all inventory units that you have at a location. On hand inventory is made up of the total of your Committed, Unavailable, and Available inventory."
"Available inventory refers to inventory that you can sell. Available inventory isn't committed or set aside as Unavailable."
"Committed inventory refers to the number of units that are set aside and can't be sold, such as units in an unfulfilled order, reserved in a draft order, or in a transfer that's marked as ready to ship."
"Unavailable inventory refers to the number of units set aside by apps or held for other reasons, such as damaged, quality control, or safety stock."
So: an order lands, nobody has packed it yet, and Available drops even though the box is still in the back room. On hand has not moved. The shop floor and the admin are both telling the truth about different things.
The one to look at hardest is Unavailable, because its definition contains the phrase "set aside by apps". If you have a number sitting in Unavailable that you did not put there, an app did, and that is your answer — it is not a sync problem, it is another piece of software doing its job where you could not see it.
Cause 2: the stock is real, but it is at a location the storefront does not count
If the admin shows stock and the product page says sold out, this is where to look next.
Shopify keeps a separate figure called the online quantity:
"If you have locations that don't fulfill online orders, such as retail-only stores, then their inventory is still counted in your total inventory, but not in your online quantity. The online quantity is what displays to customers in your online store and determines whether a product displays as available."
And it is explicit about what happens when you split stock across a fulfilling and a non-fulfilling location:
"If you have an item at a location that fulfills online orders with an inventory level of zero or below, and a location with available inventory that doesn't fulfill online orders, then that item is still displayed as out of stock to customers on your online store."
The switch that causes this has a specific name, which is worth knowing because searching for the wrong name wastes an afternoon. In Settings → Locations, on the location itself, in the Fulfillment section, it is the Use inventory at this location to fulfill online orders toggle. Turning it off does what you would expect, and Shopify spells out the consequence:
"Preventing a location from fulfilling online orders removes any inventory assigned to the location from a product's online quantity."
One thing that catches people who run a shop as well as a site: that stock has not been quarantined entirely. Shopify notes that "The location's inventory can still be used to fulfill draft orders and orders from other sales channels." So the same units can look invisible on your product page and perfectly usable when you build a draft order, which reads exactly like a sync bug and is not one.
Cause 3: a dash where you expected a number
This one is quick and it confuses almost everyone the first time.
On the inventory card, a product can be recorded at a location and still show a dash instead of an Available figure. Shopify:
"If On hand is recorded at a location but Available is a dash, then the variant is inactive at that location."
Inactive is not zero. The units are counted in your totals and cannot be sold from there. The same thing bites when you open a new location, because stocking it is two separate actions:
"When you add a new store location, your existing products aren't automatically stocked or activated at that location."
"If you record inventory at the new location but the product isn't active, then the Available quantity displays a dash."
So you can load a new warehouse with stock, watch the numbers go in correctly, and still sell nothing from it. Nothing failed to sync. The product was never switched on there.
Cause 4: tracking is off, or the tracking lives somewhere else
Shopify's rule for what "out of stock" even means starts with tracking:
"An item is out of stock when inventory is tracked and the inventory level is at zero or below."
Read that carefully, because the condition is doing real work. If tracking is not on for an item, an inventory level is not what decides whether it can be sold. Shopify also states the prerequisite plainly: "Before you can view or adjust inventory levels for a product, you need to set up inventory tracking for that product."
There is a related setting that produces the opposite complaint — "it let someone buy something we do not have". That is Continue selling when out of stock, and Shopify notes a dependency and an exception:
"You can select the Continue selling when out of stock option only when you turn on the Inventory tracked setting."
"Continue selling when out of stock doesn't apply to orders placed from Shopify POS."
And if an app manages the inventory, the picture changes again:
"If a product's inventory quantity is tracked using inventory apps, then its quantities are allocated only to that app location."
One thing to check in your own admin rather than take from us. People often ask whether tracking is set per variant or per product, since a store will have one variant behaving differently from its siblings. Shopify's out-of-stock page describes selecting the setting "from the Inventory section of a product or variant in your Shopify admin", which is the wording we are willing to stand behind. We could not find an official sentence stating the scoping rule outright, so open the specific variant that is misbehaving and look at its own Inventory section rather than assuming it inherited whatever the product-level setting says.
Cause 5: a CSV import overwrote it
If the number was right on Monday and wrong on Tuesday, and somebody uploaded a spreadsheet in between, start here.
Shopify's rules for the overwrite option are precise, and the two halves both matter:
"If you select this option, then when the handle in the import CSV file matches an existing handle in your products list, the values in the CSV file overwrite the values in the matching columns in the existing product list."
"If the overwrite option isn't selected, then the products that match an existing handle are ignored during CSV import."
Then comes the rule that does the real damage, and it is the opposite of what most people assume:
"If a non-required column in the import CSV file is blank, then the matching value in the product list is overwritten as blank."
"If a non-required column isn't included in the import CSV file, but is included in the existing product list, then the value in the product list remains the same."
A column you deleted from the file is safe. A column you left in the file but emptied will wipe what is in the store. That is exactly backwards from the intuition of "if I clear it out, nothing will happen", and it is why a file that has been round-tripped through a spreadsheet can quietly flatten fields nobody edited.
Check this one in your own admin before acting on it. Shopify states those rules for non-required columns generally; the page does not name the inventory quantity column specifically. So do not take our word for how your inventory column behaves — export one product, run the import you are worried about against that single product, and look at what moved. We wrote up the wider version of this problem, including what to repair after an import has already run, in fixing your Shopify catalog after a bad CSV import.
Finding the setting takes a minute. The catalogue behind it does not.
Arvio: AI Store Operator goes through your products one at a time. What it changes, what it leaves alone and what it got wrong on a real store, we wrote up separately in what Arvio actually does.
Cause 6: two systems writing the same number, and this one really does lose units
Everything above is a number being read wrong. This one is a number being destroyed, and it is the only cause here that deserves the word "syncing".
When an app writes inventory levels — a 3PL, a POS integration, an ERP connector, a warehouse tool — Shopify offers a concurrency mechanism, and offering it implies the obvious: two things can write the same level at once.
"The changeFromQuantity field enables concurrency control by allowing you to specify the quantity that you expect to be present before your change is applied. If the current quantity doesn't match the value that you provide, then the mutation fails with a CHANGE_FROM_QUANTITY_STALE error, preventing unintended overwrites."
Shopify's own worked example of what happens without it is unusually clear. An app reads 100 units, decides to take 10 off, and while it is thinking, 20 units sell elsewhere:
"Result: The final available inventory value is 90, but it should be 70 (20 units lost)."
Nothing errors. No log says anything. The number is simply wrong afterwards, and it stays wrong until someone counts the shelf — which is normally how this gets discovered, weeks later, as "our inventory keeps drifting".
There is also a documented reason an app might skip the safeguard on purpose:
"If you don't care about the current quantity because you're the source of truth, then you don't need to implement compare and swap and should opt out."
That is a legitimate design choice, and it is also the thing to ask your vendor about. If two of your systems both believe they are the source of truth, they will take turns overwriting each other and both of them will be behaving as designed. This is not a setting you can fix in the admin; it is a question of which system is allowed to decide, and the answer has to be one of them.
What we could not confirm. We looked for official documentation of how long inventory writes take to appear, and did not find any. Shopify does not publish a sync lag figure, so if someone tells you to "wait fifteen minutes and it will catch up", that number did not come from Shopify. Likewise, we found no official page describing a storefront caching delay for inventory display. That does not prove neither exists — it means we are not going to assert either.
The POS case
If your discrepancy involves a till, there is one documented behaviour worth knowing:
"Shopify POS needs an internet connection to sync with your Shopify admin, send receipts by email, and capture card payments."
Sales made while the connection is down are not reaching your inventory until it returns. That accounts for a specific shape of problem — everything reconciles except the hours you were offline.
What Shopify does not document, as far as we could find, is what happens when the same unit sells online and in-store during that window. So we are not going to tell you which write wins. If that is your situation, the reconciliation is a manual count, not a setting.
What this article does not know
- We have no access to your admin, and no admin access to any store. Every mechanic above comes from Shopify's public documentation, quoted word for word. Where the documentation is silent — variant-level tracking scope, the inventory column's behaviour under CSV overwrite, sync timing, POS conflict resolution — we have said so rather than filled the gap.
- We did not reproduce these failures in a test store. This is a reading of the documentation plus the setting names you will find in the admin, not a lab result. The three "check it in your own admin" notes above are the places where that distinction matters most.
- Documentation changes. Every Shopify documentation page cited here was read on September 25, 2026; the catalogue figures are a separate August 2026 read, dated where they appear.
The adjacent problem: stock that is genuinely gone and still on the shelf
Fixing the number is one job. What the storefront does with a zero afterwards is another, and it is the one that costs money quietly.
In August 2026 we read the public catalogue of 41 live Shopify storefronts — 20,604 products, nothing truncated, all from endpoints any browser can fetch, drawn with a fixed random seed from a public list of 230 stores whose owners had posted their own URLs on the Shopify Community's Store Feedback board — 60 were drawn, 41 of which had a readable public catalogue. The draw is random within that list, but the list itself is not a cross-section of Shopify: stores that ask strangers for feedback skew newer and smaller, so read these as a reason to check your own numbers, not as a figure for Shopify at large. Products that were sold out and still listed as live came to 10.3% pooled across all products, but the median store's own rate was 4.6% — 2,130 products, present on 31 of the 41 stores.
Those two figures are far apart, and the gap is the interesting part: pooled, it looks like an industry-wide condition; per store, the typical store has a much smaller version of it and a few large catalogues carry most of the volume. Read the 4.6% as the one that describes a store like yours, and check your own rather than adopting either.
To be clear about what that measurement is and is not: it counts products that are sold out and still live. It is not a measurement of inventory sync failures, and none of those stores told us why a product was in that state — plenty of merchants leave sold-out products up deliberately, to keep a URL that already ranks and to keep collecting demand signal. We include it because it is the thing people find immediately after they fix their numbers, not as evidence for any cause above.
If that is the problem you actually have, we covered both halves separately: which of the two sold-out problems you are looking at in sold out products still showing on Shopify, and whether to take the product page down at all — a decision with SEO consequences in both directions — in unpublishing out-of-stock products. The wider version, auditing a catalogue's inventory data rather than chasing one variant, is in a Shopify inventory management audit.
FAQ
Why does my Shopify inventory show a different number than my supplier's system?
Compare On hand rather than Available first. Available excludes Committed units, which Shopify defines as "units in an unfulfilled order, reserved in a draft order, or in a transfer that's marked as ready to ship" — so an outside system counting physical stock will legitimately disagree with Available while matching On hand.
Why does my product show as out of stock when I have inventory?
Most often the stock is at a location that does not fulfil online orders, which Shopify says is "still counted in your total inventory, but not in your online quantity". Check the inventory card for that variant and see which locations hold the units.
What does a dash mean instead of an inventory number?
The variant is inactive at that location. Shopify: "If On hand is recorded at a location but Available is a dash, then the variant is inactive at that location." The stock exists and cannot be sold from there until the product is activated.
How long should Shopify inventory take to update?
We could not find an official figure, so we are not going to give you one. If a number has not moved and you have ruled out the settings above, treat it as a write that did not happen rather than a write that is still on its way.
Can a CSV import wipe my inventory?
An import can overwrite fields, and Shopify is explicit that a column present but blank overwrites the existing value as blank while a column left out entirely leaves it alone. Shopify's overwrite rules do not name the inventory quantity column specifically, so test against a single product before running a large file.
Why did my inventory drift without anyone touching it?
If two systems write the same inventory level, one can overwrite the other's change with no error. Shopify documents a changeFromQuantity check that fails with CHANGE_FROM_QUANTITY_STALE rather than overwriting — ask whichever app manages your inventory whether it uses it.
Does turning off a location's online fulfilment hide the stock completely?
Not entirely. Shopify notes that "The location's inventory can still be used to fulfill draft orders and orders from other sales channels." It disappears from the online quantity, not from the store.
Does "Continue selling when out of stock" work at the till?
No. Shopify: "Continue selling when out of stock doesn't apply to orders placed from Shopify POS."
Arvio: AI Store Operator — install it on the Shopify App Store. It does not fix inventory sync — that work is in the settings above. What it does is the catalogue behind them: reading your products one at a time, drafting the changes, and applying nothing you have not approved.
