All guides

InventoryAugust 24, 20268 min read

How Shopify Inventory Tracking Works

How Shopify's inventory system actually tracks stock — on hand, committed, available, and incoming — and what triggers each number to change in real time.

A customer messages to ask why the product page still says "Add to cart" when they just watched the last one sell to someone else. You pull up the product: three units showing. You check the Inventory page: On hand says three, Available says three. Except two of those three are already sitting inside somebody's unfulfilled order, reserved and not free to sell, and the number your customer is staring at doesn't tell them that.

Shopify doesn't track one stock number per product. It tracks four, and they answer different questions. Confusing them is where most "why is my inventory wrong" support tickets actually start.

If terms like SKU and variant are still new territory, start with what Shopify inventory management actually means first — this post picks up once you already know the vocabulary and want the mechanics underneath it.

Tracked vs. untracked

Every product variant in Shopify has a setting for whether it's tracked at all, controlled by the inventory tracking toggle in the variant's Inventory section. Turn it on, and Shopify starts keeping the four numbers this article is about (On hand, Committed, Available, and Incoming) separately for every location the variant is stocked at.

Turn it off, and none of that exists for that variant. There's no On hand, no Committed, no ceiling on how many can be bought — nothing stops a sale past whatever you actually have on the shelf, because Shopify isn't keeping a number to check it against. That's a reasonable choice for made-to-order items or services. It's a quiet way to oversell anything you actually stock a finite amount of.

If you haven't turned tracking on yet, the setup guide covers exactly where to click and every bulk method for doing it across a full catalogue. This post assumes tracking is already on and explains what happens once it is.

The four inventory states

Shopify's own definitions, and the arithmetic that ties them together:

How Shopify's four inventory quantities relateOn hand is the total stock in your possession, and it divides into three parts: available, which is what a shopper can still buy; committed, which is reserved against orders you have not fulfilled yet; and unavailable, which is set aside as damaged, in quality control, or safety stock. Incoming sits outside on hand entirely, because stock on a purchase order is not in your possession until it arrives.On handeverything physically in your possessionAvailablewhat a shopper can still buyCommittedreserved against open ordersUnavailabledamaged, QC, safetyAvailable = On hand − Committed − Unavailable. This is the only one of the four a storefront sells against.Incomingon a purchase order, not yet yoursbecomes On hand onlywhen you receive it
Incoming sits outside the on-hand total, which is why a product can read “0 available” while a restock is already paid for and in transit.
On hand = Committed + Unavailable + Available
  • On hand — every unit you physically have at a location, full stop.
  • Available — the portion of On hand you can actually sell right now. Not committed, not set aside as unavailable, not still incoming.
  • Committed — units set aside and off the market: an unfulfilled order, a draft order the merchant has explicitly reserved, or a transfer marked ready to ship.
  • Unavailable — physically on the shelf but held back for a reason: damaged, in quality control, kept as safety stock, or another reason an app or staff member assigned.
  • Incoming — on its way to the location via a transfer or an app, and not sellable until it's received and its state changes to Available.

Available is what you can sell. On hand is what you own.

Incoming sits outside the equation entirely — it's not counted in On hand until it actually arrives and gets received. A shipment sitting in a truck for two weeks doesn't inflate your stock count just because you know it's coming.

What updates each number

Committed exists specifically to describe units tied up by an unfulfilled order — that's Shopify's own definition, not an inference. Practically: while an order sits open and unfulfilled, those units stop showing as Available without physically leaving your shelf. Available holds back the reservation; the units are still there, just not sellable to the next customer.

Cancel or fulfill that order, and the story diverges. Fulfill it, and those units have physically left your shelf. On hand comes down to reflect that they're actually gone, not merely reserved. Cancel it or refund it instead, and Shopify defaults to giving the units back: the "Restock inventory" checkbox on a cancellation and the "Restock items" checkbox on a refund are both selected by default, returning the canceled or refunded items to sellable stock unless someone deliberately unchecks the box.

