Title: PluginCity Product Expiry Dates for WooCommerce
Author: PluginCity
Published: <strong>September 30, 2026</strong>
Last modified: September 30, 2026

---

Search plugins

![](https://ps.w.org/plugincity-product-expiry-dates/assets/banner-772x250.png?rev
=3720678)

![](https://ps.w.org/plugincity-product-expiry-dates/assets/icon-256x256.png?rev
=3720678)

# PluginCity Product Expiry Dates for WooCommerce

 By [PluginCity](https://profiles.wordpress.org/plugincitywp/)

[Download](https://downloads.wordpress.org/plugin/plugincity-product-expiry-dates.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/plugincity-product-expiry-dates/#description)
 * [Reviews](https://wordpress.org/plugins/plugincity-product-expiry-dates/#reviews)
 *  [Installation](https://wordpress.org/plugins/plugincity-product-expiry-dates/#installation)
 * [Development](https://wordpress.org/plugins/plugincity-product-expiry-dates/#developers)

 [Support](https://wordpress.org/support/plugin/plugincity-product-expiry-dates/)

## Description

Some things should not be sold after a certain date: food has a best-before date,
a licence or a warranty covers a fixed period, and an event ticket is worthless 
the morning after.

WooCommerce has no way to say so. PluginCity Product Expiry Dates adds an **Expiry**
tab to every product, with one box on it: the date it can no longer be sold after.
When that moment passes the product comes off sale on its own, without anybody having
to remember.

The date is enforced in both places it has to be: a product past its date cannot
be added to a basket, and a basket that already held one cannot be checked out —
a basket easily outlives the date it was filled before. The customer is told which
product to take out, by name.

#### What you get

 * One expiry date per product, on an Expiry tab just below Inventory
 * An Expires column on the products list, showing what has stopped selling
 * The product taken off sale once the date passes, with a sentence on the page 
   saying why
 * Baskets that outlived the date refused at the checkout, naming the product to
   remove
 * Notices on the cart, checkout and mini-cart, in the classic checkout and the 
   blocks
 * PayPal express buttons refused too, so a one-tap order cannot get past the date
 * A shortcode, `[pexp_message]`, to put the message anywhere
 * Settings import and export, to copy a configuration to another shop or keep a
   backup
 * High-Performance Order Storage compatibility

The free version is permanent. It does not expire, needs no licence key, and never
contacts PluginCity.

#### Pro

Not every product goes off all at once, and not everyone who buys from you is a 
retail customer. [Pro](https://www.plugincity.net/plugins/product-expiry-dates-for-woocommerce)
is for shops that need the exceptions: trade accounts that may still buy cleared
stock, a shelf life that dates products for you, dates per variation and in bulk,
a warning before a date passes, and an automatic markdown as it approaches.

Pro is a separate paid version, sold and distributed by PluginCity. It is not included
in this plugin and is not downloaded or installed by it, and nothing described above
depends on it. Your dates and settings carry over if you buy it.

### Configuration

 1. Turn expiry dates on.
 2. Edit a product, open its **Expiry** tab below Inventory, and type the date it can
    no longer be sold after.
 3. Write the message customers see, and choose whether it appears on the cart, at 
    checkout, or both.

## Screenshots

[⌊The Expiry tab on a product. Type the date it can no longer be sold after, and
the time of day if the date alone is not close enough.⌉⌊The Expiry tab on a product.
Type the date it can no longer be sold after, and the time of day if the date alone
is not close enough.⌉[

The Expiry tab on a product. Type the date it can no longer be sold after, and the
time of day if the date alone is not close enough.

[⌊The Expires column on your products list. Every date in the shop on one screen,
with whatever has already stopped selling marked.⌉⌊The Expires column on your products
list. Every date in the shop on one screen, with whatever has already stopped selling
marked.⌉[

The Expires column on your products list. Every date in the shop on one screen, 
with whatever has already stopped selling marked.

[⌊A product whose date has passed. The Add to basket button is gone and your own
sentence stands where it was.⌉⌊A product whose date has passed. The Add to basket
button is gone and your own sentence stands where it was.⌉[

A product whose date has passed. The Add to basket button is gone and your own sentence
stands where it was.

[⌊A basket holding something that has since gone off. The product is named at the
top, the shop's own message sits with the totals, and the order will not go through
until it comes out.⌉⌊A basket holding something that has since gone off. The product
is named at the top, the shop's own message sits with the totals, and the order 
will not go through until it comes out.⌉[

A basket holding something that has since gone off. The product is named at the 
top, the shop’s own message sits with the totals, and the order will not go through
until it comes out.

[⌊The same basket at the checkout. A customer who comes straight to this page is
refused here too, so an expired product cannot be paid for by skipping the basket.⌉⌊
The same basket at the checkout. A customer who comes straight to this page is refused
here too, so an expired product cannot be paid for by skipping the basket.⌉[

The same basket at the checkout. A customer who comes straight to this page is refused
here too, so an expired product cannot be paid for by skipping the basket.

[⌊The two sentences a customer reads are yours to write, and %s is where the products
get named.⌉⌊The two sentences a customer reads are yours to write, and %s is where
the products get named.⌉[

The two sentences a customer reads are yours to write, and %s is where the products
get named.

## Installation

WooCommerce must be installed and active first.

 1. In WordPress, go to **Plugins  Add New**.
 2. Search for **PluginCity Product Expiry Dates for WooCommerce**.
 3. Click **Install Now**, then **Activate**.
 4. Go to **WooCommerce  Product Expiry**, or click **Settings** on the Plugins screen.

From a downloaded ZIP instead: **Plugins  Add New  Upload Plugin**, choose the file
and click **Install Now**. There is no need to unzip it.

## FAQ

### What happens when a date passes?

The product comes off sale: the buy button goes and the page says it is no longer
available, in your words. Anybody holding it in a basket is asked to remove it before
ordering. Orders already placed are untouched.

### My theme still shows an Add to cart button. What now?

Nothing can be bought through it: the date is checked again when anything is added
to a basket, rather than trusted from the page. The button belongs to your theme,
and a buy form drawn in place of WooCommerce’s own is hidden too, so in practice
it goes. If yours is still there, tell us the theme and we will look at it.

### Why is the expired product still sitting in the customer’s basket?

Because being told what to do about it is more use than finding it gone. WooCommerce
would take it straight out and say only that it can no longer be purchased, which
reads as a fault in your shop. This plugin leaves the row in place, explains it 
in your words, and refuses the order until the customer removes it.

### Is an expired product hidden, or marked out of stock?

Neither. It stays listed, so a customer who followed a link lands on a page that
explains itself rather than a 404, and nothing can be bought from it. It is not 
marked out of stock either: stock is how many you have, and writing it down as nil
would tell your reports, feeds and back-in-stock emails something untrue.

### Can I set a time as well as a date?

Yes. Leave the time empty and the product sells to the end of the day you typed,
which is how a best-before date reads. Fill it in and it stops at that minute, for
an event or a deadline.

### What time zone are the dates in?

Yours, the one set in **Settings  General**. A date you have typed stays the moment
you meant even if you later move your shop’s time zone.

### Can an expired product be hidden or unpublished instead of just unbuyable?

Not in the free version, which leaves it in the shop and refuses the sale. Pro can
hide it from your listings or move it to draft instead. The [PluginCity product page](https://www.plugincity.net/plugins/product-expiry-dates-for-woocommerce)
lists the Pro features in full.

### Can different types of product have different shelf lives?

Not in the free version. Pro dates products for you from one figure for the shop,
or a different number of days for each category — days for salad, years for tins.

### Can I discount something automatically as its date gets closer?

Not in the free version, which leaves your prices alone. Pro can take a percentage
off as the date approaches — 20% in the last week, 50% in the last two days — so
stock clears instead of being thrown away. Nothing is written onto the product, 
so extending a date puts the full price back.

### Can I be warned before a date passes, rather than finding out afterwards?

Not in the free version, which says nothing beforehand. Pro adds a dashboard panel
listing what stops selling in the next few days, and can email you the same list
each morning.

### Can I set dates on a lot of products at once?

Not in the free version, which gives you one date box per product. Pro adds Quick
Edit, Bulk Edit and expiry dates in WooCommerce’s own product CSV export and import.
See the [PluginCity product page](https://www.plugincity.net/plugins/product-expiry-dates-for-woocommerce)
for full details.

### Do variations have their own dates?

Not in the free version, where every variation is held to the product’s one date.
Pro dates each variation separately, and tells a customer who picks one whose date
has passed.

### Does it work with the block cart and checkout?

Yes. A basket holding something past its date is reported through WooCommerce’s 
Store API, so the block cart and checkout refuse to proceed and show the same message.

### Can I change the wording?

Yes, both sentences: the one on the basket and the one on the product. Bold, italics
and links are allowed; anything else is stripped before it reaches the storefront.

### Can I change how the message looks?

The free version draws it one way: a panel with a coloured band and a small clock,
taking its type and size from your theme, and it can be restyled with your own CSS.
Pro gives you the controls instead — colour, box, mark, weight, size and alignment—
with a preview as you choose.

### Can I show the basket message somewhere else on my site?

Yes. The shortcode `[pexp_message]` prints the same sentence wherever you put it,
and shows nothing while the basket is fine.

### Can a customer get past it with a one-tap payment button?

No. The buttons stay on the cart, so a customer can read why the order is not going
through, but the order itself is refused while the basket holds something past its
date. A PayPal express button is stopped the moment it is pressed, before the customer
is sent out to PayPal, and any other flow that builds its order through WooCommerce’s
checkout is refused there too.

### Does it work with High-Performance Order Storage?

Yes. Nothing is written to orders, so HPOS shops are fully supported.

### What happens if I deactivate WooCommerce?

The plugin steps aside and shows a notice. It does not fatally error, and your dates
and settings are waiting when WooCommerce comes back.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“PluginCity Product Expiry Dates for WooCommerce” is open source software. The following
people have contributed to this plugin.

Contributors

 *   [ PluginCity ](https://profiles.wordpress.org/plugincitywp/)

[Translate “PluginCity Product Expiry Dates for WooCommerce” into your language.](https://translate.wordpress.org/projects/wp-plugins/plugincity-product-expiry-dates)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/plugincity-product-expiry-dates/),
check out the [SVN repository](https://plugins.svn.wordpress.org/plugincity-product-expiry-dates/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/plugincity-product-expiry-dates/)
by [RSS](https://plugins.trac.wordpress.org/log/plugincity-product-expiry-dates/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * First public release.

## Meta

 *  Version **1.0.0**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.7 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 8.1 or higher **
 * Tags
 * [best before](https://wordpress.org/plugins/tags/best-before/)[expiration](https://wordpress.org/plugins/tags/expiration/)
   [expiry date](https://wordpress.org/plugins/tags/expiry-date/)[perishable](https://wordpress.org/plugins/tags/perishable/)
   [woocommerce](https://wordpress.org/plugins/tags/woocommerce/)
 *  [Advanced View](https://wordpress.org/plugins/plugincity-product-expiry-dates/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/plugincity-product-expiry-dates/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/plugincity-product-expiry-dates/reviews/)

## Contributors

 *   [ PluginCity ](https://profiles.wordpress.org/plugincitywp/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/plugincity-product-expiry-dates/)