WindoorERP Documentation 19.0

Run the stock aging report to identify slow-moving material

5 min read Updated 2026-08-31 WindoorERP 19.0
This article is step 8 of 9 in Know what your stock is worth

What this does

Inventory › Reporting › Stock Aging Report answers "how long has this stock been sitting here" — and therefore where working capital is quietly parked. A filter dialog generates a banded breakdown of current stock: quantities or values split into age periods (30 / 60 / 90 / 180 / 365 days by default), per product, category, location or lot, with slow-moving flags and a turnover-risk rating per row, in list, pivot and graph views or as a PDF.

Age is counted from the first receipt of that product into that location, against current on-hand stock. It is a "what is sitting here now, and since when" report — not a historical reconstruction.

Before you start

  • The Inventory Manager role — the Reporting menu gates the entry.
  • Value figures are quantity × the product's Cost, consistent with this platform's standard costing — maintained costs, honest values.

Steps

The Stock Aging Report dialog: scope filters, report type and grouping, editable aging intervals, and the Generate Report and Print PDF buttons

  1. 01
    Open Inventory › Reporting › Stock Aging Report. The filter dialog opens.
  2. 02
    Scope it: Warehouses, Locations, Products or Product Categories — empty means everything — and the As of Date.
  3. 03
    Pick the Report TypeBy Value (default, the working-capital view) or By Quantity — and the Group By: product, category, location or lot.
  4. 04
    Set the Aging Intervals if the defaults don't fit: interval type Days / Weeks / Months, with five editable period bounds.
  5. 05
    Optionally tick Only Slow Moving Stock — it keeps rows carrying stock in Period 3 or beyond, i.e. older than the Period 2 bound (60 days with the defaults) — or set a Minimum Value to cut noise.
  6. 06
    Press Generate Report for the interactive result — or Print PDF for the same thing as a document.
  7. 07
    In the result, sort by the older bands or the Turnover Risk badge, and use a row's View Moves button to see the receipts behind its age.

Reading the result

Column / elementMeaning
The band columnsQuantity (or value) per age band, plus Older and Total, each with column sums. The headers always read 0-30d / 31-60d / 61-90d / 91-180d / 181-365d — they do not re-label when you customise the intervals; your custom bounds still drive the bucketing, only the captions stay fixed.
Slow MovingFlagged when more than half the row's quantity sits in Period 3 or older.
Avg Age (Days)A weighted estimate using each band's midpoint.
Turnover RiskLow / Medium / High / Critical as the share in the oldest bands passes 25 / 50 / 75%.
Row buttonsView Moves — the done move lines for the row's product and location; View Product.
ViewsList (risk-coloured rows), pivot (bands as measures, rows by category) and a stacked bar graph. One search filter exists: Has Stock > 90 Days.

Aging results: per-product quantity and value split across the age bands with totals — freshly stocked material sitting entirely in the youngest band

The stacked bar view of the same result — capital tied up by age band at a glance

How the ages are computed — the honest details

  • Current stock only. The report buckets what is on hand now; the As of Date shifts the age arithmetic, it does not reconstruct past stock levels.
  • First receipt, not remaining receipts. A location's stock ages from the first time that product ever arrived there — a rack continuously topped up still ages from its first delivery, which makes fast-turning stock look older than a strict FIFO reading would. Read the older bands as "this rack has held this product that long", and use View Moves before condemning material.
  • Results are personal and temporary. Each Generate replaces your previous result; two managers can generate different scopes without collision, and nothing here is stored for posterity — regenerate rather than bookmark.
  • Leave "Aging Based On" on Receipt Date. The Manufacturing Date alternative depends on an expiry field this platform does not have — with lot-carrying stock it errors, and otherwise it behaves identically to receipt date. It is not usable here.

Troubleshooting

Generate Report opens an empty listNothing matched the scope — there is no message for this case. Widen the filters; for zero-stock rows tick Include Zero Quantities.
"No Data / No data found for the selected criteria."The PDF's version of the same situation.
The band headers don't match my custom intervalsKnown display limitation — captions are fixed; the bucketing follows your bounds. Note your intervals on whatever you export.
Value columns are all zeroReport Type is By Quantity — switch to By Value. (Minimum Value also only applies to the value variant.)
Yesterday's result vanishedResults are per-user and wiped by the next Generate. Print the PDF when you need to keep one.
An error mentions a missing field when generatingYou picked Based on Manufacturing Date with lot-carrying stock — switch back to Receipt Date.

Common mistakes

  • Reading old bands as dead stock without checking View Moves — continuous replenishment ages a location's stock from its first-ever receipt.
  • Customising intervals and then reading the fixed column captions literally.
  • Running By Quantity to talk about money — the working-capital argument needs By Value.
  • Comparing two people's results as if they were one report — each ran their own scope.
  • Using the report as an expiry tracker. Nothing here knows shelf life; it measures sitting time, not freshness.

Was this article helpful?

Running a window or door factory?

Ask for a demo