CanopyDocs
Docs

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.

SKU list

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:

Adding a SKU

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.

Bulk stock adjustments via CSV

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.

Locations — warehouse bin management

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:

Adding a bin location

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.

The Lots list

StatusMeaning
ActiveIn good standing — counts toward sellable stock (unless expired or short-dated).
On HoldA soft, reversible hold — held back from picks pending a decision.
RecalledA 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.

A lot's detail, with the hold and recall actions

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):

TypeCause
ReceiveReceived against a PO.
PickPulled for an order.
ReturnA returned item restocked.
Cycle CountA count correction.
ManualA hand adjustment (reason required).
DamageA damaged-goods write-off (reason required).
TransferStock moved between bins.
Break-packA 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.

On this page