Cold Outbound Cadence Template (5 touches, 21 days)
Five emails over three weeks, each with one job, plus explicit rules for what happens on every kind of reply and when to stop. The framework stands on its own; the JSON at the bottom ships it as a Relm drip sequence in one API call.
Who this is for
Founders and small sales teams running their own outbound to a list they researched - not agencies blasting 10,000 scraped addresses. Use it when you have a defined ICP, a verified list of 50-500 prospects, and one clear pain your product removes. Do not use it for inbound leads (they deserve a faster, warmer track - see the follow-up sequence templates) or for reviving old conversations (that is the re-engagement sequence). Structured multi-touch outbound descends from Aaron Ross's Predictable Revenue playbook; the specific 5-touch, 21-day spacing here is our own default, tuned for small verified lists.
The 21-day structure
One channel carries the cadence (email); LinkedIn rides alongside as a visibility layer, never as a second pitch. Every touch has exactly one goal and one ask.
| Touch | Day | Channel | Goal | The ask |
|---|---|---|---|---|
| 1 | Day 1 | Prove relevance in the first line, name the pain | 15-minute call | |
| 2 | Day 3 | Email (bump) | Resurface touch 1 with one new proof point | Same ask, shorter |
| 3 | Day 8 | Email + LinkedIn view/follow | New angle: a peer's result, not your product | "Want the one-pager?" |
| 4 | Day 14 | Preempt the most likely silent objection | "Tell me and I'll stop" | |
| 5 | Day 21 | Email (breakup) | Close the loop, leave the door open | None |
Per-touch rules that make or break it: touch 1 lives or dies on the opener - one researched sentence about them, written by you or your agent, never a template. Touch 2 reuses the subject with a "Re:" prefix so it reads as a bump; keep it under 60 words. Touch 3 changes the subject and the frame entirely - a similar company's outcome with a number in it. Touch 4 is the highest-reply email in most runs because it names the objection the prospect was silently using to dismiss you. Touch 5 is a real goodbye, not a guilt trip; breakup emails get replies precisely because they release the pressure.
The LinkedIn touches (view the profile around day 3, follow or react to a post around day 8) exist so your name is vaguely familiar when the emails land. Do not send a connection request with a pitch note - it converts worse than no touch at all.
Reply-handling branches
A cadence without branch rules is a spam cannon. Decide these up front and encode them as CRM writes, so the sequence exits the moment the state changes:
| Reply | What you do | CRM write |
|---|---|---|
| Positive ("tell me more") | Reply within the hour, propose two slots | outbound_status = meeting_booked, create a deal |
| Objection ("we use X") | One targeted counter, then a human owns the thread | outbound_status = replied |
| Not now ("try me in Q4") | Thank them, ask permission to check back | outbound_status = replied, enroll in re-engagement later |
| Referral ("talk to Sam") | Thank them, start a fresh cadence on Sam citing the referral | outbound_status = replied, create the new contact |
| Opt-out / annoyed | Apologize once, suppress forever | outbound_status = do_not_contact |
| Hard bounce | Nothing - fix your list hygiene | outbound_status = bounced |
Every branch sets one field, and the sequence's exit conditions watch that field. Nobody who replied ever gets touch 4.
When to stop
After touch 5, stop. No "one more try," no restarting the same cadence in six weeks - a prospect who ignored five well-made emails has answered you. Move them to a quarterly re-engagement track and spend the energy on new accounts. Stop early on any bounce, any opt-out, and any auto-reply that says the person left the company (find their replacement instead - that is a fresh, warmer touch 1).
Deliverability basics
- Send from a separate domain (or subdomain) with SPF, DKIM, and DMARC set up, warmed for 2-4 weeks before the first real send.
- Cap volume at 30-50 cold sends per inbox per day. Scale with more inboxes, not bigger blasts.
- Verify every address before enrolling. A bounce rate above 2-3% quietly kills the domain for months.
- Plain text, no images, at most one link - ideally zero until someone replies.
- Sweep bounces and opt-outs daily and write them back to the CRM so no other campaign ever touches those addresses.
The artifact: the cadence as a Relm sequence
Register three custom contact fields first - lead_source (how the contact entered), outbound_status (the branch state), and opener (the researched first line, written per prospect) - via POST /v1/fields. Then create the sequence. Auto-enrollment: any contact created with lead_source = cold-outbound enters the cadence; exit_when ends it the moment a branch fires. {{merge_tags}} interpolate from the contact and its custom fields; [bracketed placeholders] are yours to replace before shipping. One rendering note: body is delivered as the email's HTML part (a plaintext alternative is auto-derived), so when you replace the placeholders, swap each \n\n for <br><br> to keep the paragraph breaks in the rendered email. Each step's wait is relative to the previous step, which is how Day 1/3/8/14/21 becomes 0/2/5/6/7.
POST https://api.relmcrm.com/v1/sequences
{
"name": "Cold outbound - 5 touches / 21 days",
"channel": "email",
"trigger": {
"event": "contact.created",
"filter": [
{ "field": "lead_source", "op": "eq", "value": "cold-outbound" }
]
},
"exit_when": [
{ "field": "outbound_status", "op": "in",
"value": ["replied", "meeting_booked", "do_not_contact", "bounced"] }
],
"steps": [
{
"wait_days": 0,
"subject": "{{first_name}}, question about [pain]",
"body": "{{opener}}\n\nMost [ICP role]s I talk to handle [pain] with [status quo] - which works until [breaking point].\n\nWe built [product]: [one-line outcome with a number].\n\nWorth 15 minutes next week to see if it fits?\n\n[signature]"
},
{
"wait_days": 2,
"subject": "Re: {{first_name}}, question about [pain]",
"body": "Quick bump, {{first_name}} - I know [ICP role] inboxes are brutal.\n\nOne number since I wrote: [proof stat, e.g. 'Acme cut manual entry 60% in 3 weeks'].\n\nIf that is near anything on this quarter's list, happy to show you how.\n\n[signature]"
},
{
"wait_days": 5,
"subject": "[peer company] result: [metric]",
"body": "Different angle, {{first_name}}.\n\n[Peer company] had the same [pain]. [Two lines on what they did with the product, ending in a metric.]\n\nThe write-up is one page - want me to send it?\n\n[signature]"
},
{
"wait_days": 6,
"subject": "in case the blocker is [common objection]",
"body": "When [ICP role]s go quiet on me it is usually one of three things: bad timing, already solved, or assuming [common objection].\n\nIf it is the last one: [one-sentence counter].\n\nIf it is either of the first two, tell me and I will stop emailing.\n\n[signature]"
},
{
"wait_days": 7,
"subject": "closing the loop",
"body": "{{first_name}} - I will take the silence as 'not now' and close this out.\n\nIf [pain] climbs the list later, this inbox reaches a human, not a sequence.\n\nGood luck with [initiative or quarter].\n\n[signature]"
}
],
"enabled": true,
"enroll_existing": false
}
Dry-run it with GET /v1/sequences/{id}/preview (returns the send schedule and how many contacts would enroll right now, no side effects), or enroll one contact manually with POST /v1/sequences/{id}/enroll {"contact_id": "con_..."}. Build against a relm_test_ key first - test-mode sends are simulated and never delivered. Live delivery uses your own Resend key, connected once via POST /v1/connections {"channel": "email", "provider": "resend", "api_key": "re_...", "from": "You <[email protected]>"}. Full API reference in the docs; for wiring the branch writes into an agent loop, see the drip sequence recipes.
Apply it with your agent
If your agent speaks MCP, point it at https://api.relmcrm.com/mcp (see how to give your AI agent a CRM) and paste:
Set up my cold outbound cadence in Relm:
1. relm_create_field x3 on contact: lead_source (text),
outbound_status (text), opener (text).
2. relm_create_sequence with the JSON from
relmcrm.com/resources/cold-outbound-cadence-template,
replacing every [bracketed placeholder] with my product's
specifics (ask me for pain, proof stat, and objection first).
3. relm_preview_sequence and show me the send schedule.
4. For each prospect in the list I give you: research them,
write a one-sentence opener into custom_fields.opener,
create the contact with custom_fields.lead_source =
"cold-outbound".
5. When I forward you a reply, set custom_fields.outbound_status
per the branch table and, on meeting_booked, create a deal.
Or create the sequence directly with curl:
curl https://api.relmcrm.com/v1/sequences \
-H "Authorization: Bearer relm_test_..." \
-H "Content-Type: application/json" \
-d @cadence.json
FAQ
Why five touches and not eight or twelve?
Most positive replies arrive on touches one through three; each touch after five adds more spam-complaint risk than reply volume. Five touches over 21 days is enough persistence to catch busy buyers without burning the list or the sending domain. If a list is not replying by touch five, the problem is targeting or the offer, not the number of emails.
Should follow-ups go in the same thread?
Touch 2 should read as a bump on touch 1, so it reuses the subject with a Re: prefix. Touches 3 to 5 should each open a new subject and a new angle - a prospect who ignored the first framing twice will not respond to it a fourth time. Relm sends each step as its own message, so the Re: prefix is a copy decision, not a threading guarantee.
How does the sequence stop when someone replies?
The sequence carries exit_when conditions on the contact's outbound_status field. When you or your agent sets outbound_status to replied, meeting_booked, do_not_contact, or bounced, the enrollment exits. Relm re-checks exit conditions the moment the contact is updated and again before every send, so a reply logged at 9:00 stops the 9:05 follow-up.
Can I use this cadence without Relm?
Yes. The day structure, per-touch goals, email skeletons, and stop rules are tool-agnostic - they map onto any sequencer that supports delays and exit conditions. The JSON is only the fastest way to apply it: one POST /v1/sequences call and the cadence is live.
What reply rate should cold email get?
On a verified, tightly-targeted list with genuinely personalized first lines, a 1-5% positive reply rate is a realistic range; broad scraped lists sit well below that. Judge the cadence on positive replies per 100 prospects, not open rates - opens are unreliable since Apple Mail privacy changes. Under 1% positive means fix the list and the offer before touching the copy.
Ship this cadence in one API call
1,000 requests a month on the Free plan, no card. See pricing.
Start free →