FINANCE & KPIS

Days Inventory Outstanding (DIO) [With Qlik Expressions]

Autor

KlarMetrics

April 2, 2026 · 9 min read

Days Inventory Outstanding (DIO): Formula, Benchmarks, and Qlik Expressions

€822,000 of your cash is sitting in inventory right now. Your balance sheet calls it an asset. Your cash flow statement tells a different story.

That number comes from a real calculation: €15M COGS, a 20-day gap above benchmark, and the formula below. A manufacturer running 60-day DIO against a 40-day industry average isn’t “holding extra stock.” It’s financing that €822K on behalf of inventory that hasn’t sold yet.

Days Inventory Outstanding tells you how long inventory sits before it becomes revenue. Every day it sits, it ties up cash that could be paying down a credit line, funding a new product run, or sitting in a money market account earning 4%.

The DIO Formula

The standard formula is: DIO = (Average Inventory / COGS) x 365

You can also get there through inventory turnover: Inventory Turnover = COGS / Average Inventory, then DIO = 365 / Inventory Turnover. Both routes give you the same number.

The inventory turnover version is useful when you already have turnover in your reporting and want DIO as a quick conversion.

The trapped-cash calculation from the opening: €15M COGS / 365 = €41,096 per day. Multiply by 20 days excess = €821,918 in working capital above the industry benchmark. That is real money sitting in a warehouse instead of a bank account.

What Each Part of the Formula Actually Measures

Average Inventory: Why Not Period-End?

Average Inventory smooths out seasonality and timing distortions. A retailer who stocks up in October for the holiday season will show a misleadingly high period-end inventory balance in Q4. Using the average of beginning and ending inventory for the period gives a more representative picture of how much stock the business actually carries on a typical day.

For a trailing 12-month calculation in Qlik, Avg(Inventory) across the LTM period is the correct approach. It averages all inventory data points in the period, not just the opening and closing balance.

Why COGS, Not Revenue?

Inventory is valued at cost, not at selling price. Using revenue in the denominator creates a mismatch: you are comparing a cost-basis asset (inventory) against a price-basis flow (revenue). The result is a DIO that is artificially deflated and meaningless for cross-company comparison.

This is the most common DIO calculation mistake. If two companies have identical inventory levels and identical COGS but one has a higher gross margin, the revenue-denominator version makes the high-margin company look more efficient. It is not. Stick to COGS.

DIO Industry Benchmarks: What Is a Good Number?

Industry Good Average Concerning
Manufacturing <30 days 30-60 days >75 days
Wholesale / Distribution <20 days 20-40 days >50 days
Retail (general) <30 days 30-60 days >75 days
Retail (grocery / perishables) <10 days 10-20 days >25 days
SaaS / Professional Services N/A – no physical inventory
Healthcare (medical supplies) <30 days 30-60 days >75 days

These ranges are starting points. The meaningful benchmark is your own industry’s median, not a generic table.

A specialty chemical manufacturer with 90-day DIO might be running lean given lead times. A grocery chain at 25 days has a serious problem.

Compare DIO against three numbers. Any single benchmark in isolation can mislead.

  • Your own trailing 12-month trend
  • Direct competitors (if public financials are available)
  • Your industry vertical median

DIO is one leg of the working capital cycle. The cash conversion cycle shows how inventory speed interacts with receivables and payables.

Where Is the Money Hiding in Your Inventory?

DIO above benchmark is a cash flow problem, not an accounting problem. The money is sitting in your warehouse in three recognizable patterns.

Slow-moving SKU tail. A distributor with 800 SKUs and a 42-day average DIO might have the top 200 SKUs turning every 18 days and the bottom 200 turning every 95 days. Blended average looks fine. But those bottom 200 represent €3.8M in capital cycling less than 4 times a year. The headline hides the problem entirely.

Seasonal overstocking that never fully clears. A manufacturer buys for peak demand in Q4. Q1 demand comes in 15% lower than forecast. The excess carries into Q2, Q3, and becomes the new baseline. Each cycle adds a small layer. After three years, there’s 60 days of inventory that exists primarily because it was never written down.

Safety stock that never gets touched. A 10-week supplier lead time justifies carrying 10 weeks of that component. The business then adds a buffer for uncertainty. The buffer never gets used because the underlying forecast is conservative. That buffer is financed at cost of capital, every day, indefinitely.

A €15M COGS manufacturer running 20 days above benchmark is financing €822K across these three patterns. The specific split between them only shows up at the SKU level – which is why aggregate DIO is a starting point, not an answer.

DIO Inside the Cash Conversion Cycle

DIO is the inventory leg of the Cash Conversion Cycle. The full formula: CCC = DSO + DIO – DPO

Days Sales Outstanding (DSO) measures how long it takes to collect from customers after a sale. DPO (Days Payable Outstanding) measures how long you take to pay suppliers. DIO sits in the middle: the time between paying for inventory and selling it.

Improving any one leg improves the CCC. A 20-day reduction in DIO on €15M COGS frees €822K in cash – the same number from the opening.

That cash doesn’t appear on the income statement. It shows up in operating cash flow, and it’s the reason CFOs track the CCC rather than profitability alone.

What Causes High DIO?

