Percentage badges, strikethrough prices and countdown promotions are standard equipment in every online shop. Since the Court of Justice of the European Union ruled on 26 September 2024 in case C-330/23, one thing is clear: an advertised price advantage must be calculated against the lowest price of the last 30 days – printing that lowest price as fine print next to the offer is not enough (CJEU, C-330/23). The Düsseldorf Higher Regional Court went further in December 2025 and prohibited discount leaflets based on recommended retail prices (OLG Düsseldorf, I-20 U 43/25). In an EU-wide check of 314 online traders, 30 percent referenced their discounts to the wrong previous price (European Commission). This guide explains Section 11 of the German Price Indication Ordinance (PAngV), the CJEU requirements and the special cases – and shows how to couple price history, lowest-price calculation and badge rendering so that discounts stay lawful and still create urgency.

Section 11 PAngV: the 30-day lowest price as a duty

The core fits into a single sentence. Under Section 11 (1) PAngV, anyone obliged to state a total price must, when announcing a price reduction for goods to consumers, state the lowest total price applied to consumers within the last 30 days before the price reduction was applied (Gesetze im Internet). Three details decide whether an implementation holds up: it is about the total price including VAT, about the trader's own previously applied price – not a competitor's price or a manufacturer's recommendation – and about a window that ends when the promotion starts, not today.

This is not a German peculiarity. The rule transposes Article 6a of the Price Indication Directive 98/6/EC, which was inserted by Directive (EU) 2019/2161, known as the Omnibus or Modernisation Directive (EUR-Lex). Member States had to transpose it by 28 November 2021, and it has applied since 28 May 2022 (EUR-Lex). The stated purpose: traders should not be able to inflate reference prices artificially or mislead consumers about the extent of a reduction (EUR-Lex).

  • Subsection 1: every announced price reduction requires the lowest total price of the last 30 days (Gesetze im Internet)
  • Subsection 2: for progressive reductions increasing without interruption, the price before the sequence began may be stated throughout (Gesetze im Internet)
  • Subsection 3: the rules apply accordingly to traders who only have to state the unit price (Gesetze im Internet)
  • Subsection 4: individual price reductions and labelled reductions for perishable goods facing imminent spoilage are exempt (Gesetze im Internet)
The cut-off is the start of the promotion

A common implementation error is a rolling window counting back from today. The wording requires the lowest total price within the last 30 days before the price reduction was applied (Gesetze im Internet). During a running promotion the reference price therefore stays frozen – it must not shift along just because the promotional price itself has meanwhile become the lowest of the last 30 days.

CJEU C-330/23: a reference point, not a footnote

The consumer association Verbraucherzentrale Baden-Württemberg challenged a food discounter's leaflet advertising; the Düsseldorf Regional Court referred the question of interpretation to the CJEU (CJEU, C-330/23). Each price tile showed two figures: a large promotional price and a small strikethrough price. The lowest price of the last 30 days was in fact stated – but only as basic information in the fine print, not as the basis of the advertised saving (CJEU, C-330/23).

ItemAdvertisedStrike price30-day lowActual advantage
Pineapple1.49 EUR (price highlight)1.69 EUR1.39 EURnone – promo price is higher
Bananas1.29 EUR (-23%)1.69 EUR1.29 EURnone – price unchanged

The arithmetic exposes the pattern. The pineapple was advertised as a price highlight at 1.49 EUR next to a struck-through 1.69 EUR, although it had already been available for 1.39 EUR during the preceding 30 days (CJEU, C-330/23). The reduced price was therefore above the reference price. For bananas, a 23 percent discount was claimed on 1.29 EUR – exactly the price that had already been the lowest in the preceding 30 days (CJEU, C-330/23). Mathematically, there was no advantage at all.

The Court held that a price reduction advertised as a percentage or with a promotional statement such as price highlight must be calculated on the basis of the lowest price of the last 30 days (CJEU, C-330/23). Merely naming that price elsewhere in the advertisement does not cure a wrong reference. Article 6a of Directive 98/6/EC is therefore no longer a pure information duty but a calculation rule – and that is precisely what changes the requirements for shop technology.

