Omnibus sale-price check

EU Price Indication 30-Day Lowest Price Audit

EU price indication rules require the announced prior price to be the lowest of the last 30 days — not just your compare-at price. Audit a price history CSV per variant before the sale goes live.

Local browser scanSafe fixes onlyShopify-focused checks

Browser-side scan

Drop a price history CSV

-

No CSV selected

No CSV selectedUpload a price history CSV with SKU, date, price, and compare-at price to calculate each variant's 30-day low.
Private by default. Your price history CSV data stays in this browser session. The export applies only safe deterministic changes and leaves manual-review items in the findings list.

Shopify's compare-at price keeps no history, so a flash sale or Black Friday banner can silently violate the EU Price Indication Directive when the advertised prior price was undercut sometime in the last 30 days. This audit reads a sanitized price history CSV — SKU, date, price, optional compare-at price and campaign label — in your browser, groups rows per variant, takes the latest dated row as the current state, calculates the lowest price observed in the 30 days up to that date, and flags every variant whose reference price sits above that 30-day low. It exports a per-variant worksheet for pricing review. It provides calculations, not legal advice, and never writes prices back to Shopify.

Import blockers

Common causes this scan checks

  • Compare-at prices only store the current value, so the 30-day price history lives outside Shopify.
  • A sale banner advertises a prior price higher than something charged within the last 30 days.
  • Flash sales and Black Friday campaigns need per-variant reference prices checked in bulk.
  • Pricing teams keep history in spreadsheets and need a repeatable audit before each campaign.

Workflow

How to use the cleaned CSV

  1. Prepare a price history CSV with SKU, date, price, and optional compare-at price and campaign columns.
  2. Upload it and review each variant's calculated 30-day low against the current reference price.
  3. Export the audit worksheet and correct reference prices that exceed the 30-day low.
  4. Update your theme, metafields, or pricing app with the compliant reference before launching the sale.

Auto-fix policy

What the export can safely change

  • Detects SKU, date, price, compare-at/reference price, and campaign columns from a history CSV.
  • Groups history per variant and calculates the lowest price in the 30 days up to the latest row.
  • Flags reference prices above the 30-day low and unparseable date rows.
  • Exports a per-variant review worksheet in the browser without touching Shopify prices.

CSV example

CSV example: EU 30-day lowest price audit worksheet

The audit finds the 15.00 price charged on June 20, so the Summer-sale reference of 25.00 breaks the 30-day-low rule and the worksheet says exactly which value to fix.

Before
Variant SKU,Date,Price,Compare At Price,Campaign
MUG-1,2026-06-20,15.00,,
MUG-1,2026-06-28,18.00,25.00,Summer sale
After
SKU,History rows,Window end,30-day low,Latest price,Reference price,Review note
MUG-1,2,2026-06-28,15,18,25,Reference price must match the 30-day low (15)

FAQ

Shopify CSV questions

Is this legal compliance advice?

No. It is a calculation aid for the 30-day-low rule of the EU Price Indication Directive. Confirm the exact requirements for your market with your legal adviser.

Where does the price history come from?

From your own records: pricing spreadsheets, app exports, or scheduled Shopify exports you keep. Shopify's compare-at field alone cannot reconstruct history.

How is the 30-day window anchored?

At each variant's latest dated row in the file. The audit takes the lowest price dated within the 30 days before that row, so results are deterministic from your CSV.

Is my pricing data uploaded anywhere?

No. The CSV is read locally in your browser with the File API and nothing is stored or transmitted.

Related tools

Feedback

How is this tool working for you?

Found a bug, a false alarm, or a missing check? Tell me — a human reads every note.