Black Friday price checker: the 30-day lowest price rule

Load your price history and your planned sale. For each SKU the checker finds the prior price you must show under the EU Omnibus rule, flags wrong “was” prices and percentages, points out gaps in your data, and exports a hash-chained, signed evidence file. It all runs in this browser tab.

By Adam Hale · updated 2026-10-12

Workflow aid, not legal advice. The rules were checked against the official texts on 2026-10-12; each page links them. Your files are processed in your browser and never uploaded.

Check your sale

Columns: sku, date, price; optional currency, channel. One row per price change, or one row per day.

Columns: sku, start, sale_price; optional was_price, discount_pct, country, end, channel, currency, perishable, launched.

Settings

The price history has

Bulk licence key (more than 25 SKUs)

The key is checked offline in this browser and stored only here. About bulk licences.

What the checker applies

The five results

ResultMeaning
OKThe history covers the whole period and your planned prices match the prior price. Show the prior price it states.
Fix neededYour “was” price is above the prior price, the advertised percentage is too high, or the sale price is not below the prior price.
Incomplete dataThe history starts too late, days are missing, or there is no history in that channel or currency. Nothing contradicts your plan yet, but it cannot be confirmed.
Exempt (check condition)A national exemption applies if its condition is met, for example perishables reduced because they are about to expire in Germany or Austria, or a first-time article in Spain.
Indicators onlyUK rows: figures from your history, no verdict.

CSV format

Comma, semicolon or tab separated, with a header row. Column names are matched loosely, so Variant SKU, Compare At Price or Regular price/Sale price exports work. Download the samples: price-history.csv and planned-sale.csv.

ColumnFileNotes
skubothRequired. Matched exactly.
datehistoryRequired. 2026-11-02, 2026-11-02T14:30, 2026-11-02T14:30:00Z, 02.11.2026. Dates without an offset use the time zone setting. Ambiguous dates like 05/06/2026 are refused.
pricehistoryRequired. The price consumers paid at that time, including VAT. Or use regular_price + sale_price: the sale price wins when filled.
startsaleRequired. A date alone means 00:00 local time in the sale country.
sale_pricesaleRequired. The reduced price.
was_pricesaleOptional. The crossed-out or “prior” price you plan to show (compare_at_price works).
discount_pctsaleOptional. The percentage you plan to advertise.
countrysaleOptional. Two-letter code (DE, FR, NL, GB …). Defaults to the setting.
endsaleOptional. A date alone includes that whole day. Used to tell successive campaigns from progressive ones.
channel, currencybothOptional. Prices are never converted between currencies.
perishablesaleOptional yes/no. Applies the country's perishable-goods option.
launchedsaleOptional. First day you offered the product; applies the country's option for products on sale for less than 30 days.

The evidence file

Each export is a JSON file in which every entry (settings and rules, the SHA-256 of each input file, one entry per checked price, a summary) carries the hash of the entry before it. The final hash is signed with an ECDSA P-256 key created in this browser and kept in its storage. Anyone can check the file on the verify page. The signature proves the file has not been changed since export; it is not a trusted timestamp and says nothing about who you are. Keep the file with your original CSV exports. The printable HTML report shows the same content for a person to read.

Questions and answers

What is the 30-day lowest price rule?
When you announce a price reduction for goods to consumers in the EU, you must show the prior price: the lowest price you applied in at least the 30 days before the reduction (Directive 98/6/EC, Article 6a). Earlier promotions in those 30 days count. Read the worked guide.
Does it apply to Black Friday?
Yes. The Commission's guidance names “Black Friday offers” as announcements covered by the rule, even without a stated percentage, and says that successive Black Friday, Cyber Monday and Christmas campaigns each use the 30-day lowest price, including the earlier campaign's price (Commission guidance 2021/C 526/02, sections 1.1 and 4.3).
Can I calculate “-30 %” from my usual price?
No. The Court of Justice ruled on 26 September 2024 that a percentage or other promotional claim must be calculated from the prior price (C-330/23 Aldi Süd). The checker compares any advertised percentage with the real reduction from the prior price.
Are my files uploaded?
No. The page is static. Your CSV files are read and analysed by JavaScript in your browser; nothing is sent to a server, and the site sets no cookies and loads nothing from third parties. You can load the page, disconnect from the internet and it still works.
Where do I get a price-history CSV?
From whatever records your prices: a price-history plugin, your ERP or PIM, a repricing tool, a marketplace report, or a spreadsheet you keep. Shopify and WooCommerce do not keep a price history out of the box, so if you have none you may need to rebuild it from order or audit logs. The checker needs only SKU, date and price columns; currency and channel are optional.
What does “Incomplete data” mean?
The history does not cover the whole reference period, or days are missing from daily snapshots, so a lower price cannot be ruled out. A “was” price that is already higher than the lowest known price is still flagged as wrong, because more data can only lower the prior price.
Does it cover the UK?
Partly. Great Britain has no fixed lowest-price period, so the UK mode shows indicators from your history (how long the “was” price applied, price changes, the last price before the sale) without a pass or fail verdict. See the UK section.
Is the result legal advice?
No. It is a workflow aid that applies the rules as modelled here to the data you provide. National rules and enforcement practice can differ from what a tool can model, and your facts may matter. For a real dispute, ask a lawyer or your national consumer authority.

Sources

Official texts, read on 2026-10-12. The date is the version or publication date of the text.

  1. Directive (EU) 2019/2161, Article 2: Article 6a inserted into Directive 98/6/EC. Official Journal of the EU, L 328, 18.12.2019. 2019-11-27.
  2. Commission Notice: Guidance on the interpretation and application of Article 6a of Directive 98/6/EC (2021/C 526/02). Official Journal of the EU, C 526, 29.12.2021, p. 130. 2021-12-29.
  3. Judgment of 26 September 2024, Aldi Süd, C-330/23, ECLI:EU:C:2024:804. Court of Justice of the European Union. 2024-09-26.