Filed under Auto Markdown

Markdown vs Coupon vs Bundle: Which Discount When?

A plain-math decision framework for Shopify discounts: when a markdown, a coupon code, or a bundle is the right mechanic — and which combos backfire.

Every discount you can run on Shopify is one of three mechanics: a markdown, a coupon code, or a bundle. The markdown vs coupon vs bundle question is not really a question about which one is best — each mechanic does a different job, moves margin in a different way, and sends a different signal to your customers. Pick the wrong one and one of two things happens: you give margin away to people who would have paid full price, or the discount fails at the goal you ran it for in the first place.

We build and run discount apps for Shopify — we use the apps we sell — so we have watched this decision play out on our own test stores and across merchant installs. What follows is a decision framework, not advocacy for any single mechanic. We define the three precisely, map each one to the five goals merchants actually discount for, walk through the margin math with worked examples, and flag the combinations that quietly destroy profit.

If you want the one-line version first: markdowns clear inventory, codes target specific people, bundles raise order value. Everything below is nuance on top of that sentence — but the nuance is where the margin lives.

The three Shopify discount types, defined precisely

Shopify’s admin blurs these mechanics together under a single Discounts heading, but they behave differently at every level that matters: pricing, storefront display, reporting, and customer psychology. Precise definitions come first, because roughly half of the discounting mistakes we see start with treating the three as interchangeable.

Markdown: a visible price reduction

A markdown is a change to the actual price of the product, shown publicly to every visitor, usually with a strikethrough of the original price beside it. On Shopify you create one by lowering the variant price and moving the old price into the compare-at price field. There is no gate and no condition: everyone who lands on the product sees the lower price, and everyone pays it.

Three properties follow directly from that definition:

  • It is public. The new price becomes part of the product’s identity — on your storefront, in your Google Shopping feed, in price-tracking tools, and in your customers’ memory.
  • It is unconditional. You cannot restrict a markdown to first-time buyers, newsletter subscribers, or VIPs. Whoever shows up gets it.
  • It is invisible to Shopify’s discount reporting. Sales of a marked-down product report at the new, lower price. The Discounts column in your sales reports stays at zero, because as far as Shopify is concerned, no discount happened — the price simply changed.

That last point trips up more merchants than any other, and we come back to it in the measurement section below. Markdowns are also the mechanic with the most operational overhead when managed by hand, because you are editing real prices across potentially hundreds of variants, and you have to remember to put them all back. That workload is why we wrote a separate execution guide, our pricing-rules playbook for automated Shopify markdowns, which covers scheduling, depth laddering, and compare-at hygiene in detail.

Coupon code: a gated discount the customer applies

A coupon — Shopify calls it a discount code — leaves the listed price alone. The reduction exists only at checkout, and only for customers who present the code. The product page keeps its full-price integrity; the deal is a private arrangement between you and whoever holds the string of characters.

The defining property is the gate. You decide who receives the code: an email list, an influencer’s audience, a first-purchase popup, or one specific customer whose order arrived damaged. The gate is also the mechanic’s structural weakness, because codes leak. Coupon-extension browsers such as Honey and Rakuten harvest codes and auto-apply them for millions of shoppers, which means a “private” 20% code can become a de facto public price cut within hours of its first redemption.

Shopify also offers automatic discounts — the same discount engine with no code entry required. Functionally they sit between the two mechanics: gated by conditions (cart contents, customer segment, minimum spend) rather than by a code, and applied without any customer effort. For the purposes of this framework, automatic discounts behave like coupons in the margin math and reporting, and like markdowns in customer psychology whenever you advertise them on the storefront.

Bundle: quantity or combination pricing

A bundle prices a combination of items differently from the sum of its parts: the shampoo and conditioner together for 15% less than separately, three tees for the price of two and a half, a fixed gift set at a round number. The discount is conditional on the composition of the cart — not on who the customer is, and not on what the product page displays.

