Stock states & fields reference
This page is the lookup table for the numbers on a product's Inventory tab and the product fields that feed them. It defines each stock bucket, its underlying API field, and the formula SKU.io uses to derive it; the identity and cost fields that identify a product and value its stock; and the lot and expiry fields that can pull near-expiry units out of what's sellable.
For the model behind these numbers — how they compose and reconcile — read the concept page Stock states. To see them in the app, open a product's per-warehouse stock view or the product inventory list.
Before you begin
- These columns are derived, not entered. SKU.io recomputes them from the movement ledger, the live allocation, hold, and transfer records, and the per-bin quantities. You never type a stock number directly — you adjust stock, ship a transfer, or fulfill an order, and the buckets follow.
- The identity, cost, and lot fields live on the product record. You set them when you set up a product's inventory settings.
Stock quantity buckets
Every product carries one stock row per warehouse plus a roll-up row for all warehouses combined. Physical stock at a warehouse always splits into four buckets, and stock you own but haven't landed yet sits outside them:
On Hand = Available + Allocated + On Hold + Non-Sellable
Total Inventory = On Hand + In Transit
The buckets below are the columns on the Inventory tab, in the order they appear.
| Column | API field | What it counts / formula |
|---|---|---|
| Available to Sell | inventory_available_to_sell | Free stock after subtracting demand that has no stock yet: Available − Backorder Planned − Backorder PO Covered. Unlike Available, this value can go negative when allocations and backorders exceed on-hand stock — a signal you've over-committed. |
| Available | inventory_available | Uncommitted on-hand stock — physically here, not allocated, not held, not in a non-sellable bin. Computed as GREATEST(0, active − allocated − on_hold − non_sellable), so it's floored at zero and never shows negative. |
| Allocated | inventory_allocated | On-hand stock committed to confirmed open sales orders — allocations with status allocated. Still physically here; reduces Available. See Allocations & backorders. |
| On Hold | inventory_on_hold | Stock manually set aside for a non-order reason (QC, quarantine, damage hold) — active inventory holds. Restored to Available when the hold is released. |
| Non-Sellable | inventory_non_sellable | On-hand stock sitting in a bin marked non-sellable (a quarantine or damaged location). Physically present and counted in On Hand, but excluded from Available. A first-class column, summed from per-bin quantities in non-sellable warehouse locations. |
| On Hand | (derived) | Physical stock at the location: Available + Allocated + On Hold + Non-Sellable. Excludes In Transit. Equivalent to Total − In Transit. |
| In Transit | inventory_in_transit | Inventory in flight between your own warehouses — in_transit movements plus unreceived lines on an Amazon AWD transfer. Owned by you, not yet landed; counted in Total, not On Hand. |
| Total Inventory | inventory_total | Everything you own for the product at the location: On Hand + In Transit. Sums active and in_transit movements, plus AWD in-transit. |
| Inbound | (derived) | Quantity expected from open purchase orders — ordered from suppliers, not yet received. Distinct from In Transit (which is warehouse-to-warehouse). |
| Backorder Planned | inventory_backorder_planned | Demand with no stock and no purchase order to cover it — allocations with status planned. Not physical inventory; it represents a true shortage. |
| Backorder PO Covered | inventory_backorder_awaiting_receipt | Backordered demand already covered by an inbound purchase order — allocations with status awaiting_receipt. Not physical inventory. |
| Consigned | inventory_consigned | Supplier-owned units (FIFO layers flagged consignment) that are physically here and included in On Hand and Available, but held off your balance sheet until sold. See FIFO layers & how COGS is realized. |
| Stock value | inventory_stock_value | The FIFO-authoritative value of on-hand stock — the sum of available_quantity × avg_cost across non-archived, non-consignment FIFO layers. |
| Average cost | inventory_avg_cost | FIFO-derived weighted average unit cost — Stock value ÷ FIFO quantity. Null when there are no costed layers. This is the authoritative cost surface; see Revalue COGS. |
Each product has one stock row per warehouse (warehouse_id greater than zero) plus a cross-warehouse roll-up row stored with warehouse_id = 0. The list and summary cards read the roll-up; the per-warehouse breakdown on the stock view reads the individual rows. Both are rebuilt from the same source data, so they always reconcile.
Available is clamped to zero on write, so the cache never stores a negative on-hand figure. Available to Sell deliberately recomputes the unfloored value and can show negative — that negative is the useful signal that allocations plus backorders have out-run physical stock. If Available to Sell is red, you've promised more than you hold.
SKU.io doesn't have a separate Reserved inventory status. Stock committed to orders is Allocated; stock manually set aside is On Hold. If you're looking for units "held back," it's one of those two buckets — not a distinct status.
Identity & cost fields
These live on the product record and identify the item and value its stock.
| Field | API field | What it holds |
|---|---|---|
| SKU | sku | The product's unique reference — the identifier shown everywhere it's linked, and the field used to match on import. Unique per product. |
| Barcode | barcode | The scan-lookup code (UPC/EAN). Used when you scan an item during a stock take or receipt. |
| MPN | mpn | Manufacturer part number — a secondary search field alongside SKU and barcode. |
| Unit cost | unit_cost | The manual / standard cost you record for the product. Independent of the FIFO-derived average — a planning and fallback figure, not the realized cost of a specific layer. |
| Average cost | average_cost | Deprecated mirror (SKU-8056). Returns the same FIFO-derived value as Inventory average cost; kept for backward compatibility. Prefer inventory_avg_cost. |
| Inventory average cost | inventory_avg_cost | The FIFO-authoritative weighted average unit cost (see the buckets table above). This is the number to trust for stock valuation and COGS. |
| Weight / dimensions / case fields | weight, weight_unit, case_quantity, case_length, case_width, case_height, case_weight, … | Physical attributes used for shipping and packing. They never affect stock counts. |
When two cost numbers disagree, inventory_avg_cost is the source of truth — it comes straight from the FIFO layers. average_cost only exists so older integrations keep working, and unit_cost is a manual standard you set by hand. To correct a wrong cost, revalue or rebuild COGS rather than editing a display field.
Lot & expiry fields
These fields turn on lot tracking and let SKU.io keep near-expiry stock out of what's sellable. They live on the product and modulate the Available / Available to Sell buckets above. The day-to-day lot workflow lives on the product's Lots & Expiry tab.
| Field | API field | What it controls |
|---|---|---|
| Lot tracked | is_lot_tracked | Turns on lot/batch tracking for the product. When on, movements and FIFO layers carry a lot, and Lot tracking method becomes required. |
| Lot tracking method | lot_tracking_method | How layers are consumed. fifo (First-In-First-Out) consumes the oldest-received layer first; fefo (First-Expiry-First-Out) consumes the soonest-to-expire first. Drives the order FIFO layers are drawn down. |
| Shelf life (days) | shelf_life_days | The product's total shelf life, used to derive an expiry date from a lot's manufacture/receipt date when one isn't supplied. |
| Near-expiry threshold (days) | near_expiry_threshold_days | How many days before expiry a lot counts as near expiry — the window that flags stock as aging. |
| Minimum remaining shelf life (days) | min_remaining_shelf_life_days | The minimum shelf life stock must have left to be accepted or shipped — for example, the runway a channel like Amazon FBA requires on inbound. |
| Expiry-aware availability | expiry_aware_availability | When on, near-expiry stock is excluded from availability so you don't promise units that will expire before they ship. |
Expiry-aware availability applies only to lot-tracked products. There is an account-wide default; when it's off, only products with Expiry-aware availability switched on are treated as expiry-aware, and when it's on, every lot-tracked product is. With it active, stock inside the near-expiry threshold drops out of the availability the demand planner and channels see — even though it's still physically On Hand.
Next steps
- Understand how the buckets compose and reconcile: Stock states.
- See these numbers per warehouse and per bin: View a product's stock across warehouses.
- Set the identity, cost, and lot fields: Set up a product's inventory settings.
- Trace where a number came from: The inventory movement ledger and the movement types & fields reference.
- Work the demand side of these buckets: Allocations & backorders and Work the backorder queue.