Pull Expired Products From Your Store Automatically
Selling a product past its best-before or expiry date is the kind of mistake that quietly costs you a refund, a chargeback, or a one-star review. The fix shouldn’t depend on someone remembering to unpublish a product on the right morning. With Sellinor Product Expiration Dates you set a date once, and WooCommerce takes the product out of circulation on its own — and this is a free feature, not an upsell.
Hide, out of stock, or both
The plugin gives you three automatic responses when a product reaches its date. You pick the one that fits how you want expired stock to behave, under Products → Expirations → Settings → General.
- Hide from catalog. The product is removed from your shop pages, category listings, and search results. The product page itself stays live, so any existing links — old emails, indexed URLs, a customer’s bookmark — don’t break. The item simply can’t be browsed to anymore.
- Set to out of stock. The product’s stock status flips to “out of stock.” Depending on your WooCommerce visibility settings, it can stay visible with an “out of stock” label, which signals to shoppers that the item existed but isn’t available right now. Either way, it can’t be added to the cart.
- Both. Hide it and out-of-stock it — the most complete option, so the product is neither browsable nor purchasable.
There’s also a fourth, default state: Do nothing. The plugin still tracks and displays the date, but takes no automatic action and applies no cart guarding, leaving you in full manual control. That default matters — nothing changes on your storefront until you deliberately choose an action.
Hide vs. out of stock vs. draft — which should you use?
These three get confused constantly, so here’s the honest breakdown.
Draft is a WordPress post status. Setting a product to Draft fully unpublishes it: it drops out of your catalog and any public link to it stops resolving. It’s a blunt instrument and a manual one — WordPress won’t draft a product for you on a date. Use it when you want the product gone, links and all.
Hide from catalog is gentler. The product disappears from where customers shop, but its page stays reachable by direct URL. Reach for this when the item is coming back (you’ll restock next season) or when you don’t want to break inbound links and lose the page’s history.
Out of stock keeps the listing in place and just makes it unbuyable. This is the right call when you want customers to see that the product exists — to set expectations or preserve the page for SEO — but must stop sales today.
For perishable stock that genuinely shouldn’t be seen once expired, Both combines the catalog removal of hiding with the purchase block of out-of-stock. Most stores tracking food, supplements, or cosmetics land here. See expiry actions for the full settings reference.
Act before the date, not on it
You rarely want to sell a product right up to the last legal day. The days before setting lets the action fire early. Set it to 3 and products are hidden (or out-of-stocked) three days ahead of their expiration date — a buffer for shipping time and shelf handling. Set it to 0 to act exactly on the date.
This is one of a few independent day-based settings in the plugin, and it’s worth not confusing it with the “expiring soon” threshold (which only flags products in reports and the dashboard) or the frontend display threshold (which controls when the date label shows to customers). The expiration dates guide lays out all of them side by side.
Timing: what’s instant and what isn’t
Knowing how each action runs saves you a support ticket later.
- Hiding is immediate. The plugin filters your catalog queries on every page load, so an expired product drops out of shop, category, and search results the moment it crosses its threshold. No background task is involved.
- Out of stock runs hourly. The stock-status change is applied by a scheduled WordPress cron sweep, so it can take up to an hour to appear after a product expires.
- Cart and checkout protection is immediate, regardless. As long as an expiry action is enabled, an expired product can’t slip through that hourly gap.
If a hidden product still shows up, it’s almost always a page cache serving an older render — clear it. (If out-of-stock changes never apply, your host may be throttling wp-cron; the troubleshooting guide covers a real cron job fix.)
Nobody checks out with an expired item
Hiding a product from the catalog doesn’t help if it’s already sitting in someone’s cart. So whenever you’ve selected an expiry action, the plugin guards the cart too:
- An expired item can’t be added to the cart in the first place.
- If a product expires while it’s already in a cart, it’s automatically removed at checkout with a notice explaining why.
That closes the loophole where a customer adds a product at 11:58, it expires at midnight, and they complete the purchase the next morning. With protection on, the order can’t go through with that item.
Variable products: hidden only when fully expired
If you sell variable products — different sizes, flavors, or pack counts under one listing — the plugin is careful not to nuke the whole product over one expired variation. Each variation carries its own expiration date (or inherits a default you set on the parent). The hide and out-of-stock actions only apply at the parent level once every variation has expired. Until then, the product stays available and an expired variation simply becomes unselectable. That’s the behavior you want: one out-of-date size shouldn’t pull a still-sellable product offline.
Setting it up
The whole flow takes a minute or two:
- Open a product, go to the Product data → Expiration tab, and set a date. (For variable products, set dates per variation under the Variations tab.) You can also set dates in bulk straight from the Products list with Quick Edit and Bulk Edit.
- Go to Products → Expirations → Settings → General and choose your expiry action — Hide, Out of stock, or Both.
- Optionally set days before to act ahead of the date.
From then on, your storefront polices itself. For stores that hold several deliveries of the same product under one date, the next step is per-batch rotation — see FEFO for WooCommerce — but for a single date per product, automatic hiding is built in and free.
Frequently asked questions
How do I automatically hide expired products in WooCommerce?
Set an expiration date on the product, then choose an expiry action under Products → Expirations → Settings → General. With the 'Hide from catalog' action enabled, the Sellinor Product Expiration Dates plugin removes the product from shop pages, category listings, and search results as soon as it reaches its date. The hide action is applied immediately via catalog query filters — no waiting for a background task.
What's the difference between hiding a product, setting it out of stock, and drafting it?
Hiding removes the product from your catalog (shop, categories, search) while keeping its page live, so existing links don't break. Setting it out of stock keeps it browsable but unpurchasable, with an 'out of stock' label. Drafting is a manual WordPress status that fully unpublishes the page. The plugin automates the first two on a date; drafting stays a manual choice in WordPress.
Can I hide products a few days before they expire?
Yes. The 'days before' setting under Products → Expirations → Settings → General fires the expiry action a set number of days early. For example, setting it to 3 hides or out-of-stocks products three days before their expiration date, giving you a buffer so you never sell stock that's right on the edge. Set it to 0 to act only on the expiration date itself.
Can a customer still buy an expired product that's already in their cart?
No. When any expiry action is enabled, cart and checkout protection is immediate: an expired item can't be added to the cart, and if a product expires while it's already in someone's cart it is automatically removed at checkout with a notice. This protection applies even before the hourly out-of-stock sweep runs.
How does hiding work for variable products with multiple variations?
For a variable product, the hide and out-of-stock actions only apply at the parent level once every variation has expired. As long as at least one variation is still in date, the product stays available in your catalog, and any individual expired variation simply becomes unavailable to select.
Is automatically hiding expired products a free feature?
Yes. A single expiration date per product (and per variation), the hide / out-of-stock / both expiry actions, the 'days before' buffer, and cart and checkout protection are all part of the free Sellinor Product Expiration Dates plugin. The Pro add-on adds per-batch FEFO tracking and automatic discounts on top.
Stop selling expired stock automatically
Set an expiration date once and let WooCommerce hide the product, mark it out of stock, and block it at checkout the moment it expires.
See plans & download freeOr read the documentation.