Lowest price in 30 days: showing discounts in an online shop

If your online shop announces a discount – with a struck-through price, a percentage or a promotional label that stresses how good the price is – you must state the prior price. That is the lowest price at which you sold the goods during the 30 days before the reduction. The discount itself must be calculated from that price, so the struck-through „regular“ price stored on the product is often not enough.

In practice, this means your shop needs a reliable price history. Without it, you cannot prove what the lowest price in 30 days was, and a Black Friday promotion can easily turn into a fake discount. Below you will find the rule, an illustrative example, how to implement it in WooCommerce and in other shops, a decision table and a checklist.

This article covers the technical and process side. Have a lawyer confirm the legal interpretation for your specific case, especially where exceptions are involved.

What the rule actually requires

In Slovakia, the rule is set out in Section 7 of Act No. 108/2024 Coll. on Consumer Protection. In every announcement of a price reduction for goods, the trader must state the prior price and determine the reduction on that basis. The prior price is the lowest price at which the trader sold the goods during the 30 days before the price reduction. If the goods have been on sale for a shorter time, the lowest price since the start of sales applies.

The same section contains two deviations. For progressive price reductions, you may state the prior price established before the first reduction. The prior-price rules do not apply to goods that are liable to deteriorate rapidly in quality or to spoil.

How the discount must be calculated was clarified by the Court of Justice of the EU in its judgment in Case C-330/23 (Aldi Süd) of 26 September 2024. A price reduction announced as a percentage or through a promotional statement stressing the advantageous nature of the offer must be determined from the lowest price over a period of at least 30 days before the reduction. According to the Court’s press release, this prevents traders from raising the price before a promotion and then displaying false price reductions.

The dispute concerned a discounter’s advertising brochures. The consumers‘ association argued that in the first example the price immediately before the offer was €1.69, but the lowest price in 30 days was €1.29 – the same as the allegedly reduced price. In its view, merely stating the lowest price in the advertisement is not enough. The Court confirmed that the discount must be determined from that very price.

Rules in Czechia and Germany

The rule is based on Article 6a of Directive 98/6/EC as amended by Directive (EU) 2019/2161, commonly known as the Omnibus Directive. National laws differ in the details, however. In Czechia, according to the Ministry of Industry and Trade, Section 12a of Act No. 634/1992 Coll. on Consumer Protection has been in force since 6 January 2023: information about a discount must include the lowest price at which the trader offered and sold the goods during the 30 days before the discount, the so-called reference price.

In Germany, Section 11 of the Price Indication Ordinance (PAngV) requires every announcement of a price reduction for goods to state the lowest total price of the last 30 days before the reduction. Where a discount increases progressively and without interruption, the lowest price before it started may be stated for the duration of the promotion. Individual price reductions are expressly exempt, as are goods that perish quickly or have a short shelf life, if the price is reduced because of imminent spoilage or expiry and this is suitably indicated. When selling to Hungary, Poland or another EU country, check the local rules.

Example: a Black Friday price that is not a discount

This example is illustrative – the shop and the prices are made up. A coffee grinder had the following prices over recent weeks:

Period Price for the customer What happened
until 31 Oct €129 Regular price
1–7 Nov €99 One-week promotion advertised on social media
8–16 Nov €129 Back to the regular price
17–26 Nov €149 Price increase after a new supplier price list
from 27 Nov €119 Black Friday: the theme shows €149 struck through and a „−20%“ badge

For the promotion starting on 27 November, the relevant period is 28 October to 26 November. The lowest price in that period is €99 from the one-week promotion. The price of €119 is therefore €20 higher than the prior price and is not a discount, even though it is lower than the struck-through €149. A „−20%“ badge would mislead the customer.

The shop has two honest options. Either it sells at €119 without a struck-through price, a percentage or discount advertising, or it lowers the price below €99. At €89, the discount from the prior price is 10.1%, so it shows €99 struck through and „−10%“.

Why a standard shop setup is not enough

The WooCommerce REST API documentation describes a product’s regular price (regular_price), sale price (sale_price), the start and end of the sale price in the site’s timezone (date_on_sale_from, date_on_sale_to) and the current price (price). This is the product’s current state. You will not find a field for price history or for the lowest price in 30 days in that documentation.

If your theme strikes through the regular price during a sale and calculates the percentage from the difference between the regular and sale prices, the result is correct only if the customer price was never lower than the current regular price in the last 30 days. A price-list change or a short promotion is enough to make the numbers wrong.

On top of that, prices change from several places: manual edits in the admin, bulk edits, imports, ERP synchronisation or the scheduled start and end of a sale. With a scheduled sale, the customer price changes without anyone editing the product at that moment. A history that captures only manual edits is therefore incomplete.

How to implement price history and discount calculation

1. List every place where you announce discounts

Product page, category listing, search results, badges, banners, newsletters, social media posts and printed leaflets. The law refers to every announcement of a price reduction, not just the product page.

2. Record every price change

For each product and variant, store the price the customer saw and paid including VAT, the validity from – to, the source of the change (admin, import, ERP, scheduled sale) and the user or process that made it. In addition to these events, add a nightly record of the price actually in effect. It catches a change that an event would miss.

3. Fill gaps in the history only from verifiable records

If you have no history, you can partly rebuild it from database backups, exports, the ERP or orders. Record where each figure comes from. Where you cannot prove the price, do not announce a discount and start collecting records at least 30 days before the promotion.

4. Calculate and store the prior price when the promotion starts

