F12 Labs
EN
Contact
← All posts

Shopify discounts on sale items: skip them, or discount the original price

A Shopify discount comes off the sale price, so marked-down items get discounted twice, and staff pricing loses track of the original price. What Shopify offers, the collection workaround and where it breaks, and how to choose per discount.

A Shopify product page for a hoodie with the $90.00 price struck through and $76.50 shown, a volume pricing table below it, and a cart with a free gift and free shipping

You mark a jacket down from $150 to $120 for the end of the season. The same week, you run 20% off sitewide. A customer buys the jacket for $96, which is less than you meant anyone to pay.

Or the other way around: your staff get 30% off. They expect 30% off the jacket's original $150, which is $105. Shopify gives them 30% off $120, which is $84.

Both come from the same thing: Shopify treats a sale price and a discount as two separate things, and a discount has no setting for items that are already on sale. Here's what Shopify offers, the usual workaround and where it breaks, and what to look for in a fix.

What Shopify does: a sale price is a price, and discounts come off it

In Shopify, an item is on sale when it has a compare-at price. "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 compare-at price has to be "higher than the value in the Price field to display the sale price." (Setting sale prices for products)

Shopify is clear that this isn't a discount: "Using sale prices is different from setting up discounts." Both prices can show on product and collection pages, "but only the sale price is displayed at checkout." That's the price a discount sees.

When you create an Amount off products discount, you choose what it applies to: "To apply a discount to specific products, select Specific products, and then add your products", or "select Specific collections, and then add your collections." (Amount off discounts). There's nothing about sale items, and no choice of which price the percentage comes off.

Option 1: Point the discount at a "not on sale" collection

The usual workaround is an automated collection of products that aren't on sale, and a discount that applies only to that collection. Shopify's collection conditions include the compare-at price, with is set and is not set. (Understanding conditions for collections)

  1. Create an automated collection with the condition Compare-at price is not set.
  2. In your discount, choose Specific collections and pick it.

Where it breaks:

  • Products with some variants on sale. For is not set, "A product matches when any of its variants has an empty Compare-at price value." A hoodie with one color on sale and the rest at full price is in the collection, so the discount still reaches the sale color.
  • Leftover compare-at prices. The condition checks whether the field has a value, not whether the item is cheaper than it. "A compare-at price of $0.00 USD isn't considered empty." A product whose old compare-at price was left in after a sale ended, or set equal to the price, drops out of the collection and loses the discount, even though it isn't on sale.
  • One more thing to keep in step. Every discount that should skip sale items needs the collection, instead of all products. A discount that should cover one collection and skip sale items needs a collection combining both conditions.
  • It only skips. There's no collection that makes a discount come off the original price. Staff pricing on the compare-at price isn't possible this way.

Good for: one sitewide code, on a catalog where products are either fully on sale or not at all.

Option 2: Exclude sale items by tag

Some stores tag sale products (sale) and build the collection on Tag does not include sale. It handles products with mixed variants by your decision rather than Shopify's, but it's another manual step: tag at the start of every sale, untag at the end. Forget one and the discount is wrong until someone notices.

What to look for in a fix

  • A choice per discount. A sitewide code should skip sale items, staff pricing should use the original price, a volume tier may stack. One store-wide rule doesn't fit all three.
  • On sale means cheaper than the compare-at price, checked on the item in the cart, not on the product as a whole and not on whether a field has a value.
  • The original price as a base, so "30% off" can mean 30% off the compare-at price.
  • Nothing to maintain. Starting or ending a sale shouldn't mean editing collections, tags or discounts.
  • Calculated by Shopify at checkout, through Shopify Functions, so the cart, checkout and order agree.

How Discountly does it

Discountly's volume, product and Buy X get Y discounts have a setting called Items already on sale, with three choices. For 30% off a jacket at $120, normally $150:

Option What happens Customer pays
Don't apply The discount skips items on sale $120.00
Use compare-at price 30% off the original $150 $105.00
Stack on sale price 30% off the $120 sale price $84.00
  • On sale is checked per item in the cart. An item is on sale when its compare-at price is higher than its price. A variant at full price gets the discount even if other variants of the product are on sale, and an old compare-at price equal to the price doesn't count as a sale.
  • Use compare-at price never makes things worse. If the sale already takes more off than the discount would (an item at half price with 30% off the original), the customer keeps the sale price.
  • It works with tiers. On a volume discount with Don't apply, sale items don't get the tier discount and don't count toward the tier. The product page's volume pricing table hides itself on them.
  • It works with rewards. On a Buy X get Y discount with Don't apply, items on sale don't count toward earning the free item.
  • Shopify does the math. Discountly runs on Shopify Functions, so the discount is calculated by Shopify in the cart and at checkout.

The setting changes percentage discounts. A fixed amount, such as $10 off, is the same off either price.

A product page with the original $90.00 price struck through above $76.50, a tiered pricing table and a cart with a free gift and free shipping
Discountly's discounts are calculated by Shopify, in the cart and at checkout.

Setting it up

  1. In Discountly, open the discount, or click Create discount and choose Volume pricing, Product discount or Buy X get Y.
  2. Under Items already on sale, choose Don't apply, Use compare-at price or Stack on sale price.
  3. Click Save rule.
  4. Test it: add an item on sale and one at full price to a cart and check the price of each.

The Product discount docs walk through the options, with a staff pricing example that uses the compare-at price.

Before you rely on it

  • Check the default. New discounts start on Stack on sale price, which is what Shopify does. Pick on purpose for each discount.
  • Order discounts come off the subtotal. Discountly's order discounts take their amount off the order at the prices customers pay, sale prices included. Use a product discount to treat sale items differently.
  • Other discounts follow their own rules. The setting changes Discountly's discount only. A Shopify discount code that combines with it still comes off the sale price.
  • Keep compare-at prices tidy. Discountly only counts an item as on sale when the compare-at price is higher than the price. A compare-at price left in after the sale is ignored, but one set higher by mistake makes an item look on sale.

Shopify behavior checked on 20 October 2026 against Shopify's help center: Setting sale prices for products, Amount off discounts and Understanding conditions for collections. If Shopify adds a sale-items setting to its discounts, we'll update this post.