Showing the discount on the page is the easy part. The part that quietly costs money is stacking a sale price, an automatic discount, and free shipping without ever checking what each order nets after the product cost and fees. This guide covers every display method an operating store uses, with the margin math the SERP leaves out.
If discounts are one of several admin levers you touch each week, the broader Shopify store operations guide ties products, collections, and discounts together.
First, which "discount" do you mean?
Shopify treats two things differently, and the method you need depends on which one you're running.
A sale price is a product-level price change. You lower the Price and record the old price as the Compare-at price. This shows on the product page natively.
A discount is a separate object — an amount-off, buy X get Y, or free-shipping rule delivered as a code or automatically. Per Shopify, "using sale prices is different from setting up discounts," and a sale price "is displayed at checkout" while the compare-at and sale amounts "can be displayed on product pages and collection pages" (Shopify Help Center — Setting sale prices). Discounts, by contrast, resolve in the cart — which is exactly why they don't appear on the product page on their own.
Method 1: Compare-at price (native, no code)
This is the one that works out of the box. In the product (or variant) you set two fields: the Price field holds the new, lower price; the Compare-at price field holds the original. Shopify's own instruction is to "set the value of the Compare-at price field… to the original price of the product" and to make sure it "is higher than the value in the Price field to display the sale price" (Shopify Help Center).
What the shopper sees is theme-driven. Shopify notes your "theme controls whether sale prices are displayed… and where," and that your "theme might add a badge with a message or percentage off" (Shopify Help Center). Most modern themes render the crossed-out original, the sale price, and an automatic "Sale" badge on both the product page and collection pages.
To move many SKUs at once, select them on the Products list and use the built-in bulk editor, adding the Compare-at price column so you can set originals across a whole collection in one pass.
The margin trap in the compare-at method
Say you sell a tee at a $31 list price with a Printify product cost of $12.50. You want a sale, so you set the Compare-at price to $40 and drop the Price to $26. The page now shows "$40, now $26" with a badge, and conversion ticks up. Good.
Now do the arithmetic the badge hides. At $26, after a roughly $1.05 payment fee on this example order, you net $26 − $1.05 − $12.50 = $12.45 per order. Before the sale at $31 you netted about $17.60. You didn't give away $14 (the gap to the fake-feeling $40 anchor) — you gave away the real $5.15 between $31 and $26, which is 29% of your old per-order profit. The anchor is a display number; the margin lives between your true price and your cost.
Method 2: Showing an automatic discount on the product page
Automatic discounts apply themselves when the cart qualifies — no code typed. The problem SERP guides name correctly but rarely solve: the discount isn't attached to the product, it's evaluated against the cart, so a stock theme shows the full price on the product page and only reveals the savings once the item is in the cart.
Three ways operating stores bridge that gap:
- Mirror it with a compare-at price. If the automatic discount is a flat percentage on a collection, set matching compare-at prices so the page shows a sale visually. The risk: the two can drift and stack, double-discounting at checkout.
- Theme code that reads the active discount. A developer can surface the computed price on the product template. This is real work and breaks on theme updates — budget for maintenance.
- A discount app with a product-page widget. Apps render a coupon or struck-through price on the page while the actual Shopify price stays put.
Remember the hard limit: Shopify allows "a maximum of 25 active automatic discounts," and that total "includes app-based discounts" (Shopify Help Center — Automatic discounts). A store running app-based badges can hit that ceiling faster than expected.
Method 3: Discount codes and app badges
Codes are for targeted offers — email, influencers, win-back. Like automatic discounts, a code does nothing on the product page until it's entered in the cart. If you want "USE SAVE10" visible on the page, that's a theme snippet or an app banner, not a native feature.
Two limits worth knowing before you build a code-heavy promo: a store has a cumulative cap of "20,000,000 unique discount codes," where deleted codes still count (Shopify Help Center — Discount codes), and a shopper "can use a maximum of 5 product or order discount codes and 1 shipping discount code on the same order" (Shopify Help Center — Combining discounts).
Method 4: Theme code (full control, real upkeep)
Editing the product template or the price snippet gives you exact control — a custom percentage badge, a "You save $X" line, a countdown. The common Liquid pattern checks product.compare_at_price > product.price and renders a badge when true. Just treat it as code you now own: it needs re-testing after every theme update, and it's easy to show a stale discount after a sale ends. For stores adding products weekly, the bulk compare-at approach is lower-maintenance than bespoke code.
Which method should you use
- A real sale on specific SKUs, no code: compare-at price. Native, instant, shows the badge.
- Store-wide or collection percentage off, applied automatically: automatic discount plus a matching compare-at mirror or an app widget so the page reflects it.
- Targeted or coupon-style offer: a discount code, with an app or snippet if you need it visible on the page.
- A one-off custom display (save amount, countdown): theme code, with upkeep budgeted.
The profit question every discount hides
Every display method above is cosmetic. The decision underneath — can this product survive this discount? — is where POD stores leak money, because the stacking math isn't intuitive.
Say a $100 cart of tees has a 20%-off-product discount and a 10%-off-order code, both set to combine. Shopify applies product discounts first, then order discounts on the revised subtotal (Shopify Help Center — Combining discounts). So $100 → $80 → $72. The shopper's total discount is 28%, not the 30% you'd get by adding the two. That compounding cuts the other way too: on a thin POD margin, a sale price plus an automatic discount plus free shipping can push a per-order profit negative while the badge still looks like a win — and the processing fee on a refunded order is never returned (Shopify Help Center — Shopify Payments refunds), so a discount that drives returns bleeds twice.
This is the work Victor does. the AI employee from PodVector AI connects your Shopify store, Meta and Google Ads, your Printify, Printful, or Gelato costs, and Klaviyo, so he sees every order, every ad dollar, and every supplier cost together. Victor computes the true per-order profit on each SKU — before the first sale, because POD product costs are known up front — and he reprices the thin-margin products and changes the discounts right inside Shopify so a sale badge never quietly sells at a loss. Victor isn't a dashboard you read; he does the repricing.
If you want the display handled and the margin protected, start with Victor on your store.
Discount display is one piece of a product page that converts — the product page SEO guide covers the rest of what earns and keeps the click.
FAQs
Why isn't my automatic discount showing on the product page?
Because it's not supposed to, by default. An automatic discount is evaluated against the cart, not the product, so Shopify only surfaces it once the item is in the cart and at checkout. To show it on the product page you need a mirrored compare-at price, theme code, or a discount app with a product-page widget.
What's the difference between a sale price and a discount in Shopify?
A sale price is a product-level price change you create with the Compare-at price field, and it shows natively on product and collection pages. A discount is a separate rule (code or automatic) that resolves in the cart. Shopify states plainly that "using sale prices is different from setting up discounts," and that only the sale price shows at checkout (Shopify Help Center).
How do I show a percentage-off badge instead of just "Sale"?
Most themes show a generic "Sale" badge automatically when the compare-at price exceeds the price. For a percentage ("20% off"), you either enable that option if your theme offers it, add a Liquid snippet that calculates the percentage from compare-at and price, or use an app that renders the badge for you.
Will a compare-at price and a discount code stack on the same order?
Yes — the sale price is already the product's price, and a discount then applies on top of it unless you scope it out. This is how stores accidentally sell below cost. Model the stacked math first: product discounts apply before order discounts, so the totals compound rather than add.
Do I need an app to show discounts on my product page?
Not for a straightforward sale — the compare-at price is native and free. You need an app (or custom code) only when you want an automatic discount or a code to appear on the product page itself, or when you want a non-standard display like a countdown timer or a "You save $X" line.
Does showing a discount hurt my margin even if sales go up?
It can. More orders at a lower price with the same supplier cost and fees can net less total profit than fewer orders at full price. The only way to know is per-order profit after product cost and fees — run the arithmetic on the actual sale price, not the anchor, before you launch.