Nobody decided to do this
No brand sets out to become promotionally dependent. It accretes. A welcome code gets added to lift email capture. Cart abandonment gets a code because the version without one converted worse in a two-week test. Browse abandonment inherits the code because it's the same template. Win-back gets one because lapsed customers need a reason. Post-purchase gets one to drive the second order.
Each decision was locally correct and tested. The problem is that no one ever evaluates the portfolio. A customer moving through a year of your lifecycle program encounters a code at nearly every touchpoint, and what they learn from that sequence is not what any individual test measured.
What they learn is simple and rational: waiting is profitable. Add to cart and leave — a code arrives in an hour. Browse and bounce — a code arrives tomorrow. Go quiet for three months — a code arrives with a better offer than the one you skipped. The customer isn't gaming you. You published the rules and they read them.
Every always-on flow with a code in it is a standing offer. You are not running promotions; you are running a permanent secondary price list that rewards hesitation.
Why retention dashboards can't see it
Here's what makes this hard to catch: discount-conditioned customers usually retain fine. Sometimes better.
They open emails — there's often something in them. They click. They buy repeatedly. Repeat purchase rate, second-order rate, email engagement, order frequency: all healthy or better. A retention dashboard built on order counts will show this cohort as a success story.
The damage is entirely in the margin line, and the margin line is usually blended across all customers, so a growing promotional cohort dilutes it slowly enough that nobody can point at a month where it broke. Contribution margin drifts a point a year — 43%, then 41%, then 39% — everyone attributes it to rising COGS and shipping, and the actual driver, a rising share of orders arriving with a code attached, is never plotted.
You cannot see this problem without splitting your cohorts by promotional behavior. It is invisible in every standard view.
The cohort comparison, worked
Take two cohorts of 1,000 customers each from the same brand: $92 AOV at full price, 44% gross-of-discount contribution margin, so $40.48 of contribution on a clean order.
Cohort A — acquired at full price. Over 24 months they average 3.1 orders. 22% of those orders carry a promotion, averaging 14% off.
- 3.1 orders × $40.48 = $125.49 before discount effects
- Discount drag: 3.1 × 0.22 × ($92 × 0.14) = −$8.79
- Lifetime contribution: $116.70
Cohort B — acquired on a 20% welcome code. Over 24 months they average 3.0 orders — essentially identical retention, which is exactly why this passes unnoticed. But 71% of their orders carry a promotion, averaging 17% off.
- 3.0 orders × $40.48 = $121.44 before discount effects
- Discount drag: 3.0 × 0.71 × ($92 × 0.17) = −$33.31
- Lifetime contribution: $88.13
The gap is $28.57 per customer — 24% of lifetime value — on a 0.1-order difference in retention. Across 4,000 acquisitions a month, a cohort mix that shifts 25 points toward discount-conditioned behavior costs roughly $343,000 a year in lifetime contribution margin. And it never appears as a line item. It appears as "margin pressure."
Note the second-order effect on acquisition. Cohort B's lower lifetime contribution means you can afford less CAC for them — but they were acquired through a discount mechanism that likely reported better CAC. The channel looked cheap and delivered customers worth 24% less.
See what a standing discount costs over a customer's life — free, no login
Run both cohorts through the LTV Estimator — same order count, different promo-attached rate — and the gap stops being theoretical.
Open the LTV Estimator →Measure your promo-attached rate
One metric makes the whole thing visible: promo-attached rate — the share of orders carrying any discount code, plotted over time and cut by cohort.
Three cuts do the work. By acquisition cohort, to see whether newer cohorts are more conditioned than older ones — a rising line means the problem is compounding. By first-order discount status, comparing customers whose first order had a code against those whose didn't. By order number, to see whether dependency deepens with tenure or fades.
Be careful with the second one, because it's the cut most likely to overstate the case. Customers who take a welcome code may simply be more price-sensitive to begin with — the code didn't necessarily create the behavior, it may just have selected for it. That's a self-selected split, not a randomized one, and this post has spent several sections insisting that distinction matters. Treat the gap as an upper bound on the conditioning effect, and if the number is large enough to act on, earn the causal claim properly: randomize the first-order offer across a slice of new traffic for a quarter and compare the cohorts' promo-attached rates a year out. That's the test that separates training from sorting, and almost nobody runs it.
Pair it with effective discount rate — total discount dollars divided by gross revenue — which captures depth as well as frequency. A brand whose promo-attached rate is flat but whose effective discount rate is climbing is discounting deeper to hold the same conversion, which is the late stage of the same disease.
Both numbers belong in the monthly margin review next to COGS and shipping. The related mechanics of how discounting and returns compound against each other are covered in how returns and discounts quietly compress your margins.
Which flows are actually paying for themselves
Not every code is a mistake. The question for each flow is whether the discount is buying conversion that wouldn't otherwise happen — and the answer differs sharply by flow.
Cart abandonment for returning customers is the worst offender. These are people who know the brand, chose the product, and got to checkout. A large share complete anyway. A code here is close to pure giveaway, and it's the single most reliable place to find margin with a holdout test.
Browse abandonment is usually low-intent, and a discount rarely converts genuine browsing into buying — it mostly catches people who were already close. Low volume, low stakes, but also low justification.
Welcome is the most defensible and the most consequential. It genuinely lifts email capture and first-order conversion. It also sets the reference price for the entire relationship, which is why the cohort effect above is so large. If you keep a code anywhere, keep it here — but consider whether the same capture can be bought with something that isn't a price signal.
Post-purchase and replenishment flows are aimed at customers with demonstrated intent and a consumption clock. A code here frequently accelerates an order that was coming anyway, which is the same interception problem as a mistimed win-back trigger.
What replaces a code
Removing a discount without replacing the reason to act just lowers conversion. The substitutes that hold up:
- Free shipping at a threshold. Costs you less than an equivalent percentage discount, and it raises order value rather than lowering it.
- A gift with purchase priced at cost rather than retail — the perceived value is the retail price, the P&L hit is the cost.
- Access and timing — early access to a drop, a restock alert, first look at a new product. Zero margin cost, and it rewards loyalty without repricing the catalog.
- Bundle value instead of a percentage off, which shifts the conversation from price to quantity. The margin trade-offs there are worth modeling properly — see bundles don't raise AOV.
- Removing friction instead of price — extended returns, a clearer size guide, a payment option. Frequently the actual blocker was never cost.
Unwinding without a revenue hole
Pulling every code at once produces a visible conversion drop, an internal panic, and a reversal within three weeks. The sequence that survives contact:
- Baseline first. Promo-attached rate and effective discount rate, by cohort, for the trailing 24 months. You need the starting point to defend the outcome.
- Start with the lowest-justification flow — cart abandonment for returning customers — and hold a control group.
- Measure in contribution margin per recipient, not conversion rate. Conversion will fall. That is expected and is not the metric.
- Shrink before you remove. 20% to 15% to 10% is more survivable than 20% to nothing, and each step tells you the elasticity.
- Replace, don't just delete — pair each removal with a non-price reason to act.
- Give it two quarters. Conditioning took years to build and doesn't unwind in a month; judging at four weeks guarantees you abandon a working change.
- Protect the welcome code last, and only after you've measured whether its cohort effect justifies the capture it buys.
Common questions
What is discount dependency in ecommerce?
Discount dependency is the state where a meaningful share of your customer base will not purchase without a promotion, because past experience taught them that one is always available. It develops gradually when discount codes are embedded in always-on lifecycle flows such as welcome, browse abandonment, cart abandonment and win-back. Customers learn the pattern, and the behavior tends to persist across future purchases, which is why the cost is not limited to the discounted order that triggered it. Note that observational cohort splits overstate this effect, since customers who take codes may be more price-sensitive to begin with; a randomized first-order offer test is what separates conditioning from self-selection.
Does a welcome discount hurt long-term customer value?
Usually yes, though the effect shows up in margin rather than in repeat rate. In the cohorts I have split this way, customers acquired on a welcome discount frequently show similar or only slightly lower repeat purchase rates than full-price cohorts, which makes the discount look harmless on a retention dashboard. The difference appears in the share of their subsequent orders that also carry a promotion. Because those customers were acquired on price, they tend to keep transacting on price, so their lifetime contribution margin runs materially below a full-price cohort even at equal order counts.
How do you reduce discount dependency without losing revenue?
Remove codes from always-on flows gradually and by segment rather than all at once. Start with the flows reaching customers who are already high-intent, such as cart abandonment for returning buyers, since those recipients are the least likely to need an incentive. Replace the code with a non-price reason to act, such as free shipping at a threshold, a restock notification, or a bundle, and hold a control group so you can measure the difference in contribution margin rather than in order count. Order volume will usually dip; whether margin dollars rise is exactly what the control group is there to tell you.
Price your own dependency
The diagnostic question is uncomfortably simple: what share of your orders in the last 90 days carried a code, and how does that compare to three years ago? Most brands have never plotted it, and the line is almost always going the wrong way.
The cost isn't the discount on any single order. It's that a growing share of your customer base has correctly concluded that your list price is optional — and that conclusion is durable, transferable to new customers through the same flows, and invisible in every metric except the one at the bottom of the P&L.
Want to know what promotional conditioning is costing your lifetime value?
I split your cohorts by promo-attached rate, size the lifetime contribution gap between discount-acquired and full-price customers, and sequence an unwind that doesn't blow a hole in the quarter. Starts with a free diagnostic call.
Request a free audit →Mike Emerson
Mike writes Ecommerce Cure, an independent consulting practice for DTC and mid-market operators who work in contribution margin rather than revenue. Every framework here is diagnostic-first and shows its arithmetic. About the practice · Free P&L tools