On Shopify, bundles arrive through several implementations: Shopify Bundles for fixed sets, Buy X Get Y automatic discounts for quantity breaks, and third-party apps for mix-and-match logic. Whatever the implementation, the economics are identical: you trade margin percentage for order size. That trade is the entire point, and it makes bundles the only mechanic of the three that can grow gross profit per order while the discount is running.

The decision table: match the mechanic to the goal

Here is the framework in one table. Treat these as strong defaults rather than laws — the sections that follow explain when the default holds and when it bends.

GoalBest mechanicWhy it wins
Clear slow inventoryMarkdownMaximum reach — every visitor sees the lower price, and sell-through is a volume problem, not a targeting problem
Acquire new customersCoupon codeThe gate limits the discount to the people you are trying to win, and attribution is built in
Increase average order valueBundleThe discount only exists when the customer adds more to the cart — margin dollars per order rise even as margin percent falls
Reward loyaltyCoupon code (segmented)Rewards only work if they are exclusive; a public markdown cannot single anyone out
Seasonal events (BFCM, end of season)Markdown-led, bundles in supportShoppers comparison-shop visible prices during events; a strikethrough advertises itself, while a code adds friction at your highest-traffic moment

When to use markdowns vs promo codes vs bundles: the five goals

Every discount we have ever run, on our stores or our customers’, maps back to one of five goals. Naming the goal before choosing the mechanic is the whole discipline. Here is each goal in detail, with the reasoning and the runner-up option.

Goal 1: Clearing slow inventory — markdown

Clearance is a volume problem. You have units that need to become cash before they become storage fees, and the constraint is how many qualified eyeballs see a price attractive enough to act on. A gate is exactly what you do not want: a coupon code only reaches the people who hold it, which means most of your traffic browses past the slow stock at a full price it already declined to pay.

A markdown puts the lower price in front of 100% of visitors, and the strikethrough does the selling for you — the customer sees $60 crossed out next to $42 and understands the deal without reading anything. As an illustrative example: say you are holding 300 units of a $60 jacket moving at 8 units a week. At that pace you are sitting on 37 weeks of stock. A 30% markdown that triples velocity clears it in about 12 weeks, and every week saved is storage cost avoided and capital released for stock that actually sells.

Depth matters more than mechanism here. Our rule of thumb from testing: the first 10% barely moves velocity on a product shoppers already passed on; the meaningful jumps happen at 25–30% and again at 40%. Ladder the depth over time — 20%, then 30%, then 40% as the season closes — rather than opening at your deepest cut. We cover the operational side of that ladder, and why we automate it, in our guide to clearing excess inventory on Shopify, and the scheduling itself is what our Auto Markdown app exists to do: it applies the price change and the compare-at strikethrough on a schedule, then reverts everything when the window closes, so nobody forgets step two.

Bundles are the wrong tool for clearance when used alone — pairing a slow mover with another slow mover just builds a slower-moving bundle. The exception, pairing clearance stock with a full-price hero, shows up in the combinations section below.

Goal 2: Acquiring new customers — coupon code

Acquisition is the opposite of clearance: a targeting problem, not a volume problem. You want to lower the barrier for one specific group — people who have never bought from you — without giving anything away to the returning customers who were going to buy at full price anyway. A markdown cannot make that distinction; it discounts your most loyal customer and a first-time visitor identically. A coupon code can, because the gate is the feature.

The standard shapes all work: a 10% welcome code behind an email popup, a named influencer code (which doubles as channel attribution), a first-order automatic discount limited to customers with zero previous orders. In each case, the product page keeps its full price, your brand’s price integrity survives, and the discount only spends where it might actually change a decision.

Two guardrails from our own testing. First, set every acquisition code to one use per customer with an expiry date — an evergreen, unlimited welcome code becomes a permanent 10% price cut once Honey learns it, which happens fast. Second, judge the code by new-customer orders, not total redemptions. If a fifth of the redemptions come from repeat buyers who found the code in a coupon aggregator, the acquisition discount is quietly bleeding into your loyal base — that is leak, not acquisition, and it is worth restricting the code to the first-order segment to stop it.

Goal 3: Increasing average order value — bundle

