Why Aren't My Shopify Discounts Showing on the Product Page?

You set up the discount. You double checked the percentage. You hit save, popped open the storefront in a new tab, and... nothing. Same price as before. No strikethrough, no badge, no sign that anything changed at all.

If you're in that exact moment right now, the first thing worth knowing is that you almost certainly didn't break anything. This is one of the most common points of confusion in Shopify, and it trips up store owners who've been running their shop for years, not just people setting up their first sale. The reason isn't usually a bug. It's that Shopify treats "having a discount" and "showing a discount" as two completely separate jobs, and most people only find that out the hard way.

Let's go through why that happens, then how to actually fix it for your store.

Discounts and prices are two different systems

Here's the part that catches almost everyone off guard: when you create a discount through Shopify's Discounts section, whether it's an automatic discount or a code, you're not editing the product's price. You're creating a rule that gets calculated later, usually at the cart or checkout step, when Shopify works out the final total.

That's a deliberate design choice, not an oversight. Discount codes obviously can't show up early, since Shopify has no way of knowing which code a browsing customer might type in later. But automatic discounts trip people up more, because they feel like they should just work. You set "20% off all hoodies," you assume the hoodie page will now show 20% off, and instead the price sits there completely unchanged until the customer adds it to their cart.

Picture a $50 hoodie with that 20% off automatic discount turned on. A customer opens the product page and sees $50, exactly as before. They add it to the cart, and the line item drops to $40. Nothing on the way there told them a discount existed at all, they only find out once the math has already happened behind the scenes. That's not broken, that's the discount engine doing exactly what it was built to do, just not the job most people assume it's doing.

The product page price and the discount engine simply aren't talking to each other by default. One displays what's stored on the product. The other calculates a total at checkout. Nothing connects them automatically unless something is specifically built to do that.

The "Compare at price" field is the actual mechanism

If discounts don't update the displayed price, what does? A separate field called Compare at price.

Every product variant in Shopify has two price fields: the regular price, and an optional compare at price. When the compare at price is higher than the regular price, your theme draws a strikethrough through the old number and shows the new one next to it, the classic "$50 → $40" look. This is what most people actually picture when they imagine a discount showing on the product page.

The catch is that creating a discount in the Discounts section does not fill in this field for you. They're unrelated settings that happen to produce a similar visual outcome when both are set up correctly. If you want that markdown look on a product page, you either set the compare at price manually on every variant, or you use something that does it for you automatically.

This is also why two stores can run what looks like an identical 30% off sale and have completely different storefront results. One has the compare at price set and shows the strikethrough everywhere. The other only has the automatic discount turned on, and the price looks untouched until checkout.

Your theme has a say in this too

Even once the compare at price is set correctly, what happens next depends on your theme's code. Most modern themes check for a compare at price and render it automatically on the product page, and a lot of them do the same on collection pages. But "most" isn't "all," and the logic isn't always consistent across every page type in the same theme.

It's common to see a theme that handles this perfectly on the product page but completely ignores it on collection grids, or vice versa. Heavily customized themes, older themes, and themes that were built before a recent redesign are the most frequent offenders. If you've set the compare at price and you're still not seeing anything, the theme's product template is the next place to look, specifically whether it has logic checking for a compare_at_price value at all.

This is also where third-party apps sometimes step on each other. If you've got more than one discount or pricing app installed, it's worth checking whether one of them is quietly overriding what another is trying to display.

If you want to fix it in the theme code yourself

For the technically inclined, this is a Liquid problem at its core. Most product templates have a line that looks roughly like this:

{{ product.price | money }}
{% if product.compare_at_price > product.price %}
  <del>{{ product.compare_at_price | money }}</del>
{% endif %}

That's the logic deciding whether to draw the strikethrough at all. If your theme is missing this check entirely, or it's only present on one template and not another, that's your answer right there, and adding it is usually a small, contained edit.

The harder version of this is trying to make an automatic discount drive that same display without ever touching the compare at price field. That means writing logic that calculates the discounted price live, on every page where you want it shown, and keeping that logic in sync with whatever rules exist in your Discounts admin. It's doable, but it's real ongoing maintenance, not a one time fix, especially once you're running more than one promotion or the discount rules change from month to month. This is usually the point where a developer either builds something custom or reaches for an app instead.

