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.

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.

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:

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:

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