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.
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
Bulk licence key (more than 25 SKUs)
The key is checked offline in this browser and stored only here. About bulk licences.
| SKU | Country | Starts (local) | Sale price | Prior price | Your “was” | Result |
|---|
Columns detected
What the checker applies
- Prior price = the lowest price you applied in the 30 days before the reduction starts, counted in the sale country's local time (Article 6a(2)). A sale starting at 00:00 on 27 November 2026 in Berlin looks back to 00:00 on 28 October.
- Earlier promotions count. A Singles' Day or early-November discount inside the 30 days sets the prior price for Black Friday (Commission guidance, section 2.1). Planned sale steps in your file are added to the history automatically.
- Percentages are calculated from the prior price (CJEU C-330/23). The checker tells you the largest whole percentage you can claim.
- One prior price per sales channel when your history and sale name channels (guidance, section 2.1).
- Country options for progressive reductions, perishable goods and products on sale for less than 30 days, for France, Germany, Austria, the Netherlands, Poland, Italy and Spain. Other EU/EEA countries get the EU baseline only. Rules by country.
The five results
| Result | Meaning |
|---|---|
| OK | The history covers the whole period and your planned prices match the prior price. Show the prior price it states. |
| Fix needed | Your “was” price is above the prior price, the advertised percentage is too high, or the sale price is not below the prior price. |
| Incomplete data | The 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 only | UK 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.
| Column | File | Notes |
|---|---|---|
sku | both | Required. Matched exactly. |
date | history | Required. 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. |
price | history | Required. The price consumers paid at that time, including VAT. Or use regular_price + sale_price: the sale price wins when filled. |
start | sale | Required. A date alone means 00:00 local time in the sale country. |
sale_price | sale | Required. The reduced price. |
was_price | sale | Optional. The crossed-out or “prior” price you plan to show (compare_at_price works). |
discount_pct | sale | Optional. The percentage you plan to advertise. |
country | sale | Optional. Two-letter code (DE, FR, NL, GB …). Defaults to the setting. |
end | sale | Optional. A date alone includes that whole day. Used to tell successive campaigns from progressive ones. |
channel, currency | both | Optional. Prices are never converted between currencies. |
perishable | sale | Optional yes/no. Applies the country's perishable-goods option. |
launched | sale | Optional. 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?
Does it apply to Black Friday?
Can I calculate “-30 %” from my usual price?
Are my files uploaded?
Where do I get a price-history CSV?
What does “Incomplete data” mean?
Does it cover the UK?
Is the result legal advice?
Sources
Official texts, read on 2026-10-12. The date is the version or publication date of the text.
- 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.
- 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.
- 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.