ClearStock is live on the Shopify App Store.Install free →

← All blogs

Guides10 min read

Markdown strategy for Shopify: depth, cadence, and the margin floor

A markdown strategy that runs on aging buckets and a fixed cadence: depth per bucket, a margin floor per SKU, brand positioning rules, and a worked example.

InventoryX is in development and not available today. ClearStock is the live Shopify app.

A markdown strategy is three numbers and one calendar: how deep you cut at each age, how often you step down, and the lowest price a SKU is allowed to reach — applied on a schedule that doesn't get relitigated every Monday. Most stores have none of these. They have a permanent 20%-off collection, an occasional panic sale, and a discount decision made by whoever is most anxious that week. The result is stock that sits for eighteen months and then gets liquidated at a fifth of cost, with the margin lost twice: once to carrying cost, once to the fire sale.

This is the portfolio-level version of the question. If you want the single-SKU math — break-even multipliers at each depth — markdown depth and margin math does that properly. This piece builds the policy on top of it.

Why cadence beats depth

Two stores with identical cost structures can recover wildly different amounts from the same dead stock depending on one thing: whether the markdown decision happens on a schedule or on a feeling.

The schedule wins for three reasons, and none of them are about discount percentages:

  • It sells each unit at the highest price that unit will bear. A ladder that starts shallow catches the buyers who'd have paid 20% off before you offer 40%.
  • It removes the decision from the person having a bad week. A rule that says "91–120 days gets 40%" doesn't require anyone to conclude that their own buy was wrong.
  • It makes the floor explicit. Once you know the lowest price a SKU may reach, a deep cut becomes a decision with a number attached rather than a vibe.

The alternative — a single deep cut — is not wrong, it's just expensive when applied to everything. It's correct for stock that expires on a date, and for categories where the whole assortment turns over at once.

The aging buckets

Inventory age is the only trigger that doesn't need a forecast. It's a fact about the shelf, not an opinion about demand, which is precisely why it's a good basis for policy: nobody argues with a date.

A workable default set, to tune per category:

Bucket Age since receipt Posture Typical depth Review cadence
Current 0–30 days Full price, protect the launch window 0% Monthly
Working 31–60 days Full price; fix merchandising, not price 0% Biweekly
Watch 61–90 days Full price, but flagged; bundle and placement first 0–10% Biweekly
Markdown 1 91–120 days Discounted, shallow 20–25% Weekly
Markdown 2 121–180 days Discounted, main clearance depth 30–40% Weekly
Exit 180+ days Stop stepping: bundle, job lot, or donate At or above floor Weekly

Four rules make the buckets behave:

  1. Age is receipt date, not season. A restock of a two-year-old style is new inventory by this measure, and discounting it on arrival would be wrong. If you need season-aware aging, track season as an attribute and let the bucket use whichever is older.
  2. The floor overrides the bucket. If 40% takes a SKU under its floor, that SKU's ladder ends at 25% and its next step is an exit, not a deeper discount.
  3. Every bucket has an exit. The 180-day row isn't "discount more," it's "stop discounting and dispose." Markdown ladders that never end become permanent price cuts.
  4. Buckets are reviewed on a fixed day. Weekly, same day, same person. A markdown strategy that's reviewed whenever someone remembers is a hypothesis, not a policy.

The margin floor, and how to compute it

The floor is the lowest price a SKU may be sold at without a deliberate decision to lose money. Compute it before the season, not during the sale.

Floor = unit cost + variable selling costs + minimum contribution.

Where variable selling costs include payment processing (roughly 2–3% plus a fixed fee per transaction on most plans), pick-and-pack labour, packaging, and any marketplace or affiliate commission. Minimum contribution is a policy number: many stores set it at zero for aged stock — accept break-even, recover the cash — and at 15–25% of price for current stock.

That gives a per-SKU number you can compare against any proposed discount. A $45 item with $18 landed cost, $2.50 of variable selling cost, and a zero minimum contribution has a floor of $20.50 — about 54% off. That SKU's ladder can go deep. The same item with a $31 landed cost has a floor of $33.50 and a maximum discount of 26%; every rung past that is a write-off wearing a sale label.

The full unit-economics treatment, including carrying cost and liquidation reserve, is in clearance pricing by unit economics. For strategy purposes you need one derived number per SKU: max discount % = (price − floor) ÷ price.

The cadence, in calendar form

A markdown calendar is a set of standing dates rather than a set of campaigns. Something like this, adapted to your buying cycle:

When Action Owner
1st of the month Age all inventory; move SKUs between buckets Inventory lead
1st of the month Apply the bucket's depth to newly entered SKUs Merchandising
Weekly, same day Review Markdown 1 and 2 SKUs — did velocity change? Merchandising
Mid-season Check seasonal SKUs against their deadline, not their age Buying
End of season Force every seasonal SKU to Exit or hold with a written reason Owner
Quarterly Recompute floors from current costs and fees Finance or owner

