← Resources

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.

TouchDayChannelGoalThe ask
1Day 1EmailProve relevance in the first line, name the pain15-minute call
2Day 3Email (bump)Resurface touch 1 with one new proof pointSame ask, shorter
3Day 8Email + LinkedIn view/followNew angle: a peer's result, not your product"Want the one-pager?"
4Day 14EmailPreempt the most likely silent objection"Tell me and I'll stop"
5Day 21Email (breakup)Close the loop, leave the door openNone

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:

ReplyWhat you doCRM write
Positive ("tell me more")Reply within the hour, propose two slotsoutbound_status = meeting_booked, create a deal
Objection ("we use X")One targeted counter, then a human owns the threadoutbound_status = replied
Not now ("try me in Q4")Thank them, ask permission to check backoutbound_status = replied, enroll in re-engagement later
Referral ("talk to Sam")Thank them, start a fresh cadence on Sam citing the referraloutbound_status = replied, create the new contact
Opt-out / annoyedApologize once, suppress foreveroutbound_status = do_not_contact
Hard bounceNothing - fix your list hygieneoutbound_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

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 →