Home / Help Center / pos-app / Reports / Stock Reports
📦 Reports

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.

📍 Menu path: Reports → Stock Reports
👤 Who uses it: Roles with Reports permission (export buttons need Export permission)
🏷️ Plan tier: advanced+

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

Step-by-Step Guide

1 Check current stock levels and valuation

  1. Open Current Stock Report, use the search box (press Enter to search immediately) to find a product, and page through results with Prev/Next.
  2. Read Total Items, Total Qty, Stock Value and Out of Stock cards; rows below the minimum level are highlighted.
  3. 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

  1. 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.
  2. 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

  1. 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.
  2. 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

  1. Open Fast Moving Items, set a date range, and read products ranked by total quantity sold with transactions and average per transaction.
  2. 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.
  3. 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

  1. 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.
  2. 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

  1. 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.
  2. Open Warranty Expiry Report for warranty-specific coverage (rendered by a dedicated component reused from elsewhere in the app).

Every Field & Button, Explained

Field / ButtonWhat it does
Left-hand report menuLists all 13 inventory report types; the active one is stored in the URL as ?r=.
Current Stock ReportPaginated, searchable product list with quantity, min level, cost price and stock value; highlights low/out-of-stock rows.
Low Stock ReportProducts 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 ReportPaginated list of every zero-quantity product with last-restocked date.
Stock Valuation ReportCost Value vs Retail Value per product with an overall Gross Margin % and value-share bar.
Item Movement ReportDate-ranged, type-filterable log of every stock movement with before/after quantities, batch and reference.
Fast Moving ItemsProducts ranked by total quantity sold (from SALE-type movements) in the date range.
Slow Moving ItemsIn-stock products ranked ascending by quantity sold in the date range; zero-sale rows are highlighted.
Dead Stock ReportIn-stock products with zero movements of any kind in the date range, ranked by capital (cost value) locked up.
Expiry ReportLook-ahead window selector (30–365 days) splitting Already Expired items from Expiring Soon items, each with a days-left badge.
Wastage & ShrinkageReason filter (Waste/Spoilage/Damage/Theft) with estimated loss value per reason and per movement.
Barcode ReportProduct list filterable by Has Barcode / No Barcode with a searchable product box (Enter to search).
Serial / Batch Number TrackingBatch/serial filter box plus a Batch Summary (movements, net qty change) and full movement log with batch references.
Warranty Expiry ReportDedicated 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 buttonDownloads the currently loaded report's rows as a spreadsheet where Export permission is granted.

Tips & Best Practices

Keyboard Shortcuts

ShortcutAction
EnterIn 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.
Both reports are built from SALE-type stock movements in the selected date range — widen the date range if there were few or no sales, or confirm sales are recording inventory movements.
Dead Stock Report looks wrong — an item I know hasn't sold isn't listed.
Dead Stock only checks the date range you have selected, and only includes items currently in stock (qty > 0). Widen the date range or confirm the item still has stock.
Barcode Report shows "Not assigned" for many products.
That badge means the product has no barcode value saved. Open the product in Products and add a barcode, or use the No Barcode filter to batch through them.
Expiry Report shows nothing even though I have perishable stock.
This report only includes inventory records that have an expiry date and batch number recorded — confirm expiry dates were entered when the stock was received.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/InventoryReportsPage.jsx
  • frontend-app/packages/pos-react-lib/src/pages/reports/WarrantyReport.jsx

Backend endpoints used:

  • GET /inventory (params: page, limit, search) — Current Stock Report
  • GET /inventory/stats — Current Stock Report summary cards
  • GET /inventory (params: stockStatus=out) — Out of Stock Report
  • GET /inventory (params: stockStatus=in) — used by Dead Stock / Slow Moving to enumerate in-stock items
  • GET /inventory/low-stock — Low Stock Report
  • GET /reports/stock — Stock Valuation Report
  • GET /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 Report
  • GET /products (params: page, limit, search) — Barcode Report

Related tables (db-core repositories):

  • Inventory
  • InventoryMovement
  • Product

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.