Is Your Shopify Loyalty Program Cannibalizing Full-Price Sales? How to Fix Discount Targeting
Your repeat-purchase rate looks great, but margin is sliding. The culprit is often a loyalty setup that trains buyers to wait for the discount. Here's how to retarget it.
Priya runs Combe & Co, a $3.2M skincare brand on Shopify. On paper her retention looked like a win. Repeat-purchase rate up eleven points year over year, loyalty program adoption strong, email list engaged. The board slide practically wrote itself.
Then her finance lead pulled blended margin by cohort, and the slide fell apart. The customers buying most often were buying almost exclusively on a code. Strip the discounts out and a big slice of that “retention” was people who used to pay full price, now waiting for the 20% email that landed like clockwork every three weeks.
She hadn’t built loyalty. She’d built a schedule, and her customers had learned to read it.
A merchant we got on a retention audit call with named the trap before we could: “The myth that any loyalty program automatically boosts retention is a common trap. What you’re seeing, customers just waiting for discounts, isn’t new loyalty.” That sentence has cost more brands more margin than almost any other mistake we see.
When repeat purchases are quietly costing you money
A repeat purchase feels like an unambiguous good. Someone came back. The metric went up. Everyone claps.
But not all repeats are worth the same. A customer who would have bought at full price and instead used your 20% code didn’t become more loyal, they just got cheaper, and you funded the discount out of your own margin for a sale you already had. Scale that across a few thousand orders a quarter and the leak gets serious fast.
The cruelty of it is that the dashboard never flinches. Repeat rate, redemption rate, list growth, all green. The damage hides one layer down, in contribution margin per cohort, which is the number almost nobody puts on the weekly review. So the program looks like it’s working right up until someone divides revenue by what it actually cost to earn.
Discounting isn’t evil. Untargeted discounting is. The difference is whether the dollar you gave away changed a behavior or just subsidized one that was already happening.
How to spot it in your own numbers
You can find this in a couple of hours with the data already sitting in Shopify.
Pull your repeat buyers and split them by how often they used a discount code. A healthy program has a spread, some full-price loyalists, some discount-driven, plenty in between. A cannibalizing program has a fat clump of “repeat” customers whose orders are almost all discounted, and a full-price segment that’s quietly shrinking as people figure out the rhythm.
Then look at timing. If a meaningful share of your orders cluster in the days right after each promo email, and go quiet in between, your customers have learned your cadence and are pacing their purchases to it. That trough between sends is the tell. It’s demand you trained to wait.
The third signal is the saddest one. Watch what happens to your full-price conversion rate over the quarters after you launch or intensify a loyalty program. If it drifts down while discounted orders climb, you didn’t add incremental sales. You moved existing ones from full price to discounted and called the migration “retention.”
None of this means kill the program. It means you’ve found the part of it that’s paying people to do what they’d have done anyway.
Not every repeat buyer is the same
The whole fix lives in one idea: stop treating your customer base as a single audience that all gets the same offer.
There’s the customer who buys when she runs out, code or no code, because she likes the product and reordering is easy. Send her a discount and you’ve simply handed her money. Then there’s the customer who tried you once, liked it fine, and drifted, the one who genuinely needs a reason to come back. A well-aimed offer to him is incremental revenue you would not otherwise have seen. Same discount, wildly different return, entirely because of who received it.
Shopify gives you the raw material to tell them apart. Customer segments let you build groups off real behavior: last order date, lifetime order count, total spend, whether they’ve ever used a code. The segment that matters most is usually “bought before, hasn’t ordered in X days,” because that’s where a discount actually changes an outcome instead of subsidizing one.
Get the segments right and the discount stops being a blanket you throw over everyone. It becomes a tool you point at the specific people whose behavior it can actually move.
Reward the behavior you actually want
Once you can see the segments, the question shifts from “should I discount” to “who, and for what.”
Hold your loyal full-price buyers out of the discount flows almost entirely. They don’t need a code to come back, and every one you send them is pure margin erosion dressed up as a thank-you. If you want to reward them, and you should, reward them with something that isn’t a price cut: early access, a genuinely useful gift, faster shipping, a product they can’t get elsewhere. You keep the relationship warm without teaching them to wait for the next markdown.
Aim the actual discounts at the people on the edge of leaving. A lapsed-buyer offer, sized to the moment, recovers revenue that was otherwise walking out the door, and it does it without touching the customers who’d have paid full freight. That’s the entire game. Spend the discount where it changes a decision, withhold it where it doesn’t.
It feels counterintuitive to give your best customers the smallest price breaks. It’s also exactly right, because they’re the ones least at risk and most expensive to discount.
Loyalty beyond percent-off
Part of why brands fall into the discount trap is that “loyalty program” has quietly become a synonym for “points that convert to money off.” It doesn’t have to be.
Percent-off rewards train price sensitivity by design, because the reward is literally a lower price, so the customer learns that buying is about getting the number down. Swap in rewards that build attachment instead and the conditioning changes. Think early access to launches, members-only products, a tiering system where status itself is the perk, a meaningful free gift at a spend threshold, or a brand experience that has nothing to do with a markdown. These cost you something too, but they don’t teach the one lesson you can’t afford: that full price is for suckers who didn’t wait.
The strongest programs we see use price discounts sparingly and reserve them for winning back people who’ve gone quiet. Everything aimed at active, happy customers is about access and recognition, not a coupon. The reward reinforces the relationship rather than discounting the next transaction.
Building lapsed-only discount flows
This is where the theory becomes plumbing, and Klaviyo (or your ESP of choice) is where most of it gets built.
The pattern is a win-back flow that only fires for people who’ve crossed a lapse threshold, say no purchase in 60 or 90 days, and that explicitly excludes anyone currently active. The trigger is the gap, not the calendar. That single design choice, gating the discount behind inactivity instead of blasting it on a schedule, is what stops you from handing codes to customers who were about to buy anyway. Klaviyo’s segmentation docs walk through building these conditions.
A few things make or break it in practice. Suppress your full-price loyalists from the flow entirely, so a happy monthly buyer never accidentally lands in a “we miss you, here’s 20%” email. Escalate gently, a soft nudge before any money comes off, since some lapsed buyers return on a reminder alone and never needed the discount. And cap how often a single customer can receive a win-back offer, or you’ve just rebuilt the predictable cadence you were trying to kill, only with extra steps.
Set up well, the flow becomes nearly invisible to your loyal base and sharply present for the people drifting away. That asymmetry is the whole point.
Measure incrementality, not redemptions
Here’s the metric that quietly ruins loyalty programs: redemption rate. A high redemption rate just means lots of people used your code. It says nothing about whether any of them would have bought without it.
The number that actually matters is incremental revenue, and you get it by holding out. Before you launch a discount to a segment, randomly carve off a slice of that segment and send them nothing. Compare what the discounted group spends against what the holdout spends on its own. The gap, minus the margin you gave away, is your real return. If the holdout buys almost as much as the discounted group, congratulations, you just learned you’ve been paying for sales you already had.
Run that holdout test on your win-back flow, on your loyalty tiers, on any offer you’re tempted to send broadly. It’s a little extra work and it’s slightly deflating the first time, because it usually reveals that some chunk of your “performance” was never incremental at all. But it’s the only way to know which dollars are buying behavior and which are just leaking.
Redemption tells you people like free money. Incrementality tells you whether the program is actually growing the business, and only one of those two numbers belongs anywhere near your weekly review.
What we keep telling clients
Loyalty got oversold as a switch you flip: install the app, hand out points, watch retention rise. The reality is that a loyalty program is a set of incentives, and incentives train behavior whether or not you meant them to. Point them carelessly and you’ll teach your best customers to wait.
The brands that get real lift from retention aren’t the ones with the most generous discounts. They’re the ones who are precise about who gets a price break and who doesn’t. Full-price loyalists get recognition and access. Drifting customers get the targeted offer that brings them back. Nobody gets trained to pace their buying around your promo calendar.
It’s less satisfying than a big sitewide sale, because it doesn’t spike the daily revenue chart and it’s harder to brag about. But it protects the margin on the customers you already earned, which is the quiet, unglamorous work that actually compounds.
Priya didn’t scrap her program. She pulled her full-price loyalists out of every discount flow, rebuilt her win-back so codes only fired after 75 days of silence, swapped her top loyalty tier from points to early access and a members-only kit, and put a holdout group on everything. Her discounted-order share fell, her full-price conversion recovered within two months, and blended margin came back up without losing the repeat rate she’d been proud of. The retention was real. She’d just stopped paying twice for it.
Questions we get every week
How do I know if my loyalty program is cannibalizing full-price sales? Split your repeat buyers by how often they use a discount code, and watch your full-price conversion rate over the quarters after you launched the program. If discounted orders climb while full-price ones shrink, and orders cluster right after each promo email, you’re moving existing sales to a lower price rather than adding new ones.
Should I get rid of discounts entirely? No, targeted discounts are one of the best tools you have for winning back customers who’d otherwise lapse. The problem isn’t discounting, it’s discounting people who would have paid full price anyway. Aim codes at inactive segments and keep them away from your active, loyal buyers.
What rewards work without training people to wait for sales? Anything that builds attachment instead of lowering price. Think early access to launches, members-only products, status tiers, or a meaningful gift at a spend threshold. These still cost you, but they don’t teach customers that full price is optional. Reserve actual price cuts for win-back, where they change a real decision.
How do I actually measure if my offers are working? Hold out a random slice of the target segment and send them nothing, then compare their spend against the discounted group. The difference, minus the margin you gave away, is your incremental return. Redemption rate looks impressive but tells you nothing about whether those buyers needed the code.
If your retention metrics look healthy but your margin keeps slipping, talk to Monkey Man and we’ll audit where your discounts are actually going.