EU price cuts: put the 30-day prior price on the sale video card

EU Directive 2019/2161 Art. 6a: a price-cut announcement must state the prior price, the lowest in 30+ days. Compute it, then burn it. Read 2026-10-05.

4 min readSume
All posts

If you advertise a price reduction to EU shoppers, Article 6a of Directive 2019/2161 (inserted into the Price Indication Directive) says the announcement must indicate the prior price, and the prior price is the lowest price you applied during a period of not less than 30 days before the reduction. So a "-40%" Black Friday clip needs a number behind it that your own price history can support, not a list price that has not been charged in months.

What the text says (read 2026-10-05)

The directive is the EU baseline. Each Member State transposes it, and the text itself gives states room on some points, so a national rule can differ in detail. Check your market's law or a lawyer for the exact wording that applies to you. This is not legal advice.

Article 6a, Directive (EU) 2019/2161 on EUR-Lex, read 2026-10-05
TopicWhat it says
Announcement of a reductionMust indicate the prior price
Prior priceLowest price applied during a period not shorter than 30 days before the reduction
Goods that deteriorate or expire rapidlyMember States may set a different rule
Products on the market under 30 days; progressive reductionsMember States have flexibility

Compute the number before you burn it

The workflow is mechanical. Keep a dated price history per SKU, take the minimum over the 30 days before the sale starts, derive the percent from that minimum, and only then author the cues. Video captions takes cues with text, start and end and burns them without speech-to-text, so the number on screen is exactly the string you computed.

The script below does the calculation offline and prints the request body. Send it to POST /v1/video-captions with your video_url and an Idempotency-Key. A caption job is $0.20 for a clip up to 60 seconds.

import json
from datetime import date, timedelta

history = [(date(2026, 10, 1), 79.0), (date(2026, 10, 20), 69.0), (date(2026, 11, 5), 79.0)]
sale_start, sale_price = date(2026, 11, 27), 59.0

def price_on(day):
    return [p for d, p in history if d <= day][-1]

window = [price_on(sale_start - timedelta(days=n)) for n in range(1, 31)]
prior = min(window)
pct = round((prior - sale_price) / prior * 100)
cues = [
    {"text": f"Was EUR {prior:.2f} (lowest in last 30 days)", "start": 0.5, "end": 3.0},
    {"text": f"Now EUR {sale_price:.2f}  -{pct}%", "start": 3.0, "end": 6.0},
]
print(json.dumps({"video_url": "https://example.com/clip.mp4", "cues": cues}, indent=1))

Why the percentage is easy to get wrong

In the sample history the list price is 79.00, but the item was 69.00 from 20 October to 4 November. The 30 days before a 27 November sale start at 28 October, so the 69.00 is inside the window and the prior price is 69.00, which makes 59.00 a 14% cut, not the 25% you would claim from 79.00. Window edges are the common bug, so test day 30 (in) and day 31 (out) against your own history.

Limits

Directive text is not the national law. Some markets handle perishable goods, new products and progressive reductions differently, as the directive itself allows. The card also is not the only place a claim appears: the same prior-price rule applies to the product page and any other announcement. If your price history is incomplete, do not show a percentage at all and use a plain "Now EUR 59" card instead.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume