Skip to main content

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.

ColumnAPI fieldWhat it counts / formula
Available to Sellinventory_available_to_sellFree 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.
Availableinventory_availableUncommitted 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.
Allocatedinventory_allocatedOn-hand stock committed to confirmed open sales orders — allocations with status allocated. Still physically here; reduces Available. See Allocations & backorders.
On Holdinventory_on_holdStock manually set aside for a non-order reason (QC, quarantine, damage hold) — active inventory holds. Restored to Available when the hold is released.
Non-Sellableinventory_non_sellableOn-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 Transitinventory_in_transitInventory 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 Inventoryinventory_totalEverything 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 Plannedinventory_backorder_plannedDemand with no stock and no purchase order to cover it — allocations with status planned. Not physical inventory; it represents a true shortage.
Backorder PO Coveredinventory_backorder_awaiting_receiptBackordered demand already covered by an inbound purchase order — allocations with status awaiting_receipt. Not physical inventory.
Consignedinventory_consignedSupplier-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 valueinventory_stock_valueThe FIFO-authoritative value of on-hand stock — the sum of available_quantity × avg_cost across non-archived, non-consignment FIFO layers.
Average costinventory_avg_costFIFO-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.
The all-warehouses row vs. per-warehouse rows

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 floored; Available to Sell isn't

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.

There is no "Reserved" stock status

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.

FieldAPI fieldWhat it holds
SKUskuThe product's unique reference — the identifier shown everywhere it's linked, and the field used to match on import. Unique per product.
BarcodebarcodeThe scan-lookup code (UPC/EAN). Used when you scan an item during a stock take or receipt.
MPNmpnManufacturer part number — a secondary search field alongside SKU and barcode.
Unit costunit_costThe 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 costaverage_costDeprecated mirror (SKU-8056). Returns the same FIFO-derived value as Inventory average cost; kept for backward compatibility. Prefer inventory_avg_cost.
Inventory average costinventory_avg_costThe 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 fieldsweight, weight_unit, case_quantity, case_length, case_width, case_height, case_weight, …Physical attributes used for shipping and packing. They never affect stock counts.
One SKU, one cost surface

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.

FieldAPI fieldWhat it controls
Lot trackedis_lot_trackedTurns on lot/batch tracking for the product. When on, movements and FIFO layers carry a lot, and Lot tracking method becomes required.
Lot tracking methodlot_tracking_methodHow 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_daysThe 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_daysHow 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_daysThe 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 availabilityexpiry_aware_availabilityWhen on, near-expiry stock is excluded from availability so you don't promise units that will expire before they ship.
Expiry-aware availability: per-product opt-in over a tenant default

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

Last verified: