URL: /revenue/sequences · Id: `page:/revenue/sequences`

# Sequences: follow-ups that stop on reply

> Timed follow-ups that stop the moment someone replies, books or buys, with conversion by step.

A [Sequence](https://startupbuilder.dev/business/nouns/sequence) is timed follow-ups that stop the moment someone replies, books or buys. Each step costs $0.04 drafted and sent (sample).

```text title="Ask"
Enroll Kestrel Rentals in our nurture follow-ups, then pause them while I talk to them.
```

```ts title="SDK"
import { $ } from 'startup-builder'

const { enrollment } = await $.Contact.enroll({ contact: 'contact_52', sequence: 'sequence_3' }, { mode: 'try' })   // Assisted nurture: 9 steps, front-loaded into month one
return await $.Enrollment.pause({ enrollment: 'enrollment_17' }, { mode: 'try' })   // “Maybe next quarter.”: the next step waits
```

```json title="Response · sample"
{
  "enrollment": {
    "$id": "https://api.sb/leaseline.app/enrollments/enrollment_17",
    "$type": "Enrollment",
    "status": "paused",
    "step": "outcome",
    "nextAt": null,
    "contact": {
      "$id": "https://api.sb/leaseline.app/contacts/contact_52",
      "$type": "Contact",
      "name": "Sam Ortiz"
    },
    "sequence": {
      "$id": "https://api.sb/leaseline.app/sequences/sequence_3",
      "$type": "Sequence"
    },
    "mode": "try"
  }
}
```

## What it does
| What you pay for | Price per unit (sample) | The call |
| --- | --- | --- |
| A step drafted and sent | $0.04 | <Op verb="Contact.enroll" /> |
| A pause or a resume | $0 | <Op verb="Enrollment.pause" /> |

## Run it
| Step | Call | What it does here |
| --- | --- | --- |
| <a id="step-1"></a>1 | <Op verb="Contact.enroll" /> | Assisted nurture: 9 steps, front-loaded into month one |
| <a id="step-2"></a>2 | <Op verb="Enrollment.pause" /> | “Maybe next quarter.”: the next step waits |

## Set it up
| Check | On the day-0 Startup | Fix | Your time | Wait | Then |
| --- | --- | --- | --- | --- | --- |
| <a id="check-suppressed-contact"></a>`suppressed-contact` | pass | enrolling a suppressed Contact refuses | 0 min | none | <Op verb="Collection.query" /> |
| <a id="check-no-consent"></a>`no-consent` | pass | each step reads Consent for its purpose before it sends | 0 min | none | <Op verb="Consent.create" /> |
| <a id="check-mailbox-warm"></a>`mailbox-warm` | pass | steps send only from a warmed Mailbox | 0 min | 14 days from day 0 | <Op verb="Mailbox.warm" /> |

```mdx title="sequences/nurture-assisted.mdx"
---
sequence: nurture-assisted
play: lead-nurture
sending: as-itself
steps:
  - { id: proof, wait: 1d, medium: email }
  - { id: outcome, wait: 4d, medium: email }
  - { id: question, wait: 2d, medium: email }
  - { id: offer, wait: 7d, medium: email }
  - { id: use-case, wait: 7d, medium: email }
  - { id: month-one-close, wait: 7d, medium: email }
  - { id: value-42, wait: 14d, medium: email }
  - { id: value-63, wait: 21d, medium: email }
  - { id: pausing, wait: 21d, medium: email }
exitOn:
  - A reply
  - A paid Order or Subscription
  - A stop at any scope
  - A hard bounce
  - A Deal opened after a held Meeting
  - 90 days with no Lead Event
  - Day 180
---
```

<div className="sbO-divider" role="separator" aria-label="Reference" data-divider="reference">Reference</div>

## The records
```json title="The Enrollment, paused · sample"
{
  "enrollment": {
    "$id": "https://api.sb/leaseline.app/enrollments/enrollment_17",
    "$type": "Enrollment",
    "status": "paused",
    "step": "outcome",
    "nextAt": null,
    "exitReason": null
  }
}
```

| Step | Wait | Message | Exits on |
| --- | --- | --- | --- |
| `proof` | 1d | One proof fact matched to the Lead’s interest. | A reply · A paid Order or Subscription · A stop at any scope · A hard bounce · A Deal opened after a held Meeting · 90 days with no Lead Event · Day 180 |
| `outcome` | 4d | A verified Customer outcome like theirs, or a Sample. | the same |
| `question` | 2d | One plain-text question. | the same |
| `offer` | 7d | The entry Offer as the Pricing Page states it, with a booking link. | the same |
| `use-case` | 7d | The use case for the Lead’s role, from the claims source. | the same |
| `month-one-close` | 7d | The month-one close: the Offer, two times, and a monthly-only choice. | the same |
| `value-42` | 14d | A new fact matching the interest; skipped when none exists. | the same |
| `value-63` | 21d | A new fact matching the interest; skipped when none exists. | the same |
| `pausing` | 21d | A new fact if one exists, the note that the Play is pausing, and how to reach a person. | the same |

`+4.1 per 100 · ■■□□ Early sign · n 412 · path → arr`

Conversion by step, `sample` until captured: replies or bookings per 100 who reached the step, read with <Op verb="Metric.query" /> on `nurture-conversion` by step.

| Step | Reached (n) | Replied or booked, per 100 | Confidence |
| --- | --- | --- | --- |
| `proof` | 412 | 3.4 | ■■□□ Early sign |
| `outcome` | 398 | 2.8 | ■■□□ Early sign |
| `question` | 371 | 4.6 | ■■□□ Early sign |
| `offer` | 340 | 5.9 | ■■□□ Early sign |
| `use-case` | 301 | 1.7 | ■■□□ Early sign |
| `month-one-close` | 277 | 4.3 | ■■□□ Early sign |
| `value-42` | 231 | 0.9 | ■■□□ Early sign |
| `value-63` | 204 | 0.5 | ■■□□ Early sign |
| `pausing` | 188 | 1.1 | ■■□□ Early sign |

## Calls
| Call | What it does | What else happens | Event |
| --- | --- | --- | --- |
| <Op verb="Contact.enroll" /> | Enroll adds a Contact to a Sequence, which sends its steps until the Contact replies or exits. | Refuses a suppressed Contact or one with no consent for the Sequence’s purpose. | [`Contact.enrolled`](#event-contact-enrolled) |
| <Op verb="Enrollment.pause" /> | Pause stops one Contact’s run through a Sequence at its current step, without ending it. | — | [`Enrollment.paused`](#event-enrollment-paused) |
| <Op verb="Enrollment.resume" /> | Resume restarts a paused run at the step it stopped on and sets when that step fires. | Sets `nextAt` from the step’s wait, counted from now. | [`Enrollment.resumed`](#event-enrollment-resumed) |
| <Op verb="Enrollment.cancel" /> | Cancel ends one Contact’s run through a Sequence for good, with the reason it records as `exitReason`. | — | [`Enrollment.canceled`](#event-enrollment-canceled) |
| <Op verb="Sequence.create" /> | Not in the hub registry snapshot. | Today: — | — |

## Events
<a id="event-contact-enrolled"></a>

```json title="Contact.enrolled · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1",
  "$type": "Event",
  "name": "Contact.enrolled",
  "at": "2026-10-22T12:00:00Z",
  "seq": 1,
  "data": {
    "contact": {
      "$id": "https://api.sb/leaseline.app/contacts/contact_1",
      "$type": "Contact",
      "email": "dana@leaseline.app",
      "phone": "Example phone"
    },
    "enrollment": {
      "$id": "https://api.sb/leaseline.app/enrollments/enrollment_1",
      "$type": "Enrollment",
      "status": "active",
      "step": "Example step"
    }
  }
}
```

<a id="event-enrollment-paused"></a>

```json title="Enrollment.paused · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1",
  "$type": "Event",
  "name": "Enrollment.paused",
  "at": "2026-10-22T12:00:00Z",
  "seq": 1,
  "data": {
    "enrollment": {
      "$id": "https://api.sb/leaseline.app/enrollments/enrollment_1",
      "$type": "Enrollment",
      "status": "active",
      "step": "Example step"
    }
  }
}
```

<a id="event-enrollment-resumed"></a>

```json title="Enrollment.resumed · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1",
  "$type": "Event",
  "name": "Enrollment.resumed",
  "at": "2026-10-22T12:00:00Z",
  "seq": 1,
  "data": {
    "enrollment": {
      "$id": "https://api.sb/leaseline.app/enrollments/enrollment_1",
      "$type": "Enrollment",
      "status": "active",
      "step": "Example step"
    }
  }
}
```

<a id="event-enrollment-canceled"></a>

```json title="Enrollment.canceled · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1",
  "$type": "Event",
  "name": "Enrollment.canceled",
  "at": "2026-10-22T12:00:00Z",
  "seq": 1,
  "data": {
    "enrollment": {
      "$id": "https://api.sb/leaseline.app/enrollments/enrollment_1",
      "$type": "Enrollment",
      "status": "active",
      "step": "Example step"
    }
  }
}
```

<a id="event-sequence-created"></a>

```json title="Sequence.created · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1",
  "$type": "Event",
  "name": "Sequence.created",
  "at": "2026-10-22T12:00:00Z",
  "seq": 1,
  "data": {
    "sequence": {
      "$id": "https://api.sb/leaseline.app/sequences/sequence_1",
      "$type": "Sequence",
      "steps": {}
    }
  }
}
```

## Refuses when
| Check | Refuses | Fix | Then |
| --- | --- | --- | --- |
| [`suppressed-contact`](/code/refusals#check-suppressed-contact) | a send or Sequence step to a Contact on a Suppression, from any Play | Leave them out: run the List again, which drops every suppressed Contact. | <Op verb="Collection.query" /> |
| [`no-consent`](/code/refusals#check-no-consent) | a send or Sequence step whose purpose the Contact has given no Consent for | Record the Contact’s yes, with where they gave it, before the first send. | <Op verb="Consent.create" /> |
| [`mailbox-warm`](/code/refusals#check-mailbox-warm) <NotLiveYet gap="sales-guards" /> | a first cold email from a Mailbox that has not finished warming | Wait for the warm-up to finish, 14 days from day 0; warm intros keep running. | <Op verb="Mailbox.warm" /> |

```json title="422 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Step two to Lakeside Rentals’ owner did not send: they asked us to stop on Oct 12.",
  "checks": [
    {
      "check": "suppressed-contact",
      "status": "fail",
      "observed": "Suppression suppression_6, unsubscribed 2026-10-12",
      "doc": "/code/refusals#check-suppressed-contact",
      "fix": "Leave them out: run the List again, which drops every suppressed Contact.",
      "then": "Collection.query"
    }
  ]
}
```


```json title="422 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Pinecrest Homes’ second visitor was not enrolled: no Consent on record for sales email.",
  "checks": [
    {
      "check": "suppressed-contact",
      "status": "pass"
    },
    {
      "check": "no-consent",
      "status": "fail",
      "observed": "no Consent for purpose sales-email",
      "doc": "/code/refusals#check-no-consent",
      "fix": "Record the Contact’s yes, with where they gave it, before the first send.",
      "then": "Consent.create"
    }
  ]
}
```

## Pauses when
| Stop | Pauses when | Fix | Then |
| --- | --- | --- | --- |
| [`unanswered-positive`](/code/refusals#stop-unanswered-positive) | a reply asking to meet that waits 60 minutes for a person | Answer the reply, then approve the resume. | <Op verb="Approval.approve" /> |
| [`kill-switch`](/code/refusals#stop-kill-switch) | you press it, or the injection Stop fires | Review what fired, then turn the Process back on. | <Op verb="Process.enable" /> |

```json title="Campaign.paused · unanswered-positive · Not live yet, gaps #2 · sample"
{
  "$id": "https://api.sb/leaseline.app/events/event_951",
  "$type": "Event",
  "name": "Campaign.paused",
  "at": "2026-10-19T16:45:00Z",
  "data": {
    "campaign": {
      "$id": "https://api.sb/leaseline.app/campaigns/cold-email",
      "$type": "Campaign"
    },
    "reason": {
      "limit": "unanswered-positive",
      "observed": "64m",
      "bound": "60m",
      "window": "60m"
    },
    "task": {
      "$id": "https://api.sb/leaseline.app/tasks/task_88",
      "$type": "Task"
    }
  }
}
```

## Plays that use it
| Play | What it does | Its Metric |
| --- | --- | --- |
| [Lead nurture](/plays/lead-nurture) | Follows up each unbought Lead with notes keyed to what they did, most in month one, until they buy, reply or go quiet 90 days. | `nurture-conversion` |

Metric it reaches: [Nurture conversion](/revenue/new-paying-customers) (`nurture-conversion`).

## Hub guides it deepens
| On startupbuilder.dev | Id | What it holds |
| --- | --- | --- |
| [Sequence](https://startupbuilder.dev/business/nouns/sequence) | `noun:sequence` | the record, its fields and every call on it |
| [Enrollment](https://startupbuilder.dev/business/nouns/enrollment) | `noun:enrollment` | the record, its fields and every call on it |

## Example
| Leaseline, when | What happened | Cost (sample) |
| --- | --- | --- |
| 2026-10-14 | Kestrel Rentals enters Assisted nurture | $0 |
| 2026-10-19 | after step two, Sam replies “Maybe next quarter”; Dana pauses it while she calls | $0.08 for 2 steps |