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/sequences
create-sequence.ts
const sequence = await client.sequences.create({
  name: 'Welcome Series',
  audienceId: 'audience_xxxxx',
  triggerType: 'audience_join',
});

console.log(sequence.id);     // sequence_xxxxx
console.log(sequence.status); // draft

List Sequences

GET /v1/sequences
list-sequences.ts
const { 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/:id
get-sequence.ts
const sequence = await client.sequences.get('sequence_xxxxx');

Update a Sequence

Only sequences in draft or paused status can be updated.

PUT /v1/sequences/:id
update-sequence.ts
const 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/:id
delete-sequence.ts
await client.sequences.delete('sequence_xxxxx');

Sequence Lifecycle

Control sequence status with activate, pause, and archive actions.

ActionEndpointDescription
activatePOST /v1/sequences/:id/activateStart processing enrollments and sending emails
pausePOST /v1/sequences/:id/pauseTemporarily stop sending; enrollments are preserved
archivePOST /v1/sequences/:id/archivePermanently deactivate; all enrollments are removed
sequence-lifecycle.ts
// 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); // archived

Managing 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-steps.ts
// 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/:stepId
update-step.ts
const 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/:stepId
delete-step.ts
await client.sequences.deleteStep('sequence_xxxxx', 'step_xxxxx');

Reorder Steps

POST /v1/sequences/:id/steps/reorder
reorder-steps.ts
await 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/enroll
enroll-subscribers.ts
const 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/enrollments
list-enrollments.ts
const { 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/:enrollmentId
remove-enrollment.ts
await client.sequences.removeEnrollment('sequence_xxxxx', 'enrollment_xxxxx');

Trigger Types

Sequences can be triggered automatically or manually:

TriggerDescription
audience_joinAutomatically enrolls subscribers when they join the linked audience
manualSubscribers are only enrolled via the API enroll endpoint

Sequence Status

StatusDescription
draftInitial state; can be edited and have steps added
activeProcessing enrollments and sending emails
pausedTemporarily stopped; can be resumed or edited
archivedPermanently deactivated; read-only

Requires the sequence:read scope for read operations and sequence:write scope for mutations.