Skip to content
DevMarket
Odoo ModulesWordPress PluginsWordPress ThemesShopify ThemesApp TemplatesScripts & UtilitiesBlogSell on DevMarket

Stock Aging & Dead Stock Report for Odoo 19 documentation

A guide to the stock aging report: age brackets and how the age is counted, dead stock, scope and dates, analysis, printing and Excel.

Documents version 1.0.0Updated Oct 23, 2026

Start here

In plain words: The warehouse is full, the cash is not, and nobody can say how long the goods have been sitting there. Stock Aging & Dead Stock Report answers it: for every product, how much is on the shelf and how old it is, in six age brackets, with its value, and a flag on the dead stock that nobody has bought or received for months.
The aging by product, the value by category, and the printed report.
The aging by product, the value by category, and the printed report.
Tip: The age is counted first in, first out: sales eat the oldest receipts, so what is left on the shelf is the newest stock. Old stock shows up only when it really did not sell.

What you get

FeatureWhat it does
Six age brackets0-30, 31-60, 61-90, 91-180, 181-365 and over 365 days: the quantity and the value of each.
First in, first outThe age of each unit is the age of the receipt it came from, oldest sold first.
ValueQuantity at the cost of the product, per bracket, per product and per category.
Dead stockA product with stock where nothing was issued and nothing received for N days (180 by default) is flagged, with its value.
Last issueThe date of the last issue and the days since.
Any dateChoose a past date to see the aging as it was.
ScopeThe whole company, a warehouse, some locations, a category or chosen products.
AnalysisA pivot and a graph by category, filters for dead stock and for stock older than 180 days.
Print and ExcelA landscape PDF with the summary by bracket, and an Excel file with every column.
ArabicEverything is translated and works right to left.

Requirements

ItemDetails
Odoo19.0 (Community or Enterprise)
Apps neededInventory (stock)
LicenseOPL-1 (Odoo Proprietary License v1.0)

Install

  1. Unzip the package. Inside is taqnix_stock_aging.zip; unzip it to get the folder taqnix_stock_aging.
  2. Copy the folder into one of the addons_path folders of your Odoo server and restart Odoo.
  3. Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
  4. Remove the “Apps” filter, search Stock Aging & Dead Stock Report and press Install.
# or from the command line
./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_stock_aging --stop-after-init

Show the aging

In plain words: Inventory → Reporting → Stock Aging. Choose what you need and click Show the aging.
FieldMeaning
As ofThe date of the report: today, or a day in the past.
Warehouse, LocationsOnly the stock of this warehouse or these locations. Empty: the whole company.
Product category, ProductsA category and its sub-categories, or chosen products. Empty: every storable product.
Dead stock after (days)How many days without any issue or receipt make a product dead stock.
The aging: a line per product, the six brackets, the value and the last issue. Dead stock is in red.
The aging: a line per product, the six brackets, the value and the last issue. Dead stock is in red.
In plain words: At the top: the total value, the value older than 180 days and its share, and the value of the dead stock. Open the optional columns of the list for the value of each bracket, the days since the last issue and the age of the oldest unit.

How the age is counted

In plain words: For a product, the stock on hand on the chosen date is shared among its receipts, starting with the newest (because the oldest were sold first). A receipt is a move into the selected locations from outside of them: a purchase, a return, a manufacturing order, an inventory adjustment. A transfer between two locations of the selection does not make the stock younger.
ExampleResult
10 received 100 days ago, 10 received 40 days ago, 12 sold8 left, all from the receipt of 40 days ago: bracket 31-60.
5 received 300 days ago, nothing issued5 in the 181-365 bracket, and dead stock after 180 days.
5 received 100 days ago, moved to a shelf yesterdayStill 5 in the 91-180 bracket.
Tip: The value is the quantity times the cost of the product (the standard price, or the average or FIFO cost Odoo keeps on the product), not the price paid on each receipt.

Dead stock

In plain words: A product is dead stock when it has stock on the date, and nothing was issued and nothing was received for the number of days you set. Dead stock is in red in the list, ticked in the Dead column and counted in the value at the top. A product received last month is never dead stock, even if it was not sold yet.

Analysis

In plain words: Analysis opens the lines as a pivot, by category: the value of each bracket. The graph stacks the value of each category by moving and dead stock.
The value of each age bracket, by category.
The value of each age bracket, by category.
The value by category, moving and dead stock.
The value by category, moving and dead stock.
In plain words: The filters Dead stock and Older than 180 days keep the products you should look at first.
In plain words: Print gives an A4 landscape PDF: a summary of the value by bracket with its share, then each category with its products. Export to Excel gives every column: the quantities and values of the six brackets, the last receipt and issue, the days and the dead stock flag.
The printed report.
The printed report.

Who can do what

WhoCan
Inventory users and managersShow, analyse, print and export the aging.
Other usersNo access to the report.

Arabic and right to left

The aging in an Arabic interface.
The aging in an Arabic interface.

Limits

LimitDetail
Fixed bracketsThe six brackets (30, 60, 90, 180, 365 days) are fixed; only the dead stock days are yours to set.
Cost, not the receipt priceThe value uses the current cost of the product.
UnitsQuantities are in the unit of measure of the product.
Up to 1000 productsFor more products choose a category or a warehouse.
Stock without a moveThe report counts the stock from the done stock moves; a quant created directly in the database, with no move, is not counted.

For developers

In plain words: Skip this chapter if you only use the module.
aging = env['taqnix.stock.aging'].create({'as_of': '2026-06-30', 'warehouse_id': warehouse.id, 'dead_days': 120})
aging.action_compute()
for line in aging.line_ids:
    print(line.product_id.display_name, line.b1, line.b6, line.value, line.dead)

Troubleshooting

ProblemWhat to do
There is no stock on hand for these products on that dateCheck the date, the warehouse and the products: only storable products with a stock move are counted.
A product I know I have is missingCheck that it is a storable product and that the warehouse or the locations contain it.
The values are zeroThe cost of the product is zero: set it on the product.
The PDF is not styledCheck the system parameter web.base.url, so that the PDF engine can read the styles.

Updating and removing

Replace the folder with the new version, restart Odoo and run -u taqnix_stock_aging. Nothing is stored: the reports are computed when you open them.

Support

Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace page where you bought the module or write to support@taqnix.com with your Odoo version and a screenshot.