A finance professional in shirt and tie inspecting cardboard boxes on warehouse pallet racking, with bold text reading "Days Inventory Outstanding" and the letters D, I, O highlighted in yellow to spell DIO.

  • Jun 21

Your DIO Hasn't Moved in a Year. That's the Problem.

A DIO that sits at 78 days for a year isn't stable. It's hiding a supply problem and a demand problem. Here's how to cut it into decisions.

Four quarters. DIO at 78 days, every single one. Most controllers would call that stable. I'd call it suspicious.

An average that never moves usually means one of two things. Either nothing in your warehouse is changing, which is rare in any real manufacturing business. Or the components are moving against each other and cancelling out, which means two problems are growing while the dashboard reports calm.

Remember the controller from the first article in this series? Her DIO was 78 days, and the last real inventory review predated her in the role. When we finally cut the number open, the "stable" 78 was hiding both a supply problem and a demand problem. Neither was visible in the aggregate. Both had been running for months.

This article is about cutting the number open. The goal at the end is one distinction: how much of your inventory is stock somebody chose to hold, and how much is stock nobody decided to keep.

This is the sixth article in the Practical Lean Finance series on net working capital. Last week, ["Never pay early" is wrong. Sometimes.], closed out the payables lever. Articles 2 and 3 covered receivables. If you're new to the series, start with Article 1, where the cash conversion cycle and its three levers get laid out. This week we open the third lever: inventory.

The average that hides the mix

DIO = average inventory / COGS × 365.

Two technical notes before anything else, because both are common sources of a broken gauge. The denominator is COGS, since inventory sits on your balance sheet at cost. Teams that divide by revenue get a flattering number that won't benchmark against a standard DIO; a revenue-based inventory-days view has its place in a commercial dashboard, but it's a different metric. The numerator is average inventory across the period, since a month-end snapshot can swing with one large goods receipt the day before close.

The DIO formula shown with two ways the gauge breaks before you start: using revenue instead of COGS in the denominator, and a month-end snapshot instead of the period average. Each error is paired with the correct approach.

Now the worked example. Annual COGS of $18.25M, or $50K per day. Average inventory for the period: $3.9M. DIO: 78 days.

Cut it by material type and compare two quarters.

Q1: Raw materials $1.70M (34 days). WIP $0.40M (8 days). Finished goods $1.80M (36 days). Total: 78.

Q3: Raw materials $1.45M (29 days). WIP $0.40M (8 days). Finished goods $2.05M (41 days). Total: 78.

Same total. Same DIO. Two opposite movements underneath.

One condition for this comparison to mean anything: keep the denominator logic identical between periods. Trailing twelve months works well for a stable denominator. If demand is ramping or falling fast, run the same cut against a recent three-month denominator too, so the smoothing doesn't bury the operational signal. Otherwise a throughput change masquerades as an inventory change, and you'll chase the wrong one.

Read these as contribution days rather than true material-type days on hand. Each layer is computed against total COGS, so the layers add back to 78 and the mix shift stays comparable. Purists compute raw material days against material consumption and finished goods days against cost of sales. Once people are looking at the layers at all, refine the denominators. Start with the simple cut. It already changes the conversation.

Raw materials dropped five days. Maybe purchasing tightened, maybe a supplier moved to consignment, maybe production has been drawing down buffers that will need replacing at next quarter's prices. Finished goods climbed five days. Maybe demand softened, maybe production ran ahead of orders, maybe a large customer pushed out a delivery. Each movement deserves a conversation with a different person. The aggregate number said no conversation was needed.

Two stacked bar charts for Q1 and Q3, both totaling 78 days. Between the quarters the raw-materials layer shrinks five days while the finished-goods layer grows five days, so the total stays flat while the mix shifts.

The numbers in this walkthrough come from a working capital model I built on GoFast.Finance, run on the kind of mid-size manufacturing data I spent years inside. They behave the way real plants behave, which is the whole point of using them.

The field nobody exports

Even segmented, DIO is still a balance metric. It tells you how much stock you hold relative to throughput. It cannot tell you whether a specific pallet has been touched since last summer. The $2.05M in finished goods might be healthy stock turning every six weeks, or it might contain pallets nobody has scanned since the trade fair two years ago. The balance looks identical in both cases.

For that question you need something most controllers have never derived: the date of the last movement that represented real demand, per item. Every ERP records movement history. The work is in deciding which movements count. A transfer posting from aisle A to aisle B resets the date without proving anyone needed the item. So do cycle count corrections and stock adjustments. Count goods issues to production, shipments, and consumption. Exclude the reshuffling.