Other reasons your discount might be invisible

Once you've ruled out the big one above, a handful of smaller issues account for most of the rest:

Timing and scheduling. Discounts can be scheduled to start and end at specific times, and timezone mismatches between your store settings and your own clock are an easy way to think something is live when it technically isn't yet.

Scope. A discount can be limited to specific products, specific collections, or specific customer segments. If you're checking a product that wasn't included, or you're not logged in as the customer type the discount applies to, you won't see it, and that's working exactly as configured.

Minimum requirements. Some discounts only kick in above a certain order value. Looking at a single product page in isolation will never trigger a discount that depends on cart totals, since that condition can't be evaluated until there's an actual cart.

Combination settings. Shopify lets you control whether discounts can stack with each other through a "Combinations" setting on each discount. If a higher priority discount is set to not combine with others, it can silently override the one you're expecting to see.

Markets and currency. If you sell in multiple markets or currencies, a discount created in one context doesn't automatically apply everywhere. It's worth checking the storefront in the specific market you're testing.

Usage limits. Discounts can have a total redemption cap. Once that's hit, the discount stops applying even though it still looks "active" in the admin if you don't check the usage count specifically.

B2B and wholesale catalogs. Some discounts are scoped to specific company accounts or B2B price lists. They'll never show up for a regular logged out visitor, by design, no matter how active they are.

Caching. Rare, but real. Browser cache, a CDN, or even your own habit of checking the same tab you had open before the change can show you a stale version of the page. A hard refresh or an incognito window rules this out in ten seconds.

A quick way to actually diagnose it

Rather than guessing, work through this in order:

  1. Open the discount in your Shopify admin. Confirm it's active right now, not scheduled for later or already ended.
  2. Check whether it's an automatic discount or a code. Codes are expected to be invisible until entered, that's not a bug.
  3. Open the specific product you're testing and check its compare at price field. Is it actually set, and is it higher than the current price?
  4. If the compare at price is set correctly and it's still not showing, the issue is almost certainly in your theme's code, and it's worth a quick test on a duplicate theme to confirm before changing anything live.
  5. Test in an incognito window to remove caching as a variable.

Most cases resolve somewhere in steps one through three.

Where the manual fix breaks down

Once you know the compare at price field is what actually drives the visual, the obvious move is to just set it yourself on every product whenever you run a sale. That works, for a small catalog and a short sale.

It gets messy fast at any real scale. You have to remember to set it before the sale starts, remember to revert it the moment the sale ends, and do that across every product the discount touches. Forget the second part and you end up with a "sale" that quietly never expires, sitting there until a customer or a sharp eyed coworker points it out. Run a few overlapping promotions a year and the bookkeeping alone becomes its own small job.

That gap, between having a discount and reliably showing it without babysitting a spreadsheet of price fields, is exactly the problem I built Show Discount to close. It watches your actual Shopify discounts and shows a badge next to the price automatically the moment one goes live, then takes it down the moment it ends. No manual price editing, nothing to remember to undo. If you've read this far because you're staring down exactly this problem, it's worth a look, the free plan covers unlimited product page badges and there's no card required to try it.

A few quick answers

Will setting the compare at price myself work without any app? Yes, for product pages on most modern themes. It just doesn't scale well or sync itself when the sale ends, which is the part most stores eventually want solved.

Why does my discount show in the cart but not on the product page? That's the expected behavior for automatic discounts and codes. The cart and checkout calculate the final total directly. The product page only shows what's stored in its price fields, which a discount rule doesn't touch.

Could a different app be interfering? Yes, especially if you're running more than one pricing, bundling, or discount app at once. If your compare at price is set correctly and it's still not showing, try disabling other pricing related apps one at a time to isolate the conflict.

It shows on the product page but not on collection pages, what's going on? That's a theme issue, not a discount issue. Plenty of themes check for compare at price on the product template but skip that same check on collection grids. The fix lives in the theme's collection template code, not in your discount settings.

If none of this fixes it after working through the checklist, the remaining cases are usually theme specific, and at that point it's worth pulling in a developer who can read the actual product template rather than guessing further from the admin side.

Subscribe to our newsletter

Be the first to know the latest