Discounts don't show up as a cost line, so they feel free. They aren't. At the median ecommerce contribution margin, a 20% off code doesn't reduce profit. It erases it.

Discounting is the only growth lever that never shows up as a cost.
Ad spend has an invoice. Headcount has a payroll line. Apps have a monthly charge you can see in your Shopify bill. A discount code has none of that. It just quietly makes every order smaller, and because revenue still goes up, it reads as a win.
That's why stores discount by reflex. Not by decision.
The math nobody runs

Start with what a store actually keeps.
Median gross margin across ecommerce sits around 57%. That's the number most founders have in their head, and at 57% a 20% discount sounds survivable.
Contribution margin is the honest number. It's what's left after the product, the shipping, the payment fees and the ad spend that brought the order in. Median contribution margin lands between 15% and 20%.
Now run the 20% off code against that.
A twenty percent discount comes off the top line. Your costs don't move. The product still costs what it cost, shipping still costs what it cost, and you already paid to acquire that customer. So the discount comes out of the 15 to 20 points you were keeping.
It doesn't reduce your profit on that order. It removes it.
Sell more units at that price and you lose money faster. This is the part that catches people, because the dashboard is green the whole time.
At the low end it's worse. A quarter of stores run at a 3% contribution margin. For them a 5% off code is already underwater.
When a discount genuinely pays
Four situations. They're narrower than most stores assume.
You're buying a first order from someone who'll reorder. This is the real one. If your repeat rate is strong, a discounted first purchase is customer acquisition with a better conversion rate than ads. The math works if you know your repeat rate. If you don't know it, you're not doing this, you're hoping.
You're clearing inventory that costs you money to hold. Seasonal stock, a discontinued colorway, anything sitting in a 3PL accruing storage fees. Here the alternative isn't full price. It's the write-off.
You're moving someone over a threshold. Free shipping at $75 when the average order is $58 isn't really a discount. It's a target, and it usually raises the order rather than shrinking it.
You're trading the discount for something. An email address, an SMS opt-in, a review, a subscription signup. You gave up margin and got an asset. That's a purchase, not a giveaway.
Notice what's missing. "Sales were slow this week" isn't on the list.
When it's just paying for orders you already had
The expensive failure is the code that goes to people who were going to buy anyway.
Site-wide codes do this by design. So does the popup that fires on every first visit with 10% off, and the abandoned cart email that opens with a discount instead of ending with one. In each case the people most likely to use the code are the people furthest along, which is to say the people you'd already convinced.
There's a second cost that's harder to see. Run enough site-wide sales and you teach your list to wait. Regular buyers stop buying at full price because they know a code is coming, and your baseline quietly resets to the discounted number. Getting that back takes quarters, not weeks.
And the discount code field itself does damage. A visitor at checkout who sees an empty promo box and doesn't have a code now has a reason to leave and go looking. Cart abandonment already runs between 70% and 74%. You don't need to add a door.
Things to try before you cut price
Raise the threshold instead of lowering the price. Free shipping over $X moves basket size up. A percentage off moves it down.
Bundle rather than discount. Three for the price of two feels like a deal and holds your unit economics better than 33% off one item, because the customer is buying more.
Fix the reason they hesitated. Most carts don't fail on price. They fail on a shipping cost that appears late, a returns policy nobody can find, a size question the page doesn't answer. Those cost nothing to fix and they don't train anyone to wait for a sale.
Make the offer conditional. First order only, or a specific segment, or a genuine deadline. A code everyone can use is a price change with extra steps.
How to actually know
Everything above is a hypothesis about your store. The only way to settle it is to run the thing both ways and look at revenue, not conversion rate.
That distinction matters more here than anywhere else. A discount will almost always raise conversion rate. That's what discounts do. If you judge the test on conversion you'll conclude every discount works, and you'll be wrong every time, because the metric that moved isn't the metric you eat.
Judge it on revenue per visitor and contribution per order. Same traffic, same window, one group sees the code and one doesn't.
This is the work we built Qosmic to do. The audit finds the offer worth testing, then we build the variant and adjudicate it against real revenue, both halves, so the answer is a number rather than an argument.
You don't need us for this. A developer, a split-testing setup and a spreadsheet will get you the same answer, and plenty of good teams run it exactly that way. It takes longer and somebody has to own it every week, which is usually where it stops.
The short version
- A discount comes out of contribution margin, not gross margin. At the median that's 15 to 20 points, which is most of what you keep.
- Four situations justify it: acquiring a repeat customer, clearing inventory, crossing a threshold, or trading margin for an asset.
- A slow week isn't one of them.
- Site-wide codes mostly subsidize people who had already decided.
- Judge discount tests on revenue per visitor. Conversion rate will lie to you here.



