Skip to content

Why Your Shopify Discount Doesn't Show on the Product Page

Shopify applies discounts in the cart, not on product pages. Here is why, plus four ways to show the offer earlier and the two gotchas to avoid.

Conversion and AOVThe diex team12 min read

You set up a 20% automatic discount, opened your store, and the product page still shows the full price. So does the collection page. The discount only appears once something is in the cart. Nothing is broken: this is how Shopify works, and knowing why tells you exactly which of four fixes you need.

Shopify resolves discounts in the cart, not on the product page

Shopify's own documentation says it plainly. The discount codes FAQ states that "discounts are price reductions that are applied in a customer's cart and at checkout," and that to display discount savings with crossed-out prices on product and collection pages, "you need to use a third-party discount app, or hire a Shopify Partner to build a custom solution for you." The automatic discounts page repeats the mechanism: automatic discounts "are automatically applied in the cart and at checkout when eligibility conditions are met."

The reason is structural. A product's price is an attribute of the variant. A discount is a rule evaluated against a cart: it can depend on quantity, on order total, on which other products are present, on the customer, on shipping country. None of that exists on a product page, where there is no cart context and no customer decision yet. Shopify therefore does not try to guess. It waits until there is a cart to evaluate against.

That also explains why themes cannot fix it for you. Your theme renders price and compare_at_price from the product object. It has no visibility into a discount that has not been evaluated.

Before you go further, confirm the discount actually works. Add the product to the cart and check the subtotal. If it does not apply there either, you have a different problem: check the active dates, the minimum requirements, the product or collection the discount targets, and the limit on automatic discounts, where Shopify states "you can have a maximum of 25 active automatic discounts. This total includes app-based discounts." If it applies in the cart, the discount is fine and the rest of this article is about presentation.

Sale prices and discounts are two different systems

Shopify has two separate ways to show a lower price. They are easy to mix up, and the difference decides which fix you need.

Compare-at price Discount
Where it lives On the product variant On the Discounts page
Where it shows Product and collection pages, if your theme supports it Cart and checkout
Conditional on cart contents No Yes
Shown at checkout No, only the sale price Yes, as a line item
Can require a code No Yes
Reported as a discount No Yes

Shopify's sale pricing guide is explicit that these are different tools, and that with a compare-at price "both these amounts can be displayed on product pages and collection pages, but only the sale price is displayed at checkout." Discounts behave in the mirror image: invisible on the product page, itemized at checkout.

Once you see them as two systems, the decision gets simple. Pick the one that matches the shape of your offer.

Option 1: use a compare-at price when the markdown is just the price

If every customer gets the same lower price on that product, with no conditions attached, the offer is not really a discount. It is a price change. Model it that way.

In Shopify admin, open the product, click into the variant you are changing, and in the Price section click Compare at, then enter the original price in Compare-at price and the new price in Price, per Shopify's steps. Your theme handles the strikethrough and the sale badge from there. As Shopify notes on the same page, "your theme controls whether sale prices are displayed on your storefront, and where they're displayed," so check your theme settings if badges do not appear.

What you give up:

  • No usage limits, no codes, no customer targeting, no minimum purchase.
  • No discount reporting. The order records the lower price as the regular price, so there is no discount name for the Sales by discount codes report to group it under. That report "displays your sales grouped by the name of the discount, such as the automatic discount name or discount code." Which reports you can open depends on your subscription: Shopify says "the types of analytics and reports that you can view for a store depend on your Shopify subscription plan."
  • Checkout shows only the sale price, with no strikethrough, so the saving is most visible before the cart and least visible at the end.
  • You need a bona fide original price. In the US, the FTC's guide on former price comparisons says that "if the former price is the actual, bona fide price at which the article was offered to the public on a regular basis for a reasonably substantial period of time, it provides a legitimate basis for the advertising of a price comparison," while a price that "is not bona fide but fictitious," such as "an artificial, inflated price was established for the purpose of enabling the subsequent offer of a large reduction," makes the advertised bargain a false one. Rules differ elsewhere, so check your own market's pricing rules.

Best for: clearance, end of season, permanent price drops, single-product sales with no conditions.

Option 2: say it in words where the price cannot change

If the offer depends on something the shopper has not done yet, the price genuinely cannot be computed on the product page, so stop trying to change the number and change the copy instead. "Buy 3, save 15%" and "20% off orders over $100, applied at checkout" both tell the shopper what they need to know without pretending a conditional price is a fixed one.

Three places this costs you nothing:

  1. A line in the product description.
  2. A theme section or announcement bar above the fold on product pages, available in most Online Store 2.0 themes without code.
  3. The collection page description, so the offer is visible before the click.

One case does need code: showing the copy only to a customer group. Storefront Liquid exposes the shopper's customer object, including "the tags associated with the customer," so segment-only copy means wrapping a line in a tag condition inside the theme files. That is a job for a developer, not a theme setting.

Add one honest sentence about where the discount applies. Shoppers who see "15% off at checkout" and then see it happen trust the next offer more. Shoppers who see a bare price and discover a surprise saving in the cart are pleased, but only after they already decided to add to cart, which is the decision you wanted to influence.

Best for: code-based offers, order-total thresholds, customer-specific pricing, anything short-lived where editing prices is not worth the work.

Option 3: show tiers and progress with app blocks

Quantity and spend offers are the hardest case for a static price, because the right number depends on what the shopper chooses next. They are also the case where product-page messaging pays off most, since the shopper has to act to earn the discount and cannot act on information they never saw.

