List reactivation
Wake up an old list without burning a line: the eligibility rules, the batch sizing, the message that earns a reply, and the stop conditions.
The problem and the risk
Every business is sitting on leads that went cold and customers who stopped buying. Reactivation is the highest-volume campaign most accounts run, which makes it the one most likely to damage a line if it is run carelessly.
The failure pattern is always the same: a big old list, uploaded at once, sent from one line, with a generic "just checking in" message. Reply rate collapses, opt-outs spike, the line degrades, and the account concludes iMessage does not work.
Run it the way below instead.
Eligibility, before anything else
Drop, do not send:
- Anyone whose last activity is over 12 months old, unless you can re-verify the number.
- Anyone on your suppression list, past opt-outs, current customers you do not want in this campaign, active conversations.
- Any number you cannot trace to a source and a collection date.
- Landlines and VoIP numbers.
- Anyone contacted in the last 30 days on any campaign.
Rule 2 deserves the extra pass. Old lists are where forgotten opt-outs live, and messaging one is the single worst send you can make: it is a compliance violation and a report at the same time. Apply your suppression list on every upload, per the compliance guide.
Batch sizing
Reactivation volume almost always exceeds one day's cold capacity. Do the arithmetic before you start. One nuance works in your favor: contacts you have messaged before are returning contacts and are not capped, so a true reactivation list (people you texted months ago) often costs far less capacity than its row count suggests. Only never-messaged numbers draw down the cold caps.
const { devices } = await listLines(); // GET /v1/devices
const capacityToday = devices
.filter(l => l.status === "online")
.reduce((sum, l) => sum + l.available_today, 0);
const landsToday = eligible.slice(0, capacityToday); // the rest queuesCaps and the available_today field are documented in rate limits and on the line object. Drip sends load-balance across lines automatically, and cold volume past today's capacity queues for the next window rather than failing; run the campaign over as many days as the arithmetic requires. A 4,000-contact cold list on a handful of lines is a multi-day campaign by design.
Test slice first, always
Send 50 contacts. Wait 24 hours. Read every reply by hand. Only then scale.
What you are looking for: are people confused about who you are, is the offer landing, are you getting "who is this" replies, are the opt-outs coming in above 3 percent. A test slice costs you a day and routinely saves the campaign.
The message
The single most important requirement is a real reason for the message. "Just checking in after a while" gets ignored. A price change, a new offer, availability, a genuine result gets replies.
For cold leads:
Hey [first name], [your name] from [company]. We spoke about [service] back in [month]. Since then [one concrete new thing]. Worth a fresh look?
For past customers:
Hi [first name], it's [your name] at [company]. It's been a while since [last purchase]. We've got [specific new thing] now and I thought of you. Want the details?
Name yourself and the company every time. On a reactivation list the recipient genuinely may not remember you, and an unidentified message to someone who half-remembers you is the fastest route to a report. Vary the opening line across the batch, and no link in the first message.
Send and stop conditions
for (const contact of batch) {
await sendMessage({
to: contact.phone,
message: personalize(contact),
metadata: { crm_id: contact.recordId, recipe: "reactivation" }
});
}Note what is missing: no line pinning and no manual pacing. Drip-lane sends load-balance across your lines and space themselves out; a reactivation batch that exceeds today's cold capacity queues for the next window instead of failing. Contacts you have messaged before are returning contacts and do not count against the cold cap at all, which is exactly what makes reactivation the cheapest campaign you can run.
Stop the whole campaign, not just the line, if any of these fire:
- Opt-out rate above 3 percent of contacts messaged.
- Reply rate below 2 percent after 300 sends.
- A rising share of "who is this" or "how did you get my number" replies.
Each of these says the list is wrong, and pushing more volume through a wrong list damages every line it touches. The full signal table is in deliverability.
One follow-up, then done
One follow-up 4 to 5 days later, then stop:
[First name], last one from me. If [thing] isn't a priority right now, no problem at all. If it is, one reply and I'll send [the concrete thing].
Reactivation lists get two messages total. These are people who already ignored you once; a third message converts near zero and generates the opt-outs that hurt your lines.
What to measure
Reply rate and opt-out rate per list source, not just campaign-wide. Reactivation lists are usually several sources stacked together, and one bad source hiding inside a decent average is the most common thing this campaign teaches you. Retire any source above 3 percent opt-outs and keep the rest.