The two entries that do the most work are the mid-season seasonal check and the end-of-season forced decision. Seasonal goods don't age into failure, they hit a date; the calendar has to know the date.

Brand positioning: how much of this is public

A markdown strategy has a second constraint that pure margin math ignores: what a permanent sale does to your full-price credibility.

Positioning Public depth Channel choices Accept
Premium / brand-led Shallow, rare, never site-wide Private sales, VIP email, staff, outlet section behind a link Lower recovery, protected price integrity
Mid-market Moderate, seasonal, clearly bounded Site-wide seasonal events plus an outlet collection Some full-price erosion, manageable
Value / volume Deep, frequent, advertised Site-wide, deal-led, marketplace channels Price integrity is not the asset; freshness is

The mistake isn't discounting deeply — it's discounting deeply while claiming premium positioning. Customers resolve that contradiction by waiting for the discount, which converts your full-price business into a sale business without you deciding to make that change.

A worked example

A small apparel store, three SKUs, same season:

Overshirt Knit beanie Linen shirt
Units on hand 80 240 60
Landed cost $34 $4.20 $26
Retail price $110 $24 $88
Age 150 days 210 days 95 days
Floor (cost + $3 variable + 0 contribution) $37 (66% max) $7.20 (70% max) $29 (67% max)
Bucket Markdown 2 → 35% ($71.50) Exit Markdown 1 → 20% ($70.40)

What the policy does with each:

  • Overshirt sits in Markdown 2 at 35%, clearing through the season at $71.50 — a $34.50 contribution per unit, well above floor. If it hasn't halved by the end of the window, it goes to Exit rather than to 45%.
  • Beanie is past 180 days with 240 units. Its max discount is 70%, but discounting a $24 item by 40% to $14.40 barely changes the conversion problem and costs the margin of the units that would have sold anyway. Exit means a bundle with the overshirt and a job lot for the remainder. Cost of the decision: about $1,000 of tied capital released.
  • Linen shirt entered Markdown 1 this month, at 20% and $70.40. Its floor allows much deeper, but the ladder starts shallow deliberately — this is the rung that sells to people who were close to buying at full price.

Note what the policy doesn't do: it doesn't cut the linen shirt to 50% because the overshirt is at 35%, and it doesn't hold the beanie because 240 units feels like too much to write down. Each SKU is answered by its own row.

Making it stick in Shopify

Mechanically, a markdown strategy needs three things in the admin: an age signal, a way to change prices in bulk reliably, and a record of what the original price was. The age signal comes from inventory reports or a spreadsheet until you have something better; price changes go through the bulk editor or product CSV; the original price record is the thing everyone forgets and everyone needs at restoration time.

Where the manual version breaks is at exactly the point the policy starts working: when 200 SKUs are moving between buckets on the first of every month. That's a rule engine's job, not a spreadsheet's — ClearStock applies threshold-based markdowns with a cap, exclusions, and restoration — and it's worth it once the calendar has more than a dozen SKUs on it. Before that, a spreadsheet and a recurring calendar entry are genuinely sufficient.

Common questions

How deep should I mark down? Depth follows the aging bucket and the margin floor: 20–25% for 91–120 days, 30–40% for 121–180 days, and an exit rather than a deeper discount past that. The floor caps it — if a proposed depth takes the price below cost plus variable selling costs, the SKU's next step is disposal, not a deeper cut.

How often should I run markdowns? On a fixed cadence — bucket assignments monthly, clearance review weekly, floors recomputed quarterly. The value comes from the schedule being predictable, not from the depth of any single cut. A markdown strategy that runs when someone remembers is a series of unrelated sales.

Should markdowns be public or private? It depends on positioning. Premium brands route deep discounts through private channels and keep the public storefront near full price; mid-market runs bounded seasonal events; value-led stores can discount deeply in public because price integrity was never the asset.

What's a reasonable margin floor for aged stock? Many stores accept break-even contribution on aged stock — cost plus variable selling costs, nothing more — because the alternative is carrying cost plus eventual write-off. For current-season stock a 15–25% contribution floor is more typical. Recompute it as costs and payment fees change.

When should I stop marking down and liquidate instead? When the SKU is past your exit bucket, when the depth required to move it would breach the floor, or when a seasonal deadline has passed. At that point a job lot or donation recovers cash and shelf space that another 5% off will not.

Next step: compute the max discount percentage for your twenty oldest SKUs — (price − floor) ÷ price — and sort them ascending. The ones with the lowest ceilings are your liquidation candidates, and the ones with high ceilings are the SKUs your current permanent discount is under-serving. Both answers are in that one column.