The WooCommerce Expiration Date Custom Field: What It Does (and Doesn't)
If you’ve searched for a WooCommerce expiration date custom field, you’re probably weighing the obvious DIY route: add an ACF field or a custom post meta key to your products, type the date in, and call it done. That works — for exactly one thing. It’s worth being honest about where a bare custom field stops, because the gap is wider than most store owners expect.
What a bare custom field actually gives you
A custom field stores a date. That’s the whole feature. ACF (or a hand-rolled meta box) gives you a tidy place to record “this expires on 2026-09-30,” and the value is saved against the product. If all you need is a record sitting in the database that you’ll read manually, a custom field is enough.
What it does not do, out of the box:
- Stop sales. The product keeps selling the day after it expires unless something acts on the date.
- Hide the product or mark it out of stock. The field has no connection to catalog visibility or stock status.
- Protect the cart and checkout. A shopper who already added an expiring item can still buy it.
- Display the date properly. A raw meta value won’t render on the product page with a “Best Before” label — you’d be writing template code and a hook to place it.
- Sort, filter, or report. You can’t order your Products list by expiry, or see at a glance what’s expiring this month.
- Bulk-manage dates. Editing one product at a time is fine for ten products and miserable for a thousand.
Every one of those is a separate build if you go the custom-field-only route. That’s the real cost of “just add a field”: not the field, but the automation around it.
Turning the date into behaviour
Sellinor Product Expiration Dates for WooCommerce starts from the same place — a date on the product — and then makes the date do things, in the free version.
Expiry actions. Under Products → Expirations → Settings → General you pick what happens when a product hits its date: Hide from catalog, Set out of stock, Both, or Do nothing. Hiding is applied immediately on page load (the plugin filters catalog queries), so an expired product drops out of shop, category, and search results right away. The out-of-stock change runs on an hourly background check. A configurable days before threshold lets you act early — say, pull stock three days ahead of the printed date.
Cart and checkout protection. Whenever an action is enabled (anything other than “Do nothing”), 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 closes the window a raw custom field leaves wide open — you can’t accidentally sell expired stock even before the hourly sweep runs.
Variations, handled. Each variation can hold its own date; a dateless variation inherits the parent’s default date. A variable product is only hidden or set out of stock once every variation has expired — so one expired size doesn’t pull the whole product. (See variation expiration dates for the full picture.)
Showing the date — with a label, not raw meta
Free display settings render the date near the add-to-cart area through standard WooCommerce hooks, with a configurable label (“Best Before”, “Use By”, “Expires”) and a display threshold so it only appears within N days of expiry.
For fully bespoke templates or page builders, the [edfw_expiration_date] shortcode drops the date exactly where you want it. It takes an optional id attribute ([edfw_expiration_date id="123"]) for use off the product page, renders even when the global display toggle is off, and automatically suppresses the plugin’s own auto-placement so the date never appears twice. That’s the template control a custom field would otherwise force you to code by hand — see showing the date on the product page.
Sort, report, and bulk-manage
- A sortable, color-coded Expiration column on the Products list, plus an expiring/expired filter dropdown.
- Quick Edit and Bulk Edit to set or change dates without opening each product.
- A dashboard widget and an Overview/Reports page: a month calendar, value-at-risk, stat cards, and expiring-soon/expired tabs.
- CSV import/export, matching rows by product ID or SKU (variations carry their own IDs/SKUs).
- A 90-day activity log, HPOS compatibility, and an opt-in delete-on-uninstall setting.
Your data isn’t locked in
A common worry with plugins is lock-in. Here, dates are stored as standard WooCommerce product metadata — the same kind of meta a custom field uses. They travel with your CSV exports, and because they’re plain metadata you can remove them in bulk via the opt-in delete-on-uninstall option. You get the automation without trading away the portability that made a custom field attractive in the first place.
Where Pro fits
The free tier covers everything above. Pro adds batch & lot tracking with FEFO (per-batch lot number, expiry, and quantity, with earliest-expiry-first deduction) and tiered automatic expiry discounts with an “Expiring soon” badge. (One caveat worth knowing: those dynamic discounts don’t populate WooCommerce’s native On Sale block or [sale_products] shortcode.) For most stores, the free automation is the part that replaces the DIY custom-field project.
A custom field is a fine place to put a date. It’s just not a system. If you want the date to hide products, guard checkout, display cleanly, and report itself, that’s what this plugin is for.
Frequently asked questions
Does a WooCommerce expiration date custom field stop products from selling?
No. A bare custom field (ACF or post meta) only stores the date. It won't hide the product, set it out of stock, or block checkout. You need automation that reads the field and acts on it.
How does this plugin store the expiration date?
Dates are saved as standard WooCommerce product metadata, so they travel with CSV exports and aren't locked into a proprietary table. You can clean them up in bulk via the opt-in delete-on-uninstall setting.
Can I show the expiration date with my own label?
Yes. Free settings let you set the label text (Best Before, Use By, Expires) and a display threshold. For bespoke templates, the [edfw_expiration_date] shortcode places the date anywhere, with an optional id attribute.
Will a custom field hide an expired variation automatically?
Not on its own. With this plugin, each variation can hold its own date (inheriting the parent default when blank), and a variable product is only hidden or set out of stock once every variation has expired.
Do I need Pro to automate expiry behaviour?
No. Hide-from-catalog, set-out-of-stock, cart/checkout protection, frontend display, the sortable column, quick/bulk edit, reports, and CSV import/export are all free. Pro adds batch tracking with FEFO and tiered expiry discounts.
Make the date actually do something
Sellinor Product Expiration Dates for WooCommerce stores dates as standard metadata, then hides, de-stocks, and protects checkout automatically — for free.
See plans & download freeOr read the documentation.