AOV is the goal bundles were born for, because a bundle is the only mechanic whose discount is conditional on the customer spending more. A markdown discounts the order the customer was already going to place. A sitewide code does the same. A bundle only pays out when the second item enters the cart — the customer funds their own discount with incremental purchase.

An illustrative example of why the math is friendlier than it looks: a store with a $45 average order runs “any two for 15% off” on a line of $45 items with 60% gross margin. A single-unit order carries $27 of gross profit. The two-unit bundle order brings in $76.50 of revenue and $40.50 of gross profit — margin percent drops from 60% to about 53%, but gross profit per order is up 50%. As long as the bundle pulls in second units that would not otherwise have been bought, the trade is clearly positive. The thing to watch is cannibalization: if bundle buyers were already two-unit buyers, you just handed them 15%.

Good bundle construction follows demand, not your inventory anxieties. Pair complements the customer already buys together (check your “frequently bought together” data in analytics), anchor with a bestseller, and keep the discount shallow — 10–15% is usually enough to tip a customer who was already considering the second item. The coupon-flavored alternative, a minimum-spend code like “$10 off $75”, also lifts AOV, but it trains customers to expect codes and it leaks; we treat it as the fallback when a catalog genuinely has no natural pairings.

Goal 4: Rewarding loyalty — segmented coupon code

A reward only works if it is exclusive. The emotional payload of a loyalty discount is “this is for you, because you have been with us” — and a markdown, by definition, cannot deliver that message, because everyone on the internet gets the same price. Loyalty is the clearest case in the whole framework: it has to be a gated mechanic, and the code is the gate.

Shopify’s customer segments make the targeting straightforward: build a segment such as “3+ orders, purchased in the last 180 days,” issue a unique or segment-limited code, and deliver it by email so it feels like a message rather than a promotion. Unique one-per-customer codes are worth the extra setup over one shared code — they cannot leak to aggregators, and they give you per-customer redemption data.

The failure mode is cadence. A quarterly surprise reward strengthens the relationship; a monthly predictable one becomes an entitlement, and your best customers quietly stop buying between codes. If you find repeat-purchase timing shifting to cluster around your reward emails, you have crossed from rewarding loyalty into subsidizing it.

Goal 5: Seasonal events — markdown-led, with bundles in support

Black Friday, Cyber Monday, and end-of-season sales are the one context where the public nature of markdowns flips from cost to asset. Event shoppers comparison-shop across tabs, and they decide in seconds based on the visible price. A strikethrough price advertises itself in your collection grid, your Google Shopping feed, and every screenshot shared in a group chat. A code, at the highest-traffic moment of your year, is friction: it must be found, remembered, typed, and it sends a measurable slice of your checkout traffic off to Google to search “yourbrand discount code” — a journey some of them do not return from.

So the event playbook we run is markdown-led: visible price cuts on the featured assortment, applied and reverted on schedule. Bundles play defense in the same window — gift sets and multi-buy offers hold margin on the products you refuse to mark down, and give full-price items a reason to move during a discount-saturated week. Codes are relegated to a supporting role with a job targeting can do best: early access for your list (the code gates timing, not extra depth). We walk through the full event sequence — depth tiers, scheduling, and the revert plan — in our Black Friday markdown strategy guide.

The margin math: the same “20% off” is three different P&Ls

The three mechanics can wear the same headline number and produce completely different profit outcomes. Here is a worked example — illustrative numbers, but the structure is what matters. Take a product priced at $80 with a $32 landed cost, so a 60% gross margin and $48 of gross profit per unit at full price.

ScenarioCustomer paysCOGSGross profitMargin %Who gets the discount
Full price (baseline)$80$32$48 per unit60%No one
20% markdown$64$32$32 per unit50%Every buyer — including everyone who would have paid $80
20% coupon code (30% of orders redeem)$64 with code, $80 without$32$43.20 blended per unit~57% blendedCode holders only — until the code leaks and redemption climbs
Bundle: 2 units at 15% off$136 per order$64$72 per order~53%Only buyers who add the second unit

