When a shop in the EU announces a price reduction, it has to show the prior price: the lowest price it charged for that product during at least the 30 days before the reduction started. That rule is Article 6a of the Price Indication Directive 98/6/EC, added by the "Omnibus" Directive (EU) 2019/2161 and applied in the Member States from 28 May 2022. In September 2024 the Court of Justice added an important detail: a percentage discount must be calculated from that prior price, not from whatever price was charged yesterday.
This guide explains what the rule says, what the ruling changed, where WooCommerce shops usually go wrong and how to check your own shop. It is a practical guide, not legal advice. National laws add their own details, so check the rules of each country you sell to.
#What Article 6a actually says
The article is short. In plain words:
- Any announcement of a price reduction must show the prior price.
- The prior price is the lowest price the trader applied during a period of at least 30 days before the reduction.
- Member States may set different rules for goods that spoil or expire quickly.
- Member States may allow a shorter period for products that have been on the market for less than 30 days.
- Member States may decide that, when a reduction is increased step by step, the prior price stays the price before the first reduction.
Points 3 to 5 are options. Whether they apply to you depends on the country, which is why one setting rarely fits every EU shop.
The European Commission published guidance on Article 6a in December 2021 (Notice 2021/C 526/02). A few points from it matter for online shops:
- "Announcement" is broad. A crossed-out price, "20% off", "Sale", "Black Friday offer" or a similar label all count, even without a number.
- The lowest price includes earlier promotions in the 30-day window. If you ran a sale two weeks ago, that sale price is part of the calculation.
- The rule covers goods, not services or digital content.
- General claims such as "lowest prices in town" and comparisons with other sellers are outside Article 6a, but still fall under the rules on unfair commercial practices.
- If you sell through several channels at different prices, the prior price is worked out per channel.
- You may show other reference prices too, as long as they are clearly explained and do not distract from the prior price.
#What the Aldi Süd ruling changed (C-330/23)
In case C-330/23, a German consumer association challenged an Aldi Süd brochure. Bananas were advertised at EUR 1.29 with EUR 1.69 struck through and a percentage badge, while the brochure also stated that the lowest price in the last 30 days was EUR 1.29. In other words, the "discount" was measured against a higher recent price, while the real 30-day low was the same as the new price.
On 26 September 2024 the Court ruled that a price reduction announced as a percentage, or as a promotional statement highlighting the advantageous price, must be determined on the basis of the prior price as defined in Article 6a(2).
For a shop, the practical meaning is simple: if your badge says "-25%", the 25% must be measured from the 30-day low. Printing the prior price in small text below a percentage that was calculated from another price is exactly the pattern the Court rejected.
#Common mistakes in WooCommerce shops
WooCommerce stores a regular price and a sale price. It does not keep a history of past prices, so on its own it cannot tell you the lowest price of the last 30 days. That gap causes most of the problems below.
1. Using the regular price as the prior price. WooCommerce crosses out the regular price by default. If the product was cheaper at some point in the previous 30 days, the regular price is not the prior price.
2. Ignoring earlier sales. A product that was on sale three weeks ago, back at full price for a week and now on sale again, has the earlier sale price as its 30-day low.
3. Measuring from today instead of from the start of the reduction. The 30 days run back from the day the reduction was first applied, not from the day a customer views the page. Calculating from "now" makes the number drift during a long sale.
4. Letting the prior price slide during progressive discounts. If you lower a sale price again in the middle of a campaign, the prior price for the deeper discount should not suddenly become the previous sale price, at least in countries that adopted option 5.
5. Percentage badges from the wrong base. Many themes and badge plugins calculate the percentage from the regular price. After C-330/23 that is risky whenever the regular price is not the 30-day low.
6. Variations treated as one product. Each variation of a variable product can have its own price history. The prior price for "size M, blue" is not the prior price for "size XL, red".
7. Showing a number you cannot prove. If price history is missing, for example because a plugin was inactive or prices were changed directly in the database, an estimated "lowest price" is still a claim you have to stand behind.
8. Tax display mismatches. If your shop displays prices including VAT, the prior price must be shown on the same basis.
#A practical checklist
Use this for each campaign, and once for your shop setup:
- Your shop keeps a price history for every product and every variation, including sale schedules.
- The prior price is the lowest price in at least 30 days before the reduction started, earlier sale prices included.
- Progressive reductions keep the start of the first reduction as the anchor, where your country allows it.
- Percentage badges and "save X" labels are calculated from the prior price, or removed.
- The crossed-out price is the prior price, or any other reference price is clearly labelled and does not hide the prior price.
- Every place that shows a reduction shows the prior price: product page, category pages, related products, block-theme product grids and the selected variation.
- The prior price is displayed with or without tax, exactly like the current price.
- You know your country's options for new products and perishable goods, and your settings match them.
- Products with unknown history do not show an invented prior price, and you decide for each of them whether to announce a reduction at all.
- For multi-channel selling, each channel uses its own price history.
- Someone responsible for compliance in your company, or your lawyer, has checked the national rules for every country you sell to.
#How PN Omnibus handles it
PN Scripts makes PN Omnibus, a free WooCommerce plugin built for this rule. It has been submitted to WordPress.org; the link will follow once the review is finished. Until then, details are on the PN Omnibus product page.
What it does, mapped to the checklist above:
- Records every price change of simple and external products and of each variation: regular price, sale price and sale schedule. It picks up changes from the product editor, quick and bulk edit, CSV import, the REST API, WP-CLI, scheduled sale start and end, and code that saves products. History is stored in its own table, only when a price actually changes.
- Anchors the period at the start of the current reduction, keeps the first anchor for progressive reductions, counts every price in force during the window (including earlier sales) and counts calendar days in the shop's time zone, never fewer than 30.
- Presets for national options: EU strict, Germany, Poland and Bulgaria, plus custom rules for new products and perishable goods. Presets are starting points, not legal answers.
- Shows the prior price under the price in classic and block themes, for the selected variation, and through a shortcode, using the shop's own tax display.
- Shows nothing when it cannot prove the number. Gaps in history, a period that reaches back before a tax or currency change, or too short a history give an "unknown" result instead of a guess. A coverage report lists every product on sale and why a prior price is or is not shown, so you can decide what to do about each one.
- Imports history read-only from three other Omnibus plugins, to fill the time before it started recording.
Two honest limits. First, the plugin does not rewrite percentage badges that your theme or another plugin prints; it provides a filter for developers, and the checklist item about badges stays your job. Second, when the result is "unknown" the plugin shows no prior price, but WooCommerce may still show the sale. For those products, decide whether to announce the reduction at all. The plugin helps display prices; you remain responsible for compliance.
See also: FAQ sections that search engines understand.
#Frequently asked questions
Does the 30-day rule apply to every price change?
No. It applies when you announce a price reduction, for example with a crossed-out price, a percentage, or a "sale" label. Quietly lowering a price without presenting it as a reduction is not covered by Article 6a, according to the Commission's guidance.
Do earlier sale prices count when working out the lowest price?
Yes. The prior price is the lowest price you applied during the period, and the Commission's guidance states that earlier promotional prices in that window are included.
What did the CJEU decide in C-330/23 (Aldi Süd)?
On 26 September 2024 the Court ruled that a reduction announced as a percentage, or with a promotional statement about the advantageous price, must be calculated from the prior price defined in Article 6a(2), that is, the lowest price of at least the previous 30 days.
What about new products that have been on sale for less than 30 days?
Member States may allow a shorter period for them, and some have. Check the national law of the country you sell to. If it does not allow a shorter period, avoid announcing reductions for those products until the history covers the full period.
Does PN Omnibus make my shop compliant?
It calculates and displays the prior price from a recorded history and refuses to guess when the history is incomplete. Compliance also depends on your badges, campaign wording and national rules, so it remains your responsibility. Nothing in this article is legal advice.
Comments
Comments
Be the first to leave a comment.
Leave a comment