Skip to content

See a demo

30 minutes with Sasha Zhang · video link on confirmation

Loading scheduler…

Markdown optimization: when and how deep

The markdown you take in week 8 was decided in week 3

A 62-store operator bought 4,200 units of a seasonal cocoa gift tin for a ten-week window. By the end of week 4 it had sold 445 of them against a plan of 1,176. Nobody acted, because 445 units is not an alarming number in isolation and the seasonal report does not run until week 8. The first markdown went on in week 8, at 15%, and the item finished the season losing money outright. Markdown optimization is the discipline that would have flagged this at the end of week 2, and the reason it is worth the effort is that by week 8 the decision had already been made. All week 8 got to choose was how much to lose.

Two numbers decide a markdown, and only two: the week you break price, and how far you break it. Everything else, the sequence of successive cuts, the sign copy, the chain-versus-store question, follows from those two. This page works both of them from the sell-through curve, with the arithmetic shown, and then covers the cases where a markdown is the wrong tool entirely.

For the definition of the term and how a markdown differs from a promotion, see retail markdown. For clearing excess that has already accumulated across a chain, the ladder of options before you get to price is on reduce overstock, and this page picks up at the rung where price is the answer.

Markdown optimization is two numbers: when and how deep

DecisionSet fromFailure if you get it wrong
WhenProjected terminal exposure against a salvage toleranceFewer weeks of lifted demand, more units at salvage
How deepMeasured markdown elasticity and the salvage valueToo shallow leaves units; too deep donates margin

The asymmetry between those two rows is the finding of this page. On the buy below, getting the depth wrong by 12 points cost $745. Getting the timing wrong by three weeks cost $3,115. Timing is worth roughly four times what depth is worth, and it gets a fraction of the attention, because depth is the number that appears on the sign.

Step 1: read the sell-through index, not the sell-through

Raw sell-through tells you nothing without a curve to compare it to. Seasonal demand is front-loaded or back-loaded depending on the item, and 10% sold at week 4 is healthy for a gifting item and catastrophic for a summer beverage.

Build the planned curve from last year's same item, or from the same item class if it is a new line, as cumulative percent of the buy sold by the end of each week:

WeekPlanned cumulativeActual cumulativeIndex
14%1.6%40
210%3.8%38
318%7.1%39
428%10.6%38
planned cumulativeactual cumulativecumulative % of the buy sold4%1.6%Wk 14010%3.8%Wk 23818%7.1%Wk 33928%10.6%Wk 438sell-through index
The gap is the signal: the index settles at 38 by week 2 and stays there, six weeks before the seasonal report ran (worked example)

The index is actual cumulative divided by planned cumulative, times 100. It stabilized at 38 by week 2 and stayed there, which is the signal. A single week below plan is noise. An index that holds flat below 100 across three consecutive weeks is a demand read, and it projects: terminal sell-through of 37.8% means 1,588 units sold and 2,612 units left when the window closes.

Two conditions before you trust the index. Full distribution has to be set, because a seasonal item that reached 44 of 62 stores in week 1 reads as weak demand rather than as late set-up. And the denominator has to be non-trivial; an index computed off 40 units sold is arithmetic, not evidence. In practice that means the earliest trustworthy read on a ten-week window is the end of week 2, and this operator had it.

Step 2: set the trigger on projected terminal exposure

The trigger is not a date. It is a threshold on how many units you are projecting to still own when the window closes.

projected terminal sell-through = index / 100
projected leftover units        = buy quantity x (1 - index / 100)
break price when projected leftover units exceed the salvage tolerance

Set the tolerance in units, as a percentage of the buy, before the season starts. Ten percent is a normal number for a gifting item with a hard terminal date. This buy projects 2,612 leftover units against a tolerance of 420, so the trigger fired the moment the index was trustworthy, which was the end of week 2.

The reason to write the tolerance down in advance is that it is the only part of this that is a judgment call, and judgment calls made in week 8 while looking at the actual pile of inventory are systematically too optimistic. Everyone believes the last three weeks will save it. On this curve the last three weeks carry 34% of planned demand, which at an index of 38 is 540 units against 3,755 on hand.

Step 3: size the depth from elasticity and salvage

Depth is the part with a closed form, and the form is worth deriving because it explains a result most merchants find wrong on first reading.

