Skip to content

How to prevent over-ordering in retail

The over-order you cannot see

Ask a store manager how often their team over-orders and you will hear "rarely." At store 1046, nine dairy lines were over-ordered in a single cycle and the markdown report knew it months before anyone else did. Both are being honest. The gap between them is a piece of arithmetic buried in almost every retail order screen, and once you see it you cannot unsee it. Learning how to prevent over-ordering in retail starts there, because the ordering system is not concealing anything deliberately. It is a side effect of which number the screen chooses to show.

Order recommendations are almost always shown as a net number: the gross target for the item, minus whatever is already on order. That is the right number to display when you are deciding what to buy, because it is the quantity to add. It is a catastrophic number to filter on, because the moment actual orders reach or exceed the target, the net ask falls to zero and the line disappears from a screen that shows rows needing an order.

An over-ordered item does not appear as a warning. It appears as nothing at all.

At store 1046's dairy department in a single order cycle, this is what the shape looked like.

Dairy lines reviewed290Product already on order44Over-ordered vs. target9Visible in the order screen1
Store 1046, dairy, one order cycle. The default filter keeps rows with a net ask of at least one case, so eight of the nine over-ordered lines never render.

Two hundred ninety lines reviewed, 44 with product already on order, nine of them over-ordered against their gross target, and exactly one of those nine visible in the order screen. Eight over-ordered lines were reviewed by a competent manager who never had the chance to see them, because the filter that produces a clean worklist also produces a blind spot with precisely the wrong shape.

Why the arithmetic hides it

Work the numbers on one line to see the mechanism.

An item sells 6 units a week. The order guide targets 3 weeks of supply, so the gross target is 18 units. There are 4 on hand and 16 already on order.

gross target        = 18
on hand             =  4
already on order    = 16
net ask = 18 - 4 - 16 = -2  -> clamped to 0

The net ask is zero, so a screen filtered on net_ask >= 1 drops the row. But the store is about to hold 20 units against an 18-unit target on a 6-unit weekly rate, which is three and a third weeks of supply and climbing, because next cycle's order will be computed from an on-hand that has not yet absorbed the inbound.

Now note what makes this compounding rather than self-correcting: the line is invisible in exactly the cycle where intervening would help. By the time it becomes visible again (when the stock finally draws down and the net ask goes positive), the excess has already been paid for, received, and shelved.

How to prevent over-ordering in retail: use the gross target

The correction is small and specific. Stop evaluating "is this line ordered correctly" against the net recommendation. Evaluate it against the gross target, with the on-order quantity added back.

actual   = cases already on order
recommended (gross) = order_units + on_order_units
flag if  actual - recommended >= 2 cases
     OR  actual >= 2 x recommended

The two-part flag matters. A pure absolute threshold (two cases over) fires constantly on high-volume items where two cases is noise. A pure ratio threshold (twice the recommendation) never fires on slow items where the recommendation is one case and the order is three. Running both as an OR catches the fast-mover drift and the slow-mover blunder, which are genuinely different failures.

The comparison has to use the gross figure. This is the part that gets implemented wrong, because the column labelled "Recommended" in most order screens is already net of on-order. Comparing what was ordered against that column compares a gross quantity to a net one and produces nonsense: every line with anything on order looks over-ordered.

Making the flag survive the screen it lives on

Surfacing the flag is not enough, because the order screen has two behaviors that will swallow it.

Zero-case rows are usually greyed out. Order screens dim any line with a recommendation of zero, on the reasonable theory that there is nothing to do. Every over-order review row has a zero or near-zero recommendation by definition, so the flag lands on exactly the rows the interface is de-emphasizing. The flag has to beat the greying, or it is technically present and practically invisible.

A "versus recommended" column restates the obvious on most rows. At store 1046, 246 of the 290 dairy lines had nothing on order at all. If the comparison column renders for every row, it repeats the order quantity 246 times and buries the 9 rows that matter. Render it only where something is on order.

Both of these are interface decisions rather than analytics decisions, and both of them will silently neutralize a correct calculation. A flag that can never fire visibly is the same as no flag.

What the flag is for, and what it is not

An over-order flag is a prompt, not a veto. Most flagged rows carry a zero-case recommendation and are purely review items: look, confirm it was deliberate, move on. Some flagged rows still legitimately want a case or two, because a promotion is coming or the item is seasonal, and those rows should stay orderable rather than being blocked.

That distinction is worth building in explicitly. A system that refuses the order teaches the store team to work around it, and the workaround will be worse than the original problem. A system that says "this is more than the model expects, confirm" gets the judgment call to the person who has the context.

Legitimate reasons an order exceeds target, all of which should survive the flag:

ReasonHow to tell
Upcoming promotionPromotional calendar shows a feature within lead time
Seasonal rampPrior-year same-week rate of sale is materially higher
Supplier minimum orderThe order quantity equals the minimum exactly
Known supply disruption aheadBuyer note on the item
Genuine errorNone of the above

The supplier-minimum row is the one that shows up most and is least discussed. If a supplier's minimum is 40 cases and the store needs 12, the store is structurally forced into over-ordering every cycle, and no amount of order discipline fixes it. That is a purchasing problem, not a store problem, and it belongs in the supplier selection conversation where minimums are negotiated.

The four upstream causes worth fixing first

The flag catches over-orders. It does not stop them, and a flag firing 20% of the time on lines with anything on order is telling you something structural rather than something about individual judgment. Four causes account for most of it.

Supplier minimums above store rate of sale. Structural and unfixable at the store. Every cycle forces excess. This belongs in purchasing terms, and it is worth quantifying before a supplier negotiation: the number of store-items where the minimum exceeds three weeks of demand is a concrete negotiating fact.

Order guide targets set once and never revisited. An item whose rate of sale halved two years ago still carries the target it had then. The target is stale, the order is correct against the target, and the result is excess that no order review will catch because nothing is out of policy.

Lead time entered optimistically. If the system thinks lead time is 3 days and it is realistically 11, store teams learn to order early and heavy to compensate. That behavior is rational and produces persistent over-ordering that looks like indiscipline. Fixing the parameter removes the behavior.

Promotional buys with no draw-down check. The buy is approved against a lift assumption. When the lift underdelivers, nothing reconciles the leftover against the next order, so the promotional excess and the replenishment order stack.

Ranking these matters, because the flag will surface all four as the same symptom. At our operator the minimum-bound items and the stale targets together accounted for a clear majority of flagged lines, which meant the productive response was a purchasing conversation and an order-guide refresh, not training.

Measuring whether you actually fixed it

Two metrics, tracked at store and department level.

Over-order rate: flagged lines as a share of lines with anything on order. At store 1046 dairy that was 9 of 44, or 20.5%, which is high and was invisible. Track the trend, not the level, because the level varies by department and minimum-order structure.

Weeks of supply at the tail: the 90th-percentile weeks-of-supply across the department. Over-ordering shows up here before it shows up in markdown, and it is harder to game than an average. Dairy at 1.9 weeks looks healthy on average while individual lines sit at six.

Both should be read alongside the department's overall position, since over-ordering and overstock are the same phenomenon at different time horizons: over-ordering is the decision, overstock is the residue.

Doing this in Scout

Scout's order review builds the comparison the order screen cannot. The recommendation is computed as usual, and alongside it the gross target is reconstructed by adding on-order back, so actual-versus-expected is an apples-to-apples comparison rather than a net-versus-gross one.

The row set is the part that matters: orderable lines or over-flagged lines, rather than orderable lines alone. Flagged rows sort to the top and the flag overrides the zero-case greying, which is what keeps the eight invisible lines at store 1046 from staying invisible. The comparison column stays silent on the 246 lines with nothing on order, so the signal is not diluted by 246 restatements of the order quantity.

Because it runs across every store, the view answers the question a single order screen never can: is this a store-1046 habit or a chain-wide pattern in the same six items. Those have different fixes, and the second one is usually a minimum order or an order-guide setting rather than anything a store did.

Scout reviews and flags what was ordered against what the model expected. It does not place orders, hold your order guide, or transmit anything to a supplier: your purchasing system keeps doing that.

Starting where the volume is

If you are trying to prevent over-ordering across a whole chain, do not start with the flag. Start by counting the store-items where the supplier minimum exceeds three weeks of demand, because those lines cannot be ordered correctly by anyone and they will dominate your flag list from day one.

Fixing them is a purchasing conversation, not a store one, and it removes the noise that would otherwise train store teams to ignore the flag entirely. Once the structurally impossible lines are labelled, the remaining flags are actual decisions, and a flag list that is mostly real gets read.

Summary

  • Order screens filter on a net ask, so an over-ordered line has a net ask of zero and vanishes. At store 1046 dairy, eight of nine over-ordered lines were invisible.
  • Compare actual orders against the gross target with on-order added back, and flag on an OR of an absolute threshold and a ratio, so both fast-mover drift and slow-mover blunders are caught.
  • The flag must beat the interface: zero-case rows are greyed by default, and a comparison column that renders on every row buries the few that matter.

Further reading: reduce overstock covers what to do with the inventory once it is already there, and replenishment guidance covers setting the targets these orders are measured against.

Want this as a Google Sheet?

Drop your email and we'll send the worked example.

Book a demo with your data