Three readings of that table:

  • The markdown is the most expensive per unit because it has zero targeting: a third of your gross profit goes to every single buyer, including all the ones who needed no incentive. That cost is only justified when reach is the point — which is exactly the clearance and event cases.
  • The coupon’s cost scales with redemption rate, which makes it the cheapest of the three at launch and progressively more expensive as the code spreads. A code that starts at 30% redemption and creeps to 70% via coupon extensions has silently become a markdown — with checkout friction added on top.
  • The bundle is the only row where gross profit per order goes up — from $48 to $72 in this example. Margin percent falls, and if you report only in percentages it looks like a worse deal than the coupon. Dollars pay rent; percentages do not.

One more piece of arithmetic worth internalizing: a discount comes out of profit, not revenue. At a 60% gross margin, a 20% discount removes a third of your gross profit. At a 40% margin, the same 20% discount removes half of it. Merchants who set discount depth by looking at what competitors advertise, without checking it against their own margin structure, routinely run events that are cash-flow positive and profit negative.

Brand perception: a public price cut is not a private favor

The mechanics also differ in what they say about you, and the perception effects outlast the promotion.

A markdown is a public statement about the product’s worth. Run them rarely and with a visible reason — end of season, last sizes, discontinued colorway — and shoppers read them as honest housekeeping. Run them constantly and shoppers recalibrate: the marked-down price becomes the real price in their heads, the full price becomes fiction, and a segment of your audience learns to never buy until the strikethrough appears. Price-tracking tools and comparison sites remember your markdown history even when customers do not. This is the reason luxury brands essentially never mark down publicly; they route excess stock to outlets and private archive sales instead, precisely to keep the public price meaning something.

A coupon code reads as a relationship, not a repricing. The product page still says $80; the customer with the code feels they got a favor the general public did not. That framing protects price integrity — but the code box at checkout has a perception cost of its own. An empty discount field tells every customer that a better price exists for somebody, and a portion of them will leave your checkout to go hunting for it. Shopify lets you hide or de-emphasize the field; at minimum, be aware that the field itself is advertising the existence of codes.

A bundle is the most perception-safe discount there is, because it is framed as added value rather than reduced worth. “The set costs less than the pieces” does not tell anyone the pieces were overpriced. This is why premium brands that would never show a strikethrough will happily sell gift sets — the bundle lets them discount without ever saying so.

Stacking: where discounts compound and margins quietly die

The single most expensive discounting accident on Shopify is unintended stacking, and the classic version involves two of our three mechanics colliding. Shopify treats a marked-down price as simply the price — so when a customer applies a discount code to a marked-down product, the code discounts the already-reduced number. The two mechanics do not know about each other.

Worked example, same $80 product with $32 COGS: you mark it down 30% to $56 for a sale, and a customer applies a leaked 20% welcome code on top. They pay $44.80 — a 44% combined discount. Your gross profit on the unit drops from $48 to $12.80, and your margin from 60% to 16%. Nothing malfunctioned; every system did exactly what it was configured to do.

Shopify’s discount-combinations system controls how codes and automatic discounts stack with each other (product, order, and shipping discount classes each have combination checkboxes), but no combination setting can stop a code from applying to a markdown, because a markdown is not a discount in Shopify’s model. The protections have to be built by you:

  • Exclude the sale collection from your codes. Scope acquisition and loyalty codes to specific collections, and keep marked-down products out of those collections — or add an explicit “excludes sale items” scope where your discount setup supports it.
  • Audit every combination checkbox before an event. A product discount, an order discount, and a free-shipping discount all set to combine is a three-layer stack waiting for one customer to find it.
  • Pause evergreen codes during markdown events. The welcome popup that is harmless in March is a stacking machine during your Black Friday markdowns.
  • Model the worst-case stack before launch. Take your deepest markdown, add every code that could legally apply, add free shipping, and check the resulting unit economics. If the worst case is unprofitable, someone will find it.

Measurement: attribution works differently for each mechanic

How you will know whether the discount worked should influence which mechanic you pick, because the three leave very different evidence behind.

