Shopify inventory states: available, committed, unavailable, and incoming
Shopify inventory states explained: available, committed, unavailable, incoming, on hand — where each lives in the admin and why misreading oversells.
InventoryX is in development and not available today. ClearStock is the live Shopify app.
Short answer: Shopify tracks your stock in five states — On hand, Available, Committed, Unavailable, and Incoming — and the one that matters for almost every decision is Available: the units a customer can actually buy right now. On hand is the bigger number, and it lies by inclusion: it counts committed units already promised to orders, damaged units apps have set aside, and safety stock nobody can sell. Sellable and on-shelf are not the same number, and reading the wrong one is how oversells and phantom shortages both happen.
Here's the state map, verified against the Shopify Help Center in October 2026, then a click-path through the admin screens where each state lives, and the misreads that cost money.
The five states, defined
Straight from the Help Center's definitions, with the arithmetic that connects them:
| State | Definition | |
|---|---|---|
| On hand | All units at a location | = Committed + Unavailable + Available |
| Available | Sellable units — not committed, not set aside, not incoming | The number customers are buying against |
| Committed | Set aside, can't be sold: units in unfulfilled orders, reserved in draft orders, or in a transfer marked ready to ship | Promised, not yet gone |
| Unavailable | Set aside by apps or held for reasons: damaged, quality control, safety stock | On your shelf, not for sale |
| Incoming | On the way via transfers, purchase orders, or apps — not sellable until received | Promised to you, not yet yours to sell |
Note the two states that aren't included in On hand: Incoming isn't — it hasn't arrived, so it lives outside the physical count entirely. And one asymmetry worth memorizing: editing On hand changes Available by the same amount, and editing Available changes On hand by the same amount — they're two views of the same underlying units, not independent dials.
Worked example — a bath bombs stall, one warehouse location:
- 500 bath bombs physically in the building.
- 60 are Committed — ordered online this week, awaiting packing.
- 25 are Unavailable — 15 damaged in transit, 10 pulled for quality control because the scent batch came out wrong.
- An app holds 40 more as Unavailable (safety stock).
- Available = 500 − 60 − 25 − 40 = 375.
- Meanwhile a supplier PO of 300 units sits in Incoming — real stock, real money, sellable-by nobody until it's received.
The storefront sells against 375. If you plan reorders against 500, you're planning against 125 units that don't exist for sale.
The click-path: where each state lives
Path 1 — the Inventory page (the daily view). Products → Inventory. Each variant row shows columns per state; you can hide On hand entirely and save the view, which is the single most useful hygiene move for a store that keeps misreading its stock — if the sellable column is the only one visible, the wrong number stops being in the room. Saved views per location, plus a saved "Available < 20" view, are the native tripwires (there's no native low-stock email alert as of October 2026 — saved views and Flow are what the admin gives you).
Path 2 — the variant page (the one-SKU deep dive). Open a product, click a variant, and read the inventory card: every active location is listed, including locations that don't fulfill the variant. The subtlety documented in the Help Center: at non-fulfilling locations you'll see On hand plus any Committed, Unavailable, or Incoming above zero — but Available shows a dash if the variant is inactive at that location. A dash is not a zero: the units exist and are counted, they just can't sell from there. "Why does this location show stock but can't sell it" questions almost always end at this card.
Path 3 — the Incoming tab (who promised you what). Inventory page → Incoming tab. Click a variant's incoming quantity and Shopify shows you exactly which transfers, purchase orders, or apps make up that number. This is the screen to live on during peak season: incoming units that have sat "on the way" past their expected arrival are the easiest money in your business to lose track of (the transfer lifecycle behind that number is here).
Path 4 — the adjustment history (how it got this way). From the product or variant page, View adjustment history shows each state's movement over time — who changed what, when, and from which state to which. When Available drops in a way nobody can explain, this is the ledger that answers it.
How stock actually moves between states
The transitions that matter, as the system performs them:
- Order placed: Available −N, Committed +N.
- Order fulfilled/shipped: Committed −N (On hand drops too — the units left).
- Draft order created: units are reserved — Committed +N (draft orders hold stock, which is why abandoned drafts are an inventory problem, not just a sales one). Reservation deleted or expired: back to Available.
- Transfer marked ready to ship: Committed at origin. Transfer in transit: Incoming at destination. Received: Available at destination.
- App sets a hold: Available → Unavailable (damaged, QC, safety stock — or the app's own logic). App releases: Unavailable → Available.
- You adjust quantities manually: Set to or Adjust by on the Inventory page, with the movement recorded in adjustment history.
Two consequences follow directly from that map. First, Committed is the oversell safety mechanism: the moment an order exists, its units stop being sellable — so a store that oversells usually has a different problem: channel sync lag, app conflicts, or "continue selling when out of stock" turned on (the oversell causes and policy mechanics live there). Second, Uncontrolled Unavailable is silent dead weight: an app that set aside 200 units two years ago and still holds them has removed 200 units from every sales channel without a single visible symptom — until a count finds them.
The three misreads that cost money
1. Reordering against On hand. 500 on hand, 125 of it committed or held — your buying math says you're deep in stock while Available is already inside your reorder window. The fix is mechanical: every reorder decision reads Available (or better, Available minus incoming commitments), never On hand.
2. Treating Incoming as yours. A PO of 300 in Incoming feels like cover, and merchants push reorder dates out on its strength. But Incoming isn't sellable until received — a delayed shipment, a customs hold, or simply "nobody received the boxes" leaves the storefront dark while the system shows both stock and a PO. Until the receipt is confirmed, Incoming is a promise, and promises have lead-time risk.
3. Ignoring the dash. The non-fulfilling-location dash on the variant card means "stocked but not sellable here." Stores that see a number where a dash should be (or vice versa) conclude their inventory is broken; it's activation — the product isn't stocked-and-fulfilled at that location. Check the inventory card, not just the Inventory page.
Common questions
What is the difference between Available and On hand in Shopify? On hand is every unit at the location — the sum of Committed, Unavailable, and Available. Available is the sellable subset only: not promised to orders, not set aside as damaged or safety stock, not incoming. A store with 500 on hand might have just 375 available (Shopify Help Center, as of October 2026).
What does Committed inventory mean in Shopify? Units set aside and unsellable: items in unfulfilled orders, units reserved by draft orders, and stock in a transfer marked ready to ship. Committed drops when the order ships (units leave On hand) or the reservation is released (units return to Available).
Why can't customers buy a product that shows stock in Shopify? Usually one of three state issues: the stock is at a location that doesn't fulfill the variant (Available shows a dash, not a number), the quantity is Unavailable (held by an app or set aside as damaged/safety stock), or it's Incoming and not yet received. Check the variant's inventory card and the Incoming tab.
What is Incoming inventory in Shopify? Units on the way to a location via transfers, purchase orders, or apps. They aren't sellable until received — on receipt, the state flips to Available automatically. Click an incoming quantity on the Inventory page's Incoming tab to see which transfers, POs, or apps make up the number.
Does editing Available change On hand in Shopify? Yes — they're the same units from two angles. Editing Available changes On hand by the same amount, and editing On hand changes Available by the same amount. Committed and Unavailable adjust as the non-sellable portions of On hand, which is why they move only through orders, reservations, holds, and adjustments.
Next step: open Products → Inventory today and hide the On hand column from your default view — one saved view, ten seconds, and from then on the only number you see on the daily screen is the one customers can actually buy. Then check the Incoming tab for anything that's aged past its expected arrival, because that's stock you paid for that no customer can touch — and every week it stays unreceived, it's costing you shelf-ready sales (the cost of those dark days, quantified).