Let P be the current retail, c the unit cost, S the salvage value per unit after the window closes, and E the item's markdown elasticity measured on previous cuts. Lifted units at depth d are q0 x (1 + E x d), where q0 is the remaining full-price demand for the rest of the window. Total recovery is the margin on units sold, minus the loss on units that end up at salvage. Maximize it and the optimal depth is:

d* = ( E x (P - S) - P ) / ( 2 x E x P )

For the cocoa tin, P is $12.99, S is $0.75 (a jobber takes the remainder in January), and E measured on last year's cuts is 3.6:

d* = ( 3.6 x (12.99 - 0.75) - 12.99 ) / ( 2 x 3.6 x 12.99 )
   = ( 44.06 - 12.99 ) / 93.53
   = 33.2%

So $8.69 on the tag. Three sensitivities are worth internalizing, because they run against instinct.

A less responsive item gets a shallower cut, not a deeper one. Drop E from 3.6 to 2.4 and the optimal depth falls to 26.3%. If shoppers do not respond, cutting harder buys almost no extra units and gives away margin on every unit that was going to sell anyway.

Better salvage means a shallower cut. If the leftovers can be held for next season and sold at cost rather than dumped at $0.75, the optimal depth drops from 33.2% to 12.6%. Salvage value is the number that makes a markdown urgent, not the size of the pile.

Round to the permitted ending after solving, not before. The formula gives 33.2%, the tag says $8.69, which is 33.1% off. Close enough. What is not close enough is picking 30% because it is a round number and then discovering it leaves 300 units.

One boundary on the formula: it assumes the lifted quantity does not exceed the units you hold. Once q0 x (1 + E x d) passes the remaining inventory, the answer is simply the shallowest depth that clears, and going deeper than that is pure donation. If your price is set off keystone markup rather than off a measured margin, check the cost figure before running any of this. Cost does not enter d* at all, because the loss on salvaged units carries the same c the sold units do and it cancels out of the derivative. What the depth is genuinely sensitive to is S: get the salvage value wrong and every number below moves.

Worked example: one seasonal buy, five ways to end it

4,200 units, cost $6.10, regular retail $12.99, ten-week window, 62 stores. Every leftover unit realizes $0.75, so it carries a $5.35 loss against cost. Markdown elasticity 3.6. Through week 4, 445 units sold and 3,755 on hand.

StrategyFirst cutDepthUnits soldUnits liquidatedGross margin recovered
A. Default ladderweek 815% then 30%1,9662,234-$844
B. Right depth, three weeks lateweek 833%2,2311,969-$249
C. Right depth, right weekweek 533%2,9501,250$2,866
D. Right week, too deepweek 545%3,441759$2,121
E. Right depth, as early as the read allowsweek 333%3,292908$4,356

The arithmetic on row C, so the rest can be checked the same way. Weeks 1 to 4 sold 445 units at $6.89 of margin each, or $3,066. Remaining full-price demand for weeks 5 to 10 projects at 1,143 units; at 33.1% off, that lifts by 3.6 x 0.331 = 119% to 2,505 units, each carrying $2.59 of margin, or $6,488. That leaves 1,250 units at a $5.35 loss, or $6,688. Net: 3,066 + 6,488 - 6,688 = $2,866.

Three readings come out of that table.

The default ladder is the worst available outcome. Row A waits until the seasonal report runs, then goes shallow, then goes deeper too late to matter. It ends $5,200 behind row E on one buy. The quiz version of this trap is on spot the markdown trap, and the numbers here are why it is a trap rather than a preference.

The deepest cut is not the best cut. Row D sells 491 more units than row C and recovers $745 less, because the extra 12 points of depth cost $1.55 on all 2,505 units that would have sold at $8.69 anyway. Depth buys units at a price, and past the optimum the price exceeds what the units are worth.

Timing dominates. Rows B and C are the same depth three weeks apart and $3,115 apart in outcome. Every week of delay costs $750 to $1,050 here, because a markdown works by multiplying the remaining weeks of demand, and the remaining weeks are what you are spending while you deliberate.

The last number worth stating is the ceiling. Full sell-through at $12.99 would have produced $28,938 of gross margin. The best outcome available after week 2 was $4,356. Markdown optimization is damage control on a buy that was already wrong, which is why the version of this work that pays best happens upstream, in how the buy was sized and how it was split across stores. That is the subject of retail allocation.

Cadence: when a second cut is right

The standard ladder, 15% then 30% then 50% on a fixed schedule, is a way of avoiding the decision rather than making it. A second cut is justified in exactly one situation: the first cut's realized response came in materially below the elasticity you assumed.