An advertised price advantage is only accurate if it is calculated against the lowest price of the last 30 days. If the lowest price merely sits next to the claim, the mandatory disclosure turns into an excuse.

Core statement of the CJEU judgment of 26 September 2024, C-330/23, summarised
The practical consequence

If the promotional price is not below the 30-day low, no percentage badge and no strikethrough price may appear at all. That is not a copy question for marketing but a condition in rendering – the shop must be able to omit the badge.

Düsseldorf and Cologne: the fight over the RRP

On 18 December 2025 the 20th Civil Senate of the Düsseldorf Higher Regional Court prohibited leaflet advertising by a food discounter that promoted up to -48 percent under the headline Your brands even cheaper and calculated the percentages against struck-through recommended retail prices (OLG Düsseldorf, I-20 U 43/25). The senate looked at the overall impression: given the design of the price tiles, the strike prices and the graphically emphasised percentages, the averagely informed consumer would assume the discount related to the lowest total price of the last 30 days – the RRP note receded graphically into the background (OLG Düsseldorf, I-20 U 43/25). An appeal to the Federal Court of Justice was permitted because of the case's fundamental importance (OLG Düsseldorf, I-20 U 43/25).

That the outcome is not identical in every constellation is shown by the Cologne Higher Regional Court in its judgment of 15 May 2026: for clearly labelled RRP advertising without a suggestive headline, the senate denied that there was any announcement of a price reduction within the meaning of Section 11 PAngV – it was merely a price comparison with a manufacturer's recommendation (OLG Köln, 6 U 92/25). The difference lay in the design: the RRP indication was clearly recognisable in the same signal colour and position (OLG Köln, 6 U 92/25).

RRP advertising remains a design risk

Both decisions revolve around the same question – whether the consumer recognises the reference point. Until the Federal Court of Justice has ruled, the rule of thumb is: the larger the percentage, the more prominent the strike price and the more stimulating the headline, the more likely the advertising is understood as a reduction of the trader's own previous price – and then Section 11 PAngV applies. Anyone using RRP comparisons should label them with equal visual weight and not let the percentage dominate. This article does not replace legal advice.

Technically, this implies a separation that many catalogues do not model: RRP and own previous price are two different fields with two different legal consequences. If both are dumped into the same strike price attribute, the template can no longer answer the question. Our article on pricing rules and promotions in the Shopware Rule Builder shows how to model price fields and promotion logic cleanly.

Special cases: introductory prices, personalised prices, staged offers

The Commission has published dedicated interpretation guidance on Article 6a (European Commission). It answers exactly the cases where most shop implementations fail – because they do not follow from the statutory text alone.

Introductory prices

If a product is first offered at an introductory price and reduced afterwards, the reference price remains the lowest price of the last 30 days – that is, the introductory price itself (European Commission). A cheap launch burns the later discount story.

Personalised prices

Individual price reductions are exempt from Section 11 PAngV (Gesetze im Internet). The Unfair Commercial Practices Directive still applies, including to personalised prices (European Commission). Declaring as individual what everyone actually receives forfeits the exemption.

Progressive reductions

For reductions increasing without interruption – a promotion week with a daily growing discount, for example – the price before the sequence started may be stated throughout (Gesetze im Internet). Any interruption resets the logic.

Perishable goods

Price cuts due to imminent spoilage are exempt if labelled as such (Gesetze im Internet). The exemption covers clearance shortly before expiry, not permanent discounting of a fresh-produce category.

An often overlooked point: because the Price Indication Directive only covers price reductions as defined in it, the Unfair Commercial Practices Directive remains fully applicable to everything else – comparisons with other prices, combined or conditional offers and loyalty programmes (European Commission). The exemption in Section 11 PAngV is therefore not a free pass, only a change of legal basis. The same shift appears in other consumer protection topics, for instance in the mandatory disclosures under the GPSR product safety regulation.

