Launch pricing: Lock in Pro at $79/yr before prices go up View pricing →

How to choose the best WooCommerce expiration date plugin

Most “expiration date” plugins for WooCommerce add a date field and stop there. That’s fine until the first time an expired product ships, sits unsold, or slips through a cart that someone left open for a week. Choosing the best WooCommerce expiration date plugin means knowing which capabilities actually protect your store and your margins — not just which one has a date picker.

This is a buyer’s guide. Below are the criteria that separate a real expiration system from a basic one, and how the free and Pro tiers of Sellinor Product Expiration Dates meet each. Use it as a checklist against any plugin you’re evaluating.

1. Per-product and per-variation dates

A single date per product breaks the moment your catalog has variable products. Different sizes, packs, or production runs of the same listing expire on different days. The right plugin lets each variation hold its own date — and falls back gracefully when one doesn’t.

In the free version, each simple product and each variation can carry its own expiration date. Set a default on the parent variable product and any dateless variation inherits it, so you only override the exceptions. Critically, a variable product is hidden or set out of stock only once every variation has expired — until then it stays available, and an individual expired variation just becomes unselectable. That nuance prevents a whole listing from vanishing because one size lapsed.

2. Automatic hide / out-of-stock with a days-before buffer

Acting on a date by hand doesn’t scale. A capable plugin lets you choose what happens automatically: Hide from catalog, Set out of stock, Both, or Do nothing — and lets you fire that action a configurable number of days early.

Sellinor does both, under Products → Expirations → Settings → General. The hide action is applied immediately via catalog query filters on every page load; the out-of-stock change runs on an hourly background check. The days before setting gives you a buffer — set it to 3 to pull stock three days early, or 0 to act on the date itself.

3. Immediate cart & checkout protection

Hiding a product from the catalog doesn’t help if it’s already in someone’s cart. The real risk is the completed sale of an expired item. So the test is: does protection apply at the cart, instantly?

Here it does. Whenever an expiry action is enabled, an expired item can’t be added to the cart, and one that expires while sitting in a cart is removed at checkout with a notice — even before the hourly sweep runs. (With Do nothing, no cart guarding is applied and you stay in full manual control.)

4. A configurable storefront date label

Showing the date builds trust on perishable goods. Look for a configurable label and the option to show it only when relevant.

Free covers this: a frontend label you can set to Best before, Use by, Expires, or your own wording, with a display threshold so the date only appears within X days of expiry (0 = always). It renders near the add-to-cart area on classic, block, and most custom themes, and an [edfw_expiration_date] shortcode (with an optional id) places it manually on bespoke templates and suppresses the automatic placement so it never doubles up.

5. Reports with value-at-risk

You can’t act on what you can’t see. A good plugin gives you a catalog-wide view, not just per-product fields.

The free Overview dashboard delivers stat cards (products tracked, expiring soon, expired) plus value at risk — the stock value of products inside your expiring-soon window, so you can see the money tied up in soon-to-expire inventory. A month calendar counts expirations per day, filter tabs split All / Expiring soon / Expired, and a Dashboard widget surfaces the soonest-expiring products the moment you log in.

6. CSV import/export that round-trips cleanly

Bulk editing matters on real catalogs. The plugin should import and export dates by ID or SKU without a fragile mapping step — and survive a full round-trip.

Free includes a dedicated CSV import/export (rows matched by product ID first, then SKU, using YYYY-MM-DD), with variations carrying their own IDs/SKUs and parent rows carrying the inherited default. Because dates are stored as standard product metadata, they also travel with your regular product exports. A 90-day activity log, Quick Edit, Bulk Edit, a sortable color-coded Expiration column, HPOS compatibility, and opt-in delete-on-uninstall round out the foundation.

7. For perishable stock: batch/lot FEFO, markdowns, and digests (Pro)

If you sell food, supplements, cosmetics, or anything that arrives in shipments, a single date per product isn’t enough — each shipment expires differently. This is where most basic plugins stop and where Sellinor’s Pro add-on takes over:

  • Batch & lot tracking with FEFO. Record multiple batches per product, each with a lot number, expiry, and quantity. Orders deduct from the earliest-expiring batch first; the exact lot is recorded on the order and customer email; refunds return stock to the correct batch; and an expired batch stops counting as sellable.
  • Automatic tiered expiry discounts by days-to-expiry, plus an “Expiring soon” badge to clear stock before it’s lost. One caveat to know up front: these dynamic discounts are applied through price filters and do not populate WooCommerce’s native On Sale block or [sale_products] shortcode — the discounted price, strikethrough, badge, and cart totals are all correct on the product itself, they just aren’t collected into sale-only listings.
  • Scheduled email digests (daily / weekly / monthly) of expiring products, native WooCommerce CSV importer/exporter integration, and batch details shown in orders and emails.

The shortlist

The best WooCommerce expiration date plugin is the one that matches your stock. For dated products that need automatic protection and clear reporting, the free tier covers criteria 1–6 in full. For perishable inventory that demands rotation, markdowns, and proactive alerts, add Pro. Start with the free plugin and step up to Pro when batches enter the picture.

Frequently asked questions

What features make the best WooCommerce expiration date plugin?

Look for per-product and per-variation dates, automatic hide or out-of-stock actions with a configurable days-before buffer, immediate cart and checkout protection, a configurable storefront date label, an Overview report with value-at-risk, and CSV import/export. For perishable stock, the bar is higher: per-batch FEFO rotation, automatic expiry markdowns, and scheduled expiring-soon email digests. Sellinor Product Expiration Dates covers the first set for free and the perishable set in Pro.

Does the plugin handle expiration dates on product variations?

Yes, in the free version. Each variation can carry its own expiration date, and any dateless variation inherits the default date you set on the parent. A variable product is only hidden or set out of stock once every variation has expired — until then it stays available, and any individual expired variation simply becomes unavailable to select.

Can it stop an expired product from being purchased?

Yes. Whenever an expiry action is enabled (anything other than 'Do nothing'), 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's removed at checkout with a notice. This applies even before the hourly out-of-stock sweep runs.

How does FEFO batch tracking work?

FEFO is a Pro feature. You record multiple batches per product, each with its own lot number, expiry date, and quantity. When an order comes in, the plugin deducts from the earliest-expiring batch first, records the exact lot on the order and customer email, and returns stock to the correct batch on refunds. An expired batch stops counting toward sellable stock unless you choose to keep selling it.

Will expiry discounts show up in WooCommerce's On Sale block?

No. Pro applies tiered expiry discounts dynamically through WooCommerce's price filters rather than writing a sale price, so the discounted price, strikethrough, badge, and cart totals are all correct on the product itself — but expiry-discounted products do not populate WooCommerce's native On Sale block or the [sale_products] shortcode, which read from a separate sale-price lookup.

Is a free version enough, or do I need Pro?

The free plugin is enough if you need dates, automatic expiry actions, cart protection, storefront labels, the Overview report, and CSV import/export. Choose Pro when you manage perishable stock that arrives in batches and need FEFO rotation, automatic markdowns to clear stock before it expires, and scheduled email digests of what's expiring soon.

Get the expiration tracking your store actually needs

Install the free Sellinor Product Expiration Dates plugin from WordPress.org, then add Pro for batch FEFO, automatic markdowns, and email digests when you're ready.

See plans & download free

Or read the documentation.