Codes are self-attributing. Every redemption is logged against the code, so per-channel and per-influencer ROI falls out of Shopify’s discount reports with no extra work. This is the mechanic’s quiet superpower and a legitimate reason to choose it when attribution is the priority. The trap is mistaking redemption for incrementality: a Honey user whose extension auto-applied your code was buying anyway, and that redemption measures leak, not persuasion. Watch where redemptions come from, and treat a sudden redemption spike with flat traffic as a leak signal, not a success signal.

Markdowns are invisible to discount reporting, as covered above — the sale simply happens at the new price. Measuring them means measuring velocity: units per week before versus during the markdown, sell-through rate against the clearance deadline, and gross margin dollars recovered versus the write-down alternative. That requires recording the original price, the markdown date, and the depth somewhere outside the order data, because once the price changes, Shopify’s reports have no memory of what it used to be. This bookkeeping is one of the things Auto Markdown handles for us automatically — every rule keeps its price history, so before-and-after velocity is a report, not an archaeology project.

Bundles are measured in attach rate and AOV shift. The questions that matter: what share of eligible orders took the bundle, how much did average order value move, and — the one merchants skip — how many bundle takers were already multi-unit buyers. If units per transaction was 1.8 before the bundle and the bundle’s attach rate is high but UPT barely moves, you are discounting behavior that already existed.

For every mechanic, the honest test is a control. Hold out a comparable collection, region, or time window without the discount and compare. It is unglamorous, and it is the only way to separate “the discount worked” from “we were going to have a good week anyway.” If you need tooling for any of this — bundle builders with attach-rate reporting, code managers with leak detection, markdown schedulers — we keep a category-by-category rundown current in our guide to the best Shopify discount apps in 2026.

Combinations that work — and combinations that backfire

The mechanics are not mutually exclusive, and mature stores usually run all three at once. The difference between a discount system and a discount mess is whether each mechanic keeps its own job.

Combinations that work

  • Markdown + bundle on clearance stock. “Last sizes: any 2 for a further 10% off” deepens the effective clearance discount only for customers who take more units off your hands — you buy extra velocity with margin you were going to spend on the next markdown tier anyway.
  • Acquisition code + AOV bundle, running simultaneously. Different jobs, different triggers, no overlap: the code gates on customer identity, the bundle gates on cart contents. This pair is the everyday steady state we recommend for most stores.
  • Seasonal markdown + early-access code. The code gates timing, not extra depth — your list shops the same markdown prices a day before the public. Loyalty gets genuine exclusivity, and the stack risk is zero because the code carries no discount of its own.
  • Bundle anchored by a full-price hero. Pair a bestseller at full price with a slow mover at a bundle discount. The hero supplies the demand; the slow mover rides along. This is the one honest way a bundle helps with clearance.

Combinations that backfire

  • Code on top of markdown. The double-dip from the stacking section. Unless you have consciously priced for the combined depth, exclude sale items from every code.
  • Sitewide code and sitewide markdown in the same window. Beyond the stacking risk, it reads as chaos: two different discount stories competing on the same products, and the customer concludes your pricing is negotiable.
  • Evergreen welcome code + frequent markdown events. Individually reasonable; together they guarantee that everyone always qualifies for something, which is functionally a permanent price cut split across two systems where neither report shows its full size.
  • Bundling two slow movers. Two products nobody wanted, now available as a set. The bundle inherits the demand of its most demanded component — pair accordingly.
  • Deep bundle + free-shipping threshold set too low. If the bundle discount drops the order below your free-shipping breakeven, the two mechanics team up against your contribution margin. Re-check the threshold whenever bundle math changes.

Common mistakes

