Skip to main content
POST
Add a step
Adds a step at the end of the cadence. To put it somewhere else, add it and then reorder the steps. A sequence holds at most 50 steps.

Step types

Tasks go to the rep who owns the enrollment. display_name becomes the task’s title, and task_note and task_priority are copied onto it. LinkedIn, meeting and SMS exist as one-off task types but cannot be cadence steps.

Variables in the name and note

A step’s name and note can name the person. display_name on a call or task step, and task_note on any step, take the same variables as a template, fallbacks included, except AI lines. They are filled in for each contact when the step creates the task: a step named Call {{first_name}} at {{company}} gives the rep a task called Call Dana at Acme Logistics.
  • An empty variable with no fallback shows as its name in brackets, such as [First name], so the rep sees what is missing. Nothing waits.
  • An email step’s name is the same for everyone, so it takes no variables.
  • AI lines are for emails only. A name or note cannot hold one.
A token a field cannot take is refused with 400 and the same body as a template write. Each entry in unknown also names its field:
reason is not_allowed_here for an AI line, and for anything in double braces in an email step’s name. A typo is not_a_variable, as in a template. See Calls and to-dos that name the person.

Examples

A call on the day someone is enrolled:
Two days later, an email that A/B tests two templates, sending the second three times as often:

Personalization

