Mastering Shopify Discounts: Stop Welcome Codes from Stacking on Sale Variants

Hey everyone! As a Shopify migration expert and someone who spends a lot of time digging through community discussions, I often see recurring challenges that really highlight the nuances of running an online store. One topic that recently popped up, and resonated with a lot of merchants, was about managing discounts – specifically, how to stop your welcome coupon codes from stacking on top of items that are already on sale, especially when those sales are variant-based.

Our friend @summitandnest kicked off a fantastic thread, describing a common scenario: they offer a 15% welcome coupon, but it was applying to both full-price and sale items. The real kicker? Their sales are often variant-specific. Think about it: a 12-month gray t-shirt might be on sale, but the 18-month version of that exact same t-shirt is full price. The goal was simple: let customers have both sale and full-price items in their cart, but make sure the coupon only applied to the full-price variants. Sounds straightforward, right? Well, as many in the community quickly pointed out, it's trickier than it looks with Shopify's native tools.

The Core Challenge: Product vs. Variant-Level Exclusions

The heart of this problem, as @Ramadan_Alex and @LitExtension emphasized, is the distinction between product-level and variant-level control. Shopify's native automated collections, while powerful, typically work at the product level. If you create a collection to exclude items “on sale” using a condition like "Compare at price is not greater than Price," it applies to the whole product. So, if even one variant of your gray t-shirt is on sale, the entire product might get excluded from your welcome discount, meaning the full-price 18-month variant wouldn't get the 15% off either. That's not what we want!

What we really need is for the discount to evaluate each cart line/variant separately. If the 12-month variant is on sale, no discount. If the 18-month variant is regular price, apply the 15%.

Solution Path 1: The Native Shopify Approach (If You've Got the New Collections Model)

One exciting possibility, highlighted by @cuongnm_trooix and @HBNStudio, involves Shopify's newer collections model. If your Shopify admin has this update, you might be able to achieve variant-level exclusions natively!

How to Set Up Variant-Level Collections for Discounts:

  1. Check for the New Collections Model: Go to your Shopify admin and try creating a new automated collection. Look for an option to use a "Variants source." If you see it, you're in luck! If not, this native route isn't available to you yet, and you'll need to explore apps.
  2. Create a "Full-Price Variants" Collection:
    • Choose to create a collection with a Variants source.
    • Set the condition to: Compare at price > is not set.

    This collection will then contain only the variants that do NOT have a compare-at price set, which typically signifies they are full price.

  3. Target Your Welcome Code: Create or edit your welcome discount code.
    • Make sure it's an "Amount off products" discount. (If it's an "order discount," you'll need to recreate it, as order discounts can't target specific collections like this.)
    • Set the discount to apply specifically to the new "Full-Price Variants" collection you just created.

Important Caveats for the Native Approach:

  • New Collections Model Required: This is the big one. Legacy collections only contain whole products.
  • "Compare at Price" Must Be Truly Empty: A value of 0.00 is still considered "set." For a variant to be included in your "Full-Price Variants" collection, its compare-at price field must be completely blank.
  • Reliable Marker: This method assumes that the compare-at price field is a reliable and consistent marker for *every* sale variant in your store. If you use other methods to mark items as on sale (like tags or specific pricing rules), this might not capture everything.

Solution Path 2: The App Ecosystem to the Rescue

For many merchants, especially those without the new collections model or with more complex discounting needs, third-party apps are the most practical and robust solution. The community thread offered some excellent recommendations, and they generally fall into two categories of behavior:

Apps for Selective Application (Discount Applies to Full-Price, Skips Sale Items):

This is what @summitandnest was looking for – the discount applies only to the full-price items in the cart, while leaving the sale items at their reduced price.

  • Deducto: Smarter Promotions: @deducto shared their app, which has a native "Is On Sale" condition evaluated per cart line. You'd set your welcome code to apply only where "Is On Sale is false." This is precisely what's needed for variant-level control. They even have a free plan to try it out!
  • Regios Automatic Discounts: Recommended by @LitExtension, this app reportedly has a specific "don't apply to items already on sale" setting that checks compare-at pricing directly, making it suitable for variant-level sales.
  • Discount Bot / Discount Bot: Sitewide sales: Mentioned by both @LitExtension and @Guleria, this app allows you to set an exclusion list for products/variants alongside your welcome code.
  • Solo Discount: @Guleria also suggested Solo Discount as another option.

Apps for Rejecting the Code Entirely (If a Sale Item is Present):

While not the primary request, @HBNStudio pointed out that some apps, like their own HBN: Discount Floor Guard, work differently. Instead of partially applying the discount, they block the entire code at checkout if it would hit a protected (sale) item. The shopper then needs to remove either the code or the sale item. This approach doesn't depend on compare-at data or the new collections model, offering a different kind of control. Their free plan covers one storewide sale-item rule.

The Critical Test: Always Run a Mixed-Cart Scenario!

No matter which route you choose – native Shopify or a third-party app – there's one crucial step that every expert in the thread, from @HBNStudio to @Ramadan_Alex, stressed: the mixed-cart test.

Here's how to do it:

  1. Add one sale variant (e.g., the 12-month gray t-shirt) to your cart.
  2. Add one full-price variant (e.g., the 18-month gray t-shirt) from the same product to your cart.
  3. Go to checkout and apply your welcome coupon code.
  4. Verify the outcome:
    • Does the 15% discount only apply to the full-price 18-month t-shirt? (This is the desired selective application.)
    • Or is the entire checkout blocked with a message, requiring you to remove the sale item or the code? (This is the "reject code entirely" behavior.)
    • Or, worse, does the discount apply to both, or neither?

This simple test will immediately tell you whether the solution you've implemented or the app you're trialing is actually handling the exclusion at the variant/cart-line level as intended. It's the best way to ensure your customers get the right discount without you losing out on already-reduced items.

So, there you have it! While Shopify's native capabilities are evolving, for now, many merchants will find a robust app to be the most reliable way to handle these complex, variant-specific discount exclusions. Always test, and choose the solution that gives you the precise control you need for your store's promotions.

Share:

Start with the tools

Explore migration tools

See options, compare methods, and pick the path that fits your store.

Explore migration tools