Discount codes in recovery conversations: our case for offering fewer
Where we stand
Give a campaign one modest standard code, let the agent offer it only to shoppers who say price is the problem, and leave the escalation tier empty until you have done the arithmetic further down. Plenty of shoppers leave checkout for reasons a code does nothing about, as our post on why shoppers leave sets out. A code given to them is margin handed back on an order you might have won anyway.
How codes work in ACR
The Offer step starts with a choice: offer a discount or don’t. If you offer one, you list up to ten codes, each with a short description and a tier. A standard code is the one the agent leads with. An escalation code is held back for a shopper who is still hesitating on price after hearing the standard one.
ACR does not create codes. You make each one in your store first, with its amount, limits and end date. ACR does not check that a listed code exists, so test each one yourself.
The agent’s instructions say to offer a code only when price or cost is what holds the shopper back, to use only the listed codes, and never to make up another code or a different amount. The default offer rule adds the order: “If price is what is holding the shopper back, offer the standard code once. Offer the escalation code only if they are still hesitating on price after that.”
Behind the instructions there is a hard stop. When the agent texts a code during a call, ACR checks it against the campaign’s list and refuses anything that is not on it. With the offer switched off, the agent is told the campaign has no discount and to say so if a shopper asks for one.
One way a code reaches everyone
A text or email step with a fixed template can include the {{ discount_code }} merge field. It fills in your first standard code for every shopper who reaches that step, whatever they said or didn’t say about price. Use it only if you mean to give the code to everyone.
The margin a code has to earn back
Take a store we made up for this post. Its average order is $80, and product, shipping and payment costs come to $44, which leaves $36 of margin before any discount. Suppose 100 shoppers tell the agent that price is the problem, and 10 of them would buy at full price after the conversation anyway. Those 10 orders earn $360.
Now offer a code, and assume everyone who buys uses it. The table shows how many buyers each code needs just to earn the same $360.
| Code | Cost per order | Margin left per order | Buyers needed to earn $360 | More buyers than without a code |
|---|---|---|---|---|
| No code | $0 | $36 | 10 | None |
| 10% off | $8 | $28 | 12.9 | 29% more |
| 15% off | $12 | $24 | 15 | 50% more |
| 20% off | $16 | $20 | 18 | 80% more |
A 20% code has to turn 10 buyers into 18 just to break even with offering nothing.
The escalation tier has its own arithmetic. With a 10% standard code and a 15% escalation code, every shopper who would have bought at 10% but ends up with 15% costs $4 of margin. Every shopper who buys only because of the 15% adds $24. So one shopper won by the bigger code pays for six who would have taken the smaller one. If you can’t believe that ratio holds for the shoppers who keep pushing on price, leave the escalation tier empty.
Teaching shoppers to leave checkout
A code that arrives every time someone leaves checkout turns into a pattern, and shoppers who notice it can learn to leave on purpose. We have no figure for how often that happens. The risk grows with how predictable the code is, so keep it unpredictable:
- Let the agent decide, and keep the merge field out of fixed templates. A code offered only after a shopper names price is one most shoppers never hear.
- Keep the cooldown. By default a campaign skips a shopper it has already had in the last 30 days.
- Set limits on the code in your store. Shopify’s discount code settings include the number of times a code can be used, a maximum of one use per customer, and the dates the code is valid.
- Route repeat buyers elsewhere. Campaigns are checked in order, so a campaign with the offer switched off and the start condition “has bought from the store before”, placed above your main campaign, takes returning customers before the code is in play. ACR judges “bought before” from the orders your store has sent it.
A code also decides who gets the credit
ACR credits an order to a campaign by its discount code first, and only then by the shopper’s most recent engagement inside the attribution window. How ACR counts a recovered order explains the full rule. Three consequences are worth planning for:
- Any order that uses a campaign’s code counts for that campaign, whether or not ACR ever contacted the buyer. If the code ends up on a coupon site or in your newsletter, the campaign gets credit for those orders too. Give each campaign a code that is used nowhere else.
- ACR keeps crediting orders that use a code after you remove it from the campaign or switch the offer off. When you stop using a code, end it in your store as well.
- A code outranks engagement. A shopper who talked with one campaign’s agent and then typed another campaign’s code is credited to the second campaign.
A credited code shows the code was used. It does not show that the code caused the order. Measuring recovery with a holdout covers how to find that out.
Sources
More in Checkout recovery, or back to all posts.
Read next
- Checkout recovery
Why shoppers leave checkout, and which reasons a conversation can fix
Baymard Institute's abandonment research, split into what a conversation can help with and what only a change to your site will solve.
November 7, 2026Read the post
- Checkout recovery
Abandoned cart or abandoned checkout: the difference that decides who you can reach
A cart holds products. A checkout usually holds an email address or a phone number as well. What Shopify records when a checkout is left, and why ACR starts there.
November 7, 2026Read the post