Inventory Stock by location
Active SKUs
1,184
63 inactive
Total qty on hand
24,810
units across all items
Below reorder point
42
7 out of stock
Inventory value (at cost)
$182,340
retail $329,180
Item Category Qty on hand Committed Available Reorder pt. Restock lvl. Price Cost Last received Status
USB-C Cable 2m / Black
SKU: USB-C-2M-BLK · 7500435330025
Electronics 0 0 0 10 30 $19.99 $7.20 Mar 30, 2026 Out of stock
Wireless Mouse
SKU: MSE-WL01 · 7500435330018
Electronics 18 2 16 25 50 $34.99 $18.40 Apr 14, 2026 Low stock
Coffee Beans 1lb · Dark Roast
SKU: COFFEE-DK-1LB · 7500435550036
Food & Beverage 8 0 8 15 40 $12.99 $6.40 Apr 10, 2026 Low stock
AA Batteries 8-pack
SKU: BAT-AA8 · 7500435110014
Electronics 248 12 236 50 200 $9.99 $4.10 Apr 28, 2026 Healthy
Dish Soap 32oz
SKU: DSH-32OZ · 7500435440025
Cleaning 412 8 404 100 300 $4.99 $1.85 Apr 22, 2026 Healthy
Ibuprofen 200mg · 100ct
SKU: IBU-200-100 · 7500435660047
Health 94 3 91 20 80 $8.49 $3.10 Apr 19, 2026 Healthy
Show per page · showing 1–6 of 1,184
Row click behavior: opens the parent product at /products/$id. The product detail page's existing Inventory tab (currently a "Coming soon" placeholder, see ProductDetailPage.tsx) is where per-location stock detail will surface. This avoids inventing a parallel /inventory/$id route for the same data.
▸ Reference: Loading / Empty / Error states
Loading skeleton
No items match your filters
Try widening the search or clearing filters.
Couldn't load inventory
Something went wrong loading the stock list.
▸ Mockup notes (design decisions)
  • Scope (validated): only Stock snapshot + Low Stock. Adjustments, Stock Counts, and Movements are not surfaced here — pending a separate architecture decision (their UI location was never documented).
  • Layout: reuses the live portal's list-page composition (PageHeader → StatCardGrid(4) → FilterBar → DataTable → built-in pager). No navy hero banner — those are reserved for detail pages per the established pattern (PurchaseReceiptDetailPage / SupplierDetailPage).
  • Active location: the LocationProduct list is scoped to the location active on the TopNav switcher. The chip in the subtitle echoes it so it's visible at a glance.
  • "Low stock" stat card: styled with a warning surface and clickable — sets the stock-status filter to Below reorder point. Same trick the Dashboard low-stock card uses today.
  • Available column: shown alongside Qty on hand and Committed (= QtyOnHand − QtyCommitted). The backend doesn't return it directly; computed client-side.
  • Severity tints on Available: warning amber when below reorder point, error red when 0. Status badge gives the categorical version (Healthy / Low stock / Out of stock).
  • Row click → /products/$id: avoids inventing a parallel detail route. The Product detail page's existing Inventory tab will host per-location stock detail when implemented.
  • Sortable columns: all columns marked sortable. Each needs a matching SortBy + SortDirection switch on ListLocationProductsEndpoint. If the backend doesn't support a given sort yet, remove the arrow rather than ship a silent no-op (CLAUDE.md DataTable rule #21).
  • Out of scope (explicit): Adjustment CRUD, Stock Count CRUD, Movement log, Cost history, multi-location aggregated view, CSV export beyond the visual button.