Documentation
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.
{
"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.
{
"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.
{
"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.
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-UnsubscribeandList-Unsubscribe-Postheaders provide native unsubscribe buttons in Gmail/Outlook. Replies classified asnot_interestedorunsubscribeautomatically 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 setsList-Unsubscribeheaders.header_only— No visible opt-out content in the email body. OnlyList-Unsubscribeheaders 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.
{
"optOutMode": "reply",
"exitCriteria": [
{ "trigger": "reply" },
{ "trigger": "unsubscribe" }
]
}/v1/unsubscribe/:tokenPublic endpoint (no auth required). Processes an unsubscribe request from a signed token.
// Handled automatically — recipients click the unsubscribe link // The token is HMAC-signed and contains organizationId, contactId, enrollmentId
# 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...