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.

ColumnWhat it counts / formula
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.
AvailableUncommitted on-hand stock — physically here, not allocated, not held, not in a non-sellable bin. On-hand stock minus Allocated, On Hold, and Non-Sellable, floored at zero — it never shows negative.
AllocatedOn-hand stock committed to confirmed open sales orders — allocations that are Allocated. Still physically here; reduces Available. See Allocations & backorders.
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-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 HandPhysical stock at the location: Available + Allocated + On Hold + Non-Sellable. Excludes In Transit. Equivalent to Total − In Transit.
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 InventoryEverything you own for the product at the location: On Hand + In Transit. Sums active and in-transit movements, plus AWD in-transit.
InboundQuantity expected from open purchase orders — ordered from suppliers, not yet received. Distinct from In Transit (which is warehouse-to-warehouse).
Backorder PlannedDemand with no stock and no purchase order to cover it — allocations that are Planned. Not physical inventory; it represents a true shortage.
Backorder PO CoveredBackordered demand already covered by an inbound purchase order — allocations that are Awaiting Receipt. Not physical inventory.
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 valueThe FIFO-authoritative value of on-hand stock — the sum of available quantity × average cost across non-archived, non-consignment FIFO layers.
Average 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 plus a cross-warehouse roll-up row covering all of them. 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.

FieldWhat it holds
SKUThe product's unique reference — the identifier shown everywhere it's linked, and the field used to match on import. Unique per product.
BarcodeThe scan-lookup code (UPC/EAN). Used when you scan an item during a stock take or receipt.
MPNManufacturer part number — a secondary search field alongside SKU and barcode.
Unit 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 costDeprecated mirror. Shows the same FIFO-derived value as Inventory average cost; kept so older integrations keep working. Prefer Inventory average cost.
Inventory average 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, and case fieldsPhysical attributes used for shipping and packing. They never affect stock counts.
One SKU, one cost surface

When two cost numbers disagree, Inventory average 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.

FieldWhat it controls
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 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)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)How many days before expiry a lot counts as near expiry — the window that flags stock as aging.
Minimum 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 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: