Stop writing off expiring stock — three habits that recover the money
Every online store that sells dated goods — food, supplements, cosmetics, anything with a best-before date — quietly loses money to stock that expires unsold. The cost is rarely one big event. It’s a slow drip: a case of product forgotten behind a newer delivery, a short-dated batch nobody thought to mark down, a shelf of items that crossed their date last week and now have to be written off in full.
The frustrating part is that almost all of it is preventable, and not by working harder. Three habits do the heavy lifting: rotate stock so the soonest-to-expire unit always sells first, mark short-dated items down automatically so they clear before the date, and get told what’s coming up while there’s still time to act. WooCommerce can’t do any of this on its own — it tracks one stock number per product, with no dates and no idea which units expire first — so this guide shows how each habit works and how to set it up with the Sellinor Product Expiration Dates plugin.
Habit 1: Rotate by expiry, not by arrival
The single biggest source of avoidable waste is selling stock in the wrong order. Most stores ship whatever unit is easiest to reach, which usually means the most recent delivery. That’s FIFO — First In, First Out — and it only avoids waste if deliveries always arrive in expiry order. They don’t. A fresh shipment can easily carry a shorter shelf life than stock you already have on hand, and the moment that happens, your older units start aging out behind newer ones.
The fix is FEFO — First Expired, First Out: the unit closest to its expiration date goes first, regardless of when it arrived. For an online store this can’t be a manual habit, because the warehouse and the website don’t share a brain. It has to be enforced automatically at the point of sale.
That’s what batch tracking in the Pro add-on does. Instead of one stock number, each product holds one or more batches, each with its own lot number, expiration date, and quantity — so a single SKU might have 40 units expiring in March and 60 in May. When an order comes in, the plugin deducts from the batch with the earliest expiration date first, moving to the next only when one runs out. The exact batch is recorded on the order, and refunds or cancellations return stock to the correct batch. If an order needs more than your batches can supply, it’s placed on hold rather than overselling stock you don’t physically have.
The result: your oldest sellable stock leaves first, every time, with no one having to remember to make it happen. Full setup is in batch & lot tracking, and the rotation logic is explained in the FEFO guide.
Habit 2: Mark down short-dated stock automatically
Rotation gets the right unit out the door first, but some stock will still approach its date faster than it sells — seasonal items, slow movers, an over-ordered batch. The mistake here is treating clearance as a single last-minute decision. By the time someone notices a product is three days from expiry, it’s often too late to move it at any price.
A better approach is to let the price drop on a schedule as the date approaches, so a short-dated item gets steadily more attractive until it clears. With the Pro add-on you define discount tiers by days remaining:
| Days until expiration | Discount |
|---|---|
| 14 days | 10% off |
| 7 days | 25% off |
| 3 days | 50% off |
A product 10 days out gets 10% off; once it hits 7 days the discount steps up to 25%, and at 3 days to 50%. The plugin applies the right sale price automatically through WooCommerce’s price filters — strikethrough pricing, cart totals, and order totals all reflect it. An optional Expiring soon badge on shop and product pages flags the deal so shoppers notice it.
The point isn’t to give margin away. It’s that a unit sold at 50% off recovers far more than a unit written off at 100% loss, and the early, gentle tiers often clear stock before you ever reach the steep ones. Match the percentages to your margins so each tier still makes sense. Setup and the badge options are in automatic discounts.
Habit 3: See what’s coming before it’s a problem
Rotation and markdowns run on their own, but you still need a clear view of what’s at risk so you can reorder smarter, run a promotion, or pull items manually. Flying blind is how a forgotten batch becomes a write-off.
The free version gives you this view without opening individual products. The Overview dashboard at Products → Expirations shows an Expiring soon count and a Value at risk figure — the stock value of products expiring within your threshold — so you can see the money tied up in soon-to-expire inventory at a glance. A month calendar shows how many products expire on each day, the products list gains a sortable expiration column, and a WordPress dashboard widget surfaces the soonest-expiring items as soon as you log in. Details are in reports & calendar.
To avoid having to check at all, the Pro add-on sends a scheduled email digest — daily, weekly, or monthly — listing every product within your day threshold, each with its current stock level and days remaining. A digest only goes out when something actually qualifies, so you don’t get empty emails. That’s usually the cue to push a promotion or adjust your next order. See email notifications.
A safety net for anything that slips through
Even with all three habits running, set an expiry action so nothing past its date ever ships. The free plugin can automatically hide an expired product from the catalog, set it out of stock, or both — and you can trigger that a set number of days early. Cart and checkout protection is immediate, so an expired item can’t be bought even in the window before the action fully applies. That doesn’t recover the cost the way rotation and markdowns do, but it guarantees a customer never receives something past its date.
Putting it together
Waste from expiring stock isn’t one problem, it’s three: stock leaving in the wrong order, short-dated items nobody clears in time, and no early warning. Fix all three and most of the loss disappears. Start free — add expiration dates, turn on the Overview dashboard, and set your expiry action — then add the Pro layer of FEFO rotation, automatic markdowns, and email digests once dates are in place.
For the inventory side of this in more depth, the food & grocery expiry guide and the FEFO guide go further on rotation. But the fastest first step is simply getting dates on your products, so install the free plugin and start there.
Frequently asked questions
Why does an online store lose money to expiring stock?
Two reasons. First, units expire on the shelf because newer deliveries get picked first, so older stock is forgotten — a rotation problem. Second, nobody marks short-dated items down in time to sell them, so they go from full price to a total write-off with nothing in between. Fixing rotation and adding timed markdowns recovers most of that loss.
What is FEFO and why does it cut waste?
FEFO means First Expired, First Out: the unit closest to its expiration date ships first, regardless of when it arrived. It cuts waste because deliveries don't always arrive in expiry order — a newer shipment can have a shorter shelf life than stock already on hand. Selling by arrival order (FIFO) leaves the soonest-to-expire units sitting until they're worthless.
How do automatic discounts reduce write-offs?
Instead of one decision to clear stock at the last minute, you set tiers by days remaining — for example 10% off at 14 days, 25% at 7 days, 50% at 3 days. The Sellinor Pro add-on applies the right sale price automatically as each product crosses a threshold, so short-dated items keep getting more attractive until they sell, recovering partial revenue rather than zero.
How do I know which products are about to expire?
The free plugin shows a Value at risk figure and an Expiring soon list on its Overview dashboard, plus a sortable column on the products list and a dashboard widget. The Pro add-on adds a scheduled email digest — daily, weekly, or monthly — listing products within your chosen day threshold, each with its stock level and days remaining, so you can act before the date arrives.
Can WooCommerce do this without a plugin?
No. Core WooCommerce tracks a single stock quantity per product with no expiration dates, no batches, and no concept of which units expire first, so it can't rotate by expiry, mark down short-dated stock automatically, or alert you. You add those capabilities with the Sellinor Product Expiration Dates plugin; dates, expiry actions, and the Overview reports are free, while FEFO, discounts, and email digests are in the Pro add-on.
What happens to expired stock if I do nothing?
You can have the plugin act automatically when a product reaches its date — or a set number of days before — by hiding it from the catalog, setting it out of stock, or both, with cart and checkout protection so expired items can't be bought. That prevents shipping past-date goods, but it doesn't recover the cost. Rotation and markdowns are what turn would-be write-offs into sales before that point.
Turn expiring stock into recovered revenue
Add expiration dates to your products for free, then let FEFO rotation and automatic markdowns clear short-dated stock before it becomes a write-off.
See plans & download freeOr read the documentation.