Skip to main content
A sales sequence is a personal outreach cadence — a series of emails, call reminders, and LinkedIn tasks that fire on a schedule against a contact (or a batch of contacts). Each email is sent from your connected Gmail or Outlook, so the recipient sees a normal 1:1 message, not a marketing blast. When the contact replies, books a meeting, or changes stage, the sequence exits automatically so you stop pinging them.
Sales sequences ≠ Marketing sequences.
  • Sales Sequences (this page) — OAuth Gmail/Outlook, CRM-scoped, one rep’s inbox, exit on reply/booking. Lives under CRM → Sequences.
  • Marketing Sequences — SES blast, bulk audiences, engagement branching. Lives under Marketing → Sequences.
Use Sales for outbound and follow-up. Use Marketing for newsletters and drips.

Before you start

1

Connect your sending inbox

Sales sequences send from the contact owner’s connected inbox. Connect yours first:If the contact owner has no connected inbox when a step fires, the enrollment flips to failed with a red-pill message on the Enrollments tab. Connect, then resume.
2

(Optional) Set your send window and timezone

Per-sequence Overview lets you restrict sends to business hours in a specific timezone (e.g., 9–5 America/Chicago, weekdays only). Outside the window, the engine defers the send to the next open slot instead of queueing it immediately.

Step kinds

Each sequence is an ordered list of steps. Five kinds cover most cadences:

email

Send from your OAuth inbox. Subject + body support {{first_name}}, {{last_name}}, {{company_name}}, and any custom field you’ve added to contacts. CC/BCC supported per step. Unsubscribe footer auto-appended.

call

Creates a task on your CRM queue with a due date. No auto-dial.

linkedin

Creates a LinkedIn-flagged task on your CRM queue (connect request, DM, etc.) with a due date. You do the actual send in LinkedIn.

task

Generic task reminder — “research their latest funding round”, “check for mutual connections”.

wait

No side effect; just advances the pointer. Use wait between an email and a follow-up task to space them out.

Delays between steps

Each step has three delay inputs that stack (in order): business days, calendar days, hours.
  • delay_business_days = 2 means “Mon–Fri, 2 weekdays later”. Enroll on Friday → next step fires Tuesday.
  • Calendar days and hours are added on top of the business-day offset.
  • Holidays aren’t auto-skipped (v1). If you need them, add a wait step or pause the sequence.

Exit triggers

On the sequence Overview tab you can toggle three auto-exit rules:
ToggleWhat it doesTypical use
Exit on replyStops the sequence when the contact replies to any email in the thread.Default ON. You almost always want this.
Exit on stage changeStops when the contact’s lifecycle stage or a linked deal’s stage changes.ON for post-qualification cadences.
Exit on bookingStops when a meeting is booked for this contact in your connected calendar.Default ON.
These fire live through CRM triggers (reply logged → exit same-second) and are double-checked by the cron on every tick as a backstop.

Build a sequence — three ways

Open the AI SDR chat and describe the cadence. Example:
Build a 3-step outbound sequence for cold SaaS intros:
Day 1 — intro email with their company name and a one-line pitch
Day 3 business days — follow-up email asking about their current tooling
Day 7 business days — LinkedIn connect-request task
Exit on reply and on meeting booked.
The AI SDR creates the sequence, adds the steps, and wires the exit flags. Confirm by opening the sequence in the UI.

Merge variables

Anywhere in subject, body, CC, or BCC:
Hi {{first_name}},

Saw that {{company_name}} just shipped the new onboarding flow. Loved
the copy on the empty state — any appetite to compare notes on how
you measured activation?
Available out of the box: {{first_name}}, {{last_name}}, {{company_name}}, {{owner_first_name}}, {{owner_email}}. You can also reference any custom field you’ve added to contacts — e.g., if you have a custom field named renewal_date, {{renewal_date}} renders it. Multi-line custom field values preserve their line breaks. Missing values render as empty strings (no "" leaking through to the recipient). You can see the render live by clicking Preview with contact on any email step.

A/B variants per step

On any email step, toggle Enable A/B to add a second subject + body. Enrollments are assigned to A or B deterministically (hash of enrollment id), so roughly 50/50 over time. The Analytics tab breaks opens / clicks / replies out per variant so you can see which wins.

Templates

Save a good email step as a reusable template: Steps → … menu → Save as template. Pick from your templates later via the template picker on any new step. Templates are personal to your user — they don’t share across the account.

Spam-risk preview