auto_email and manual_email steps can carry personalization. Each contact’s email is then written for them when the step runs, from the step’s template and what Salesfinity knows about them.
What it writes:
  • A template with AI lines ({{ai:opener|why I'm reaching out}}) gets those lines written for each person. A template without them is rewritten within instructions.
  • Each personalized email uses the team’s daily personalization budget.
  • If an email can’t be personalized, for example because the budget is used up, the plain template goes out instead. A template with AI lines goes to the rep as a manual_email task, rather than out with the lines unwritten.
  • An empty variable still holds the email when the template’s if_empty is wait, personalized or not.
enabled: true on a call or task step is refused with 400 (personalization is only allowed on auto_email and manual_email steps), and so is review: "rep" on a manual_email step (personalization.review = rep is only allowed on an auto_email step).

Rules

Each of these is a 400 naming the problem:
  • An interval sequence needs interval_seconds and refuses date. A date sequence needs date and refuses interval_seconds.
  • auto_email needs at least one template.
  • An auto_email step that starts a thread (the first email step, or one with new_thread: true) needs a subject on every template it uses. A step that replies in a thread does not.
  • templates and new_thread are only for auto_email and manual_email; call_purpose only for call.
  • Every template must be on your team. Archived templates are accepted.
A 51st step is refused with 422.

Things to know

  • Subjects and threads. An email step replies in the thread of the previous email unless you set new_thread: true, and a reply does not send its template’s subject. The first email step always starts a thread, so its template’s subject is the one the prospect sees.
  • Weights are relative. weight 0 keeps a template on the step but never picks it. An auto_email step whose templates all weigh 0 cannot send.
  • Adding to a running sequence. Allowed. People still partway through reach the new step after the earlier ones; people who already finished do not.
  • Retries. Without an Idempotency-Key, a retry appends the step twice.
  • user_id must be the sequence’s author, the team owner or a team admin.

Authorizations

x-api-key
string
header
required

Team-scoped API key generated in the Salesfinity dashboard under Settings → Connections → API & Webhooks. A missing or invalid key returns HTTP 403.

Headers

Idempotency-Key
string

Makes this write safe to retry. Send a unique value, such as a UUID, and send the same value again when you retry the same request. A retry with the same key and the same request (method, path including the query string, and JSON body) returns the original successful response without acting twice. The same key with a different body or path returns 409, and so does a retry while the first request is still running; that one is safe to repeat after a moment. A request that fails frees its key, so a retry runs the write again: after a 5xx on a create, confirm with a GET before retrying. Keys are kept for 24 hours and are scoped to your team.

Path Parameters

sequence_id
string
required

24-character sequence id.

Body

application/json
step_type
enum<string>
required

auto_email sends an email on its own; manual_email, call and task create a task for the rep who owns the enrollment.

Available options:
auto_email,
manual_email,
call,
task
user_id
string
required

The team member making the change. Must be the sequence's author, the team owner or a team admin, and have an active plan or seat. A 24-character hexadecimal ID.

Example:

"507f1f77bcf86cd799439011"

interval_seconds
number

Required on an interval sequence, refused on a date sequence. Seconds to wait after the previous step finished (an email sent, or a task completed or skipped); for the first step, after enrollment. Whole number.

Required range: x >= 0
date
string<date-time>

Required on a date sequence, refused on an interval sequence. ISO 8601 date-time when the step comes due.

display_name
string

The step's name, up to 200 characters. On a call or task step it titles the task the step creates and can use variables, filled in for each contact (Call {{first_name}} at {{company}}); an empty variable with no fallback shows as its name in brackets, such as [First name]. It takes the same variables as a template except AI lines. An email step's name is the same for everyone and takes no variables.

Maximum string length: 200
new_thread
boolean

auto_email and manual_email only. true starts a new email thread with this step's template subject; otherwise the email replies in the previous email's thread and the template's subject is not sent. The first email step always starts a thread.

task_note
string

Up to 2,000 characters, shown to the rep on the task the step creates. It can use variables on every step type, filled in for each contact; an empty variable with no fallback shows as its name in brackets, such as [First name]. It takes the same variables as a template except AI lines.

Maximum string length: 2000
task_priority
enum<string>
default:medium
Available options:
high,
medium,
low
task_autoskip_delay
number

Seconds after the task is created at which a still-open task expires and the enrollment moves on. Whole number. Omit to let tasks wait indefinitely.

Required range: x >= 0
call_purpose
object

call steps only.

templates
object[]

auto_email and manual_email only; auto_email needs at least one. 1 to 10 templates, each on your team (archived ones are accepted), picked by weight each time the step runs.

Maximum array length: 10
personalization
object

Email steps only (auto_email, manual_email); enabled: true on any other step is refused with 400. When on, each contact's email is written for them when the step runs, from the step's template and what Salesfinity knows about them: the template's AI lines ({{ai:name|what to write}}) are filled in, or, if it has none, the email is rewritten within instructions. If an email cannot be personalized (for example, the team's daily personalization budget is used up), the plain template is used instead; a template with AI lines goes to the rep as a manual_email task rather than out with the lines unwritten.

Response

The new step.

One step of a cadence.

_id
string

24-character hexadecimal id.

Example:

"507f1f77bcf86cd799439011"

sequence
string

The sequence the step belongs to (24-character id).

Example:

"507f1f77bcf86cd799439011"

team
string

The team that owns the step (24-character id).

order
integer

1-based position in the cadence. Steps run in this order; change it with PUT /v2/sequencer/sequences/{sequence_id}/steps/reorder.

step_type
enum<string>

auto_email sends an email on its own. manual_email creates a task with the email drafted from a template, for the rep to edit and send. call creates a call task. task creates a to-do. Tasks go to the rep who owns the enrollment.

Available options:
auto_email,
manual_email,
call,
task
interval_seconds
integer | null

On an interval sequence: seconds to wait after the previous step finished (an email sent, or a task completed or skipped) before this step comes due. For the first step, the wait after enrollment. Absent on a date sequence.

date
string<date-time> | null

On a date sequence: when the step comes due. Absent on an interval sequence.

display_name
string | null

The step's name. On a call or task step it can hold variables, and titles the task the step creates, filled in for that contact.

new_thread
boolean

Email steps: true starts a new email thread with this step's template subject; false replies in the previous email's thread, so the template's subject is not sent. The first email step always starts a thread.

task_note
string | null

Note for the rep, filled in for each contact on the task the step creates. It can hold variables.

task_priority
enum<string>

Priority copied onto the task the step creates. Defaults to medium.

Available options:
high,
medium,
low
task_autoskip_delay
integer | null

Seconds after the task is created (when the step comes due) at which a still-open task expires and the enrollment moves on to the next step. Absent means tasks wait indefinitely.

templates
object[]

Email steps: the templates to pick from, by weight. Empty for call and task steps.

call_purpose
object

Call steps only: the call purpose set on the step. Absent when none is set.

personalization
object | null

The step's AI personalization settings: enabled, instructions and review (auto or rep). Absent when personalization was never set.

deliver_count
integer

Number of deliveries from this step, counted as events. Rebuilt every 15 minutes.

open_count
integer

Number of opens from this step, counted as events. Rebuilt every 15 minutes.

click_count
integer

Number of link clicks from this step, counted as events. Rebuilt every 15 minutes.

reply_count
integer

Number of replies from this step, counted as events. Rebuilt every 15 minutes.

bounce_count
integer

Number of bounces from this step, counted as events. Rebuilt every 15 minutes.

opt_out_count
integer

Number of opt-outs from this step, counted as events. Rebuilt every 15 minutes.

failure_count
integer

Number of failed sends from this step, counted as events. Rebuilt every 15 minutes.

schedule_count
integer

Times this step ran and produced work: emails sent plus tasks created. Rebuilt every 15 minutes.

created_at
string<date-time>

When the step was created.

updated_at
string<date-time>

When it last changed.