Documentation

DocsAdvanced FeaturesCold Email Deliverability

Cold Email Deliverability

Purpose-built features for high-deliverability cold outreach: send windows, delay jitter, inbox rotation, email threading, and CAN-SPAM compliant unsubscribe.

Send Windows

Control when emails are delivered. Cold emails sent at 2am destroy reply rates. Add a sendWindow to any send_email node to restrict delivery to business hours in the recipient's timezone.

Send Window Configuration
{
  "type": "send_email",
  "sendWindow": {
    "start": "08:00",
    "end": "11:00",
    "timezone": "recipient",
    "businessDaysOnly": true
  }
}

Timezone options: recipient (uses contact's timezone field), sender, or UTC. When businessDaysOnly is true, sends skip weekends.

Delay Jitter

Enrolling 100 contacts shouldn't produce 100 follow-ups at the exact same millisecond — that's a spam signal. Add jitterMinutes to any delay node to spread sends across a window.

Jitter Configuration
{
  "type": "delay",
  "delayAmount": 3,
  "delayUnit": "days",
  "jitterMinutes": 120,
  "businessDaysOnly": true
}

With jitterMinutes: 120, each enrollment's delay is randomized by up to 2 hours. Jitter is computed once per enrollment and is deterministic on workflow replay.

Inbox Rotation

For lists over 50 contacts, rotate across multiple sending inboxes to protect domain reputation. Specify inboxIds instead of a single inboxId on send nodes. Each contact gets assigned a sender on enrollment and stays with that sender through the full sequence.

Inbox Rotation Configuration
{
  "type": "send_email",
  "inboxIds": ["inb_01", "inb_02", "inb_03"]
}

// Workflow-level sender strategy (in definition):
{
  "senderStrategy": "round_robin"  // or "random"
}

Email Threading

Follow-up emails automatically thread under the original message in Gmail and Outlook using In-Reply-To and References headers. The subject is prefixed with Re:. Threaded follow-ups get 2-3x the reply rate of new threads.

Threading is automatic. When a sequence has multiple send_email steps, steps 2+ reference the first email's Message-ID so they appear as replies in the recipient's inbox.

Opt-Out Compliance

Every outbound email includes CAN-SPAM compliant opt-out mechanisms. The behavior is controlled by optOutMode on the workflow definition:

  • reply (default) — No visible unsubscribe link in the email body. List-Unsubscribe and List-Unsubscribe-Post headers provide native unsubscribe buttons in Gmail/Outlook. Replies classified as not_interested or unsubscribe automatically suppress the contact. Use the {{unsubscribe_text}} Liquid variable to include soft opt-out language like "If this isn't relevant, just let me know.".
  • link — Appends a hyperlinked "Unsubscribe" to HTML emails and "Reply 'unsubscribe' to opt out" to plain-text emails. Also sets List-Unsubscribe headers.
  • header_only — No visible opt-out content in the email body. Only List-Unsubscribe headers are set.

When a recipient unsubscribes (via link, header, or reply classification), the contact is marked as suppressed and a recipient.unsubscribed event is created, triggering any matching exit criteria. Suppressed contacts cannot be re-enrolled.

Setting optOutMode on a workflow definition
{
  "optOutMode": "reply",
  "exitCriteria": [
    { "trigger": "reply" },
    { "trigger": "unsubscribe" }
  ]
}
POST/v1/unsubscribe/:token

Public endpoint (no auth required). Processes an unsubscribe request from a signed token.

TypeScript
// Handled automatically — recipients click the unsubscribe link
// The token is HMAC-signed and contains organizationId, contactId, enrollmentId
curl
# Recipients click this link; you don't call it directly.
# GET also supported — returns an HTML confirmation page.
curl -X POST https://api.outreachagent.dev/v1/unsubscribe/eyJvcm...