Real example: Black Friday + Christmas + January Sale, all scheduled at once
Say you sell a t-shirt at 29,99 € and want three sales planned for November and beyond:
- Edit the product in WooCommerce → find the "Scheduled sale prices" section
- Add: 19,99 € from Nov 28 to Dec 1 (Black Friday)
- Add: 30% off from Dec 20 to Dec 26 (Christmas)
- Add: 12 € off from Jan 5 to Jan 15 (January sale)
- Save the product once. Done.
- Before anything goes live, the editor tells you what the EU Omnibus rules will see: Christmas at 20,99 € is not lower than the 19,99 € of Black Friday a few weeks before, so it should not be announced as a reduction, and the January sale will be measured against 20,99 €, not 29,99 €.
Every sale can be a fixed price, a percentage off or an amount off, and you see the resulting price before saving. Each sale can start and end at an exact time (hour and minute), so flash sales begin and end right when you plan them, and WordPress cron (configurable down to every 5 minutes) applies each price automatically. Sales for one product live in the product editor you already use.
Black Friday for a whole category, checked before it runs
- Go to Marketing > Sales Scheduler > Campaigns
- Pick categories or tags, the discount and the dates
- Click Preview: every product appears with its campaign price and the prior price the EU Omnibus rules will measure it against
- The preview marks the products where the sale would not be a real reduction, and the ones that already have a sale on those dates
- Untick what you don't want and schedule it
Variable products get the sale on each variation. Each campaign shows which products it is on and whether its sale applies on each one, and the WooCommerce product list can be filtered by campaign. Products you publish later can be added to a running campaign, with the same check. Deleting a campaign removes its sale from every product and leaves your other sales alone.
Scheduled Sales, Discounts and Omnibus Price History for WooCommerce extends WooCommerce's native sale scheduling by letting you queue up unlimited sale prices per product, each with its own dates, times and discount type. It also handles the prior price the EU Omnibus Directive asks you to show: it checks every scheduled sale before it runs, shows the right prior price on your store, and keeps a price history you can export.
Why this plugin?
- All-in-one free solution combining: multiple sales per product, percentage and fixed amount discounts, variations support, CSV import/export, activity log, overlap priority, dashboard widget and Command Palette
- EU Omnibus prior price, before and after the sale: the editor warns you while you plan a chain of sales, your store strikes through or shows the right prior price, and the price history tab is your record of which price applied when
- Integrated into the product editor, plus a campaigns tab to put whole categories on sale
- Lightweight: no build process, no external dependencies, no JavaScript frameworks
- HPOS-ready (High-Performance Order Storage) and ready for the WordPress Command Palette (Cmd+K / Ctrl+K)
- Built and maintained by a WordPress specialist with 15+ years of experience publishing plugins on WordPress.org
Key Features
- Schedule multiple sale prices per product
- Campaigns: one sale for every product of the categories or tags you choose, with an Omnibus check of each product before you schedule it
- Fixed price, percentage discount or fixed amount off, with a live preview of the final price
- Optional minimum and maximum final price, so a percentage discount never goes further than you want
- Dynamic pricing: Schedule both discounts and price increases
- Each sale has its own start and end date and time, down to the minute
- Omnibus check while you plan: each scheduled sale shows the prior price it will be measured against, counting your other scheduled sales, and warns you when it would not be a real reduction
- Omnibus on your store: the prior price struck through instead of the regular price, or a note with it, with your own text and the number of days your country asks for
- Price history: every price change of every product and variation for 13 months, searchable and exportable to CSV
- Tells you when a discount rules or currency plugin is active, since the prices they show are not in the price history
- Configurable check frequency (every 5, 10, 15, 30 minutes or hourly)
- Works with simple and variable products
- Configurable priority when sales overlap
- Import and export scheduled sales via CSV
- Activity log with configurable retention period
- Automatic deletion of expired sales
- Admin notifications when sales activate or end
- Alert notifications before sales expire
- Dashboard widget with sales overview
- Compatible with HPOS (High-Performance Order Storage)
- Automatic sale activation and deactivation via cron
- Import existing WooCommerce sales
- Clean orphaned scheduled sales from deleted products
- Command Palette integration (Cmd+K / Ctrl+K) for quick access to export and overview
Use Cases
- Plan Black Friday, Christmas and seasonal sales months in advance, all in one visit to the product editor
- Put a whole category on sale in one step, knowing beforehand which products can be advertised as a reduction
- Schedule different discounts for different promotional periods without losing track of the legally required reference price
- Implement dynamic pricing for high-demand periods (hotels, events, tickets)
- Seasonal price adjustments (peak season vs. off-season)
- Manage flash sales and special offers
- Coordinate pricing across multiple products
- Track pricing history with activity log
- Keep a record of which price applied when, ready to export if anyone asks
- Receive alerts when sales are about to end
- Automatically clean expired sales
Settings Options
- Default overlap priority (lowest, highest, first, last)
- Enable/disable activity log
- Log retention period (30-365 days)
- Automatic deletion of expired sales (never, 30-365 days)
- Sale check frequency (every 5, 10, 15, 30 minutes or hourly)
- Sale activation notifications
- Notifications before sale ends (1-30 days)
- Overlap warnings when creating schedules
- EU Omnibus prior price: strikethrough, when and where to show the note, days counted, note text, and no reduction shown while the prior price is not fully known
Requirements
- WordPress 5.8 or higher
- WooCommerce 6.0 or higher
- PHP 7.4 or higher
1.7.1
Fixes campaigns stopping at 50 products: use Add missing products in its row to complete one. Sale start notices now appear. Optional setting to show no reduction while the prior price is not fully known. Tested with WooCommerce 11.3.
- Improved: Add missing products, in each campaign row. It previews the products of the campaign's categories and tags that do not have its sale yet (published after it, or left out when it was scheduled), with their Omnibus check, and adds the ones you tick. A product whose sale was removed in the product editor is not offered again
- Improved: New setting under EU Omnibus prior price, off by default: do not announce a reduction while the plugin has not recorded the whole period before the sale, as in the first days after installing it or for a product created or imported recently. Those sales are shown as a plain price, without strikethrough, sale badge or prior price note
- Improved: The plugin screen tells you when a discount rules or currency plugin is active, because the discounts and converted prices they show are not in the price history or the prior price
- Improved: A campaign gets one notice when it starts and one when it ends soon, each with its number of products, instead of one notice per product
- Improved: Developers can ask whether the store shows a sale as a plain price with ayudawp_msps_shows_plain_price()
- Fix: A campaign with more than 50 products was saved with only 50, although the preview found them all and the confirmation counted them all. Campaigns created with 1.7.0 keep the products they got: use Add missing products to complete them
- Fix: The confirmation after scheduling a campaign counts the products that got its sale, not the ones you ticked
- Fix: The notice when a scheduled sale starts never appeared. Now the scheduled check shows it when it applies the sale. With that setting on, as it is by default, you will start seeing these notices. Sales already running when you update are not announced
- Fix: Product names in the sale notices are shown as plain text
- Fix: Scheduling a campaign only writes its sale into products of its categories and tags
- Fix: The Overview tab no longer deletes schedules it cannot show while it loads. The Clean orphaned schedules button still removes them
- Fix: The CSV import result is shown as plain text
1.7.0
Campaigns: one sale for whole categories or tags, with an Omnibus check of every product before you schedule it. Fixes the scheduled check saving every product on sale on each run, and more. Tested with WooCommerce 11.2.
- New: Campaigns tab: schedule one sale (percentage or amount off, with optional price limits) on every product of the categories or tags you choose, variations included. Before anything is saved, a preview checks each product against its EU Omnibus prior price, counting the sales you already scheduled, and marks the ones that would not be a real reduction or that overlap another sale. A campaign only lowers prices: a product whose campaign price would not be below its regular price is left out. Each campaign shows which products it is on, with the price each one gets, its prior price and whether another sale wins the overlap, and links to the WooCommerce product list filtered by campaign. Deleting a campaign removes only its own sale from each product
- Improved: Sales added by a campaign show the campaign name in the product editor
- Improved: The activity log records a CSV import or a campaign as one entry, with its number of products
- Fix: The scheduled sales check saved every product on sale again on every run (every 5 to 60 minutes), which fired the WooCommerce product update hooks (feed syncs, cache purges, search reindexing) and, with the log on, added an activation entry each time. Now a product is saved only when its price has to change
- Fix: The price history dates a scheduled price change at its scheduled start or end, not at the moment the check applied it, so the 30-day window of the next sale starts where it should
- Fix: A variation sale that has already started applies as soon as you add it, and goes away as soon as you delete it, as on simple products, instead of waiting for the next check
- Fix: Shop managers can save the plugin settings. They could open the page, but saving needed administrator permissions
- Fix: The CSV import applies sales that have already started right away, only accepts products and variations you can edit, rejects variable products (their sales go on each variation) and rejects impossible dates such as February 30 instead of moving them to another day
- Fix: The price history list and its full export only include products you can edit
- Fix: Products added after the first price history seeding without a WooCommerce save, as some importers do, get their starting point in the daily check
- Fix: In the price history export, a timezone written as an offset (+01:00) no longer gets an apostrophe in front
- Fix: The prior price note keeps the markup WooCommerce gives prices, which keeps the amount in order in right-to-left languages and the currency symbol out of browser translation
- Fix: The price history list skips a stored value that is not a valid history instead of showing a price of 0
- Fix: The activity log showed prices with their HTML code
For older changelog entries, please check the
changelog.txt file.