Inventory
Every client's SKUs and stock, the bins that hold it, lot tracking, and the full adjustment history.
Inventory is the source of truth for what stock exists, where it lives, and how it's moving — across all your clients. As an operator you also manage the physical bins themselves and can adjust, transfer, and count stock.
Operator vs. client view
A brand sees only their own SKUs and stock. You see every client's, plus a Locations page (bin management) clients never get, the Upload CSV bulk stock-adjustment tool, and the hands-on actions — transfer, cycle count, and lot hold/recall.
SKUs
Inventory → SKUs. The product catalogue with live stock, across all clients.

Each row shows on-hand, allocated, available, and a days of stock pill (🔴 under 7 / 🟡 7–14 / 🟢 14+ / — no recent sales). A Reorder badge appears when on-hand hits the reorder point, and badges flag Kit, Non-physical, and Inactive SKUs. Eight filter chips narrow the list — Active, Kit, Allocated, Available, Backordered, Kit Components, Warehouse, and At Risk (each toggles all / show-only / hide). Operators also get Add SKU and Upload CSV.
Add SKU opens a sheet for the code, name, dimensions, kit/non-physical flags, and any initial stock:

Upload CSV is a bulk stock-adjustment importer, not a catalogue loader.
Each row (Sku, Action, Quantity, Location, Reason) posts a delta as a MANUAL
adjustment — it can create a new bin, and it side-creates a bare stub SKU for an
unrecognized code, but it does not edit any SKU's catalogue fields. The dialog
runs select → preview (valid / invalid) → done (processed / skipped / new
locations); pin a client first.

Click a SKU for its detail: five KPI cards (On Hand, Allocated, Available, Backordered, Locations), an Unsellable / Expired callout when stock sits on a bad lot, the Locations holding it, Lot tracking settings, Kit Components (with the bottleneck part flagged), unit-of-measure tiers for case/pack SKUs, and the Activity history.
Locations
Inventory → Locations. Bin management — the operator-only view of every storage location in the warehouse.

Each bin shows its label, type, and flags — Pickable (a forward pick face) and Sellable (its stock can be allocated) — plus how many units and SKUs it holds, and its zone and warehouse. Filter by active / pickable / has-stock / empty / sellable, search by label, and Add Location to create a bin. The Cycle Count Queue link jumps to Warehouse Ops → Cycle Count.
Add Location opens a sheet for the bin's label, type, and zone, plus its sellable and pickable flags:

Item Locations
Inventory → Item Locations. Stock broken out by bin — useful when one SKU lives in several places. Each row shows whether the bin is Pickable, plus the lot # and expiry with an Expired or Short-dated badge when relevant. The Pickable only toggle narrows to forward pick faces. This is also where you transfer stock between bins.
Lots
Inventory → Lots. For perishable stock, each batch is tracked with its own expiry, origin, and status.

| Status | Meaning |
|---|---|
| Active | In good standing — counts toward sellable stock (unless expired or short-dated). |
| On Hold | A soft, reversible hold — held back from picks pending a decision. |
| Recalled | A hard, terminal withdrawal — blocked from picking and shipping. |
Open a lot to see its manufactured date, vendor, and on-hand by location — with the operator actions in the header: Put on hold, release, or Recall.

Only sellable stock counts toward a SKU's available quantity — stock on expired, short-dated, on-hold, or recalled lots stays visible but can't be allocated or shipped.
Adjustment Log
Inventory → Adjustment Log. The audit trail for every stock change across all clients — who changed what, when, and why. Each entry has a type badge (shown here in Title case, as the page renders it) and a signed quantity (green added, red removed):
| Type | Cause |
|---|---|
| Receive | Received against a PO. |
| Pick | Pulled for an order. |
| Return | A returned item restocked. |
| Cycle Count | A count correction. |
| Manual | A hand adjustment (reason required). |
| Damage | A damaged-goods write-off (reason required). |
| Transfer | Stock moved between bins. |
| Break-pack | A sealed pack opened one level down (e.g. a case into inner packs, or into loose eaches) — the pack form changes, net units don't. |
Same events, two views
The Reports → Inventory Changes
report is the same data, but there the type shows as a raw all-caps badge
(RECEIVE, RETURN RESTOCK, …). Don't be thrown by the different casing.
Each entry records the SKU, bin, who made the change, and a note — with the driving record's reference id (PO, pick list, return, transfer) when there is one.
You post the two operator-driven types yourself. Adjust Stock (from a SKU's
Locations tab, or the per-bin pencil) opens a sheet — Add/Remove direction,
location, lot (for lot-tracked SKUs), quantity, and a required reason — and
writes a MANUAL row; it works even when on-hand is 0. Break pack opens a
sealed case/master-case/pallet down one level (eventually to loose eaches) in the
same bin, writing a BREAK PACK row. Both are operator-only.