By late November, the deepest discount a retailer runs is rarely the one that does the damage. The margin leaks somewhere quieter — a code that stacked with a promotion it was never meant to combine with, a bundle priced below its own cost of goods, an offer that stayed live three days after the campaign it belonged to had ended. At enterprise scale, a BFCM discount strategy is no longer decided by how aggressive the headline number is. It is decided by whether the discounting is governed.
That reframing is the shift worth attention this season. For most of the past decade, discount depth and breadth were treated as marketing calls — how low to go, how much of the catalogue to include, when to pull the trigger. As promotional calendars have stretched from a single Black Friday blast into weeks of concurrent, overlapping offers, the binding constraint has moved. The question is no longer whether a promotion is aggressive enough to compete; it is whether that promotion, multiplied against every other offer running beside it, still clears the margin floor underneath it.
Why “how deep should we discount” is the wrong question
The old model treated a BFCM promotion as a single decision with a single dial. Set the discount, pick the audience, measure the lift. That model held when the calendar was short and offers ran one at a time. It breaks the moment a retailer is running a storewide percentage, a category-specific code, free-shipping thresholds, an email-exclusive early-access tier, and a handful of vendor-funded bundles in the same week.
At that point the risk is no longer insufficient depth; it is uncontrolled interaction — and on Shopify, that interaction doesn't happen by accident. Discounts default to non-combinable, so two offers only stack when someone has opted both of them in. The failure is rarely the discount itself; it's a combinability permission granted for one campaign, never revisited, and left to compound against a later offer no one had in mind when they granted it — the storewide percentage cleared to stack with free shipping for one weekend, still stacking with the email-exclusive early-access code that launches the next. Not every leak needs an interaction, either. A code built for lapsed customers circulates on a deal-aggregator site and gets claimed by buyers who would have paid full price. A promotion scheduled to end Sunday night keeps redeeming Monday morning because no one set the end date. None of these is a depth problem, and none of them shows up in a plan that only asked how deep to go. They show up in the margin report in December, after the revenue has been booked and the discount already given away.
Set the margin floor before the promotional calendar exists
The first act of discount governance is not designing an offer. It is deciding the lowest contribution margin per order the business will accept, and refusing to design anything that breaches it. Work backward from the floor, not forward from the headline discount.
That floor has to account for the full cost of a promotion, not just the percentage taken off the price. A discount carries the markdown itself, plus any shipping subsidy attached to it, plus the elevated return rate that discounted purchases tend to bring, plus the revenue surrendered to customers who would have converted at full price anyway. A code advertised as a 30% cost is frequently a much larger margin event once those are counted. Establishing the floor first turns every subsequent offer into a constrained problem — how to create urgency and move inventory without crossing a line drawn before the pressure of the calendar set in.
The fork: sitewide reach or tiered margin protection
Every retailer building a BFCM discount strategy chooses, deliberately or by default, between two structures.
A sitewide discount is the blunt instrument: one percentage across the whole catalogue. It is simple to communicate, maximally visible, and nearly impossible to misconfigure. It also discounts the products that were already selling at full margin, compresses margin uniformly across healthy and thin SKUs alike, and trains a customer base to wait for the sale it now expects every November. Its cost is paid quietly, in the full-price sales it cannibalizes.
A tiered or segmented structure scopes discount depth to where it earns its keep — deeper on overstock and thin-margin lines that need to move, shallower or absent on high-margin products that sell without help, and differentiated by customer segment so early access and the steepest offers reach the buyers most likely to respond. It protects margin where margin is worth protecting, but it demands the segmentation and enforcement infrastructure to hold the boundaries, and it is far easier to misconfigure than a single storewide number.
Bundling sits alongside both as a margin-protecting move rather than a discount at all. A well-built bundle raises average order value, moves slower inventory attached to a hero product, and obscures the unit price so the headline markdown never becomes the anchor a customer negotiates against. The trade-off is merchandising effort: bundles have to be built, priced against their own combined cost of goods, and retired when the inventory logic behind them changes.
What a governed BFCM discount strategy actually controls
The difference between a discount strategy that holds its margin and one that hopes to is enforcement. But it's worth being precise about what Shopify's native controls actually enforce: none of them reads margin. What they enforce is a set of rules that stand in for a margin policy — block this class of discount from stacking, exclude that collection, cap that threshold — and those rules only hold the floor if someone has set them to the right numbers. Genuinely margin-aware logic, where the discount respects unit cost, isn't native: a merchant has to store cost in product metafields and write a Shopify Function against it.
-
Discount combinations decide whether product, order, and shipping discounts are allowed to stack. Configured deliberately, they are the mechanism that stops a category code, a storewide offer, and a free-shipping threshold from compounding past the floor on a single order.
-
Shopify Functions carry the custom discount logic that standard offers cannot express — tiered spend thresholds, buy-X-get-Y mechanics, collection exclusions applied at checkout, and any margin-aware rule that reads cost off a product's metafields. This is the layer that replaced Shopify Scripts, which no longer run; a strategy still referencing Scripts as a live control is describing something that has already stopped working and needs to migrate.
-
Native discount scheduling sets an explicit start and end on every code and automatic discount — the simplest guard against the offer that outlives its campaign, provided the end date is actually set.
-
Shopify Flow automates the governance around the discounts rather than the discounts themselves. Triggers fire when a discount code or an automatic discount is created, and notification actions keep a large calendar visible. There's no purpose-built action for tagging or deactivating a discount, since Flow's tagging actions apply to customers, orders and products. But its Send Admin API request action can call discountCodeDeactivate, so killing a code mid-sale can be automated rather than left to whoever notices first. What Flow can't do is gate. Every trigger here fires after a discount already exists: it reacts, it doesn't approve.
Approval workflow is the human control sitting over all of them — and it's worth being clear that it's human, not native. Shopify has no discount approval routing; nothing in the platform gates a discount before it goes live. What the platform gives you is staff permissions, which limit who can create discounts in the first place, and Flow, which can flag a code once it exists. A real review gate — someone signing off before a live discount reaches production — is a process your team runs, backed by a naming convention that keeps every active code legible at a glance. The platform enforces who and notifies when; it can't enforce a sign-off.
Governance gets harder as the calendar gets longer
A single promotion is easy to govern. The difficulty scales with concurrency. Once a calendar carries dozens of live codes across email, SMS, paid, and retail at the same time, the failure mode is almost never one badly built discount; it is the unmodelled interaction between several correctly built ones. Governing that requires a single source of truth for every active offer, a naming convention consistent enough to audit, and reporting that measures realized margin per code after the fact — not the intended discount, but the one that actually cleared once stacking and returns were counted.
That operational discipline is a subject in its own right, covered in ‘Promotions at Scale: Managing Hundreds of Discount Codes Without Losing Control’. It also depends on a calendar built early enough to reason about rather than assembled under deadline — the case made in ‘Why Enterprise Retailers Should Start BFCM Planning in July, Not October’ — and it intersects directly with how far ahead of the weekend the discounting begins, which is its own strategic question in ‘Halloween & Early Access Sales: Should You Launch BFCM Deals in October?’
The season rewards the governed, not the restrained
The shift underneath all of this is straightforward: discounting at enterprise scale has become an architecture decision, not a marketing one. The margin that survives BFCM will not belong to the retailers who discounted least, nor to the ones who discounted most. It will belong to the ones whose discounts were bounded by a floor set in advance, enforced by the platform rather than by vigilance, and reconciled honestly once the weekend was over. The depth of the discount was never the real variable. The governance around it always was.