📣 WhatsApp Broadcasts

How to Win Back Lapsed Customers on WhatsApp

Find the customers who've gone quiet — 'no order in 60 days' — and win them back. The full no-code build, a window-picking table, and the four numbers to watch after.

A win-back campaign is a message sent to customers who bought from you once but have gone quiet for a defined number of days — 30, 60, 90 or more — with the goal of getting one more order out of a relationship you already paid to acquire. On WhatsApp you build it with a single date filter: last order date is more than 60 days ago.

This playbook is the whole build, end to end: the field, the automation that fills it, the segment, the message, the timing table that tells you whether 30 or 90 days is right for your store, and what to look at afterwards to know if it worked. No code, and once it's running it keeps finding newly-lapsed customers on its own.

Why recency is the filter that matters

Every other segment you build describes who someone is — their city, their tags, their order value. A win-back segment describes when they last acted, which is the only attribute that changes on its own while you do nothing. That's what makes it self-maintaining: a customer crosses into "lapsed" without you touching anything, and crosses back out the moment they order again.

It is also the cheapest audience you own. You are not paying to find these people — they are already in your contact list and already opted in. What you pay is WhatsApp's per-message fee, which since 1 July 2025 is charged per delivered message rather than per 24-hour conversation, and only for messages that actually arrive (Meta's pricing documentation). A win-back is a marketing-category message, so budget it as paid.

How the build works in one paragraph

You create a Date field called last_order_date, have an automation stamp today's date into it every time an order is placed, then build a segment using the date operator is more than … days ago. Because a segment is a live filter that is re-evaluated every single time a broadcast resolves its audience, the list is never stale — it is always today's lapsed customers, computed at the moment of sending.

Step 1 — Create the date field

  1. Go to Settings → Contact Attributes.
  2. Type the field name — "Last order date" — which gives you the key last_order_date.
  3. Choose the type Date. This matters: the type is what unlocks the date operators. A text field will only offer word matches like contains, and none of the day-counting filters this playbook depends on.
  4. Click Add Field.

Step 2 — Fill it automatically on every order

In the automation builder, open (or create) your order placed rule and add an Update Customer Attribute step. Set the field to last_order_date and the value to {{date.today}}. From that moment every order stamps that customer's last-order date for you.

Be honest with yourself about the first 60 days. The stamp only starts from a customer's next order, so on day one the field is empty for your entire back catalogue — and a contact whose date field is empty never matches a date filter at all. You have two options: wait out one full lapse window while orders fill the field naturally, or do a one-time backfill of historical last-order dates through your account's API (a single job for whoever manages your store data). If you skip the backfill, expect your first win-back segment to be small and to grow week by week.

Step 3 — Pick your lapse window (the decision that actually matters)

The number of days is not a style choice — it should be roughly 1.5 to 2 times your normal repeat-purchase gap. Message too early and you interrupt someone who was going to buy anyway; message too late and they have already found another shop. Use your own repeat cycle if you know it; otherwise start from this table.

WindowFilter to useSuits this kind of storeWhy this number
30 daysis more than … days ago · 30Coffee, supplements, pet food, groceries, cosmetics refillsThe product physically runs out in about a month, so at 30 days the customer is genuinely overdue and a reminder is useful rather than pushy.
60 daysis more than … days ago · 60Fashion, beauty, accessories, mid-price homewareThe common default. Long enough that the customer has clearly moved on, short enough that they still remember your brand name.
90 daysis more than … days ago · 90Seasonal clothing, electronics accessories, gifting, hobby suppliesPurchases here are occasion-driven rather than habitual, so 60 days of silence is normal and not a warning sign.
180 daysis more than … days ago · 180Furniture, jewellery, appliances, high-ticket one-offsNobody buys a sofa quarterly. At six months you're prompting a genuinely new need, not a repeat of the same one.
365 daysis more than … days ago · 365Annual purchases — school uniforms, festival wear, seasonal gearThe trigger is the anniversary of the need, not fatigue. Consider a day & month filter instead if the date is fixed each year.

If you have no idea which row you are, pick 60, run it for a month, and look at how many people the segment returns. A segment that returns 4% of your list is a healthy lapsed pool; one that returns 70% means your window is far too short for what you sell.

Step 4 — Build the segment

  1. Start a new broadcast and open Audience → By segment.
  2. Add a condition: attribute last_order_date, operator is more than … days ago, value 60.
  3. Optionally add a second condition to sharpen it — for example order_total · greater than · 3000 to win back only customers who were worth having — and set the match type to Match all so both must be true. Match any would widen it instead, which is rarely what you want here.
  4. Click Preview recipients and check the count before you go near the send button. The preview also tells you how many contacts were skipped for being opted out.
  5. Name it "Lapsed 60d" and click Save segment so every future campaign can reuse it.

One safety detail worth knowing: a segment with no conditions matches nobody, not everybody. That's deliberate — it means a half-built segment can never turn into an accidental send to your whole list.

A worked example, with real dates

Say today is 18 July 2026 and your filter is last_order_date is more than 60 days ago. The cut-off is therefore 19 May 2026 — anyone whose last order is strictly older than 60 days matches. Four contacts:

Customerlast_order_dateDays agoMatches "more than 60"?Matches "more than 90"?
Ayesha2 May 202677YesNo
Bilal14 Feb 2026154YesYes
Chen29 June 202619No — still activeNo
Dania(empty)No — an empty date never matchesNo

So a send today reaches Ayesha and Bilal. If Ayesha orders tomorrow, the automation restamps her last_order_date to 19 July and she silently leaves the segment — no list to clean, no exclusion rule to maintain. Dania is the argument for doing the backfill: she may well be your most lapsed customer of all, and she is invisible until her date exists.