These are the failures we see most often — on merchant stores, and a couple of them in our own history, which is how they earned their place on the list.

  1. Using a code to clear inventory. The gate throttles reach on a goal that is entirely about reach. If the stock needs to go, the price cut needs to be visible to everyone.
  2. Marking down to acquire customers. Zero targeting means most of the spend lands on existing customers, and the public price cut damages the anchor for everyone — you paid the perception cost without getting the exclusivity benefit.
  3. Judging codes by redemption count. Redemptions measure how far the code spread, not how many sales it caused. Segment redemptions by new versus returning customers before calling a code successful.
  4. Leaving compare-at prices up after the sale ends. A permanent strikethrough is a fake discount. Customers eventually notice, and reference-pricing rules in a growing list of jurisdictions treat a was-price that was never the real price as a legal problem, not just a trust problem. Every markdown needs a scheduled revert — this is precisely why we built reverts into Auto Markdown as a default, not an option.
  5. Running discounts on a predictable calendar. If the 20%-off email lands the first Friday of every month, customers stop buying the other 27 days. Vary the timing, the mechanic, and the depth.
  6. Setting depth from competitors instead of margin. Their 40% may sit on a 70% margin; yours may not. Run the profit math on your own numbers before matching anyone’s headline.
  7. Forgetting that each mechanic reports differently. Codes appear in discount reports, markdowns do not, and bundles depend on implementation. Merchants who total their “discount spend” from Shopify’s Discounts column alone are usually undercounting by whatever their markdowns cost.
  8. Building bundles without checking component inventory. A bundle sells at the pace of its scarcest component. When one part sells out, the offer dies with units of the other component still on the shelf — match component depth before you launch the set.

FAQ

What’s the difference between a price reduction and a discount code on Shopify?

A price reduction (markdown) changes the product’s actual price, publicly, for every visitor — on Shopify you lower the variant price and set a compare-at price to show the strikethrough. A discount code leaves the listed price intact and applies the reduction only at checkout, only for customers who enter the code. The practical differences follow from that: markdowns maximize reach and show up in shopping feeds; codes allow targeting and are logged as discounts in Shopify’s reports, which markdowns are not.

Which hurts margins more, a markdown or a coupon code?

At the same percentage, a markdown costs more in total because every buyer receives it, including everyone who would have paid full price. A coupon’s cost scales with its redemption rate — cheap while the code stays contained, and approaching markdown-level cost as the code leaks to coupon extensions and aggregators. The honest comparison is blended margin across all orders, not the per-redemption number.

Can customers stack a discount code on top of a markdown?

Yes, by default. Shopify treats a marked-down price as simply the current price, so any applicable code discounts it further — a 30% markdown plus a 20% code is a 44% combined cut. Shopify’s combination settings only govern how codes and automatic discounts stack with each other, not with price changes. Protect yourself by scoping codes to exclude sale collections and pausing evergreen codes during markdown events.

Do bundles count as discounts in Shopify reports?

It depends on the implementation. Bundles built as Buy X Get Y or automatic discounts appear in discount reporting; fixed-price bundle products and some app-based bundles record as ordinary sales at the bundle price, with no discount line at all. Before launching, place a test order and check how it lands in your reports — otherwise your bundle spend can be invisible in the same way markdown spend is.

Which Shopify discount type is best for Black Friday?

Lead with visible markdowns: event shoppers compare prices across tabs in seconds, strikethroughs advertise themselves in collection grids and shopping feeds, and codes add friction at your highest-traffic moment while sending customers off to search for better ones. Use bundles to defend margin on products you will not mark down, and reserve codes for early list access. Our Black Friday markdown strategy guide covers the full sequencing.

How do I stop coupon extensions like Honey from leaking my codes?

You cannot fully stop it, but you can contain it: issue unique one-per-customer codes instead of shared ones (unique codes are worthless to aggregators), set short expiry windows, scope codes to segments such as first-time buyers, and monitor redemption sources so a leak shows up in days rather than months. For discounts that were never meant to be exclusive, automatic discounts sidestep the problem entirely — there is no code to harvest.


— Palm Beach Themes is a Miami-based Shopify app studio. We use the apps we sell, so every claim in this post comes from our own merchant testing.

If your next discount decision points to a markdown — clearance, end of season, or an event — the mechanics of scheduling price changes, setting compare-at strikethroughs, and reverting everything on time are exactly what Auto Markdown automates. Set the rule once, and the prices change and change back on schedule, with the history kept for your reporting.