Shopify compare-at price not showing? Check the variants
What the compare-at price is
The compare-at price is the original price, which your store can display beside the lower price a customer actually pays. Shopify's help page puts it in one line:
"To set a sale price, set the value of the Compare-at price field in your Shopify admin to the original price of the product."
The customer never pays it. Shopify says "only the sale price is displayed at checkout." And it only shows as a sale when it is higher than the price.
If yours is not showing, the rest of this page is for you.
Two different problems wear the same clothes
"My compare-at price isn't showing" is really two complaints, and they have different causes.
Nothing appears anywhere. No struck-through price on the product page, none on the collection page.
It appears on the product page but not on the collection page. The product itself looks discounted. The grid it sits in does not.
The second is documented, specific, and the faster of the two to rule in or out. Work out which one you have first.
Check both pages, not just one
Open the product page on your live storefront. Then open a collection that contains it. Look at both.
Checking only the product page will mislead you. Shopify's page on sale pricing explains why.
"On product pages, the compare-at price displays correctly because it displays the pricing for the specific variant that's selected."
The product page can look perfect while the collection page shows no sale at all. Check one and you will conclude everything is fine.
Showing on the product page, missing on the collection page
Shopify gives the mechanism in one sentence, and it is the one to hold on to:
"When a product is displayed on a collection page, the product displays the most general information that applies to all variants."
A collection page has no variant selected. It can only say something true of the whole product, so when the variants disagree about being on sale, it says nothing at all.
The variant you are looking for may not be blank
Told that some variants have inconsistent pricing, the natural move is to open the Variants table and scan for an empty compare-at box.
That finds three of every five. The other two have a number in the box.
| What your eye sees | Products | What you do about it |
|---|---|---|
| An empty compare-at box | 18 | Type a price in, or clear the rest to match |
A box holding 0.00 where it should be empty, and no empty box on the product | 2 | Clear the field entirely; zero is not empty |
| A box holding a real price that is not above the price beside it | 10 | Raise it, or clear it |
The bottom two rows are the ones that cost an afternoon. In both, the box is filled in. One holds zero, which Shopify says is not the same as empty; the other holds a price that is equal to the one beside it, or lower, so it never reads as a discount. No amount of scanning for blanks will show you either.
Read each compare-at price against the price on its own row. Not against the other variants, and not against what you meant to charge.
In sixteen of the thirty, one or two variants were the problem, in tables running up to 58 rows. It is a single line, and it looks fine.
The other fourteen are not subtle at all. One Brooklinen duvet cover has 93 variants with a compare-at price on five of them, which is a discount that was started and abandoned rather than a row that was missed.
The fix, in Shopify's own words
The same page carries the remedy. It opens by stating the goal — "To resolve this issue, make sure all variants have consistent compare-at pricing" — and then gives five numbered steps.
Inside those steps is the sentence worth the whole visit.
"Either remove all conflicting compare-at pricing and leave them blank, or ensure all compare-at prices are higher than their respective regular prices. A compare-at price of $0.00 USD isn't the same as an empty compare-at price. Make sure to clear the field entirely for variants that shouldn't display a compare-at price."
A merchant ending a discount reaches for zero, because zero reads as nothing. In this field it does not. Zero is a value; empty is the absence of one, and only empty is what you want. Three products in our sample had a literal $0.00 sitting in some of their boxes and not others — two of seven, three of six, three of five — all on the same shop, which is what a habit looks like rather than a slip. One of the three also had an empty box, so the tables count it under empty and show 2 for zero.
Shopify's steps: go to Products, click the product, open the Variants section, review the compare-at price on every variant, then Save.
Different compare-at prices on every variant: we went and looked
Shopify lists this among its examples of inconsistency, and it is the one we ran into most often by far: 297 of the 5,444 products carried a compare-at price on every variant, at differing values, across 13 of the 18 shops.
Read the examples list literally and all 297 should be failing to show as on sale. So we opened three of those shops' collection pages and read the cards.
| Shop | Product | Variants | Distinct compare-at values | Comparison drawn on the card? |
|---|---|---|---|---|
| sleepyowl.co | Hot Brew Dark Roast | 3 | 3 | Yes — struck price and a "Sale" badge |
| thesleepcompany.in | AeroFlip Adjustable Desk | 8 | 4 | Yes — struck price and a percentage off |
| thesleepcompany.in | AeroPlus Adjustable Desk | 16 | 2 | Yes |
| thesleepcompany.in | All Weather Comforter | 8 | 2 | Yes |
| thesleepcompany.in | Bamboo Mattress Protector | 8 | 3 | Yes |
| brooklinen.com | Classic Percale Core Sheet Set | 66 | 10 | Yes — struck price and a percentage off |
| brooklinen.com | Washed Classic Percale Core Sheet Set | 47 | 4 | Yes |
| brooklinen.com | Classic Percale Pillowcase Set | 10 | 3 | Yes |
| brooklinen.com | Woven Checkerboard Duvet Cover | 3 | 2 | Yes |
The prices on those cards are deliberately not printed here. They were true on 2026-08-28 and several had already moved within a week; what does not move is whether the shop drew a comparison at all.
Every one of them showed the sale, across three themes and two currencies — including a sheet set carrying ten different compare-at values across 66 variants. The raw file has worse: one mattress carries 28 different compare-at values across 72 variants, and nine products carry more than twenty.
We also checked two products on the same pages whose variants all share one compare-at value, and those displayed too. That matters: it means these pages were drawing comparisons while we looked, so the products above were not silent because the whole grid was.
This fits Shopify's own remedy, quoted above. It asks that every compare-at price be "higher than their respective regular prices" — each variant against its own price — and all of them meet that. The examples list is broader than the fix printed on the same page, and the fix is the part that tells you what to do.
Now the limits, because they are real. These are hand observations of cards on three storefronts, not a measurement: no instrument, no sample, no rate. Shopify says outright that where a sale price displays "depends on your theme", and three themes is three themes. But it is enough for one instruction: do not re-price 66 variants before you have opened your own collection page and looked at the card.
Nothing appearing anywhere
Then it is one of the other conditions the same page sets out, in the order worth checking.
The compare-at must be higher than the price. In Shopify's words: "make sure that the value in the Compare-at price field is higher than the value in the Price field to display the sale price." Equal values show nothing, and so does a compare-at below the price.
Your theme has to draw it. Shopify is explicit: "whether sale prices display on your storefront, and where on your storefront sale prices are displayed, depends on your theme." Read that twice. "And where" means a theme can show the comparison in one place and not in another, which is the symptom this whole article is about, arriving from a different direction. If the variant fix above does not describe your product, this is the next place to look.
It adds that "sale price styling on your storefront can often be customized through your theme settings", so start there. If no such setting exists, the comparison lives in the theme's own code, which Shopify documents under editing theme code.
Market pricing can override the admin. If you use fixed prices for a market, "fixed prices will override prices and compare-at prices set in your Shopify admin." Worth checking if the badge appears in one country and not another.
What we counted
On 2026-08-28 we tried 40 well-known Shopify storefronts and could read the public catalogue of 24, paging each one to the end rather than stopping at the first 250 products. We dropped internal and test SKUs, then kept every product with more than one variant and at least one variant discounted. Eighteen shops contributed such a product to the figures below.
| State | Products |
|---|---|
| Every variant discounted, all at one compare-at value | 5,117 |
| Every variant discounted, at differing values | 297 |
| A variant with an empty compare-at box | 18 |
A 0.00 in place of an empty box, and no empty box on the product | 2 |
| A compare-at price present, but not above its own price | 10 |
| Total multi-variant products on sale | 5,444 |
Stated so you can check it. Of 5,444 multi-variant products on sale across 18 Shopify shops on 2026-08-28, 30 carried the variant pricing Shopify says stops a collection page showing a sale. Of those 30: 18 had an empty compare-at box, 2 had a literal 0.00 in place of an empty box and no empty box anywhere on the product, and 10 held a price not above the variant's own.
Thirty products in five and a half thousand is rare. It is also 9 of the 18 shops, and the per-shop number is the one that matters to you, because you own one shop rather than a slice of all of them. Half the shops we could read had at least one.
| Shop | Products with a missing or too-low compare-at price |
|---|---|
| sugarcosmetics.com | 13 of 32 |
| bluetokaicoffee.com | 5 of 53 |
| www.lucyandyak.com | 3 of 240 |
| www.taylorstitch.com | 3 of 2538 |
| www.chumbak.com | 2 of 25 |
| boldcare.in | 1 of 35 |
| www.boat-lifestyle.com | 1 of 653 |
| www.brooklinen.com | 1 of 52 |
| www.thesleepcompany.in | 1 of 71 |
One thing this table is not: a ranking of which shops are careful. The denominators run from 25 to 2,538, and four of Sugar Cosmetics' thirteen are the same lipstick listed four times.
And the fact that argues against us belongs here too. The single largest catalogue we read, tentree.com, had 1,565 multi-variant products on sale and not one in either state. A big catalogue is not the cause, and a small one is not a defence. Nine of the eighteen shops that had anything on sale had at least one of these; the other nine had none. That is about as much as thirty products can tell you.
What we did not measure
We did not open a collection page for any of the 30 products with a missing or too-low compare-at price. So we never confirmed that one of them fails to display as on sale, and we did not test what Google or any other crawler makes of these pages. The nine cards further up are all products of the other kind, where every variant is discounted at a differing value. So the case Shopify documents most clearly is the one case we counted and did not go and look at.
Sixteen of the forty shops could not be read at all — blocked, rate-limited, or with the catalogue endpoint switched off. Shops that hide their catalogue are missing from this sample entirely, and they may well be the more carefully run ones. The 24 we did read were picked by brand recognition across Indian, American and British brands, so this is not a random sample of Shopify. One further shop is measured but held out of every proportion above, because it was originally chosen for having pricing problems.
An earlier version of this article reported these figures from the first 250 products of each shop, which is all a single request returns. Eleven of the 24 shops hold more than that, and one of them took twenty-seven requests to read to the end, so those earlier numbers were floors printed as counts. Everything above comes from paging each catalogue until it stopped returning products.
Every figure was true on 2026-08-28. A shop can change its pricing tomorrow.
If you want the neighbouring question, whether a product page publishes a machine-readable record of its price at all, we measured that separately: what breaks in product schema on 23 real shops.
The raw rows
The counts are here: one entry per multi-variant product on sale. Each row carries its shop, its variant count, how many variants were discounted, how many had no compare-at price, how many had one that was not above the price, and which state it fell in.
All 30 products above, plus 40 drawn at random from the 297, were re-fetched from a second Shopify endpoint and re-classified. Every one of those 70 comparisons is here, and 70 of 70 agreed. That is a second endpoint on the same host, so it catches a stale or mis-parsed row and cannot catch an error in the catalogue itself. If you run the same count on a shop we named and get a different answer, it has changed its pricing since.