Step 5 — Write the message

A win-back has to do three jobs in about five lines: remind them who you are, give a reason to come back now, and make the next step one tap. A structure that holds up:

  1. Name them. Open with their first name using a personalization variable. A win-back that opens "Dear Customer" reads like a list, because it is one.
  2. Acknowledge the gap without guilt-tripping. "It's been a while" works. "We noticed you haven't shopped since May" is creepy specificity.
  3. Give the actual reason to return — a discount code, free delivery, or genuine news ("the size you wanted is back"). A win-back with no offer is just a reminder that you exist, and it converts like one.
  4. Put an expiry on it. "Valid until Sunday" turns a nice feeling into a visit this week.
  5. End with one button. One clear call to action, with click tracking on the link so you can tell interest apart from indifference.

Because this is a marketing-category template, it needs Meta approval before you can send it, and it must respect the WhatsApp Business Messaging Policy — the people in this segment bought from you, but that is not by itself the same as having opted in to marketing. Test-send it to your own number before it goes anywhere near the real audience.

Step 6 — One-off send, or set it to repeat

You can send once and be done. The better setup is to switch the schedule from One-time to Repeat and choose weekly, because each occurrence of a recurring broadcast rebuilds its audience from scratch. Week one catches everyone currently past 60 days; week two catches only the handful who newly crossed the line, because everyone else either bought (and left the segment) or was already messaged.

That last point is the one thing to watch: a weekly recurring win-back will message the same non-buyer again next week, since they are still more than 60 days lapsed. Two ways to handle it, and you want at least one:

Building a two-step win-back ladder

The people who ignore your first win-back are not the same audience as the people who read it, and they deserve a different second message. After the first send lands, create a new broadcast, choose Audience → Re-target, pick the win-back campaign you just sent, and select the outcome Didn't reply. Send that group a sharper version — a bigger incentive, or a plain "should we close your file?" message, which is often the highest-response win-back of all. Full detail in re-targeting by delivery outcome.

You can also stack date filters to build tiers instead: a soft nudge for is more than 60 days ago combined with is within the last … days · 120 (recently lapsed, still warm), and a heavier offer for people past 180 days who have nothing left to lose.

What to measure afterwards

Win-back is one of the few campaigns where the honest success metric is not in the campaign report at all — it's the segment shrinking. Track these four:

What to look atWhere you find itWhat a good result looks like
Segment size, week over weekPreview recipients on the saved "Lapsed 60d" segmentIt falls after each send. People leave the segment by ordering, which is exactly the outcome you wanted.
Delivered vs. failedThe broadcast's delivery report, per recipientFailures should be a small fraction. A lapsed list is an old list, so a spike in invalid numbers here is a data-hygiene signal, not a messaging one.
Click rateClick tracking on the campaign's linkThe cleanest read on whether the offer was worth returning for. High reads with almost no clicks means the incentive is too weak.
RepliesThe shared inbox, and the Replied re-target outcomeWin-backs generate real conversations — "do you still have…", "my last order arrived damaged". Those replies are worth more than the discount.

Read counts are a floor, not a truth: recipients who switch off read receipts in WhatsApp's privacy settings report only as "delivered" even when they read the message. Judge the campaign on clicks, replies and segment shrinkage instead.

Protecting your number while you do this

A lapsed audience is, by definition, the audience least expecting to hear from you, which makes it the audience most likely to block you. Two guardrails. First, respect your daily messaging limit — Meta's tiers run 250 → 2,000 → 10,000 → 100,000 → unlimited unique recipients in a rolling 24 hours, and new business portfolios start at 250 (Meta's messaging limits documentation). A 4,000-person win-back on a Tier 2K number will not all go out today. Second, watch the quality badge on your template in the composer: a template Meta has rated 🔴 Low is blocked from sending outright, which is the platform telling you the message is annoying people.

When not to run a win-back

Frequently asked questions

How do I find customers who haven't ordered in 60 days on WhatsApp?

Store each customer's last-order date in a Date field (auto-stamped by an 'order placed' automation using {{date.today}}), then build a segment with the filter 'last_order_date is more than 60 days ago'. That segment is your lapsed audience, and because a segment is a live filter it is rebuilt at the moment of every send.

Should I use a 30, 60 or 90-day win-back window?

Roughly 1.5 to 2 times your normal repeat-purchase gap. 30 days suits consumables like coffee, supplements and pet food; 60 days is the common default for fashion and beauty; 90 days suits occasion-driven categories; 180 to 365 days suits furniture, jewellery and other high-ticket one-offs. If a 60-day segment returns 70% of your list, your window is too short for what you sell.

Do I need a developer for this?

No for new orders — the Update Customer Attribute step stamps the last-order date automatically. You'd only need a one-time API push or import to backfill customers who bought before you created the field, and until you do, those contacts have an empty date and never match the filter.

Will a customer keep getting win-back messages forever?

No. Once they order again the automation restamps their last-order date and they drop out of the 'more than 60 days ago' segment. For people who never come back, turn on the frequency cap on the Opt-outs page — for example a maximum of 2 marketing messages per 7 days — so a weekly recurring win-back can't chase the same person indefinitely.

How do I know if the win-back campaign actually worked?

Watch the saved segment shrink: run Preview recipients before and after, because customers leave the segment by ordering. Then read click rate and replies from the campaign report. Don't judge it on read counts — recipients with read receipts switched off report as 'delivered' even when they've read it.

Need help? Message us