Stock Reports
Stock Reports is a 13-report inventory workbench with a left-hand menu — current stock and valuation, low/out-of-stock alerts, movement history, fast/slow/dead-stock analysis, expiry and wastage tracking, plus barcode and batch/serial reports.
Overview
Stock Reports uses the same left-nav pattern as Sales Reports: 13 report types listed on the left, the active one loaded on the right and stored in the URL as ?r= (e.g. ?r=expiry).
The 13 reports are: Current Stock Report, Low Stock Report, Out of Stock Report, Stock Valuation Report, Item Movement Report, Fast Moving Items, Slow Moving Items, Dead Stock Report, Expiry Report, Wastage & Shrinkage, Barcode Report, Serial Number Tracking and Warranty Expiry Report.
Several reports (Fast Moving, Slow Moving, Dead Stock) are computed client-side by combining the inventory list with stock-movement history for the selected date range, rather than coming from one dedicated endpoint.
Before You Start
- Requires a role with Reports permission and the store on the Advanced plan tier or above (reports feature).
- Export buttons only appear for roles with Export permission.
- Low Stock, deficit and reorder figures are only meaningful once Min Stock Level and Reorder Point are set on your products.
- Expiry, Wastage and Serial/Batch Tracking reports rely on batch numbers and expiry dates being recorded when stock is received.
Step-by-Step Guide
1 Check current stock levels and valuation
- Open Current Stock Report, use the search box (press Enter to search immediately) to find a product, and page through results with Prev/Next.
- Read Total Items, Total Qty, Stock Value and Out of Stock cards; rows below the minimum level are highlighted.
- Open Stock Valuation Report to see Cost Value vs Retail Value per product with an overall Gross Margin % card and a per-product value-share bar.
2 Find items that need reordering
- Open Low Stock Report to see items below their Min Stock Level, each with a Deficit quantity and Gap % bar; a second card highlights items at or below their Reorder Point.
- Open Out of Stock Report for a paginated list of every product at zero quantity, with its last-restocked date.
3 Track how stock moves and where batches went
- Open Item Movement Report, set a date range and optionally filter by movement Type (Restock/Sale/Adjustment/Return/Damage/Transfer/Opening), then read the Stock In vs Stock Out summary cards and the movement log table.
- Open Serial / Batch Number Tracking, set a date range, and optionally filter by a batch/serial number; review the Batch Summary table (movements and net qty change per batch) above the full movement log.
4 Spot fast movers, slow movers and dead stock
- Open Fast Moving Items, set a date range, and read products ranked by total quantity sold with transactions and average per transaction.
- Open Slow Moving Items for the same idea in reverse — in-stock products with the lowest (or zero) sales in the period are listed first; rows with zero sales are highlighted.
- Open Dead Stock Report to see in-stock products with absolutely no movement of any kind in the date range, ranked by the capital value locked up, with a Capital Locked summary card.
5 Manage expiry and wastage/shrinkage
- Open Expiry Report, choose a look-ahead window (30/60/90/180/365 days), and review the Already Expired table separately from the Expiring Soon table, each row tagged Expired / Critical / Warning.
- Open Wastage & Shrinkage, set a date range and optionally filter by reason (Waste/Spoilage/Damage/Theft); each reason has its own estimated-loss card, and the table shows product, reason, qty and estimated loss value (based on cost price, falling back to selling price).
6 Check barcodes and warranty coverage
- Open Barcode Report, search by product (press Enter to search) and filter by Has Barcode / No Barcode, then review Total Products, With Barcode and Missing Barcode cards.
- Open Warranty Expiry Report for warranty-specific coverage (rendered by a dedicated component reused from elsewhere in the app).
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Left-hand report menu | Lists all 13 inventory report types; the active one is stored in the URL as ?r= |
Current Stock Report | Paginated, searchable product list with quantity, min level, cost price and stock value; highlights low/out-of-stock rows. |
Low Stock Report | Products below Min Stock Level with a Deficit amount, Gap % bar, and a separate Reorder Needed count for items at/below Reorder Point. |
Out of Stock Report | Paginated list of every zero-quantity product with last-restocked date. |
Stock Valuation Report | Cost Value vs Retail Value per product with an overall Gross Margin % and value-share bar. |
Item Movement Report | Date-ranged, type-filterable log of every stock movement with before/after quantities, batch and reference. |
Fast Moving Items | Products ranked by total quantity sold (from SALE-type movements) in the date range. |
Slow Moving Items | In-stock products ranked ascending by quantity sold in the date range; zero-sale rows are highlighted. |
Dead Stock Report | In-stock products with zero movements of any kind in the date range, ranked by capital (cost value) locked up. |
Expiry Report | Look-ahead window selector (30–365 days) splitting Already Expired items from Expiring Soon items, each with a days-left badge. |
Wastage & Shrinkage | Reason filter (Waste/Spoilage/Damage/Theft) with estimated loss value per reason and per movement. |
Barcode Report | Product list filterable by Has Barcode / No Barcode with a searchable product box (Enter to search). |
Serial / Batch Number Tracking | Batch/serial filter box plus a Batch Summary (movements, net qty change) and full movement log with batch references. |
Warranty Expiry Report | Dedicated warranty-coverage report reused from the Warranty component elsewhere in the app. |
Search box (Current Stock, Barcode) | Filters by product name/SKU; press Enter to run the search immediately instead of waiting for the next reload. |
Export button | Downloads the currently loaded report's rows as a spreadsheet where Export permission is granted. |
Tips & Best Practices
- Set Min Stock Level and Reorder Point on every product — the Low Stock Report's Deficit and Gap % numbers, and the Reorder Needed count, are only meaningful once those thresholds exist.
- Dead Stock only flags items that are still in stock with zero movement in your chosen date range — widen the date range if you suspect an item should show up but doesn't.
- Wastage & Shrinkage estimates loss value from Cost Price (falling back to Selling Price if no cost price is set) — set Cost Price for more accurate figures.
- Record batch numbers when receiving stock so Serial / Batch Number Tracking and the Expiry Report have something to key off.
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
| Enter | In the Current Stock Report and Barcode Report search boxes, runs the search immediately instead of waiting for the debounce/next reload. |
Troubleshooting & FAQ
Fast Moving Items or Slow Moving Items is empty.
Dead Stock Report looks wrong — an item I know hasn't sold isn't listed.
Barcode Report shows "Not assigned" for many products.
Expiry Report shows nothing even though I have perishable stock.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/InventoryReportsPage.jsxfrontend-app/packages/pos-react-lib/src/pages/reports/WarrantyReport.jsx
Backend endpoints used:
GET /inventory (params: page, limit, search) — Current Stock ReportGET /inventory/stats — Current Stock Report summary cardsGET /inventory (params: stockStatus=out) — Out of Stock ReportGET /inventory (params: stockStatus=in) — used by Dead Stock / Slow Moving to enumerate in-stock itemsGET /inventory/low-stock — Low Stock ReportGET /reports/stock — Stock Valuation ReportGET /inventory/movements (params: from, to, type, page, limit) — Item Movement, Fast/Slow Moving (type=SALE), Dead Stock, Serial/Batch Tracking, Wastage (type=WASTE/SPOILAGE/DAMAGE/THEFT)GET /inventory/expiring (params: days) — Expiry ReportGET /products (params: page, limit, search) — Barcode Report
Related tables (db-core repositories):
InventoryInventoryMovementProduct
Redux slices:
scope (selectCurrentScope / getScopeQueryParams)
Feature flag key: reports (requires advanced plan tier or above)
Fast Moving, Slow Moving and Dead Stock reports are computed entirely client-side: the component fetches raw inventory and movement lists via Promise.all and aggregates them in JavaScript rather than calling a dedicated backend aggregation endpoint. Warranty Expiry Report is the one entry in the REPORT_MAP that delegates to an external WarrantyReport component rather than a component defined in this file.