Re-engagement Sequence for Dormant Leads
Dormant leads are the cheapest pipeline you have: they already know you, and reviving one costs three emails, not thirty cold touches. Below: the dormancy rules, a 3-touch revival arc - new-value hook, proof, permission close - list hygiene for everyone who stays silent, and the whole thing as copy-paste JSON your agent installs in one shot.
Who this is for
Anyone sitting on a CRM full of leads that went quiet without ever saying no: founders doing their own sales, the first SDR hire, agencies with a year of stale inquiries, and AI agents that need a machine-checkable definition of "dormant." Run it as a scheduled sweep - monthly for most teams - not as a one-off panic when the quarter looks thin.
Know what it is not. Net-new prospects belong in the cold outbound cadence. Deals in active conversation belong in the post-demo and post-proposal follow-ups. An explicit "no" is not dormancy either - re-approach those only on a real trigger event (new role, new funding). Re-engagement targets the middle bucket: engaged once, never declined, drifted.
Detecting dormancy: 60 and 90 days
The only honest dormancy clock is the prospect's last real signal - their last reply, call, or meeting - not your last unanswered send. Measure from your own outbound and a lead you email every week never "goes dormant," even though they stopped answering a year ago.
| Situation | Dormant after | Why |
|---|---|---|
| Replied or met with you before | 60 days of silence | A warm thread quiet for two months is cold. Waiting longer only decays it further. |
| Engaged once (demo request, download, event) but never replied | 90 days | Weaker intent deserves a longer leash - and a stronger hook. |
| Open deal in an active stage | Never via this sequence | That is a stalled deal, not a dormant lead - work it with a deal follow-up. |
| Marked unresponsive by a previous sweep | Excluded | See list hygiene below. Re-reviving non-responders breeds spam complaints. |
Mechanically this is one query per contact: fetch the newest activity and compare its date to the cutoff - in Relm, GET /v1/activities?contact_id=con_...&limit=1 (newest first); any CRM with an activity timeline can answer the same question. Store the verdict in a lifecycle field on the contact - the state machine below needs structured data, not a mental note.
The 3-touch revival arc
Three emails over nine days. Each touch has one job, and none of them is "checking in."
| Touch | Day | Job | Subject shape |
|---|---|---|---|
| 1 - New-value hook | 0 | Give them a new reason, not the old pitch | "New since we last spoke" |
| 2 - Proof | 4 | One peer result, one number, one link | "How [peer] handled [problem]" |
| 3 - Permission close | 9 | Convert silence into a decision | "Closing your file?" |
Touch 1 lives or dies on the hook. "Just checking in," "circling back," "bubbling this up" - all announce you have nothing new, and the lead went dormant on your old pitch. Something changed in the months since: a shipped feature, new pricing, an integration, a case study. Lead with it, and make the ask tiny - reply for a three-line summary, not a calendar link.
Touch 2 is proof, because skeptics who ignored feature news answer to peer results. One customer, as close to their industry and size as you can get, one concrete number, three sentences, one link. A single specific story beats a montage of twelve logos.
Touch 3 is the permission close, a direct descendant of the breakup email popularized by Bryan Kreuzberger of Breakthrough Email. Ask permission to close their file, with an equal-dignity out for both answers: "it is dead" and "the timing is wrong, ask me in Q4." It is reliably the highest-reply email of the three because it makes silence itself a decision - and it only works if the tone is genuinely indifferent, never wounded.
Two hard rules. Three touches max: a dormant list is the segment most primed to mark you as spam, and touch four is where that starts. And exit instantly on any reply - nothing torches a revived thread like drip email three arriving after a human conversation has restarted.
List hygiene after no response
Re-engagement is a state machine whose exit states matter more than the sequence: active → dormant → re_engaged or unresponsive. A few days after touch 3 with no reply, mark the contact unresponsive and mean it: suppressed from every sequence for six months minimum, never auto-enrolled by the next sweep. Delete hard bounces outright. Keep the unresponsive records - the history is valuable the day they come back inbound, the one event that legitimately resets the machine. The CRM hygiene checklist covers the broader cleanup doctrine.
The kit: lifecycle field + revival sequence
This JSON installs the whole system: a lifecycle enum, two contact fields, one sequence. The moment any contact's lifecycle flips to dormant, the trigger enrolls them (contact.updated + filter). exit_when is re-checked before every send and the instant the contact changes, so marking a replier re_engaged stops the remaining touches immediately; enroll_existing back-fills already-dormant contacts at creation time in a bounded sweep of your most recent records - anything it misses, enroll directly with the REST call below. Apply in order: enums rows to POST /v1/enums, fields rows to POST /v1/fields, then the sequence to POST /v1/sequences - all plain REST endpoints.
{
"enums": [
{ "group": "lifecycle", "value": "active", "label": "Active - engaged in the last 60 days" },
{ "group": "lifecycle", "value": "dormant", "label": "Dormant - gone quiet, in revival" },
{ "group": "lifecycle", "value": "re_engaged", "label": "Re-engaged - replied to revival" },
{ "group": "lifecycle", "value": "unresponsive", "label": "Unresponsive - revival done, no reply" }
],
"fields": [
{ "object": "contact", "key": "lifecycle", "label": "Lifecycle", "data_type": "select", "enum_group": "lifecycle" },
{ "object": "contact", "key": "dormant_since", "label": "Dormant since", "data_type": "date" }
],
"sequence": {
"name": "Dormant lead revival - 3 touches, 9 days",
"channel": "email",
"trigger": {
"event": "contact.updated",
"filter": [{ "field": "lifecycle", "op": "eq", "value": "dormant" }]
},
"exit_when": [{ "field": "lifecycle", "op": "neq", "value": "dormant" }],
"enroll_existing": true,
"steps": [
{
"wait_days": 0,
"subject": "New since we last spoke, {{first_name}}",
"body": "<p>Hi {{first_name}},</p><p>When we talked in [month], [the blocker] was the sticking point. Two things have shipped since that change the math: [change 1] and [change 2].</p><p>Worth a second look? Reply and I will send a three-line summary of what is different - no deck, no call.</p><p>[Your name]</p>"
},
{
"wait_days": 4,
"subject": "How [peer company] handled [the problem]",
"body": "<p>Hi {{first_name}},</p><p>[Peer company], a [industry/size] team like yours, hit the same wall: [one-line problem]. They got to [result with a number] in [timeframe].</p><p>The write-up is a two-minute read: [link]. If the numbers look interesting, I can map it to [their company] in 15 minutes.</p><p>[Your name]</p>"
},
{
"wait_days": 5,
"subject": "Closing your file, {{first_name}}?",
"body": "<p>Hi {{first_name}},</p><p>I have not heard back, which usually means the timing is off or this stopped being a priority. Both are fine - I would rather know than keep guessing.</p><p>If it is dead, say the word and I will close your file. If the timing is just wrong, tell me when to check back and I will disappear until then.</p><p>[Your name]</p>"
}
]
}
}
Design notes: wait_days is the delay before each step, so the arc lands on days 0, 4, and 9. Subjects and bodies template {{first_name}} from the enrolled contact; fill the [bracket] placeholders once per segment - that is what makes it a sequence, not thirty hand-written emails. The framework needs no particular tool: the same three emails work in any sequencer or a plain inbox. Relm just makes the install one instruction. Live sends go out over your own connected email key (POST /v1/connections, BYO Resend); test-mode sends are simulated - rehearse with a relm_test_ key before anything real goes out.
Apply it with your agent
If your agent is connected over MCP, paste this prompt with the kit JSON above:
Run a dormant-lead sweep in my CRM:
1. Call relm_describe_schema. If the lifecycle field or the
"Dormant lead revival" sequence is missing, create them from
the kit JSON I pasted (enums, then fields, then sequence).
2. List contacts page by page. For each contact whose lifecycle
is empty or "active", fetch its most recent activity
(list activities with contact_id, limit 1).
3. If the latest activity is older than 60 days (90 if they never
replied) and the contact has no open deal, set
custom_fields.lifecycle = "dormant" and
custom_fields.dormant_since = today.
The sequence trigger enrolls them automatically.
4. Never touch contacts marked "unresponsive".
5. Ongoing: when someone replies, set lifecycle = "re_engaged"
(the sequence exits on its own). When an enrollment completes
with no reply, set lifecycle = "unresponsive".
6. Report: contacts scanned, tagged dormant, enrolled, skipped.
Over REST you can also enroll a contact directly, bypassing the trigger:
curl -X POST https://api.relmcrm.com/v1/sequences/seq_.../enroll \
-H "Authorization: Bearer relm_test_..." \
-H "Content-Type: application/json" \
-d '{ "contact_id": "con_..." }'
Before going live, hit GET /v1/sequences/{id}/preview - a dry run returning the step schedule and a count of how many contacts would enroll right now, no side effects.
FAQ
How long should a lead be inactive before you re-engage?
60 days from the last two-way activity if they have replied or met with you before; 90 days if they engaged once (demo request, download) but never replied. Under 30 days of silence is normal follow-up, not re-engagement. Measure from their last real signal, not from your last unanswered send.
How many emails should a re-engagement sequence have?
Three, over about nine days: a new-value hook on day 0, proof on day 4, a permission close on day 9. More touches on a dormant list trains people to ignore you and damages sender reputation. If three touches produce nothing, the answer is list hygiene, not a fourth email.
What should the first re-engagement email say?
Lead with what changed since you last spoke - a shipped feature, new pricing, an integration, a customer result. The lead went dormant on your old pitch, so repeating it fails by definition. Never open with "just checking in" or "circling back"; those subject lines announce you have nothing new. Offer a low-commitment next step - a reply, not a calendar link.
Does the breakup email actually work?
Yes - the permission close is usually the highest-reply email of the three, because it converts silence into a decision. The format was popularized by Bryan Kreuzberger of Breakthrough Email: ask permission to close their file and give an easy out for both "this is dead" and "the timing is wrong". It stops working when it turns passive-aggressive, so keep the tone genuinely indifferent to the outcome.
What do you do with leads that never respond?
Mark them unresponsive, suppress them from all sequences for at least six months, and never auto-enroll them in the next dormant sweep - repeatedly reviving non-responders is a deliverability tax that ends in spam complaints. Delete hard bounces outright. Keep the records themselves: the history is valuable if they ever come back inbound - the one event that resets the state machine.