Skip to content
Store slow, dated, or hard to edit? Request a Store Diagnostic
Running B2B on spreadsheets or email? Plan Your B2B Project
CRO

Shopify Discount Stacking for BFCM: What’s Possible Without Breaking Your Margins

Every November, someone on the marketing team asks: “Can we let people use their welcome code on top of the site-wide BFCM sale?” It sounds like a harmless yes/no question. In Shopify, it’s actually a configuration decision with real margin consequences, and if you get it wrong, you find out on 27 November when finance asks why average order value is up but gross margin is down.

Shopify’s discount engine is more capable than most merchants realise, but it’s also easy to misconfigure in the rush to launch a BFCM campaign. Discounts can combine with each other by design, not by accident, which means a stacking problem is almost always a settings problem, not a platform limitation.

This guide walks through how Shopify’s native discount combination rules actually work, what’s different on Shopify Plus with Scripts and Functions, and the specific BFCM mistakes that quietly erode margin every year. By the end, you’ll have a practical checklist to run before your sale goes live.

How Shopify’s Discount Types Work

Shopify groups every discount into one of three classes, and the class determines what it’s allowed to combine with:

  • Product discounts, a percentage or fixed amount off specific products, variants, or collections (e.g., 20% off the Summer Collection).
  • Order discounts, a percentage or fixed amount off the entire order (e.g., $15 off orders over $100).
  • Shipping discounts, free or discounted shipping, either automatic or code-based.

Every discount you create in Shopify admin (Discounts app, or Settings > Discounts) falls into one of these buckets, and it can be either a code-based discount (customer types a code at checkout) or an automatic discount (applies without any input, based on cart conditions).

This matters because Shopify’s combination logic is bucket-based, not discount-based. You’re not deciding “can discount A stack with discount B” as two arbitrary rules, you’re deciding whether product discounts can combine with order discounts, whether order discounts can combine with shipping discounts, and so on.

The “Combinations” Setting Explained

When you create or edit a discount in Shopify admin, there’s a Combinations section. It lets you tick which of the other two discount classes this discount is allowed to stack with. For example, on a product discount you’ll see two checkboxes:

  • Combine with order discounts
  • Combine with shipping discounts

Critically, combination is not automatically mutual in the way people assume, you need to check the setting on both discounts involved, because Shopify only lets two discounts combine if each one has explicitly opted in to combining with the other’s class. If your BFCM sitewide automatic discount doesn’t tick “combine with order discounts,” a customer’s $10-off order code won’t apply on top of it, full stop.

A few mechanics worth knowing cold before BFCM:

  • A cart can apply at most one discount from each class at a time, one product discount, one order discount, one shipping discount, combined together if their settings allow it. You cannot stack two order-level percentage codes on the same order.
  • Automatic discounts and code discounts follow the same combination rules. An automatic discount is not inherently “safer”, it will combine with a customer-entered code if both have the matching combination checkboxes ticked.
  • When multiple eligible discounts exist within the same class, Shopify applies the one that gives the customer the best value on that portion of the cart, not necessarily the one you’d have picked.
  • Combination settings are configured per discount, so a legacy code from October and a new BFCM automatic discount can have completely different combination behaviour unless you audit both.

Automatic Discounts vs Codes for BFCM

For a sitewide BFCM sale, most Shopify merchants use an automatic discount rather than a code. The advantage is obvious: no one misses the sale because they forgot to type SAVE20, and you avoid the support tickets asking “does the code still work?” on Cyber Monday.

The trade-off is that automatic discounts are more dangerous from a stacking perspective precisely because customers don’t have to do anything to trigger them. A code-based discount requires intent, someone has to know the code and enter it. An automatic 25%-off-sitewide discount applies to every eligible cart by default, including carts where a customer also has a separate code (from an email flow, an affiliate, or a influencer partnership) that’s technically still valid.

This is why the combination checkboxes deserve more attention during BFCM setup than any other time of year. If your automatic sitewide discount has “combine with order discounts” ticked, and your ongoing $20-off-first-order welcome code is still live, new customers can get both, 25% off plus $20 off, on top of stock that might already be discounted at the product level from a clearance collection.

Common BFCM Discount Mistakes

These are the patterns that show up most often when we audit a store’s discount setup ahead of BFCM:

1. Stacking on top of already-discounted sale collections. A store creates a “Clearance” collection already marked down 30% at the product/price level, then applies a sitewide 20% automatic discount on top with no collection exclusion. The customer ends up close to 50% off stock that was already thin on margin. This is the single most common margin leak we see, because the sitewide discount is usually built in a rush without checking which collections already carry reduced prices.

2. No exclusion for gift cards. Shopify’s discounts can technically apply against gift card purchases unless you deliberately exclude them. Since gift cards are a cash-equivalent product with near-zero margin, a 20%-off code applying to a gift card purchase is a straightforward, avoidable loss, Shopify lets you exclude specific products or the gift card product type from a discount’s eligibility, so this should always be checked, not assumed.

3. No cap on percentage-based codes when combined with high-AOV carts. A flat “20% off, no minimum, no maximum” order discount looks fine on a $150 cart and reckless on a $3,000 wholesale-style cart from a B2B-adjacent customer. Where volume is unpredictable, a fixed-dollar cap (e.g., 20% off up to a maximum of $150 discount) protects margin on outlier orders without changing the offer for typical customers.

4. Combination checkboxes left on by default from an earlier campaign. Teams often duplicate last year’s BFCM discount to save time, which also duplicates last year’s combination settings. If last year’s promotion was designed to combine with shipping discounts because you were also running free shipping, and this year you’re not, that setting can let unintended combinations through.

