Skip to main content

Documentation / Sequences

Sequences (Email Drip Cadences).

Multi-step outbound cadences with reply detection, mailbox safety caps, and per-step analytics. This page covers everything from creating your first sequence to wiring the REST API into your stack.

What sequences do

A sequence is a multi-step email cadence sent from a connected mailbox to a list of contacts. Each step is either an email, a wait delay, or a conditional branch (e.g. skip the next step if the prospect already replied).

Sequences are designed for outbound prospecting — cold and warm-intro cadences alike. The engine handles send windows, per-mailbox throttling, retries on transient SMTP errors, IMAP reply detection, and one-click unsubscribes by default.

Sequences live in your authenticated app under /app/sequences. The marketing overview is at /sequences.

Getting started

  1. Connect a mailbox. Go to /app/mailboxes and connect Gmail or Outlook via OAuth, or wire up SMTP / IMAP for a custom domain. Free plan allows 1 mailbox; Pro is unlimited.
  2. Create a sequence. Open /app/sequences → “New sequence”. Pick the mailbox, set a name, configure the send window (timezone, weekdays-only, start/end hour).
  3. Add steps. Step 1 is always an email. Add follow-ups via wait + email pairs (e.g. wait 2 days, send follow-up #1; wait 5 days, send follow-up #2). Use {{firstName}} and {{company}} merge tags for personalization.
  4. Enroll contacts. Pick a saved list (from /app/lists) or paste emails directly. Preview the rendered email against any contact before you start.
  5. Hit Start. The status flips from draftactive. Sends respect the send window and per-mailbox throttle. Replies auto-pause the contact.

Step types

TypePurposeNotes
emailSend a templated email with merge tags.Subject + HTML body + plain-text fallback. Rendered with {{firstName}}, {{company}}, {{customField}}.
waitDelay before the next step.Configured in days or hours. Honors the sequence's send window (a 2-day wait may stretch over a weekend if weekdays-only is on).
conditionalBranch on engagement signals.if_replied, if_opened, if_clicked. Skips the contact past the branched step when the condition matches.

Reply detection

Fareof opens an IMAP connection to every connected mailbox and polls for new mail. When a prospect on an active sequence replies, we detect the reply, auto-pause that contact's enrollment, and flip their status to replied.

  • Polling cadence: every ~5 minutes per mailbox. Expect a typical detection delay of 1-5 minutes.
  • Match strategy: we match on In-Reply-To / References headers first, then fall back to recipient + subject heuristics. Both threaded and non-threaded replies are caught.
  • Auto-pause: happens at the contact level — the sequence keeps running for everyone else. Toggle off via autoPauseOnReply on the sequence settings if you want manual review.
  • Notifications: a reply produces an in-app notification and (if enabled) an email digest.

Mailbox safety

Deliverability is everything. Fareof enforces both daily and hourly send caps per mailbox to keep your sender reputation intact across high-volume cadences.

SettingFree planPro plan
Daily send cap50 / day / mailboxUnlimited (provider-bound)
Hourly throttle~10 / hourConfigurable per mailbox
Connected mailboxes1Unlimited
Concurrent sequences1Unlimited

Warm-up notes: for new domains or fresh mailboxes, ramp up gradually — 10/day for week 1, 25/day for week 2, 50+/day from week 3. Fareof tracks open and reply rates per mailbox; if engagement collapses, you'll see a warning banner before the warning becomes a Postmaster Tools issue.

Bounce handling: hard bounces auto-pause the contact and surface the address for re-verification through the triple-check pipeline.

Status states

StatusMeaningTransitions
draftSequence is being built. No sends happen.active via /start
activeEngine is sending per the cadence.paused via /pause or auto-paused on bounce
completed when all contacts finish
pausedSends temporarily halted. Editable.active via /resume
completedAll enrolled contacts have hit a terminal state (replied, bounced, unsubscribed, or finished the last step).Read-only. Clone to re-run.

Analytics

Every sequence ships with per-step and per-contact analytics. The metrics tab shows the full funnel:

  • Sent — the SMTP server accepted the message.
  • Delivered — final-recipient handoff confirmed (no bounce, no defer).
  • Opened — open pixel fired (when tracking is enabled per sequence).
  • Clicked — at least one tracked link clicked.
  • Replied — IMAP reply detector matched.
  • Bounced — hard or soft bounce surfaced via SMTP DSN or async webhook.

Drill from the sequence header into per-step metrics, then into the per-contact log to see exactly which message in the cadence drove the reply.

API reference

Sequences are first-class REST resources under /api/sequences. All endpoints require Bearer token auth — see the authentication guide.

GET/api/sequences

List sequences in the active organization with rollup counts.

POST/api/sequences

Create a new sequence. Body: { name, mailboxId, sendWindowStartHour?, sendWindowEndHour?, autoPauseOnReply? }.

GET/api/sequences/:id

Fetch a single sequence with its steps and contact rollup.

PUT/api/sequences/:id

Update sequence metadata (name, send window, tracking flags).

POST/api/sequences/:id/steps

Append a new step. Body: { type: 'email' | 'wait' | 'conditional', subject?, body?, waitDays?, condition? }.

PUT/api/sequences/:id/steps/:idx

Update an existing step in place.

DELETE/api/sequences/:id/steps/:idx

Remove a step (other steps re-index).

POST/api/sequences/:id/enroll

Enroll contacts. Body: { listId } or { contactIds: [...] }.

POST/api/sequences/:id/start

Transition draft / paused → active. Engine begins sending.

POST/api/sequences/:id/pause

Halt active sends (per-contact state preserved).

POST/api/sequences/:id/resume

Resume from paused → active.

GET/api/sequences/:id/contacts

List enrolled contacts with their step progress and last-event timestamps.

POST/api/sequences/:id/preview

Render a step against a real contact before sending. Body: { stepIndex, contactId }.