Sequences
Create automated email sequences that send a series of emails to subscribers based on triggers like joining an audience, completing an action, or manual enrollment.
Create a Sequence
Create a new automation sequence linked to an audience. Sequences start in draft status and must be activated before they begin processing enrollments.
POST /v1/sequencesconst sequence = await client.sequences.create({
name: 'Welcome Series',
audienceId: 'audience_xxxxx',
triggerType: 'audience_join',
});
console.log(sequence.id); // sequence_xxxxx
console.log(sequence.status); // draftList Sequences
GET /v1/sequencesconst { data, hasMore, nextCursor } = await client.sequences.list({
limit: 20,
});
for (const seq of data) {
console.log(`${seq.name} (${seq.status}): ${seq.enrollmentCount} enrolled`);
}Get, Update, and Delete
Get a Sequence
GET /v1/sequences/:idconst sequence = await client.sequences.get('sequence_xxxxx');Update a Sequence
Only sequences in draft or paused status can be updated.
PUT /v1/sequences/:idconst sequence = await client.sequences.update('sequence_xxxxx', {
name: 'Updated Welcome Series',
triggerType: 'manual',
});Delete a Sequence
Only draft sequences can be deleted. Active or paused sequences must be archived first.
DELETE /v1/sequences/:idawait client.sequences.delete('sequence_xxxxx');Sequence Lifecycle
Control sequence status with activate, pause, and archive actions.
| Action | Endpoint | Description |
|---|---|---|
| activate | POST /v1/sequences/:id/activate | Start processing enrollments and sending emails |
| pause | POST /v1/sequences/:id/pause | Temporarily stop sending; enrollments are preserved |
| archive | POST /v1/sequences/:id/archive | Permanently deactivate; all enrollments are removed |
// Activate a draft sequence
const active = await client.sequences.activate('sequence_xxxxx');
console.log(active.status); // active
// Pause to make changes
const paused = await client.sequences.pause('sequence_xxxxx');
console.log(paused.status); // paused
// Archive when no longer needed
const archived = await client.sequences.archive('sequence_xxxxx');
console.log(archived.status); // archivedManaging Steps
Each sequence contains a series of steps. Steps can be emails or delays. Steps are executed in order based on their position field.
Add a Step
POST /v1/sequences/:id/steps// Add an email step
const emailStep = await client.sequences.addStep('sequence_xxxxx', {
position: 0,
type: 'email',
subject: 'Welcome to our platform!',
html: '<p>Hello {{firstName}}, thanks for signing up!</p>',
});
// Add a delay step (wait 3 days before the next email)
const delayStep = await client.sequences.addStep('sequence_xxxxx', {
position: 1,
type: 'delay',
delayDays: 3,
});
// Add a follow-up email
const followUp = await client.sequences.addStep('sequence_xxxxx', {
position: 2,
type: 'email',
subject: 'Getting started guide',
html: '<p>Here are some tips to get the most out of our product...</p>',
});Update a Step
PUT /v1/sequences/:id/steps/:stepIdconst step = await client.sequences.updateStep('sequence_xxxxx', 'step_xxxxx', {
subject: 'Updated: Welcome aboard!',
html: '<p>Hello {{firstName}}, welcome to the team!</p>',
});Delete a Step
DELETE /v1/sequences/:id/steps/:stepIdawait client.sequences.deleteStep('sequence_xxxxx', 'step_xxxxx');Reorder Steps
POST /v1/sequences/:id/steps/reorderawait client.sequences.reorderSteps('sequence_xxxxx', [
{ id: 'step_aaa', position: 0 },
{ id: 'step_bbb', position: 1 },
{ id: 'step_ccc', position: 2 },
]);Enrollments
Subscribers are enrolled into sequences either automatically (via trigger) or manually via the API. You can list enrollments and remove individual subscribers.
Enroll Subscribers
POST /v1/sequences/:id/enrollconst result = await client.sequences.enroll('sequence_xxxxx', [
'subscriber_aaa',
'subscriber_bbb',
'subscriber_ccc',
]);
console.log(`Enrolled ${result.enrolled} subscribers`);List Enrollments
GET /v1/sequences/:id/enrollmentsconst { data, hasMore } = await client.sequences.listEnrollments('sequence_xxxxx', {
limit: 50,
});
for (const enrollment of data) {
console.log(`${enrollment.subscriberId} — step ${enrollment.currentStep}, status: ${enrollment.status}`);
}Remove an Enrollment
DELETE /v1/sequences/:id/enrollments/:enrollmentIdawait client.sequences.removeEnrollment('sequence_xxxxx', 'enrollment_xxxxx');Trigger Types
Sequences can be triggered automatically or manually:
| Trigger | Description |
|---|---|
audience_join | Automatically enrolls subscribers when they join the linked audience |
manual | Subscribers are only enrolled via the API enroll endpoint |
Sequence Status
| Status | Description |
|---|---|
draft | Initial state; can be edited and have steps added |
active | Processing enrollments and sending emails |
paused | Temporarily stopped; can be resumed or edited |
archived | Permanently deactivated; read-only |
Requires the sequence:read scope for read operations and sequence:write scope for mutations.