TL;DR
A 20% discount on a 30% gross-margin product requires a 300% increase in unit volume just to break even on absolute profit, not 20% more. Shopify’s own reporting splits discount data across “Sales by discount” and “Discounts by order,” which often show different totals, creating a margin-blind spot for merchants. Adobe’s 2025 holiday data shows electronics discounts averaged 30.9%, apparel 25%, and toys 27%, far deeper than typical off-season promotions.
Shopify’s BFCM 2025 data confirms average cart sizes jump to 3.4 items (vs. ~2.1 normally), making cannibalization nearly impossible to isolate without proper tracking. The audit’s bottom line: base discount decisions on per-SKU gross margin, not discount depth alone, and use the price waterfall framework to trace where stacked deductions erode net profit.
Does discounting actually erode margin, or just revenue?
Both, but not proportionally — and that's the part most Shopify merchants get wrong. A discount comes off the top line while your cost of goods sold (COGS), shipping, and payment processing stay fixed. That means margin percentage falls faster than revenue does. The standard break-even math: if your gross margin is m and you discount by d, you need a volume increase of roughly d ÷ (m − d) just to hold total profit flat. At a 30% starting margin, a 20% discount requires roughly 3x the unit volume to break even on absolute profit — not 20% more, three times more. At a 50% starting margin, the same 20% discount only requires about 67% more volume. Starting margin, not discount depth alone, determines how dangerous a promotion is.
This matters because Shopify's own discount tooling doesn't calculate any of this for you. It tracks what was discounted and by how much — not whether the resulting order was still profitable. That gap is what this audit is built to close.
Definitions, so the audit terms are unambiguous
- Discount class: Shopify groups every discount as a Product, Order, or Shipping discount. Combination rules ("Combine with other discounts") are set per class, not per discount — this is the mechanism that governs stacking.
- Discount stacking: when two or more discounts apply to the same order. Shopify applies them sequentially, not additively — a 10% order discount followed by a 20% product discount yields 28% off, not 30%, because the second discount applies to the already-reduced price.
- Gross margin vs. net margin: gross margin is (price − COGS) ÷ price, before marketing, fulfillment, and overhead. Discount audits should work off gross margin per SKU, since that's the layer a promotion directly attacks.
- Cannibalization: revenue from a discount that would have happened anyway at full price. This is the hardest thing in this whole exercise to measure honestly, and I'll come back to that.
- Incremental lift: revenue that would not have occurred without the discount — new customers, moved-up purchase timing, or larger basket size.
What the evidence actually shows
Direct answer: Three sources are worth grounding this in, because "discounting is risky" is not itself a testable claim — the mechanics and the data are.
Shopify's own combination and reporting mechanics are the ground truth for how discounts behave on your store. Per Shopify's documentation, each discount code or automatic discount can be set to combine with other discounts by class, and a shopper is capped at five discount codes per order regardless of combinability. Reporting is split across two places that don't always reconcile cleanly: "Sales by discount" lives under Sales reports, while "Discounts by order" lives under Finance reports, and Shopify's own merchant community has documented cases where discount usage counts differ between the discount's built-in "Performance" view and the "Sales by discount" report. That reporting split is itself a source of margin-risk blind spots — if your finance and marketing teams are pulling from different reports, they can walk into a promo debrief with two different discount totals.
Adobe's Digital Insights data on the 2025 holiday season is the closest thing to a real, dated benchmark for discount depth in practice. Adobe tracked average discounts by category through the 2025 season and reported electronics discounts peaking around 30.9% off list, with apparel around 25% and toys around 27% — all deeper than typical non-holiday promotions. Adobe's wrap-up attributed part of the season's $257.8 billion in U.S. online spend (up 6.8% year over year, ahead of its own 5.3% forecast) directly to that discount depth plus buy-now-pay-later availability. The takeaway for an audit isn't "discount to 30%" — it's that discount depth is highly seasonal, and comparing a random Tuesday promo against BFCM-week pricing is comparing two different games.
Shopify's own BFCM 2025 numbers back that up from the merchant side: BFCM weekend sales across the platform hit $14.6 billion, up 27% year over year, with average order value at $114.70 (up from $102.10 in 2022) and average cart size climbing to 3.4 items during the weekend versus roughly 2.1 outside of it. Larger baskets during heavy-discount windows is exactly the kind of behavior that makes cannibalization hard to isolate — did the discount cause the bigger basket, or did people who were already going to buy in bulk just wait for BFCM?
McKinsey's pricing and promotions research frames the mechanism generally: their "price waterfall" framework, described in McKinsey's work on markdown pricing, traces every deduction between list price and the margin you actually collect — discounts, promotions, freight, payment terms — and argues that most margin leakage happens because companies don't have visibility into where those deductions stack up. Separately, McKinsey's retail pricing-and-promotions analytics work reports that companies who link pricing and promotion decisions analytically, rather than running promotions ad hoc, have captured three-to-five percent gains in combined revenue and margin. Their guidance is consistently to route promotional decisions through data on which promotions produce incremental demand versus which ones simply subsidize sales that were happening anyway — not to set a universal "safe" discount ceiling.
There's also older academic grounding for why repeated discounting changes customer behavior beyond a single order. Consumer research on reference-price adaptation — going back to Lattin and Bucklin's 1989 model in the Journal of Marketing Research, and synthesized in Mazumdar, Raj, and Sinha's 2005 review in the Journal of Marketing — shows that customers form an internal reference price from repeated exposure to promotions, and that reference price becomes the benchmark against which they judge your regular price going forward. This is the mechanism behind "discount fatigue": it's not that any single promotion is unprofitable, it's that repeated exposure resets what customers consider your real price.
A margin-impact framework
Direct answer: Use this table to translate any discount you're running into the volume lift required to avoid losing absolute profit, based on the break-even formula above (d ÷ (m − d)):
| Starting gross margin | 10% discount | 20% discount | 30% discount |
|---|---|---|---|
| 70% | +17% volume needed | +40% volume needed | +75% volume needed |
| 50% | +25% volume needed | +67% volume needed | +150% volume needed |
| 30% | +50% volume needed | +200% volume needed | Margin goes negative |
Read this as a floor test, not a forecast: if the discount you're running requires volume lift beyond what's realistic for the SKU and channel, it's structurally margin-negative regardless of how good the creative or targeting is. Note the bottom-right cell — at a 30% starting margin, a 30% discount eliminates gross margin entirely before you sell a single incremental unit.
The audit: 9 steps
- Pull both discount reports and reconcile them. Export Shopify's "Sales by discount" (Analytics > Reports > Sales) and "Discounts by order" (Finance reports) for the same period. If the totals or order counts don't match, resolve that before drawing conclusions from either.
- Tag every active discount by class and combinability. For each live discount, record whether it's a Product, Order, or Shipping discount, and whether "Combine with other discounts" is enabled — this determines your actual stacking exposure, not just what's visible in a single discount's settings.
- Attach true landed COGS to every discounted SKU. Not wholesale cost — landed cost including inbound freight, duties, and packaging. Discount audits built on wholesale price alone systematically overstate margin.
- Run each active discount depth through the margin-impact table. Flag any discount whose required volume lift is unrealistic for that product's typical sell-through rate.
- Segment discount usage by new vs. returning customer. Shopify doesn't do this natively in the discount reports — you'll need to cross-reference against customer order history or tags. This is your best available proxy for incremental vs. cannibalized demand, even though it's not a clean causal measure (see limitations below).
- Check return rates on discounted orders against full-price orders. A materially higher return rate on discounted SKUs erodes margin beyond the discount itself once restocking and reverse-shipping costs are included.
- Audit for unintended stacking. Look for orders where the total discount percentage exceeds any single discount you intentionally created — that's stacking working as designed, but possibly not as budgeted.
- Set a minimum-margin floor per SKU or collection, below which no discount — including stacked ones — can push the effective price. Shopify's five-discount-code-per-order cap limits stacking depth but doesn't enforce a margin floor; that has to be a policy decision, and on Shopify Plus it can be enforced with a Shopify Function.
- Re-run this after every high-volume promotional window, not just on a fixed quarterly calendar. Seasonal discount depth (per Adobe's data, materially deeper around BFCM than the rest of the year) means a static audit cadence will miss the periods where margin is most exposed.
Limitations — read this before you trust the output
Direct answer: Attribution is genuinely hard, not just tedious. Knowing a discount code was used on an order tells you the discount was applied — it does not tell you the customer wouldn't have purchased anyway. Distinguishing incremental lift from cannibalization properly requires a controlled comparison: a holdout group that didn't receive the offer, or a genuine before/after test with a stable baseline. Segmenting by new-vs-returning customer (step 5) is a reasonable proxy, not a substitute for that.
Seasonality confounds every comparison. Adobe's and Shopify's own data show discount depth and basket size both move together around BFCM and other high-traffic windows. That means a spike in discounted revenue during a seasonal event isn't evidence the discount worked — sales were already going to be elevated. Compare discount performance against the same calendar period in a prior year, not against your store's average week.
Native Shopify reporting stops at discount amount, not margin. Nothing in Shopify's built-in analytics joins discount data to product cost data automatically. Every margin figure in this audit requires manually (or programmatically) combining discount reports with a COGS source — Shopify doesn't do that join for you, and third-party numbers you see quoted elsewhere about "typical" discount rates or margin impact by category are frequently unsourced blog estimates rather than platform data. Treat any external benchmark, including the ones in this piece, as directional, not a target to hit.
Where nqzai fits
nqzai can connect to your Shopify store's order and discount data and surface it inside a diagnostic conversation — pulling discount usage, order-level totals, and product cost fields you've provided, and flagging orders or SKUs where discount depth looks out of line with margin. It's not a dedicated discount-audit product with its own workflow; it's a way to ask the questions in this piece against your actual store data without exporting three separate reports and reconciling them by hand first. If you haven't connected product cost data, nqzai will tell you that's missing rather than estimate a margin figure it can't actually support.
FAQ
Does every discount hurt margin?
Not inherently — a discount that drives genuinely incremental demand (a customer who wouldn't have bought otherwise) can be margin-positive even at meaningful depth. The risk is in discounts that mostly redirect purchases that were going to happen at full price anyway, which is common and hard to detect without a controlled test.
How do I know if a discount is cannibalizing full-price sales?
You can't know with certainty from order data alone. The reliable method is a holdout test — withhold the offer from a comparable segment and compare outcomes. Absent that, watch for proxy signals: a spike in discount usage among repeat customers who buy at a predictable cadence, or a dip in full-price sales in the days immediately before a known promotion (customers delaying purchase to wait for it).
Can Shopify's native reports tell me discount-adjusted margin?
No. Shopify's reports show gross sales, discounts, and net sales — not margin, because margin requires product cost data that lives outside the discount reporting system. You have to join it yourself.
What's a "safe" discount depth?
There isn't a universal number. Adobe's 2025 holiday data shows category discount depth ranging from roughly 18% (non-holiday promotional events) to over 30% (electronics during peak season) — and both can be profitable or unprofitable depending on your starting margin and whether the demand is incremental. Use the margin-impact table above against your own gross margin, not an industry average.
Does stacking two discounts just add the percentages?
No — Shopify applies combinable discounts sequentially, each on the already-reduced price, so two 15% discounts produce about 27.75% off, not 30%. It compounds, but slightly less than naive addition suggests.
How often should this audit run?
At minimum quarterly, plus immediately after any high-volume promotional window (BFCM, a major site-wide sale) since that's when discount depth and stacking exposure are both at their highest.