5. No end date/time, or a date set in the wrong timezone. Discounts left running past Cyber Monday because the end date/time defaulted to UTC instead of AEDT/AEST is a recurring, avoidable issue for Australian merchants, always confirm the discount’s scheduled end against your store’s actual timezone setting in Settings > General.

Advanced Discount Logic with Shopify Scripts and Shopify Functions (Plus)

Native discount combinations cover most stores, but they’re still rule-based and blunt: you’re choosing from fixed conditions (minimum spend, product/collection scope, combination checkboxes) rather than writing genuinely custom logic.

Shopify Plus merchants have two additional options:

  • Shopify Scripts (legacy, being phased out in favour of Functions) allowed Ruby-based custom logic for line item, cart, and payment/shipping discounting, for example, “apply the best of these three discounts, never all three” or “cap total discount at 30% regardless of how many promotions a customer qualifies for.”
  • Shopify Functions are the current, actively developed replacement, letting developers build custom discount logic (and other checkout customisations) that runs server-side at checkout, deployed as a Shopify app extension. For BFCM specifically, this is where merchants build things native discounts can’t do out of the box: true “best discount only” logic across an unlimited number of active promotions, tiered spend-based discounts with custom breakpoints, or discount eligibility based on customer tags/segments rather than just cart contents.

If your BFCM strategy genuinely needs “only ever apply the single best available discount, never combine, regardless of source,” that’s a Functions-based build, not a checkbox, native combination settings can prevent specific stacking but can’t dynamically pick “best of many” across product, order, and shipping discounts simultaneously. This is exactly the kind of edge case worth scoping with a developer before BFCM week, not during it.

A Pre-BFCM Discount Audit Checklist

Run this against your store at least two weeks before your BFCM sale goes live:

  1. List every active and scheduled discount (code and automatic) in Discounts, including anything left running from earlier campaigns.
  2. For each discount, check the Combinations section, confirm which classes it can combine with, and whether that’s actually intended for BFCM.
  3. Cross-check your sitewide BFCM discount against any collection or product already carrying a reduced compare-at price. Exclude those collections if the sitewide discount shouldn’t stack on top.
  4. Confirm gift cards are excluded from percentage-based discounts.
  5. Add a maximum discount cap on uncapped percentage codes if your customer base includes high-AOV or wholesale-style buyers.
  6. Verify start and end date/time against AEDT/AEST, not UTC.
  7. Test the actual combined checkout experience in an incognito window, add a product from a sale collection, apply your BFCM automatic discount, then try a live customer code on top. Confirm the total matches what you intended, not just what the settings implied.
  8. If you’re running influencer or affiliate codes concurrently, confirm whether those should combine with the sitewide sale or be treated as exclusive alternatives.

When to Bring in a Specialist

Discount combination settings look simple until you have five or six promotions live simultaneously across email flows, affiliate codes, a sitewide sale, and a loyalty programme, all interacting through the same three-bucket system. Getting the stacking logic wrong at BFCM volume is one of the more expensive mistakes a Shopify store can make in a single week, and it’s rarely obvious until the sale is already live and orders are flowing through.

If you want a second set of eyes on your BFCM discount architecture, or you’re weighing up whether your promotion strategy needs Shopify Functions rather than native combinations, that’s a conversion-focused review worth doing properly. Our Shopify conversion rate optimisation work includes exactly this kind of promotional and checkout audit, mapping every discount interaction before peak trading starts, not after.

FAQ

Can I stop a specific discount code from combining with my sitewide BFCM sale?
Yes. Edit the code’s Combinations settings and untick the box for the discount class your sitewide sale belongs to (usually “order discounts”). Remember both discounts need matching settings, if the sitewide sale still allows order discounts to combine, the code may still stack unless you also adjust that side.

Do automatic discounts always take priority over codes?
No, priority isn’t about automatic vs code, it’s about class and combination settings. If both are eligible and their combination settings allow it, they’ll combine. If they’re in the same class and can’t combine, Shopify applies whichever gives the customer the better outcome on that portion of the cart.

Can I exclude gift cards from a sitewide discount in native Shopify?
Yes. When setting up a discount’s eligibility, you can restrict it to specific products or collections, which effectively lets you exclude gift cards by not including the gift card product, or by using product exclusion where available depending on the discount type.

Is Shopify Scripts still usable for BFCM discount logic?
Shopify Scripts is a legacy feature being phased out in favour of Shopify Functions, and availability has been narrowing for merchants without existing Script Editor access. If you’re building new custom discount logic for Shopify Plus, plan around Functions rather than Scripts.

How far in advance should we finalise BFCM discount settings?
We’d recommend having your full discount structure, types, combination settings, exclusions, and caps, locked and tested at least two weeks out, so there’s time to catch stacking issues in a staging or incognito test before real traffic and real orders are on the line.

Next Step

If your BFCM discount strategy hasn’t been stress-tested against every combination a real customer could trigger, it’s worth a proper look before the sale goes live. Book a call with our team and we’ll walk through your current discount setup together.

Niraj Raut
Written by Niraj Raut SEO Manager

Niraj Raut is the SEO Manager and co-founder at Nexly. He helps Australian Shopify and Shopify Plus brands earn durable organic growth through technical SEO, search-led store architecture and content that ranks. He writes about what actually moves rankings for ecommerce.

Connect on LinkedIn
Have a Shopify project? Chat with us, takes 30 seconds.