When to Mark Down Near-Expiry Products, by Category
Markdown start day isn't a fixed rule. Compare days of cover to days to expiry for dairy, bakery and packaged goods, with worked examples you can copy.
ShelfLifePro Editorial Team
Inventory management insights for retail and pharmacy
The markdown that came too late
You know the scene. It's the morning walk, and there's a row of yogurt with tomorrow's date on it, nine cups deep. You put a sticker on, a few sell, and the rest end up in the shrink bin anyway. The markdown happened. It just happened on the wrong day.
The question operators ask is "how many days before expiry should I discount?" Honestly, there isn't one number. The right start day comes from two things already in your records: how fast the item sells and how many units are left.
Why a fixed days-before rule misfires
A blanket rule like "discount everything three days out" treats fast movers and slow movers the same way. For example, picture two dairy items, both three days from their date. One has 6 units and sells 4 a day, so it'll clear at full price and the sticker just gives away margin. The other has 20 units and sells 2 a day. Three days out is already too late for that one, because even a deep cut can't move 14 extra units in that window.
So a fixed rule misses in both directions. You discount things that would've sold anyway, and you get to the pile that needed a week of runway too late.
Days of cover vs days to expiry
The method comes down to one comparison per item, and ideally per batch:
- Days of cover = units on hand ÷ units sold per day. Use recent sales, not last season's.
- Selling days left = days until the date, minus the day you pull it from the shelf.
- Units that won't clear = units on hand − (daily sales × selling days left).
If days of cover is equal to or less than selling days left, leave the item alone. If cover is longer, that batch won't clear at full price, and the third line tells you by how much.
Your start day is the first day that gap turns positive. Act then, because a markdown needs time to work: shoppers have to walk past it, notice it and pick it up. Catch the gap early and a small cut has days to close it. Wait until you can see it on the shelf and the only option left is a steep one. That's the reason to build a markdown schedule instead of reaching for one panic sticker.
Dairy: short dates, steady sellers
Worked example: say a batch of 48 yogurt cups arrives with ten days to the date, and you pull dairy the day before. That leaves nine selling days. At 6 cups a day, cover is 8 days. That's under nine, so no markdown. Leave it.
Now suppose a cold snap drops sales to 4 a day. Cover jumps to 12 days against nine selling days, and 48 − (4 × 9) = 12 cups won't clear. That flag shows up on day one, not day eight. A light markdown or a better facing now gets nine days to move 12 extra cups. Wait until day eight and those same 12 cups have to go in a single day.
The lesson for dairy is that the dates are short but the sell rate is fairly steady, so the comparison holds up as long as you recheck it daily. What should trigger the markdown is a change in the sell rate, not the calendar.
Not sure how much you're losing to expiry?
Run a free inventory waste audit, find your bleeding SKUs in 60 seconds. No sign-up required.
Run free auditBakery: the window is hours
Bakery changes the units. When something only lasts a day, days of cover turns into hours of cover.
For example, say you bake 30 sourdough loaves and they've been selling at 3 an hour. At 3 p.m. you have 18 left and you close at 8. That's five selling hours, so 15 loaves go at full price and 3 won't. The markdown decision belongs at 3 p.m., not 7:45 when you've got a closing shift and a full rack.
If the afternoon pace picks up to 4 an hour, all 18 clear and the 3 p.m. check says hold. Same product and same clock, but a different answer. That's why a fixed "mark down at 6 p.m." rule costs you money on good days and doesn't go far enough on slow ones. For what to do with the leftovers next morning, see the day-old bread playbook. If you want to track it on paper, there's the day-old & markdown rotation log.
Packaged goods: long dates, slow sellers
Packaged goods fool people because the date looks so far away.
Worked example: say you have 40 boxes of a specialty cracker with 120 days to the date. You pull packaged goods 7 days early, which leaves 113 selling days. The cracker sells one box every four days, or 0.25 a day. Cover is 160 days, and 40 − (0.25 × 113) leaves about 12 boxes that won't clear.
That gap is there on day one, four months out. Nobody walks past that shelf feeling any urgency, but those 12 boxes are already headed for the bin. The upside is that a long runway gives you options besides a discount. You can move it to a better shelf, bundle it, or send it back to the supplier while the return window is still open. Check that window first. The expired-goods RTV pack includes a deadline tracker for exactly that. Keep the markdown as the fallback, and remember a small one held for weeks can still do the job.
Setting the start day for each category
Putting it together, here's how often to check each category:
- Dairy: check daily, counting in days. Watch for a dip in sell rate, because that's what opens the gap.
- Bakery: count in hours. Check once in the afternoon, at whatever point still leaves enough selling hours for a markdown to work.
- Packaged: check at receiving, then weekly. The gap shows up early, so try returns and repositioning before you discount.
And the routine itself, whatever the category:
- Pull recent daily sales for each item.
- Pull units on hand and the date for each batch.
- Work out cover and selling days left.
- Flag anything where cover is longer than selling days left, and note how many units won't clear.
- Take the smallest action that closes the gap in the time left, then recheck tomorrow.
Once you know when, there's still how much. Dynamic markdown pricing covers discount depth. For batches that are past saving, when a markdown below cost is the right call covers the end game.
Where a spreadsheet runs out
You can run all of this in a spreadsheet. For a few dozen perishable lines, the expiry-tracking spreadsheet template plus a daily sales export from your POS will do.
It breaks down at the recheck. The method only works if you recalculate cover every day, because sell rates move with the weather, a promo down the street or payday. A sheet you filled in on Monday only tells you about Monday. Once you're tracking hundreds of batches, the daily recalculation is the step that quietly stops happening. That's how the markdown slides back to the day before the date.
A daily check that does the arithmetic
That daily recalculation is the job ShelfSense by ShelfLifePro is built for. Once a day it reads your stock, batch, cost and expiry records. It flags at-risk batches days ahead with a recommended markdown and shows the units that won't clear, the projected loss and the discount. It's the same cover-vs-days comparison from this post, with the working shown so you can check it. It recommends and you approve. It never changes a price on its own, and it stays quiet when it isn't sure.
For example, a call might read "~12 of 14 units won't clear by Friday at 0.4/day." That's the same three lines of arithmetic from earlier, applied to one batch. Here's how it reasons through a call like that.
It works alongside the system you already have. Start with a CSV export of your stock and expiry dates. If you're on Shopify, Clover or Tally, you can export to CSV today, and a direct connection is on request. ShelfSense's free audit reads one CSV export, no account needed. The Watch tier is free forever at 30 SKUs — a daily scan and a health report. If you'd like to see your own start days worked out, start free here.
ShelfLifePro Editorial Team
The ShelfLifePro editorial team covers inventory management, expiry tracking, and waste reduction for pharmacies, supermarkets, and retail businesses worldwide.
See what batch-level tracking actually looks like
ShelfLifePro tracks expiry by batch, automates FEFO rotation, and sends markdown alerts before stock expires. 14-day free trial, no credit card required.
Prefer to talk it through? Book a 30-min call
The monthly expiry-tracking brief
One short email a month, only when there is something worth reading. FEFO tactics, markdown math, and real-world waste-reduction wins. Unsubscribe anytime.
No spam. Unsubscribe in one click.