Skip to content
imessageapi

Win-back campaigns that do not feel like surveillance

A customer who stopped coming has not decided to leave. They fell out of a habit. The message that brings them back is warmer and less specific than you think.

7 min readUpdated August 20, 2026Playbooks

Win-backs are the highest-risk message type a small business sends. They are unambiguously marketing, which means they need express written consent. They go to people who have already drifted, which means the tolerance for annoyance is low. And they are the message most likely to be over-sent. Fitness studios and local retailers get the most out of this one, and burn lists with it the fastest.

Define lapsed by your own cycle

A barber's lapsed customer is six weeks. A dentist's is eighteen months. Take your median gap between visits, multiply by about two, and that is your threshold. Do not use a round number someone read in a blog post.

lapsed.ts
export function lapsedThresholdDays(visitGaps: number[]) {
const sorted = [...visitGaps].sort((a, b) => a - b);
const median = sorted[Math.floor(sorted.length / 2)];
return Math.round(median * 2);
}
 
export function isLapsed(customer: Customer, thresholdDays: number) {
return (
daysSince(customer.lastVisitAt) > thresholdDays &&
customer.consent.scope !== "transactional" && // marketing consent required
customer.consent.status === "opted_in"
);
}

The message

winback.ts
export const winback = (c: Ctx) =>
`Hi ${c.firstName} — it's been a while! ${c.staffName} at ${c.business}. ` +
`15% off your next visit if you book this month: ${c.link}` +
`\n\nReply STOP to opt out.`;

Vague beats specific here

'It's been a while' is warm. 'We noticed you haven't visited in 94 days' is surveillance. You have the data; do not demonstrate that you have the data. This single wording choice separates a win-back that works from one that gets you blocked.

Why an offer, and how much

  • An offer gives a reason to act now rather than 'sometime'. Without one this is just a reminder that you exist.
  • Keep the discount modest. A large discount trains people to lapse deliberately, which is an expensive lesson to teach.
  • Time-bound it. 'This month' creates a real deadline you can honour, unlike '48 hours only' on a message someone reads on day three.
  • Never discount below what makes the visit worth having.

Frequency: this is the dangerous part

  • At most a couple of win-backs per customer per year.
  • Never two in the same quarter, even for different offers.
  • Suppress anyone who has received any marketing message in the last 48 hours — enforce this at the send layer, not per campaign.
  • Remove people after two ignored win-backs. They have answered you.

Measure it with a holdout

Win-backs are where attribution goes most wrong. Some lapsed customers were coming back anyway, and a campaign that takes credit for them looks brilliant while doing nothing. Withhold 10% and compare. Measuring ROI has the method.

Next step

Generate a tagged link for whatever you send next with the UTM builder, see what this looks like in your industry, or compare the services that can send it on the providers page.