- It continues the conversation. Emails go out from the same mailbox and, when a step’s subject is empty, in the same email thread as the conversation with the lead.
- Entering ends the main sequence. The lead’s remaining campaign emails are canceled - the lead never gets the campaign’s step 3 and the subsequence’s first email on the same day. It does not go back to the main sequence.
- One at a time, each once. A lead is in at most one subsequence at a time (a newer match replaces the current one) and enters each subsequence at most once.
- Any reply stops it. A reply from the lead to any email of the campaign, or a manual reply you send from the inbox, ends the lead’s subsequence.
- Only contacted leads. A subsequence continues a conversation, so a lead that was never emailed cannot enter. Unsubscribed, bounced and blacklisted leads never enter.
- Settings are inherited. Mailboxes, tracking, unsubscribe link, stop rules and verification skips come from the campaign and follow its changes. A subsequence has its own name, trigger, start, sending limits and emails.
403 with code subsequences_plan_required.
Scopes
Turning a subsequence on and moving leads into it lead to real email, so they need
campaigns:lifecycle - the same scope that starts a campaign.
Create a subsequence
"enabled": false, status: "draft") - it sends
nothing until you turn it on. Name, settings and emails are
all-or-nothing: if any part is invalid (400; details names the field when the error is about one),
nothing is created. The response is the subsequence, the same shape as
GET /v1/subsequences/{id}.
Settings
settings has three sections. Each one you send replaces that section as a
whole; the sections you leave out keep their value (on create: the defaults).
Trigger - who enters
any holds up to 5 rules - any of them enrolls a lead; each kind can be used
once. "any": [] means manual only: leads enter only when you
move them in.
when decides what an open or a click does:
{ "mode": "after_main_sequence", "waitDays": 0 }(recommended) - the lead finishes the main sequence first; if it did not reply, it enterswaitDayslater.{ "mode": "right_away" }- it enters at the open or click, and the rest of its main sequence is canceled.
sequence_finished_no_reply and "after_main_sequence" rules watch the main sequence,
so they need "main" in sources (400 otherwise).
sources says where the rules listen: "main" (the campaign’s own sequence) and/or
ids of other subsequences of the same campaign. That chains flows: a
“Re-engage” subsequence can hand leads that reply “Interested” to a “Book a call”
one. trigger always carries any, sources and filters - pass [] when there
is nothing to list.
filters (up to 5) are extra conditions - a lead enters only if all match:
Filters are checked when a rule enrolls a lead, not when you move one in, so a manual-only
subsequence ignores them. A filter no lead entering by the rules could pass is rejected
(
400): replied: false when every rule fires on a reply (replied, reply_contains,
lead_status with reply statuses - and Converted - only), replied: true when every rule fires only without
a reply (sequence_finished_no_reply, opens and clicks "after_main_sequence"),
engagement not_opened when every rule is an open or a click (a click counts as an
open), not_clicked when every rule is a click, and reached_step past the last step of
the main sequence. Two filters of the same kind (replied, email_provider, reached_step)
and filters that rule each other out are rejected too.
When one event matches several subsequences, the lead enters the first by
position (set it with PATCH).
Start - when the first email goes out
ooo_return works only with a single lead_status rule for
lead_replied_out_of_office. The first step has no delay of its own - start is it.
Emails still go out only inside the sending schedule.
Sending
schedule:inherit- the campaign’s schedule (default);custom- the subsequence keeps its own schedule, edited in the dashboard.dailyLimit.mode:inherit- its emails count toward the campaign’s daily limit and go out first, the campaign’s own emails use the rest (default);custom- its own limitvalueon top of the campaign’s;unlimited- only the mailboxes’ own daily limits apply.
settings.enabled in a request is
a 400. Use /enable and /pause.
Emails
sequence follows the same rules as a campaign’s sequence: a step is subject +
body (one variant A) or variants (an A/B test, up to 5, leads split evenly).
Two differences:
- An empty subject (
"") replies in the same thread as the conversation with the lead - recommended for the first step. A subject of its own starts a new thread. - Step 1 has no delay -
delayDays/delayHoursmust be0or left out on it (400otherwise); when it goes out is set bysettings.start. Later steps waitdelayDays/delayHoursafter the previous one - at least 1 hour (400otherwise, nothing is created).
Turn on, pause, resume
Response
/enableturns it on: from now on, leads that match the trigger enter it.enrollExisting: truealso enrolls the leads that already match (in the background) - by a lead status, a reply, a finished main sequence, or an open / a click in the main sequence;reply_containsrules and clicks on a URL count only from now on. A lead going through another subsequence right now is not taken out of it. On a draft campaign the subsequence staysdraftwhile on and starts together with the campaign./pauseturns it off: no new leads enter, and leads already in it wait - nothing more is sent to them - until it is resumed. The main sequence keeps sending. If this was the campaign’s last subsequence that is on, the main sequence has finished and no lead is still in a subsequence, the campaign then completes on its own (unless it keeps active when leads run out) - and/enableneeds a restart in the dashboard./resumeis the same as/enable: waiting leads continue, new ones enter again.
400). On a completed
campaign /enable answers 409 parent_completed - restart the campaign in the
dashboard first. A deleted campaign answers 404.
state says in one word why a subsequence is (not) sending:
status is the subsequence’s campaign status: active = sending; draft / paused = not sending right
now - it can still be on and wait for the campaign to start or restart; enabled and state tell which.
Move leads in
Move leads of the campaign into a subsequence by hand - by lead id or by email, up to 1000 per call:Response
leadIds (ids of the campaign’s leads, from
GET /v1/campaigns/{id}/leads) or emails, not both. start is { "mode": "now" } (the default),
{ "mode": "delay", "days": N } or { "mode": "date", "date": "YYYY-MM-DD" } - it
overrides the subsequence’s own settings.start for these leads.
Moving works whether the subsequence is on or off: into one that is paused or was never
turned on, the leads wait and start when you /enable (or /resume) it. Each lead’s
remaining campaign emails are canceled, exactly as when a trigger fires. The response counts who entered, who did not and why, and which ids
or emails are not leads of the campaign (notFound):
Treat any other key in
skipped the same way - the lead did not enter (for example,
not_family_lead when the lead was removed from the campaign while the call ran).
Read
{ "data": [ … ] } - an array of subsequences; one subsequence is the object itself:
Response
entered = inProgress + ended: an entry ends when its emails are all sent, the lead
replies, its status changes, it is removed or moves to another subsequence. waiting
(part of inProgress) is leads whose first email is not due yet. positive counts leads
that replied and whose status is positive now, when the lead became positive during this
subsequence - a subset of replied. A lead that turned positive in the main sequence
counts there, not here.
The campaign lists its subsequences too - GET /v1/campaigns/{id} has
"subsequences": [{ "id", "name", "status" }], and
GET /v1/campaigns/{id}/analytics adds subsequences with entered / in progress /
replied / positive counters per subsequence (all time). The campaign’s analytics
totals cover the campaign with its subsequences by default; scope=main gives the main
sequence and subsequenceId={id} one subsequence (see Analytics).
A subsequence id is not a campaign id in the API: it does not appear in
GET /v1/campaigns, and every /v1/campaigns/{id}… route answers 404 for it
(/v1/leads/search does not return subsequence lead rows either - it returns the
lead’s row in the campaign). Use /v1/subsequences/{id}.Emails of a subsequence in /v1/emails come with
the main campaign’s campaignId and the lead’s id in that campaign, plus a
subsequence object (id, name) - so every id you receive works with
/v1/campaigns/{id}….Update and delete
PATCH /v1/subsequences/{id} changes only what you send: name, position, any
settings section, sequence. A sent section or sequence replaces the current
one; step and variant ids change when sequence is replaced. The emails of a
running subsequence cannot be replaced - pause it first (400, nothing is written; see
/pause for what turning off the last subsequence that is on does).
Sections are written one after another, as with PATCH /v1/campaigns/{id}.
DELETE /v1/subsequences/{id} deletes it: its scheduled emails are canceled, and
leads in it do not return to the main sequence. Deleting the campaign’s last subsequence
that is on can let a campaign whose main sequence has finished complete, as /pause does.
Errors
Errors use the usual envelope. Codes specific to subsequences:MCP
The MCP server haslist_subsequences, create_subsequence,
update_subsequence and enroll_in_subsequence. A subsequence created there is off;
it is turned on in the dashboard or with
POST /v1/subsequences/{id}/enable.