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.
- 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.
- It applies to any announced reduction: a compare-at price, a “-20%” badge, a sale collection, an automatic discount shown on the page.
- 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
- Under a discounted price: Lowest price in the last 30 days: 59,00 €, in the shopper’s language and the store’s money format.
- When the history is younger than 30 days (a new product, a new store): either nothing, or an honest Lowest price since 12 October: 59,00 €. Never a number invented from the compare-at.
- On a product that is not reduced: nothing. The line is for reductions.
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.
Read next
- A bulk edit, an import or an app changed your Shopify prices: how to undo it, and why there is no Undo button
- Low stock alerts on Shopify: why one threshold is wrong for every product, and what to reorder instead
- Shopify order notifications in Telegram: what to send to a chat, what to keep in e-mail, and how to set it up in a minute
- An estimated delivery date on Shopify that is true: cut-off, processing, transit, days off
- Add to Cart stopped working on Shopify: why every page still says 200 OK, and how to catch it in minutes
- A 90% discount instead of 9%: the Shopify price mistakes that cost the most, and how to catch them before the orders do
- How to track competitor prices on Shopify without a spreadsheet