Discount codes, countdowns and 20 percent off everything

This is where the EU-wide sweep found the second major source of error. Of 314 online traders checked across 23 EU countries plus Iceland and Norway, 34 percent used price comparisons – but 60 percent of those did not explain where the reference price came from (European Commission). 18 percent used urgency claims or countdown timers, and more than half of those cases were misleading (European Commission).

  • General announcements such as 20% off everything must hold for every affected item – the lowest price differs per product and per sales channel
  • Discount codes handed to every visitor are effectively a general reduction, not an individual one under subsection 4 (Gesetze im Internet)
  • Countdown timers that restart after expiry are an urgency claim without substance – rated misleading in more than half of the checked cases (European Commission)
  • Permanent discounts: almost 50 percent of the checked discounts ran so long that the regular price lost its meaning (Wettbewerbszentrale)
  • Channel separation: a lowest price from a marketplace listing is not automatically the lowest price of your own shop – reference prices belong per sales channel
Why permanent discounts hurt twice

If a discount runs longer than 30 days, the promotional price itself becomes the new lowest price. The next promotion then has to be calculated against that lower value – the advertisable percentage shrinks with every extension. Whoever discounts permanently loses the ability to discount. Economically it is a quiet surrender of margin, as our article on AI-driven dynamic pricing also shows.

Storing price history: the data foundation

Lawful discounts start in the data model, not in the template. At any point in time the shop must be able to answer which total price it actually displayed to a consumer for a given product, in a given sales channel and a given currency. From our project experience, this is exactly where the gap sits: many catalogues only know the current price and overwrite it on every change (project experience) – the history then exists at best in log files nobody can query.

The workable approach is a narrow, immutable event table that records every price change as an interval. It is only appended to and not modified afterwards – which keeps it usable as evidence if a warning letter arrives. The technical implementation is manageable; the value comes from the discipline of making every price source write into it.

price_history_schema.sql
CREATE TABLE product_price_history (
    id BINARY(16) NOT NULL PRIMARY KEY,
    product_id BINARY(16) NOT NULL,
    sales_channel_id BINARY(16) NULL,
    currency_id BINARY(16) NOT NULL,
    gross_price DECIMAL(10,2) NOT NULL,
    valid_from DATETIME(3) NOT NULL,
    valid_to DATETIME(3) NULL,
    origin VARCHAR(32) NOT NULL,
    KEY idx_window (product_id, sales_channel_id, currency_id, valid_from)
);
  • Store the total price, not the net price – Section 11 PAngV speaks of the total price (Gesetze im Internet)
  • Separate per sales channel and currency, because the same item can be priced differently
  • Document the origin (manual, import run, price rule, promotion) for later traceability
  • Intervals instead of snapshots: valid_from and valid_to answer which price applied on day X without interpolation
  • Retention well beyond 30 days – a complaint rarely reaches you the next day
  • Price rules and automations must write into the same history, otherwise blind spots appear
The history is your evidence

In a dispute, what counts is whether you can prove the reference price for a specific day. An append-only table with time intervals is suitable for that – a value reconstructed after the fact from a data warehouse usually is not.

Calculating the lowest price and rendering badges from data

On this foundation the claim becomes computable. Instead of maintaining a strike price by hand, a resolver derives the entire price claim from the history: reference price, percentage and – the most important case – the decision that there is no reduction to advertise at all.

PriceClaimResolver.php
<?php

final class PriceClaimResolver
{
    public function resolve(
        string $productId,
        float $currentGross,
        \DateTimeImmutable $reductionStartsAt
    ): PriceClaim {
        // The window ends when the promotion starts, not "now"
        $lowest = $this->history->lowestGrossPrice(
            productId: $productId,
            from: $reductionStartsAt->modify('-30 days'),
            to: $reductionStartsAt
        );

        // No known previous price or no real advantage: no badge
        if ($lowest === null || $currentGross >= $lowest) {
            return PriceClaim::plain($currentGross);
        }

        $percent = (int) floor((1 - $currentGross / $lowest) * 100);

        return new PriceClaim(
            current: $currentGross,
            reference: $lowest,
            percent: $percent,
            referenceLabel: 'Lowest total price of the last 30 days'
        );
    }
}