A two-column reference. Left, the movements that count as real demand: goods issue to production, customer shipment, consumption posting. Right, the movements to exclude: transfer postings, cycle-count corrections, stock adjustments.

In SAP, the slow-moving analysis is a starting point. Transaction MC46 ranks materials by the time since their last consumption posting, and MC50 isolates the dead-stock quantity that hasn't moved at all in the window. Both read the Logistics Information System, so they only show what the info structures were set up to track, inside the plant and storage-location scope you run them for. Don't treat either output as a decision list until an MM colleague confirms the movement types, the special-stock handling (consignment, customer-owned, blocked, QI), and the scope. SAP's note on the calculation logic is worth reading first (KBA 2341446). On S/4HANA, plenty of teams skip the old LIS reports and pull the same signal from the "Slow or Non-Moving Materials" app, a CDS view, or a direct goods-movement extract. In any other system, the goods movement log carries the same information under a different name. And if you manage batches, lots, or expiry dates, run the same test one level down. A moving SKU can still hide dead batches.

Run the cut on a real mid-size plant and the shape is usually something like this. 2,000 active SKUs. 800 of them with no relevant consumption in more than 180 days. Treat 180 as a starting threshold, adjusted to your replenishment cycle, rather than a law. That 800 is the headline that gets attention, but it isn't yet a decision. Some of those items are supposed to sit still. Critical spare parts. Regulatory retention stock. A contractual buffer a customer pays you to hold.

So you classify. Items with a documented justification, a named owner, and a review date are deliberate holds. An owner without a review date is permanent storage by default. Items that stopped moving 90 to 180 days ago and have no verdict yet go on a watch list. Items beyond 180 days with no owner and no documented reason are the red pile: accidental stock.

The classification is the whole game, and two items with identical movement histories can land on opposite sides of it. A $40K critical spare that hasn't moved in three years can be deliberate, because the downtime it covers would cost many times its carrying cost. A $40K component from a discontinued product, no owner and no reason, is accidental. Same dead history, opposite verdict. The movement date finds both. The classification tells them apart.

Most of the red pile also has a story upstream: a forecast that missed, an MOQ buy, an engineering change, a customer that pushed out an order. Worth remembering before anyone blames the warehouse for stock it only stored.

In this example, the red pile came to 150 items worth $2.4M.

Three months earlier, the action item in the ops review was "we should review inventory." It had been the action item for two years. Now the action item is a list of 150 specific items with values attached. That's what a measurement is for.

A funnel narrowing 2,000 active SKUs to 800 with no relevant consumption in over 180 days, then splitting them into deliberate holds (owner plus review date), a watch list (90 to 180 days), and a red pile of 150 accidental items worth $2.4M with no owner or reason.

When a moving SKU is still half dead

The batch caveat deserves its own example, because it catches the people who think the movement test cleared them.

Take a finished good with a two-year shelf life. A sealant, a reagent, a coating, anything with an expiry date. On the aggregate test it looks perfect. Goods issues every two weeks, last movement well inside the 180-day line. No flag. The controller moves on.

Then someone walks the warehouse and finds the picking logic isn't FIFO. Operators grab whatever pallet is nearest the door, usually the most recent receipt. The newest stock cycles. The oldest sits behind it, ages past eighteen months, and starts running at the expiry date. On a batch-level cut, 30% of the on-hand quantity for that "healthy" SKU is old stock heading for write-off. It passed every test you ran at the material-number level and it's still carrying a loss you haven't booked.

This is a different failure than the one in the first example. There the problem hid between material types. Here it hides inside a single SKU, below the level most reports stop at. Purchasing didn't cause this one and demand didn't either. The fix is a warehouse conversation about pick sequence. For shelf-life items the control is FEFO, first expired first out: you ship the batch that dates soonest, whatever its receipt date, and plain FIFO still lets an old batch decay behind a newer one. Same instinct, one level deeper: when shelf life is in play, the last-movement date on the material number lies, and the batch is where the truth sits.

One finished-goods SKU that passes the material-number movement test, with its on-hand quantity split by batch age: 45% newest, 25% aging, 30% past 18 months and heading for write-off because picking isn't FIFO.

The price tag

Back to the 150 red items and the $2.4M behind them. Here's the part finance owns outright: putting a cost on standing still.

Inventory has a carrying cost even when nothing happens to it. The largest component is capital. $2.4M sitting on shelves is cash that could repay debt or fund operations, and at a typical cost of capital that alone runs 8 to 15% per year. Add storage: warehouse space, handling, insurance. Add risk: obsolescence, damage, shrinkage. Use 25% as a fully loaded working proxy until you've built your own rate from your cost of capital, storage costs, and write-off history. The proxy gets the conversation started. Your own rate keeps it honest.