Draft orders are the one place this trips people up. Building a draft order (a phone sale, a wholesale quote) doesn't touch Available or Committed by default. The units stay fully sellable online while the draft sits open, which means the same stock can be sold twice unless you click Reserve inventory on the draft. And when you do reserve it, those units move to Committed, not Unavailable — a distinction worth getting right, since plenty of guides get it backwards.

None of this covers fixing a number that's simply wrong — a miscount, damage you need to log, stock you're moving to safety-stock status. That's a manual action, not an automatic state change, and it's covered on its own in how to adjust inventory in Shopify.

Overselling & continue selling

With tracking on, what happens at zero Available depends on one setting: "Continue selling when out of stock." Leave it off, and a variant with zero Available simply can't be purchased — the buy button effectively shuts itself off. Turn it on, and customers can keep buying at zero or negative Available, which is exactly the behavior a preorder or backorder strategy wants and exactly the behavior an accidental miscount doesn't.

It's a per-variant setting, not a store-wide one, and it's only selectable once tracking is on for that variant — you can't configure oversell behavior for something Shopify isn't counting in the first place.

Multi-channel sync

Every sales channel and every app that reads or writes your stock is pointed at the same underlying record per location — one inventory item, one quantity per state, per place you stock it. That's the model Shopify's API exposes, and it's also why sync issues happen: when your online store, your POS, and a marketplace app can all write to that same number, near-simultaneous sales from two channels can race each other. One of them wins the last unit; the other finds out after the fact.

This is a structural property of running more than one selling surface against one stock number, not a bug specific to any single channel or app. Apps that read from the same live data — including ours — inherit the same real number the moment they read it, which is worth knowing if you're troubleshooting a mismatch between two systems that both claim to be right.

If you're running more than one physical location on top of this, the same four states exist separately per location — worth reading on its own in how multi-location inventory works rather than assuming it behaves like a single-location store split in half.

Understanding this model matters even if you never touch a spreadsheet — it's the same data any inventory app, StockCue included, reads to calculate a reorder point. StockCue watches Available against your sales velocity so you're not the one reconciling four numbers by hand every morning.

STOCKCUE

Demand forecasting is on every StockCue plan, including Free — it reads the same Available number this post just explained and turns it into a reorder point automatically, for up to 50 SKUs at no cost.

Install StockCue on Shopify →

The four states in this post are one layer of a bigger discipline. See inventory management fundamentals for the wider picture — turnover, control methods, and where tracking mechanics fit into the rest of running a store.

Frequently Asked Questions

What's the difference between "on hand" and "available" in Shopify?

On hand is every unit you physically have at a location. Available is the portion of On hand you can actually sell right now — On hand minus whatever is Committed to existing orders and whatever is set aside as Unavailable.

What does "committed" inventory mean?

Committed inventory is stock that's set aside and can't be sold: units in an order that hasn't been fulfilled yet, units in a draft order a merchant has explicitly reserved, or units in a transfer marked ready to ship. It's still physically on the shelf — it's just spoken for.

Does Shopify update inventory in real time?

Shopify keeps On hand, Committed, Available, and Incoming updated as orders, fulfillments, transfers, and adjustments happen, rather than on a manual refresh — from a merchant's perspective, that reads as real time. Shopify doesn't publish the exact internal timing of every individual trigger, so treat "real time" as directionally accurate rather than a guaranteed instantaneous figure.

What happens to inventory when an order is refunded or returned?

The refund screen includes a "Restock items" checkbox that's selected by default, which returns the refunded units to Available. A merchant can uncheck it — for a damaged or unsellable return, for example — which leaves inventory as-is instead of adding the units back to sellable stock.

Devmerx

Devmerx is a Shopify and WordPress development agency helping DTC brands build faster stores, cleaner migrations, and higher-converting experiences. Based in London, UK, serving clients worldwide.

See our work

Need help with your Shopify store?

Devmerx builds and optimises Shopify stores for DTC brands. Book a free 20-minute consultation.