Install

Article · 7 min read

The 30-day prior price on Shopify: what the Omnibus rule actually needs, and why compare-at price is not it

22 October 2026 · by njX

If you sell to shoppers in the EU and you ever show a discount, the page has to say what the product cost before. Not the price you crossed out: the lowest price you charged in the 30 days before the reduction. Here is what the rule asks for, why a Shopify store cannot answer it from its own fields, what you must be able to show when asked, and the two other EU rules that land on the same product page.

What the rule says

The Omnibus Directive (2019/2161) added one article to the EU price indication rules: when a price is reduced, the seller must show the prior price, defined as the lowest price applied in a period of at least 30 days before the reduction. Every member state has written it into national law, some with their own details: Germany and Poland enforce it actively, France and the Netherlands have fined on it, and most countries let the prior price be shown as a plain line under the new one.

Three things follow that catch stores out.

  1. It is about history, not about the crossed-out number. If the product was 59 for the last month and you set it to 79 crossed-out, 49 now, the prior price is 59.
  2. It applies to any announced reduction: a compare-at price, a “-20%” badge, a sale collection, an automatic discount shown on the page.
  3. You must be able to prove it. A consumer authority asks for the price history of the product; “we set compare-at to the old price” is not a record.

Why compare-at price is not it

Shopify’s compare-at price is one number per variant: whatever you typed, with no date and no history. It cannot know what the price was 30 days ago, it is overwritten by every edit, and a bulk editor, a feed or another app changes it without a trace. It is a display field. The Omnibus rule needs a ledger.

So the honest way to show a prior price is to record every price change as it happens and compute the lowest of the 30 days before the reduction from that record. The number on the page comes from the record, never from a field someone could type into.

What the page should show

Keep the record exportable. A CSV of every variant with its prior price and the reduction it belongs to is what an inquiry asks for.

Two more EU rules on the same page

The withdrawal button. Directive 2023/2673 adds a “withdrawal function” to distance contracts: from 19 June 2026 an online shop must offer a clearly labelled button or link, Withdraw from contract here, that leads to a form where the consumer gives their name, order and what they return, and receives a confirmation with the date and time. A line in the terms is no longer enough.

GPSR safety information. The General Product Safety Regulation (2023/988), in force since 13 December 2024, requires every product page to name the manufacturer with a postal address and an e-mail, a responsible person in the EU when the manufacturer is outside it, and the warnings and the model where they exist. For a store with a few hundred products that is a manufacturer per vendor and a block on the page, not a paragraph in each description.

Doing it from one app

njX EU Omnibus, Withdrawal & GPSR keeps the price ledger from the day it is installed and draws the prior-price line under every discounted price from that ledger, in 24 EU languages, with an honest “lowest since” while the history is young. The withdrawal link, the request page in your theme and the acknowledgement e-mail are the second block; the manufacturer, the responsible person and the warnings are the third, assigned per product, vendor or collection. Nothing is typed by hand into a price field, and the CSV is one click.