When to discount slow moving inventory: a dated trigger ladder with a margin floor
A markdown trigger ladder with real dates and a margin floor: when weeks of cover crosses the line, what depth to take, and which SKUs should never be discounted.
InventoryX is in development and not available today. ClearStock is the live Shopify app.
Discount slow-moving inventory when weeks of cover crosses a number you fixed in advance, and never below a margin floor you also fixed in advance. A workable default: 20% off at 12 weeks of cover, 30% at 16, 40% at 20, and an exit decision at 24 — with no rung allowed below cost, and any SKU already under 25% gross margin excluded from the ladder entirely. Tune the thresholds by category. The pre-commitment is not optional, because the entire value of a trigger is that it fires on a date rather than on a mood.
Why the trigger has to be a number
Merchants don't usually fail to notice slow stock — they notice, then defer. The deferral feels prudent ("it might still move at full price") and it compounds: every month adds carrying cost, ages the stock, and lowers what a buyer will eventually pay. A trigger converts an open-ended judgment into a date on a calendar, which is the only form of judgment that reliably executes.
Two inputs do the work, and both need honest numbers:
Weeks of cover = units on hand ÷ average weekly units sold. Use in-stock-only velocity — a SKU that sat dark for two weeks reads slower than it is, and discounting a product for being unavailable is a self-inflicted loss.
Age of the oldest units. Cover tells you the position; age tells you how much time you have. A 20-week position in stock received last month is a different problem from a 20-week position in stock received nine months ago, because the second one's achievable price is already falling.
When those two disagree, trust the combination: high cover with old stock is the true trigger, and it's the basis of the timing table below.
The trigger ladder, with dates
These are calendar-anchored, not "review it when we have time." The dates assume a report run on the first Monday of each month and a decision window of a few days after.
| Trigger | Fires when | Action at that date | Depth |
|---|---|---|---|
| Watch | Cover 8–12 weeks, or oldest stock 60+ days | Non-price fixes: hero image, collection placement, bundle copy, a content mention. Log the date. | 0% |
| Rung 1 | Cover 12–16 weeks | Mark down on the 15th of the month, end on the last day of the following month | −20% |
| Rung 2 | Cover still 16–20 weeks two weeks after rung 1 ends | Mark down on the 1st of the next month, same six-week window | −30% |
| Rung 3 | Cover 20+ weeks, or any SKU with no sale in 90 days | Short window — three weeks — then exit | −40% |
| Exit | Rung 3 missed its sell-through target | Bundle, bulk lot, donate, write off. No rung 4. | — |
Three properties make this ladder work where a vague plan doesn't. Each rung has a start date and an end date — an open-ended markdown isn't a rung, it's a permanently lower price with a badge attached. Each rung has a measured target, typically half the remaining units sold inside the window, and missing it triggers the next rung rather than an extension. The ladder stops at your floor.
One seasonal override: date-stamped and seasonal goods don't run on cover at all. A 2027 wall calendar in February isn't "rung 2," it's an item with a deadline, and the discount should be sized to the selling weeks left.
The margin floor
The floor has two parts, and both need writing down before you discount anything.
Floor 1 — never below cost. A price under unit cost isn't a markdown, it's a partial write-off wearing a sale tag. It also destroys the ladder's diagnostic value: if rungs can go underwater, "did the discount work?" stops being a question about demand.
Floor 2 — a minimum gross margin percentage per rung. Deep discounts on low-margin items require impossible volume. The arithmetic: your break-even multiplier is full-price margin ÷ discounted margin. On a $19 item with $12.50 of margin, a 20% cut needs 1.4× the volume, a 30% cut 1.8×, a 40% cut 2.6×, a 50% cut 4.2×. On a $14 item with $5.00 of margin, a 30% cut leaves $0.80 and demands 6.3× — a rung that will never pay. The full multiplier table and worked examples are in how deep to mark down.
| Gross margin at full price | Deepest rung that stays above the floor |
|---|---|
| 40%+ | 40% off, if the item is high-ticket and storage is expensive |
| 30–40% | 30% off |
| 25–30% | 20% off |
| Under 25% | No ladder. Bundle, sell in bulk, or hold |
The last row is the one people resist. For a thin-margin item, the honest options are bundling with something profitable, selling the lot, or accepting the position — discounting just converts a slow SKU into a cheap slow SKU.
Worked example: the same sock, two calendars
All figures illustrative. The "Trail Crew" merino boot sock, $18.00 retail, $6.10 landed cost, $11.90 margin. It's September 1. On hand: 210 pairs. Trailing velocity: 8 pairs a week.
210 ÷ 8 = 26 weeks of cover
At 26 weeks the ladder says exit. But last year's Q4 ran this style at 14 pairs a week, and none of that lift has happened yet:
210 ÷ 14 = 15 weeks of cover
That's rung 1 — and only if Q4 arrives and it's still crawling. Firing a 20% cut on September 15 because trailing math said "26 weeks" would have cost $3.60 a pair on 210 pairs, about $756 of margin, to solve a problem the calendar was about to solve for free. Use projected velocity when a known season sits inside the cover window, and don't use it as an excuse past the point where the season should have started.
The mirror case is the Halloween-adjacent SKU with 10 weeks of cover on October 1. The ratio says healthy; the calendar says three selling weeks left. The date wins.
Path comparison, both from December 1 with 190 pairs left: a 20% rung now ($14.40, $8.30 margin) at roughly 12 pairs/week clears in about 16 weeks for $1,577 of contribution, minus ~$70 of carrying. Holding to a 50% cut in February ($9.00, $2.90 margin) moves at perhaps 9/week, takes 21 weeks, and returns $551 minus ~$100 of carrying. The gap is mostly depth, not delay: the shallow rung keeps $5.40 more per pair. Early and shallow beats late and deep in almost every honest version of this arithmetic.
Rules versus judgment: where the line actually is
The old advice was "keep it manual; no rule engine should own it." That's half right, and the wrong half is the expensive one.
A rule can own the trigger. Computing weeks of cover, comparing it to a threshold, checking age, and producing the list of SKUs that crossed the line is mechanical work — and done by hand monthly, it gets skipped in exactly the busy months that generate the most slow stock. Automating detection doesn't remove judgment; it gives judgment a queue. ClearStock does this part: it tracks slow and dead stock candidates in Shopify and can apply rule-based discounts with a cap you set, logged and reversible.
A human owns the floor and the exclusions. Three things shouldn't be rule-driven without a person in the loop:
- The floor. Which SKUs are excluded because their margin can't survive any cut, and what the deepest permitted depth is — a decision about cash and brand, not a threshold.
- Exclusions. Bundle components, subscription items, hero products you'll never discount, anything under a supplier's MAP policy. Rules happily discount things that shouldn't be touched.
- The public story. Whether the store wants a visible sale section at all is positioning, and positioning doesn't fit in a condition statement.
The practical split: software watches cover and age and applies guard-railed price changes inside a cap you set; you set the floor, name the exclusions, and review the log monthly to see which rules move stock rather than just moving prices.
Where merchants get burned
- Discounting a healthy SKU because the velocity number counted dark days. Check the denominator before touching the price.
- Skipping the non-price rung. Some slow SKUs are a photography and placement problem; 20% off fixes neither and costs margin.
- One ladder for the catalog. Staples tolerate wide ceilings, trend goods need tight ones, date-stamped goods need deadlines.
- Extending a window because the rung "just needs a bit more time." Extensions are how a six-week clearance becomes an eighteen-month occupation.
- Discounting past the point where exiting is cheaper. Beyond roughly 20 weeks of cover, percent-off games are slower liquidation; the ranked tactics are in how to get rid of dead stock.
Common questions
When should I discount slow-moving inventory? At a cover threshold you set in advance — 12 weeks is a workable default for the first 20% cut, with 16 weeks for 30% and 20+ weeks for 40% or an exit. Compute cover from in-stock-only velocity and read it alongside the age of the oldest units, since high cover on young stock is a buying problem rather than a demand one.
How much should the first markdown be? 20% is the usual starting point: enough to register with price-sensitive buyers without giving away margin to people who would have paid full price. Then step down in fixed windows only if the rung misses its sell-through target — the depth math is a break-even multiplier, not a preference.
What is a margin floor and why does it matter? A pre-set rule that no rung may price a SKU below cost, or push gross margin below a minimum percentage. Below cost a discount is a partial write-off; on thin-margin items a deep rung demands impossible volume — a 30% cut on a $5 margin item needs 6.3× the sales to break even.
Should markdown triggers be automated? The trigger can be; the floor shouldn't be. Detecting that a SKU crossed a cover threshold is mechanical and gets skipped in exactly the busy months when it matters. Deciding maximum depth, naming excluded SKUs, and deciding whether the store wants a visible sale section belong to you — with any automated price change capped, logged, and reversible.
How long should a markdown last? Two to three weeks per rung, with a start date, an end date, and a sell-through target. Open-ended discounts stop being events and become your new price, which trains customers to wait.
Next step: compute weeks of cover for your 25 slowest SKUs this week, sort them by cover, and write the rung and the calendar date next to each. Then put the monthly cover check on a recurring calendar entry — the ladder only fires if something runs it.