The system takes the lowest price from the 30 days before the promotion starts, or since the start of sales for new goods. It stores the result with the promotion so that it does not change while the promotion runs. For progressive reductions, you may keep the prior price established before the first reduction; for the German market, the discount must increase without interruption.

5. Show one price and one percentage

The simplest and safest approach is for the struck-through price to be the prior price and for the percentage to be calculated from it. Add a clear label, for example „Lowest price in the 30 days before the discount: €99“. Round percentages down so that you never overstate the discount.

6. Run a check before the campaign goes live

Generate an overview of all products in the promotion: prior price, sale price, calculated percentage and the percentage that will be displayed. A product whose sale price is not lower than the prior price must not get a discount badge. Have a responsible person approve the overview.

7. Connect marketing to the same data

Take the copy for banners, emails and posts from the approved campaign overview instead of retyping it. If you plan and approve content centrally, social media automation connected to the same prices helps. Archive the campaign overview in case of an inspection.

Decision table: what is the prior price?

The table summarises the Slovak rule and the differences that follow from the German text. It does not replace a legal assessment.

Situation Prior price Note
You have sold the goods for more than 30 days and the price has not dropped below the current regular price in that time Current regular price Only in this case is a calculation from the regular price stored on the product correct
Another promotion ran in the last 30 days The price from that promotion, if it was the lowest Affects every promotion that starts within 30 days after it ends
You raised the regular price in the last 30 days The lower price before the increase A price rise just before a promotion does not make the discount bigger
You have sold the goods for less than 30 days Lowest price since the start of sales Slovakia: Section 7(2)(b) of Act No. 108/2024 Coll.
Progressive price reduction Prior price established before the first reduction Slovakia: Section 7(3); Germany: only if the discount increases without interruption
Goods that perish quickly In Slovakia, the obligation does not apply (Section 7(4)) Germany: only with imminent spoilage or expiry and with labelling
Individual discount for a specific customer Not required in Germany – express exception Slovak Section 7 does not list this exception – check with a lawyer

Plugin, theme change or custom solution

A ready-made plugin is the fastest option. Before deploying it, however, check whether it also records changes from imports, the ERP and the REST API, whether it tracks variants, whether it stores prices including VAT, how it handles scheduled sales, where it displays the prior price and what happens to the history if you deactivate it or migrate.

A theme change only solves the display. Without a reliable history, it cannot calculate the correct struck-through price.

A custom module gives you full control over the calculation, the campaign overview and approvals. However, it requires development, testing and maintenance with WooCommerce updates. If prices originate in your ERP, it is often cleaner to calculate the prior price there and send it to the shop through an API integration. The shop then only displays it.

Recommendation: for a smaller catalogue with prices managed in the admin, start with a vetted plugin and a pre-campaign check. With imports, an ERP or sales to several countries, design price history as a separate part of the system.

Common mistakes

  • Percentage from the regular price. A regular price raised before a promotion creates a fake discount – according to the Court of Justice of the EU, calculating from the prior price is meant to prevent exactly that.
  • A forgotten short promotion. A promotion that ended less than 30 days ago can still determine the prior price.
  • History from the admin only. Imports, the ERP and scheduled sales stay outside the record.
  • Parent product only. Variants with different prices need their own history.
  • Different numbers across channels. A banner promises „−30%“ while the product page shows a different percentage.
  • History lost during migration. When you switch plugins or platforms, the records are not carried over.
  • Wrong day or timezone. If the history, sale scheduling and calculation do not work in the same timezone, the 30-day period shifts by a day.

Pre-promotion checklist

  • Price history covers at least 30 days before the start of the promotion for all products and variants in it.
  • Records include changes from the admin, imports, the ERP and scheduled sales.
  • The prior price is calculated and stored when the promotion starts.
  • Both the struck-through price and the percentage are based on the prior price.
  • Products whose sale price is not lower than the prior price have no discount badge.
  • Banners, emails and posts use the same numbers as the shop.
  • There is a clear rule for new goods, progressive discounts and exceptions.
  • A responsible person has approved the campaign overview and it is archived.
  • The situations from the decision table have been tested on a staging copy of the shop.

Frequently asked questions

Do I have to show the lowest price for a discount coupon too?

Slovak Section 7 refers to every announcement of a price reduction for goods and does not list an exception for coupons. The German PAngV expressly exempts individual price reductions. For publicly advertised codes covering the whole range, consult a lawyer and prepare the same calculation technically.

What if we have been selling the goods for less than 30 days?

Under Slovak law, the prior price is the lowest price since the start of sales. The system therefore also needs the date from which you have been selling the goods.

How should the discount percentage be rounded?

Section 7 does not regulate rounding. A safe approach is to calculate from the prior price and round down, so the percentage shown is never higher than the real one.

Does this also apply to newsletters and social media?

The obligation covers every announcement of a price reduction for goods, and the Court of Justice case concerned advertising brochures. If you state a discount in an email or a post, calculate it the same way as in the shop and from the same data.

Can price history be reconstructed retrospectively?

Only from verifiable records such as backups, exports, the ERP or orders, with the source recorded. If you cannot prove the price for some days, do not announce a discount until you have 30 days of reliable records.

How we can help

If you want to be sure before your next campaign that struck-through prices and percentages are correct, take a look at our services, including custom online shops. We add price history, prior-price calculation, a pre-campaign check and ERP integration. Write to us and together we will find out where the prices in your shop come from and what to change first.

Sources

Choose which cookies to allow. You can change your choice at any time using the footer link or cookie button.

Privacy policy and cookie details