Win-Back Push Campaigns for Dormant Users
A win-back campaign recovers subscribers who have gone quiet — before they block notifications or churn outright. This guide gives you the working definition of dormancy, a proven three-touch sequence, an incentive-escalation model, and the reactivation metric that tells you whether any of it works.
Quick answer
A win-back push campaign targets subscribers who have crossed a dormancy threshold (typically 2× your baseline usage interval) with a short, escalating sequence: touch 1 a low-pressure reminder, touch 2 a value or social-proof nudge, touch 3 a concrete incentive. Space the touches a few days apart, suppress anyone who returns, and measure success as the reactivation rate — the share of targeted dormant users who take a meaningful action within an attribution window. Three touches is the sweet spot; beyond that, blocks and unsubscribes outrun recoveries.
Defining dormancy
Dormancy is not “hasn’t opened the app in a while” in the abstract — it’s a specific inactivity window measured from each subscriber’s last_active_at. The threshold must reflect your product’s natural cadence. For a daily-use app, 7–10 days of silence signals dormancy; for a weekly tool, 21–30 days. Pick the threshold empirically: bucket users by inactivity age and find where the natural return rate collapses. That inflection point is where a nudge changes outcomes instead of merely interrupting someone who would have returned anyway.
Crucially, dormancy is reversible. The moment a dormant subscriber takes any meaningful action — a session, a push click, an in-app open — they exit the win-back sequence and revert to active. The broader scheduling and suppression machinery for this lives in the re-engagement campaign strategies guide; here we focus on the sequence itself.
It also helps to distinguish dormant from lapsed. A dormant subscriber has gone quiet but is still plausibly recoverable; a lapsed one has ignored the full sequence and is, for messaging purposes, gone. The win-back campaign operates entirely in the dormant band. Once a subscriber clears the final touch without responding, continuing to message them costs more in blocks and unsubscribes than it can ever earn back, so they should be archived rather than re-enrolled. Knowing where that line sits — and respecting it — is what separates a win-back program that protects your sender reputation from one that quietly erodes it.
The three-touch sequence
Each touch has a distinct job. Escalation matters: leading with an incentive trains users to lapse on purpose and devalues the offer.
| Touch | Timing | Intent | Example |
|---|---|---|---|
| 1 | Day 0 (dormancy reached) | Gentle reminder | “Still there? Here’s what you missed.” |
| 2 | +3 days | Value / proof | “Your saved items are still here” / “3 new replies.” |
| 3 | +4 days | Incentive | “Welcome back — here’s 15% off / a free month.” |
If touch 1 reactivates the user, touches 2 and 3 never fire. The sequence is a funnel, not a schedule everyone runs to completion.
The spacing between touches is as important as the messages. Three days between touch 1 and touch 2 gives a genuinely busy user time to return on their own — which counts as a win and saves you a send — while keeping the campaign tight enough that the user still remembers your product. Compress the touches onto consecutive days and you read as desperate; stretch them across weeks and the thread of attention snaps. The figures above are a sound default for a daily- or weekly-use product; lengthen them for tools used monthly, where a three-day gap would arrive before the user would naturally have returned anyway.
Each touch should also carry a distinct deep link aimed at the action you most want. Touch 1 points at the general entry point (“here’s what you missed”), touch 2 at something the user already invested in (saved items, an unfinished draft, unread replies), and touch 3 at the redemption flow for the incentive. Pointing every touch at the homepage wastes the sequence; the closer the link is to a concrete, low-friction action, the higher the reactivation.
Incentives
Reserve the real incentive for the final touch, and make it specific. Vague “come back!” offers underperform concrete ones (“your cart is still saved,” “unlock your unused credit”). For commerce, a small discount or free shipping works; for SaaS, a re-extended trial, a restored feature, or a one-click “resume where you left off” deep link often beats a discount because it lowers friction rather than price. Keep the payload lean — the encrypted ciphertext must stay under the 4 KB payload limit with the aes128gcm encoding required by RFC 8291, so carry a deep link and let the landing page do the heavy lifting.
Implementation
The win-back send reads VAPID details from the environment — never hardcode the public key server-side — and tags each notification with its step so you can attribute reactivations later.
const webpush = require('web-push');
webpush.setVapidDetails(
'mailto:lifecycle@yourdomain.com',
process.env.VAPID_PUBLIC_KEY,
process.env.VAPID_PRIVATE_KEY
);
const WINBACK = {
1: { title: "Still there?", body: "Here's what you've missed.", url: "/feed" },
2: { title: "Your saved items are waiting", body: "Pick up where you left off.", url: "/saved" },
3: { title: "A welcome-back perk for you", body: "Tap to unlock it.", url: "/welcome-back?offer=wb15" }
};
async function sendWinback(sub, step) {
const t = WINBACK[step];
const payload = JSON.stringify({
title: t.title, body: t.body,
data: { url: t.url, campaign: "winback", step }
});
const subscription = {
endpoint: sub.endpoint,
keys: { p256dh: sub.p256dh_key, auth: sub.auth_secret }
};
return webpush.sendNotification(subscription, payload, {
TTL: 86400, // not time-critical; let it buffer up to a day
urgency: 'low'
});
}
Steps to run a win-back campaign
- Set the dormancy threshold from your usage data, not a guess. Validate it against natural return rates by inactivity age.
- Build the three payloads with escalating intent and a deep link per touch; keep each under 4 KB.
- Enroll dormant, suppressible subscribers — exclude active, opted-out, and hard-bounced endpoints.
- Send touch by touch with the right spacing, advancing a per-subscriber cursor only after a confirmed send and pruning
410 Goneendpoints. - Watch for reactivation between touches and abort the remaining sequence for anyone who returns.
- Measure reactivation rate per touch and overall, plus block/unsubscribe deltas, to decide whether the offer or cadence needs tuning.
Measuring reactivation
Reactivation rate is the share of targeted dormant subscribers who take a meaningful action within an attribution window (say 72 hours of the last touch). Measure it per touch so you know which message does the work, and always against the targeted population — not your whole base. Pair it with the cost side: track block and unsubscribe deltas during the campaign. A campaign that reactivates 6% but doubles your block rate is losing money. To attribute clicks to the right touch, tag the deep link (campaign=winback&step=2) and reconcile against your retry and backoff layer so failed sends aren’t counted as delivered-but-ignored.
Gotchas and edge cases
- Leading with the incentive. If touch 1 is the discount, you teach users that lapsing earns rewards. Escalate; save the offer for last.
- Counting active users as recoveries. A user who was about to return anyway will “reactivate” regardless of your push. Hold out a control group of dormant users to measure true lift.
- Ignoring the
410surge. Dormant devices have the highest rate of expired endpoints. Treat410 Goneas a prune signal, not a delivery, or your reactivation denominator is wrong. - Too-short TTL. A short TTL can drop the message if the dormant device is offline. Use
TTL: 86400so the push service buffers it; see TTL and expiration handling. - Running more than three touches. Each additional touch against an unresponsive dormant user costs more in blocks than it earns in recoveries. Archive after touch 3.
Related
- Back to Re-Engagement Campaign Strategies — the scheduling, suppression, and lifecycle machinery that drives this sequence.
- TTL & Expiration Handling — why win-back pushes want a long TTL so offline devices still receive them.
- Retry Logic & Backoff Strategies — keeps transient failures from corrupting your reactivation numbers.
FAQ
How many touches should a win-back sequence have?
Three is the practical maximum for push. Touch 1 reminds, touch 2 adds value or proof, touch 3 offers an incentive. Beyond three, blocks and unsubscribes from unresponsive dormant users outpace the recoveries you earn, so archive the subscriber as lapsed after the third touch.
How do I prove the campaign actually caused reactivations?
Hold out a randomized control group of dormant subscribers who receive no win-back pushes, then compare their natural return rate against the treated group. The difference is true lift. Without a control, you will credit the campaign for users who would have returned on their own.