High DIO has three distinct root causes, and each requires a different fix.

  • Over-ordering and excessive safety stock. The demand forecast is wrong or risk-averse, so the business buys more than it needs. The fix is a demand planning problem, not an inventory problem. Better forecasting models and tighter reorder-point parameters address the root cause.
  • Slow-moving or obsolete SKUs. A handful of low-velocity products inflate the average. These SKUs might be legacy items, seasonal leftovers, or failed product lines that never got written down. The fix is a portfolio cleanup: identify zero- or low-movement items and either discount them out or provision for write-down.
  • Long supplier lead times forcing forward buying. If a key component has a 10-week lead time, the business has to carry 10+ weeks of that component regardless of demand certainty. The fix is a supply chain problem: dual-sourcing, consignment arrangements, or VMI (vendor-managed inventory) with the supplier.

DIO alone does not tell you which root cause you have. A 65-day DIO could be any of the three, or all three simultaneously. The analysis has to go one level deeper.

Is a Falling DIO Always Good?

No. A declining DIO is not automatically a sign of efficiency.

When DIO falls because demand forecasting improved and reorder points were tightened, that is genuine improvement. When DIO falls because the business stopped replenishing fast enough, you get stock-outs, service level failures, and lost revenue. The DIO chart looks the same either way.

Always pair DIO with stock-out rate and service level data. If DIO drops 8 days and order fill rate drops from 97% to 91% in the same period, the DIO improvement is destroying more value than it is creating. The working capital gain is smaller than the revenue at risk.

A finance dashboard tracking DIO in isolation is missing half the picture. The operational counterpart has to be visible on the same screen.

DIO by SKU and Product Category: Where the Real Problem Hides

Aggregate DIO is almost always misleading. The average conceals the distribution.

A business with an overall DIO of 45 days might be running a 15-day average on fast-moving core SKUs and a 90-day average on slow-moving tail SKUs. The fast movers are healthy. The slow-mover tail is the actual working capital problem, and it is invisible in the aggregate number.

Consider a concrete example. A distributor carries 800 SKUs. The top 200 by volume turn every 18 days. The bottom 200 by volume turn every 95 days. Blended average: 42 days. The headline looks fine.

But the bottom 200 SKUs represent €3.8M in inventory capital cycling less than 4 times a year. That is where the working capital opportunity sits.

The useful analysis is always at the category or SKU level, not the aggregate. Build the drill-down first.

Qlik Expressions for DIO

Three expressions cover the main use cases. Field name placeholders used: Inventory, COGS, IsLTM, YearMonth. Replace with your actual field names.

These expressions assume a master calendar with an IsLTM flag set to 1 for the trailing 12 months.

DIO Overall (KPI Tile)

Avg({<IsLTM={1}>} Inventory) averages inventory across all rows in the LTM period. Sum({<IsLTM={1}>} COGS) sums the period flow. The {1} modifier is not used here because inventory is being averaged across time, not read as a point-in-time balance.

Num(
  (
    Avg({<IsLTM={1}>} Inventory)
    / If(Sum({<IsLTM={1}>} COGS) = 0, null(), Sum({<IsLTM={1}>} COGS))
  ) * 365
, '##0.0')

DIO by Product Category (Bar Chart)

Use this in a bar chart with your product category field on the dimension. No TOTAL modifier needed. The dimension context filters each bar to its own category’s inventory and COGS automatically, which is the same dimension-context approach used in the CCC by Business Unit expression.

// Bar chart with ProductCategory on the dimension.
// Each bar shows DIO for that category calculated against its own COGS.
// TOTAL is NOT used here - dimension context does the filtering.

Num(
  (
    Avg({<IsLTM={1}>} Inventory)
    / If(Sum({<IsLTM={1}>} COGS) = 0, null(), Sum({<IsLTM={1}>} COGS))
  ) * 365
, '##0.0')

DIO Trend (Line Chart, Rolling 12 Months)

Use this in a line chart with YearMonth as the dimension. Each point on the line shows that month’s DIO using that month’s inventory average and COGS. No rolling window calculation needed.

Add an IsLTM={1} chart-level filter to restrict the axis to the last 12 months. The set analysis tutorial covers dimension-context filtering in more detail.

// Line chart with YearMonth as the dimension.
// Dimension context filters each point to its own month automatically.
// Apply IsLTM={1} as a chart-level set analysis filter to limit to LTM.

Num(
  (
    Avg(Inventory)
    / If(Sum(COGS) = 0, null(), Sum(COGS))
  ) * 365
, '##0.0')

DIO and Obsolete Inventory: The Hidden Risk

Standard DIO includes obsolete inventory at book value. That distorts the number in two directions at once.

A business carrying €2M in items with zero movement in the past 12 months inflates DIO and also carries a hidden P&L risk. The write-down hasn’t happened yet.

Once it does, COGS spikes and the denominator jumps, which makes DIO look artificially low in the write-down period. Neither the inflated period nor the deflated period reflects operational reality.

Finance teams using Qlik should build two DIO views side by side:

  • Standard DIO – per the formula above, matches what external stakeholders and auditors will calculate
  • Adjusted DIO – excludes items with zero movement in 90+ days, reflects the working capital performance of the active inventory base

The gap between the two is the “obsolescence drag.” A widening gap is an early warning signal that a write-down conversation is coming.

What to Read Next

The full working capital picture: Cash Conversion Cycle shows how DIO interacts with receivables and payables – and gives you the single number that tells a CFO how efficiently the business converts operations into cash.

The receivables side: Days Sales Outstanding is the DIO equivalent for your invoice book. If DIO is under control but DSO is high, the working capital problem just moved downstream.

Build the dashboard: Finance Dashboard shows how DIO, DSO, and CCC sit together in a working capital view that surfaces the cash impact in euros, not just days.