Two places carry the case law. The window ends at $reductionStartsAt, not at now – matching the wording of Section 11 (1) PAngV (Gesetze im Internet). And the condition $currentGross >= $lowest models the pineapple case: if the promotional price is not below the lowest price, there is no advantage to advertise (CJEU, C-330/23). The template only queries the result and no longer makes decisions itself.

price-claim.html.twig
{% set claim = product.priceClaim %}

{% if claim.hasReduction %}
    <p class="price-reference">
        {{ claim.referenceLabel }}:
        <s>{{ claim.reference|currency }}</s>
    </p>
    <p class="price-current">{{ claim.current|currency }}</p>
    <span class="price-badge">-{{ claim.percent }}%</span>
{% else %}
    <p class="price-current">{{ claim.current|currency }}</p>
{% endif %}
One calculation path for all channels

The resolver belongs in a domain layer used equally by the shop front end, feed export, newsletter and marketplace integration. Otherwise every channel computes its own percentage – and the deviation surfaces exactly where it is most expensive. Our Shopware development team supports the implementation in your shop.

One side effect is welcome: because the price claim is now a structured object, it can be handed consistently to structured data, filters and sorting. Anyone working on conversion rate benchmarks or on A/B testing in the shop gains a reliable basis for discount filters along the way – because reduced items only is only as reliable as the definition behind it.

Creating urgency without deceiving

Discounts remain a revenue driver: for Black Friday and Cyber Monday 2025, German retail expected 5.8 billion euros in turnover (Handelsverband Deutschland). At the same time the figure fell for the first time since 2016 – just under 2 percent below the previous year (Handelsverband Deutschland). Online retail with goods, by contrast, grew 3.2 percent to 83.1 billion euros in 2025 (bevh). Promotional days no longer carry themselves; the credibility of the price promise gains weight.

This matches what makes users abandon. The average cart abandonment rate is around 70 percent (Baymard Institute), and 48 percent of abandonments are caused by unexpected extra costs (Baymard Institute). Price opacity is therefore not a compliance side issue but the most expensive conversion killer in the checkout – better checkout guidance can lift conversion by up to 35 percent (Baymard Institute).

Real scarcity beats countdowns

A genuinely limited promotional stock or an actual end date works without deceiving. Timers that restart after expiry were rated misleading in more than half of the checked cases (European Commission).

Show the lowest price openly

The mandatory disclosure reads as a trust signal: stating the 30-day lowest price prominently proves the advantage instead of claiming it – in line with established trust signals in the shop.

Rarer, but clearer

Fewer and shorter promotions keep the regular price intact as a reference. Almost 50 percent of the checked discounts ran so long that the regular price lost its meaning (Wettbewerbszentrale).

The design question can therefore be answered soberly: urgency may come from real facts – end date, remaining stock, price difference – not from invented ones. Where the line between lawful scarcity and manipulative patterns runs is explored in our article on dark patterns and a fair checkout. And how prices are perceived without any statement becoming inaccurate is covered in the article on pricing psychology and price presentation.

A discount that cannot be calculated is not a discount but a claim. The difference is decided in the data model, not in the layout.

XICTRON development team

Checklist: lawful discount advertising in the shop

  • Price history per product, sales channel and currency kept as an immutable interval table
  • Reference price = lowest total price of the 30 days before the promotion starts, not rolling from today (Gesetze im Internet)
  • Percentage computed from the reference price, not from a manually maintained strike price (CJEU, C-330/23)
  • No badge if the promotional price is not below the lowest price – the template must provide for this case
  • RRP and own previous price as separate fields, RRP comparisons labelled with equal visual weight (OLG Düsseldorf, I-20 U 43/25)
  • Introductory prices taken into account as a reference (European Commission)
  • Discount codes open to all visitors treated as a general reduction, not an individual one (Gesetze im Internet)
  • Countdowns and scarcity tied to real end dates and stock levels
  • Promotion duration limited so the regular price stays a reference (Wettbewerbszentrale)
  • One calculation path for shop, feeds, newsletter and marketplaces
  • Provability: the reference price is queryable for any past day
