Product Expiration Date | Start Date and Expiry Scheduling without a Cron
Description
Highlights
About the Extension
The Black Friday bundle needs to go live on Friday morning. The January sale items need to disappear on the 31st. So you sit in the admin on a Sunday evening, tick products active, and four weeks later you tick them inactive again. Or you forget, and somebody orders stock you no longer have.
The problem
A Shopware product has an active switch, but no date. If you run seasonal ranges, limited promotions or a pre-order, you end up keeping a second list next to your shop: what goes on when, and what goes off when. Every missed deadline costs you money, because the stock went live too late, or nerves, because you have to cancel an order and explain yourself. With ten products you can hold that in your head. With two hundred you cannot.
The solution
You set a start date and an expiration date on the product. That is it. From then on Shopware takes over: the product goes live at the start of the window and goes offline at the end of it. Outside that window it is not just invisible, it cannot be ordered either.
What's in it for you
You plan once instead of chasing it three times. The start date and the expiration date sit on the product itself, in the custom fields tab. Whoever maintains the product also sees its time window. No calendar entry, no sticky note, no Sunday evening in the admin.
No worker, no cron, no conversation with your host. The plugin attaches the check to ordinary storefront requests. It therefore runs on hosting where no message worker has ever been set up. If you do run a worker, you get a scheduled task on top, but you never need one.
Expired stock does not get through the checkout. Four places are covered, not just one: listings and search results drop the product, cross-selling leaves it out, the product detail page answers with a 404, and the cart removes it before the order goes through. A customer still holding an old newsletter link will not end up in an order you have to reverse.
Every sales channel on its own. The main switch, the customer-facing display and the check interval are all read per sales channel. Your trade shop can keep selling clearance stock long after it has gone from your consumer shop. Turn the main switch off for a channel and nothing at all happens there.
Your customers know how long they have. If you want it, the shop shows the expiration date on the product detail page and in the cart, with a lead time you set in days. At 0 the date only appears on the day itself. That is honest urgency instead of an invented countdown.
How the plugin works
Each product carries three custom fields in the group Start & expiry date: a switch, a start date and an expiration date. Only products with the switch on are looked at. An empty start date means available now, an empty expiration date means no end.
Two things run side by side. On every page request the plugin decides straight from the custom fields it has already loaded whether the product is currently sellable. That costs no extra query and takes effect immediately. Separately, the plugin brings the real active flag of the product in line, so that your sitemap, product feeds and API show the same picture as the storefront. That run starts at most once per configured interval, 60 seconds by default. Set the interval to 10 seconds and you get a more precise switching moment for slightly more load.
Traffic makes no difference to this. The right to perform the run is handed out through a single atomic database statement. If 500 visitors arrive in the same second, the check still runs exactly once, not 500 times. The cache is only cleared when a product has actually changed.
Typical use cases
Seasonal and promotional stock. The Christmas hampers go live on 1 December, the barbecue range ends on 30 September. You enter the dates in summer and stop thinking about them until the new year.
Limited-time offers. A promotion runs for three weeks. After that the product should not linger as a dead link in the Google index, it should disappear cleanly.
Pre-orders with a start date. The new item is fully maintained, photographed and signed off, but should only become visible on the first day of the trade show. You set the start date and you do not have to be at your desk at midnight.
Discontinued ranges and products with a shelf life. Once the cut-off date is reached, the product is out. Including out of the cart of the customer who put it there three days ago.
Technical facts for your IT team
The plugin needs Shopware 6.7.11 or newer and PHP 8.2 or newer. The 6.7.11 floor is not caution for its own sake: the expiry notice in the storefront is a Twig component, and the storefront component system only exists from that version onwards.
The plugin creates no database table of its own and runs no migration. It uses three custom fields on the product plus one timestamp in the system configuration to remember its last run. Existing Shopware tables are left alone.
The plugin sends no data to external servers. It processes no personal data: it reads product data and writes the active flag of products. Everything stays inside your own Shopware database.
On load: the visibility check needs no additional database query, because it evaluates custom fields that are loaded anyway. The cart is checked with one collective query, never one query per line item. The switching run is capped by the interval guard, and the cache is only cleared on real changes.
Uninstalling is your decision. Choose to keep the data in the plugin manager and the custom fields and settings stay exactly as they are. Otherwise the plugin removes its own custom fields and configuration values. If you only deactivate it, the custom fields are set to inactive and the dates you entered remain.
To be honest
This plugin switches products. It does not email you before something expires, it does not mark stock down automatically and it does not manage batches. If you need an expiry warning with notifications, this is the wrong tool.
Without a worker, the timing of the switching run depends on traffic. In a shop with no visitors at three in the morning, the active flag is only brought in line with the first request of the day. That changes nothing for your customers, because the visibility check applies on every page request straight away. If you need the stored flag to be accurate to the minute, for an external product feed for example, add the scheduled task or the CLI command. Try it on one test product first, setting a time window takes under five minutes.
Legal notice
We accept no liability for legal requirements. Please check the use of this plugin with a qualified legal advisor.
Details
- Available: English, German, Dutch
- Latest update: 14 September 2026
- Publication date: 22 February 2022
- Version: 6.7.4
- Category: Special features
Resources
Reviews (0)
About the Extension Partner
BuI Hinsche GmbH
Partner Status
-
Shopware
Bronze Partner -
Shopware
Premium Extension Partner
Details
- Ø-Rating: 4.3
- Partner since: 2014
- Extensions: 93
- Certifications: 2
Support
- Based in: Germany
- Speaks: German, English
- Response time: Very quickly