Every email step shows a spam score (0–100, lower = better) and color band (green / amber / red) computed from a heuristic scorer (ALL-CAPS subjects, spam-vocabulary phrases, link-to-text ratio, excessive exclamations, empty subject, image-only bodies, dollar-sign patterns, and more). Fix the red warnings before you enroll. You can also ask the AI SDR:
Score this subject and body for spam risk, and rewrite it to be under 20.

Enroll contacts

Single contact

On any contact detail page, click Enroll in sequence. Modal picks:
  • which sequence (active only)
  • which of your connected inboxes to send from (defaults to the contact owner’s default; override only if you want sends attributed to a specific mailbox)

Bulk from the contacts list

Check rows, open the bulk action bar → Enroll in sequence. Same modal, but runs across the selected contacts. The response summarizes enrolled / skipped_duplicates / failed.

Duplicates and failure modes

  • Same contact, same sequence → skipped (a contact can be in the same sequence only once).
  • Same contact, different sequences → allowed.
  • Contact owner has no OAuth inbox → that enrollment is failed, with a red badge and a plain-English failure_message on the Enrollments tab. Fix by either (a) connecting an inbox, or (b) reassigning the contact to an owner who has one.

Manage live enrollments

The Enrollments tab on a sequence shows every active / paused / exited / failed enrollment. Per row you can:
  • Pause — freeze the cadence for this contact (no sends fire; pointer doesn’t advance).
  • Resume — unfreeze.
  • Unenroll — exit with reason manual. Cannot be undone; re-enroll to start over.
Exited enrollments show an exit reason: reply_received, stage_changed, booking, unsubscribed, manual, or completed (reached the end of the step list).

Suppressions

A contact can be globally suppressed from sales-sequence sends — either because they clicked the unsubscribe link, hit “mark as spam”, or you manually added them.
  • The unsubscribe footer on every email uses RFC 8058 one-click headers, so Gmail and Outlook native unsubscribe buttons work.
  • Manage the list at CRM → Settings → Suppressions.
  • Suppressed contacts can still be enrolled in a sequence — the email step will just skip them with the reason suppressed and move to the next step. No send goes out.

Analytics

Per sequence, the Analytics tab shows overall and per-step metrics:
  • Sent — how many emails actually dispatched (not queued)
  • Opens / Open rate — from the tracking pixel
  • Clicks / Click rate — from wrapped links
  • Replies / Reply rate — inbound CRM email activities tied to the sequence
  • Unsubs / Bounces — per the send provider’s callbacks
  • Meetings booked — calendar activities for enrolled contacts
A/B variants are broken out separately. The crm_sequences_compare tool lets the AI SDR rank two sequences head-to-head on reply rate.

Editing a live sequence

Steps are read from the database on every cron tick, so edits apply to steps that haven’t fired yet. Already-sent steps aren’t retroactively rewritten — the email went out with the old copy. Safe edits while enrollments are active:
  • Tweak subject / body of later steps
  • Adjust delays on not-yet-fired steps
  • Toggle exit flags on the sequence
Avoid:
  • Deleting a step that’s “up next” for many enrollments (pointer gets stranded; those enrollments jump to the next one, but you may not intend that)
  • Changing step_type mid-flight

Throttling and send caps

Account-wide knobs under Settings → Sales Sequences:
  • max_active_sequences_per_contact — cap the number of simultaneous sequences one contact can be in (prevents over-messaging).
  • sequence_hourly_send_cap — global hourly ceiling across all sales sequences. The queue clamps to this — extra sends roll to the next hour.
Leave defaults alone unless you’re scaling up past a few hundred sends/hour.

Troubleshooting

The contact’s owner hasn’t connected an OAuth sending inbox. Either connect one under Settings → Email Connections, or reassign the contact to an owner who has.
Two crons must run: crm-sequence-engine (enqueues sends) and email-send-queue-tick (actually dispatches). If you’re on Hiveku cloud, both run automatically. If self-hosted, confirm your cron scheduler is hitting both endpoints.
The reply needs to land as a CRM email activity — either the inbox sync picked it up, or someone logged it manually. If the mailbox isn’t syncing, replies won’t be detected. The cron backstop catches most edge cases on its next tick.
Steps only fire inside the sequence’s configured send_window_start_hour and send_window_end_hour in the sequence’s timezone, and on weekdays if send_weekdays_only = true. A step scheduled for Saturday 3am in a Mon-Fri 9-5 window defers to the next Monday at 9am.
On the sequence detail page, … menu → Duplicate. You get a copy (Active = false) with all steps intact. Rename, tweak, activate.