Sources and studies

This article draws on the judgment of the Court of Justice of the European Union of 26 September 2024 in case C-330/23 (Verbraucherzentrale Baden-Württemberg v Aldi Süd), the wording of Section 11 of the German Price Indication Ordinance (Gesetze im Internet), Directive (EU) 2019/2161 and Article 6a of Directive 98/6/EC together with the European Commission's interpretation guidance (EUR-Lex, 2021/C 526/02), the judgment of the Düsseldorf Higher Regional Court of 18 December 2025 (I-20 U 43/25) and the judgment of the Cologne Higher Regional Court of 15 May 2026 (6 U 92/25), the results of the European Commission's CPC sweep of 26 March 2026 covering 314 online traders, the Wettbewerbszentrale's assessment of that investigation, the promotional-days forecast of the German Retail Federation (HDE) for 2025, the bevh annual figures on interactive commerce 2025 and research by the Baymard Institute on cart abandonment. Our own experience from shop projects is also reflected (project experience). Figures quoted may change over time. This article does not replace legal advice. Last updated: July 2026.

As a rule, yes. Section 11 (1) PAngV requires the lowest total price of the last 30 days for every announcement of a price reduction for goods (Gesetze im Internet). Individual price reductions and labelled price cuts due to imminent spoilage are typically exempt (Gesetze im Internet). When in doubt, have the individual case reviewed by a lawyer.

Following the CJEU judgment in C-330/23, usually not. The Court held that an advantage advertised as a percentage or promotional statement must be calculated on the basis of the lowest price of the last 30 days – merely naming that price as basic information does not suffice (CJEU, C-330/23). The lowest price is the reference, not a footnote.

Experience suggests this depends heavily on the design. The Düsseldorf Higher Regional Court prohibited RRP-based percentage discounts because the note receded graphically and consumers assumed a reference to the trader's own previous price (OLG Düsseldorf, I-20 U 43/25). The Cologne Higher Regional Court, by contrast, treated clearly labelled RRP advertising as a permissible price comparison (OLG Köln, 6 U 92/25). An appeal to the Federal Court of Justice has been allowed; until it is clarified, restraint with dominant percentages is advisable.

The promotional price then typically becomes the lowest price of the last 30 days itself and thus the new reference. The next reduction is calculated against that value and the advertisable percentage falls accordingly. Almost 50 percent of the discounts examined in an EU-wide investigation ran so long that the regular price lost its meaning (Wettbewerbszentrale).

In our experience yes, as soon as the code or promotion is open to all consumers – then there is no individual price reduction within the meaning of Section 11 (4) PAngV (Gesetze im Internet). In practice this means the claim has to hold for every affected item against that item's own 30-day lowest price. For practices outside the definition of a price reduction, unfair commercial practices law remains applicable (European Commission).

The effort depends on the starting point. If a price history already exists, work is usually limited to lowest-price calculation, template adjustments and channel alignment. If the history is missing, building the data layer is added, and it typically only produces reliable values from its start date onwards – so an early start pays off (project experience). An individual assessment is usually possible within a few days.

Discounts that follow the data model

Case law has turned the strikethrough price from a design element into a calculated statement. The CJEU demands the correct reference point (CJEU, C-330/23), the Düsseldorf Higher Regional Court measures the overall impression (OLG Düsseldorf, I-20 U 43/25), and the EU-wide check shows that 30 percent of traders miss that reference (European Commission). Anyone running price history, lowest-price calculation and badge rendering as decoupled parts will not close this gap through more careful maintenance – the gap is structural. Conversely, a clean price object produces both at once: a defensible legal position and a price promise customers can believe. If you would like to put your discount logic on that foundation, talk to our team for e-commerce development – or use the contact form directly.