$2.4M of red items × 25% = $600K per year. $50K per month.

An inventory carrying-cost breakdown. $2.4M of red items flows into three components (capital at 8 to 15%, storage, risk), combined at a 25% fully loaded proxy to reach $600K per year, or $50K per month.

Be precise about what that number is, because a CFO will ask. It's an economic cost and a hurdle rate, the price of leaving the decision unmade. Clearing the items won't drop $600K straight into next month's P&L: part is capital you free up, part is risk you stop accruing, part is cost you can actually cut. And where red items turn out to be genuinely obsolete, expect a lower-of-cost-and-net-realizable-value review with accounting to follow.

Framed that way, the number changes the meeting. "We have slow-moving inventory" is an observation that has survived two years of ops reviews without consequence. "These 150 items cost us $50K a month to leave undecided, and nobody owns them" is a sentence that forces a response.

One thing this article will not do is tell you to clear all 150 items. Some of them might deserve to stay, and some of the deliberate holds might deserve to grow. The carrying cost is the price of the decision, whichever way it goes. What's unacceptable is paying $50K a month for items where no decision was ever made. Next week's article is about making those decisions, including the cases where the right answer is more inventory, and where the same 25% becomes the hurdle rate that proves it. The gauge cuts both ways. A DIO falling fast can hide stockouts, premium freight, and blown service levels just as quietly as a flat one hides dead stock.

Common pushback

When this lands in a real finance team, four objections come up almost every time. Each one has an answer.

  1. "We already run a slow-moving report. This isn't new." Pull it up and check two things. Does it exclude transfer postings and stock adjustments, or does an aisle-to-aisle move reset the clock? And does it end in a list of owners and a monthly cost, or in a number nobody acts on? Plenty of teams treat a report they never act on as if it were a control. The movement classification and the price tag are what turn it into a decision.

  2. "Most of that 800 is safety stock we actually need." Good. Then it survives the classification with a named owner and a review date, and it leaves the red pile cleanly. Nobody's accusing the whole 800. The charge is the subset with no owner and no documented reason, which here was 150 items. If most of the 800 really is justified, proving it takes an afternoon and you walk into the review holding the strongest possible position.

  3. "25% is a made-up number. Our auditors would never sign off on it." They wouldn't, and you wouldn't ask them to. 25% is a planning proxy for a management conversation, not a balance-sheet entry. It's a hurdle rate that tells you what the undecided pile costs to leave alone. The number that hits the financial statements is a separate net realizable value test on the items that turn out to be impaired, done with accounting, item by item. Two numbers, two jobs.

  4. "Operations will say inventory levels are their call, not finance's." They're right, and you should agree on the spot. The decision belongs to operations. The measurement and the price belong to you. You're not walking in to set stock levels. You're walking in to put a number on the table that nobody had before, so the people who own the decision can make it with the cost in front of them. That's finance acting as the orchestrator of the conversation instead of the scorekeeper after it.

Why this works: stratification

The move this article keeps repeating has a name in the quality toolkit: stratification. It's one of the seven basic quality tools, and the idea fits in one sentence. Take an aggregate measure, cut it into layers that correspond to different causes, and keep cutting until the number turns into a decision.

DIO was one number. Cut by material type, it became two opposite trends. Cut by movement age, it became 800 candidates. Cut by ownership and justification, it became 150 decisions with a monthly price. Cut by batch, even a healthy SKU gave up a write-off nobody had booked. Each cut removed a hiding place, and the final cuts separated deliberate stock from accidental stock.

If you followed the first series, this is the same instinct that broke "the close takes 7 days" into tasks on a critical path. An aggregate is fine for reporting. It's useless for improving, because improvement needs to know where.

The tool transfers anywhere an average is keeping the peace. Scrap cost by production line. Energy cost by machine. Overdue AR by root cause, which is exactly what the aging article did with the receivables file. Whenever a number has been stable for a suspiciously long time, stratify it before you trust it.

A vertical cascade cutting one DIO number step by step: by material type into two opposite trends, by movement age into 800 candidates, by ownership into 150 priced decisions, by batch into a write-off hidden inside a healthy SKU. Each cut removes a hiding place.

What to do this week

Two exports. In a clean system they take minutes. In a messy one the first pass takes longer, because you have to align material type, valuation, and which special stocks count. Either way it stays a diagnostic. You're not launching a project.

First, inventory balance by material type: raw materials, WIP, finished goods. Any ERP produces this. Divide each by daily COGS. Compare to the same cut three and six months ago. If the layers moved while the total didn't, you've found your first hidden conversation.

