> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hiveku.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Run Sales Sequences from Your Own Inbox

> Personal multi-step cadences that send from your connected Gmail or Outlook — with auto-exit on reply, stage change, or meeting booking

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.

<Info>
  **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](/email-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.
</Info>

## Before you start

<Steps>
  <Step title="Connect your sending inbox">
    Sales sequences send from the contact owner's connected inbox. Connect yours first:

    * [Connect Gmail](/how-tos/connect-gmail)
    * [Connect Outlook](/how-tos/connect-outlook)

    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.
  </Step>

  <Step title="(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>
</Steps>

## Step kinds

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

<CardGroup cols={2}>
  <Card title="email" icon="paper-plane">
    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.
  </Card>

  <Card title="call" icon="phone">
    Creates a **task** on your CRM queue with a due date. No auto-dial.
  </Card>

  <Card title="linkedin" icon="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.
  </Card>

  <Card title="task" icon="list-check">
    Generic task reminder — "research their latest funding round", "check for mutual connections".
  </Card>

  <Card title="wait" icon="hourglass">
    No side effect; just advances the pointer. Use `wait` between an email and a follow-up task to space them out.
  </Card>
</CardGroup>

### 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:

| Toggle                   | What it does                                                                | Typical use                              |
| ------------------------ | --------------------------------------------------------------------------- | ---------------------------------------- |
| **Exit on reply**        | Stops the sequence when the contact replies to any email in the thread.     | Default ON. You almost always want this. |
| **Exit on stage change** | Stops when the contact's lifecycle stage or a linked deal's stage changes.  | ON for post-qualification cadences.      |
| **Exit on booking**      | Stops 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

<Tabs>
  <Tab title="AI chat (fastest)">
    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.
  </Tab>

  <Tab title="Start from a template">
    Go to [**CRM → Sequences**](https://app.hiveku.com/dashboard/crm/sequences) and click **New from starter**. We ship a few battle-tested cadences (cold outbound, post-demo, re-engagement, renewal). Pick one, rename it, tweak the copy.
  </Tab>

  <Tab title="Build manually">
    <Steps>
      <Step title="Create">
        **CRM → Sequences → New**. Give it a name and a description.
      </Step>

      <Step title="Overview tab">
        Toggle exit flags, pick a timezone, set the send window, choose a pipeline (optional — scopes the sequence to one pipeline's deals).
      </Step>

      <Step title="Steps tab">
        **Add step → email**. Enter subject and body. Drop in merge variables. Set `delay_business_days` from the previous step. Save. Repeat for each step.
      </Step>

      <Step title="Activate">
        Flip the **Active** toggle at the top of the page. Only active sequences accept new enrollments.
      </Step>
    </Steps>
  </Tab>
</Tabs>

## 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 "{{first_name}}" 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

<AccordionGroup>
  <Accordion title="My enrollment says 'failed' with 'Owner has no connected Gmail/Outlook inbox'">
    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.
  </Accordion>

  <Accordion title="Emails queue but never send">
    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.
  </Accordion>

  <Accordion title="Exit-on-reply didn't fire even though the contact replied">
    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.
  </Accordion>

  <Accordion title="The send window dropped a step I expected to fire">
    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.
  </Accordion>

  <Accordion title="How do I duplicate a sequence?">
    On the sequence detail page, **… menu → Duplicate**. You get a copy (`Active = false`) with all steps intact. Rename, tweak, activate.
  </Accordion>
</AccordionGroup>

## Related

* [Connect Gmail](/how-tos/connect-gmail) · [Connect Outlook](/how-tos/connect-outlook) — prerequisite for sending
* [Add and Manage CRM Contacts](/how-tos/crm-contacts) — contact creation, tags, custom fields
* [Cold Email Campaigns](/how-tos/cold-email) — for high-volume blast (Marketing side)
* [Email Suppressions](/how-tos/email-suppressions) — account-wide opt-out list
* [Marketing Sequences](/email-marketing/sequences) — the SES blast cousin of this feature