This is what app blocks exist for. A theme app extension adds a block to your product page through the theme editor: Online Store > Edit theme, go to the page and section you want, click Add block, then choose the app block, as described in Shopify's guide to app blocks in themes. Shopify notes that "app blocks can only be used with compatible themes," and that "app blocks might only be compatible with certain page types."

diex includes blocks of this kind: a volume pricing table on product pages that shows the quantity tiers, follows the quantity the shopper has selected and the current cart, highlights the tier reached and says how many more units to add, plus a promotion banner that can carry your text and a discount code with a copy button. These blocks need an Online Store 2.0 theme, which covers Dawn and most current themes. The discounts themselves run as Shopify Functions, so Shopify still applies them in the cart and at checkout: the blocks change what the shopper knows, not where the discount resolves. If you are building the offer itself, the walkthrough on tiered quantity discounts covers the tier structure before the display.

Best for: volume and quantity breaks, spend tiers, mix-and-match offers, anything where the shopper has to add more to qualify.

Option 4: leave it to the cart, deliberately

Sometimes the right answer is to do nothing. A free shipping threshold, a small sitewide code from an email campaign, a 5% automatic discount for tagged wholesale customers: these do not need product-page treatment, and the effort to build it would be better spent elsewhere. The shopper who entered through your email already knows about the code.

Leaving it to the cart becomes a mistake when the offer is the reason to buy, or when the shopper has to change their behavior to earn it. A quantity break nobody sees is a margin giveaway to people who would have bought two anyway.

Two gotchas worth checking before you ship

Inconsistent variant compare-at prices silently kill the collection-page sale badge

If a product has multiple variants and their compare-at prices do not match, the collection page will not mark the product as on sale, even though the product page shows the sale correctly. Shopify's sale pricing guide explains that "when a product is displayed on a collection page, the product displays the most general information that applies to all variants," so "if some variants have compare-at prices that are inconsistent (such as some variants having a compare-at price of $0.00 USD, or some being empty, or different values across variants), then the collection page won't display the product as being on sale."

The fix is to open the product's variant list and make the compare-at prices consistent across every variant: either all set, or all cleared. $0.00 counts as inconsistent, not as empty. If you put a product on sale by editing one variant at a time, check the ones you skipped.

A compare-at price plus a discount is a double discount

This is the trap in the quickest-looking fix. You set a compare-at price to make the strikethrough appear, and you leave the automatic discount running. Shopify's discount engine reduces the Price field, and your compare-at price is not a discount in Shopify's system, so nothing stops the two from stacking.

For example, say a product normally sells for $50. You set Price to $40 and Compare-at price to $50 so the product page shows "$40, was $50." Your 20% automatic discount is still active, so the cart charges $32. You intended a 20% markdown and gave 36%. On a product with a 45% gross margin, that difference is most of what was left.

Note that this is not blocked by Shopify's combination rules. Those rules are about discounts combining with each other: per the discount combinations guide, "product discounts combined with other product discounts on the same item" is Shopify Plus only. A compare-at price is not a discount, so it never counts toward that limit and never triggers a warning. If you want the wider picture of what stacks with what, we covered it in Shopify discount combinations.

Two rules keep you safe: when you set a compare-at price, exclude that product from the running discount, and whenever you change prices, add the product to a cart and check the final number before you walk away. The risk is well known to people who have tried it. In the Shopify Community thread on this exact problem, where a merchant asks how to show an automatic discount on product and collection pages, one reply to the compare-at suggestion reads: "The biggest issue with that is that the compare-at-price isn't an actual discount and often leads to double discounts." The thread ends without a working theme fix for the merchant who asked.

Choose by the kind of offer you are running

Offer Best approach
Clearance or permanent price drop Compare-at price
Flash sale on a handful of products Compare-at price, discount removed
Sitewide code from an email Leave it to the cart, mention the code in a banner
Spend threshold ("$20 off $100") Words on the page plus a cart progress indicator
Quantity break ("10% off 3+") App block on the product page
Customer-group pricing Words on the page (segment-only copy needs a theme edit)
Short promotion across many SKUs Discount plus messaging, not price edits

The dividing line: if the price is unconditional, change the price. If it is conditional, explain the condition.

What to do this week

  1. Add the affected product to a cart and confirm the discount applies there. If it does not, fix the discount first, starting with dates, minimums and targeted products. Shopify's discount codes FAQ is the reference for native discounts. If you built the discount with diex, start with our troubleshooting guide.
  2. Sort your active discounts into unconditional and conditional. Move the unconditional ones to compare-at prices and turn those discounts off.
  3. For every conditional offer, write one sentence of product-page copy that states the condition and where the discount applies.
  4. Audit variant compare-at prices on any product that should show a sale badge on collection pages. Make them consistent or clear them entirely.
  5. Pick your single highest-traffic conditional offer and give it a product-page block, then watch the add-to-cart rate for two weeks before rolling it out further.

Sources

  1. Shopify Help Center: Discount codes FAQ
  2. Shopify Help Center: Putting products on sale (compare-at price)
  3. Shopify Help Center: Automatic discounts
  4. Shopify Help Center: Discount combinations
  5. Shopify Help Center: Adding app blocks and app embeds to your theme
  6. Shopify Help Center: Sales reports
  7. Shopify Help Center: Analytics and reports
  8. Shopify.dev: customer Liquid object
  9. Shopify Community: Automatic Discount Not Showing on Product & Collection Pages
  10. 16 CFR 233.1: Former price comparisons (FTC Guides Against Deceptive Pricing)

Drafted with AI from the sources above and checked automatically against them and our product facts. Spotted a mistake? Email help@diex.app.

More articles

Run the promotions you actually want to run

Install diex from the Shopify App Store. One plan at $29.99 a month, billed by Shopify.