Second, the item list with movement history, reduced to the last relevant consumption date per item. Scope it before you sum: exclude consignment and customer-owned stock, and decide upfront whether blocked stock and quality-inspection stock belong in your number. Filter for no relevant movement in more than 180 days. Sum the value. Multiply by 25%.

Bring both numbers to your next ops or finance review. Don't propose a project. Put the segmented DIO trend and the monthly cost of the undecided pile on the table, and ask one question: which of these items are deliberate, and which are accidental?

An action summary. Two ERP exports feed one meeting: inventory balance by material type divided by daily COGS, and the item list with movement history filtered to 180-plus days and multiplied by 25%. Both lead to one question about which items are deliberate and which are accidental.

Questions I get asked

  • How do I pull the last-movement date if I'm not an SAP power user? You don't need to be. MC46 and MC50 give you the ranked lists directly. If those info structures aren't set up, export the goods-movement log and the stock value list and build the last-relevant-movement date in Excel or Power Query, filtering to the movement types that represent real demand. The skill is choosing which movement types count, and that's a thirty-minute conversation with MM, not a technical project.

  • What if operations refuses to assign owners to the slow-moving items? Then the absence of an owner is itself the finding. Don't argue the list item by item. Bring the total carrying cost of the unowned pile to the review and let the number do the work. "We're paying $50K a month for stock that no function will claim" is a sentence that gets owners assigned, because nobody wants to be the reason it stays unowned once the cost is visible. You escalate through the price.

  • Does this work for a distributor or retailer with no raw materials or WIP? Yes, and it's simpler. Drop the material-type cut, since you only hold finished goods. Keep the movement-date cut and the carrying-cost math. The 25% starting proxy still works to open the conversation, but challenge the rate harder here. Markdown risk, shrinkage, perishability, and thin margins can pull a distributor's or retailer's real carrying cost well away from a manufacturer's. If anything the slow-stock signal is cleaner, because there's no production buffer to explain away a dead item.

  • How do I tell deliberate safety stock from accidental dead stock? Documentation decides it. Deliberate stock has a reason somebody wrote down, a named owner, and a review date. Accidental stock has none of those. An item where someone says "we probably need that" but can't point to an owner or a date is accidental until proven otherwise. The test is strict on purpose, because "we might need it someday" is the exact sentence that built the $2.4M pile.


Ask this next month: How much of our inventory is deliberate, with a named owner and a review date, and how much is accidental?

Controller move: Export inventory with movement history and derive the last relevant consumption date per item, excluding transfers and corrections. Filter 180+ days. Sum the value and multiply by 25%. That's the annual cost of the stock nobody is deciding about. Segment your total DIO by material type while you're in there. Two numbers, one meeting.


Over the past few weeks we covered the cash coming in (receivables) and the cash going out (payables). This week we opened the third lever: the cash sitting on shelves, and the measurement cuts that make it visible. Next week, the uncomfortable part: sometimes the right answer is more inventory, and the same carrying cost math is how you prove it.


The automated version of this analysis, with the segmented DIO view, the per-SKU movement classification, and the carrying cost calculated per item, all refreshable from a standard ERP export, is part of the Net Working Capital Operating Model course (CC-AA02) on GoFast.Finance. The course gives you the model. This article gave you the cuts you can run by hand today.

Subscribe to Practical Lean Finance for one applied Lean technique per week, built for controllers and finance directors who want to move the numbers, not just report them.


This article originally appeared in the Practical Lean Finance newsletter on LinkedIn: https://www.linkedin.com/pulse/your-dio-hasnt-moved-year-thats-problem-arnaud-lemaire-ozfne


Sources

  • Taulia, Days Inventory Outstanding definition (average inventory / COGS × days)

  • NetSuite, inventory carrying cost components and the 25% planning shortcut; ISM on the 20 to 30% range and the absence of consensus benchmarks; APQC carrying cost component definition

  • The Hackett Group, 2025 Working Capital Survey (context: European DIO rose roughly 4% to 68.9 days, a decade high, on supply-chain and geopolitical buffers)

  • IAS 2 and US GAAP ASC 330, inventory measured at the lower of cost and net realizable value, with write-downs recognized when the loss occurs (the basis for any obsolescence review)

  • SAP, slow-moving and dead-stock analysis logic (MC46, MC50, KBA 2341446; S/4HANA Slow or Non-Moving Materials app)

  • Eliyahu M. Goldratt, The Goal. The book that made inventory a throughput problem instead of an accounting line. View on Amazon

As an Amazon Associate, GoFast.Finance earns from qualifying purchases.

0 comments

Joinor login to leave a comment