Inventory management apps provide merchants with various ways to manage their inventory. For example, an inventory management app might query and adjust inventory quantities on behalf of a merchant.
This guide describes the inventory management lifecycle, provides use cases for inventory management apps, and offers some developer tools and resources to get you started.
## How it works
Inventory is the set of items that a merchant tracks and uses to conduct their business. This can include items that are physically at a location and ready to be sold, items that are incoming to a merchant's location, and items that are set aside for holds or inspection.
Merchants track inventory to avoid selling products that have run out of stock, and determine when they need to order or make more of a product. Apps and third-party logistics providers can automate the [inventory management process](/docs/apps/build/orders-fulfillment/inventory-management-apps/manage-quantities-states) by querying and adjusting inventory quantities on behalf of merchants.
The following diagram shows some of the inventory management activities that an app or third-party logistics provider can perform in the context of an order lifecycle:
The `incoming` state is the only state that represents quantities that aren't physically present at a location. Incoming inventory is surfaced at its destination location. |
| `on_hand` | The total number of units that are physically at a location.
The `on_hand` state equals the sum of inventory quantities that are in the `available`, `committed`, `reserved`, `damaged`, `safety_stock`, and `quality_control` states. |
| `available` | The inventory that a merchant can sell. Available inventory isn’t committed to any orders and isn’t part of incoming transfers. |
| `committed` | The number of units that are part of a placed order but aren't fulfilled. When a draft order is created, the inventory isn't committed until the draft order is completed and an order is created. |
| `reserved` | The on-hand units that are temporarily set aside. For example, a merchant might want to set on-hand units aside for holds or inspection.
Inventory quantities in a `reserved` state display as **Unavailable** to merchants that are tracking inventory in the Shopify admin. When a draft order is created, merchants can optionally [reserve the units for a limited period of time](https://help.shopify.com/en/manual/fulfillment/managing-orders/create-orders/create-draft#reserve-items). |
| `damaged` | The on-hand units that aren't sellable or usable due to damage.
Inventory quantities in a `damaged` state display as **Unavailable** to merchants that are tracking inventory in the Shopify admin. |
| `safety_stock` | The on-hand units that are set aside to help guard against overselling.
Inventory quantities in a `safety_stock` state display as **Unavailable** to merchants that are tracking inventory in the Shopify admin. |
| `quality_control` | The on-hand units that aren't sellable because they're currently in inspection for quality purposes.
Inventory quantities in a `quality_control` state display as **Unavailable** to merchants that are tracking inventory in the Shopify admin. |
> Note:
> The `incoming`, `available`, `committed`, `reserved`, `damaged`, `safety_stock`, and `quality_control` states are mutually exclusive.
### GraphQL queries and mutations
The following diagram shows the relationships between inventory states and the GraphQL Admin API query or mutation that's executed:
Webhook topic | Description |
---|---|
inventory_items/create |
Occurs when an inventory item is created. |
inventory_items/update |
Occurs when an inventory item is updated. |
inventory_items/delete |
Occurs when an inventory item is deleted. |
inventory_levels/connect |
Occurs when an inventory level is connected. |
inventory_levels/disconnect |
Occurs when an inventory level is disconnected. |
inventory_levels/update |
Occurs when an inventory level is updated. |