Measure it two weeks after the cut. Compare realized units against the units the depth formula predicted. If realized lift is within about 20% of predicted, hold the price and let the window run. If it came in at half of predicted, the elasticity input was wrong, and re-solve the formula with the newly measured E and the new remaining inventory. That re-solve will usually recommend a second cut, and it will recommend a different depth from the ladder's next rung.

Two cuts driven by measurement look like a ladder from outside and are not one. The difference is that a ladder commits to the next rung before it has any evidence, and evidence is exactly what the first cut produced.

Whatever the cadence, take the cut across the whole chain position at once. Staggering by store moves units between stores rather than out of the system, and it makes the response measurement useless because the comparison stores are now contaminated.

Non-seasonal items: carrying cost replaces salvage

The depth formula needs a salvage value, and a non-seasonal item does not have one, because it will eventually sell at full price. Substitute the value you expect to eventually realize, net of what holding costs until then.

Take a slow center-store line at $5.99 retail, $3.40 cost, holding 26 weeks of supply. Carrying the money for 22 extra weeks at 22% a year is about $0.32 a unit. Add a 6% expected loss to damage and date code, another $0.20. Effective salvage is $5.47, not $0.75. Run the formula with a markdown elasticity of 2.8 and it returns a negative depth, which is the formula's way of saying do not mark this down at all.

That is the right answer, and it matches what the overstock clearing ladder recommends from a different direction: stop ordering, rebalance between stores, expand the facing, and only then consider price. A markdown on a non-perishable item with no terminal date converts a timing problem into a permanent margin loss. The exception is an item being discontinued, which does have a terminal date and therefore does have a salvage value, so the formula applies again.

Where markdown optimization goes wrong

Marking down against a phantom on-hand. Every number above rests on knowing how many units you actually hold. Where the perpetual record has drifted, the depth is sized against inventory that does not exist, and the cut clears three weeks early into an out-of-stock. See store-level inventory visibility.

Measuring recovery against the last price. A 50% cut that clears looks like a triumph next to the 30% that failed. Measure every markdown's recovery against original cost, or the sequence will always flatter its own final step.

Borrowing an elasticity from a promotion. Markdown elasticity and promotional elasticity are not the same number, and neither is base elasticity. A markdown is a permanent price reduction on a specific unit population with a terminal date; a promotion is temporary and pulls purchases forward. The distinction and how the numbers diverge is on price elasticity.

Marking down a distribution problem. An item selling at index 38 chain-wide because it never got set in 18 stores is not a demand failure, and no price will fix it. Check the store count and the set date before touching price.

Treating the item in isolation. A 33% cut on the branded tin pulls units off the store-brand tin next to it. If the store brand carries a richer margin rate, some of the markdown's measured success is cannibalised margin. The category read is the honest one.

No terminal plan. Deciding the salvage route in January, after the season, guarantees the worst price for it. Line up the jobber, the transfer, or the donation before the season starts, because the salvage value is an input to every depth decision you make during it.

Where Scout fits

Scout computes the sell-through index against a planned curve built from the item's own history or its class, per store and chain-wide, and fires the trigger the week the projection crosses the tolerance you set rather than when the seasonal report happens to run. It measures markdown elasticity off the chain's previous cuts on comparable items, which is the input the depth formula is most sensitive to and the one most often borrowed from somewhere it does not belong.

Scout can also carry the decision through. It holds the item file, maintains cost and retail, and pushes the approved markdown to the POS, so the price you solved for is the price on the tag on the day you intended it. Ordering is the exception: purchase orders stay with your purchasing system.

What Scout will not do is tell you the salvage value. That is a commercial fact about a jobber, a donation route or a transfer, and it belongs to whoever negotiated it. It is also the single input with the largest effect on depth, so it deserves to be a maintained field rather than an assumption.

The short version

  • Two numbers decide a markdown: the week and the depth. On this buy, three weeks of delay cost $3,115 and 12 points of excess depth cost $745, so timing is worth about four times what depth is.
  • Trigger on the sell-through index against a planned curve, not on a calendar. An index holding at 38 across three weeks projects 2,612 leftover units, and that is the number the tolerance is set against.
  • Depth solves to d* = (E x (P - S) - P) / (2 x E x P). Less responsive items get shallower cuts, and better salvage gets shallower cuts.
  • A non-seasonal item with no terminal date usually returns a negative depth, which means stop ordering and rebalance rather than mark down.

Want this as a Google Sheet?

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

Book a demo with your data