Plain-language questions
Ask for dead stock percentage per month, customer or product in the SQL Explorer with AI. The AI writes the SQL, you see the query and run it yourself; the AI only receives metadata.
KPI · Inventory, purchasing and production
Dead stock is inventory that has not sold for a long time, for example twelve months or more. As a KPI you express it as a share of total inventory value. It shows how much capital and warehouse space is tied up in products that will probably sell only at a discount, if at all.
Inventory value of products with no sales in the last X months ÷ total inventory value × 100%
On 30 June 2026 Acme Groothandel held inventory worth €1,250,000. Products with no sales in the previous twelve months account for €100,000 of that. The dead stock percentage is €100,000 ÷ €1,250,000 × 100% = 8.0%.
Fictitious figures for Acme Groothandel, a sample wholesaler.
A lower share means less cash is locked in unsellable stock and less risk of write-downs. Track the trend by quarter and product group, and look at which buying decisions create new dead stock. Agree the X-month threshold with finance, because it is often also used for the inventory provision in the annual accounts.
SQL & DAX
Two examples on a fictitious data warehouse for Acme Groothandel: a PostgreSQL query and a measure for a Power BI model. Adjust table and column names to your own model.
WITH last_sale AS (
SELECT product_id, MAX(movement_date) AS last_sale_date
FROM stock_movements
WHERE movement_type = 'sale'
GROUP BY product_id
),
current_stock AS (
SELECT product_id, SUM(value) AS value
FROM stock_levels
WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM stock_levels)
GROUP BY product_id
)
SELECT SUM(cs.value) AS total_stock_value,
ROUND(100.0 * SUM(cs.value) FILTER (
WHERE ls.last_sale_date IS NULL
OR ls.last_sale_date < current_date - interval '12 months')
/ NULLIF(SUM(cs.value), 0), 1) AS dead_stock_pct
FROM current_stock cs
LEFT JOIN last_sale ls ON ls.product_id = cs.product_id;Current Stock Value = CALCULATE(SUM(Stock[Value]), LASTNONBLANK('Date'[Date], CALCULATE(SUM(Stock[Value]))))
Dead Stock Share = DIVIDE(CALCULATE([Current Stock Value], FILTER(Products, ISBLANK(Products[LastSaleDate]) || Products[LastSaleDate] < TODAY() - 365)), [Current Stock Value])In ENABLE
Ask for dead stock percentage per month, customer or product in the SQL Explorer with AI. The AI writes the SQL, you see the query and run it yourself; the AI only receives metadata.
Define the KPI as a measure in your Power BI model and show it in the portal, with "Last refreshed" next to it. Access profiles and optional row-level security decide who sees which figures.
Add the KPI as a tile to a custom dashboard, compared with last year. The Dashboard Builder is a pilot and can be switched on per client.
With the built-in Targets app you set a target for the KPI per month, so you see actuals and target side by side.
FAQ
Stock is usually called dead when it has had no sales for a set period, often six or twelve months. The cut-off varies by industry and product type, so set your own. Use the same threshold for the KPI and for write-downs in the accounts.
Find the last sale date for each product and select those where it falls before the cut-off or is missing. Add up their inventory value and divide by total inventory value. Exclude new products that have not had a chance to sell yet.
The usual options are clearance at a discount, returning it to the supplier, selling to a stock liquidator or writing it off and disposing of it. Choose based on what each option recovers compared with the storage cost. Then adjust purchasing so the same items do not pile up again.
In an online demo we show how ENABLE makes your data securely available and how you build on it: describing an app in the AI Builder, plain-language questions, dashboards and APIs. And how we set it up and manage it for you.