October 5, 2026 · Ahmed · More by Ahmed
Shopify's Physical Inventory Preview Adds Bins and Counts
Shopify's Physical Inventory feature preview adds bins, counts, and read-only purchase orders to the unstable Admin API, with explicit reconciliation math.

Shopify's Physical Inventory feature preview adds three new primitives to the unstable GraphQL Admin API: bins, counts, and purchase orders. Together they give an app a way to model how a stockroom is actually organized, instead of treating a location as a single flat on-hand number.
What's new, and what stays the same
Bins are named storage within a location — a shelf or a rack — that can be created and updated, with their held quantities readable per item. Counts set the on-hand quantity of an item in a specific bin through the inventoryCountCreate mutation. Purchase orders are read-only in this preview: an app can read a purchase order, its line items, and its supplier, but not create or modify one.
Shopify describes these APIs as additive: they introduce new primitives alongside the existing inventory APIs, so an integration built against inventorySetQuantities keeps working unchanged while a team builds against bins and counts.
The reconciliation formula
The detail that matters most for automation that already depends on location-level aggregates: a location's onHand still equals unbinnedQuantity plus the sum of every bin's quantity. Existing inventorySetQuantities calls still land in the unbinned quantity, and bins that haven't been touched are unaffected. The location-level aggregates — available, committed, onHand — are unchanged; bins only change how the on-hand is distributed underneath that number.
Variance detection and idempotency in inventoryCountCreate
Setting a bin's quantity through inventoryCountCreate takes two numbers per line item, not one: actualQuantity, the quantity just counted, and expectedQuantity, the quantity last read for that item in that bin. Shopify's own description is that expectedQuantity is used to detect a variance and to guard against overwriting a change made since the last read — meaning a cycle-count workflow has to read current bin quantities immediately before submitting a count, not rely on a stale snapshot. The mutation also requires a unique key per call via the @idempotent directive; reusing a key returns the original count instead of creating a new one, which matters for any automation that retries a failed network call and needs to avoid double-counting.
Access is opted in, not universal
These APIs only work on the unstable API version, and only on a development store that has explicitly enabled the Physical inventory feature preview, handle physical_inventory_apis. A call from a store without the preview enabled returns an access error — so this is something to build and test on a dedicated dev store before assuming it's available anywhere else.