steps parameter on flow_set takes an ordered array of step objects. delay is measured from completion of the previous step, not from launch.
Call
reference with topic: "sequence_steps" or "triggers" before authoring a sequence. It returns the live vocabulary the server validates against.Step types
| Type | Required fields | Needs |
|---|---|---|
CONNECT | note (≤300 chars) or connectWithoutMessage: true | LinkedIn account |
MESSAGE | message | LinkedIn account |
INMAILS | message (subject recommended) | LinkedIn account |
VOICE | message — the script for the voice note | LinkedIn account |
EMAIL | subject + message | mailbox, Pro plan |
ENGAGEMENT | — (postsToLike / commentsToAdd / skillsToEndorse, default 2/0/0) | LinkedIn account |
FOLLOW | — | LinkedIn account |
FOLLOW_COMPANY | followCompanyUrl | LinkedIn account |
EVENT | eventUrl | LinkedIn account, Pro plan |
EVENT_MESSAGE | message | LinkedIn account |
GROUP_MESSAGE | message | LinkedIn account |
WITHDRAW | — (delay in days since the invite, default 7) | LinkedIn account |
TASK | title | — |
API | — (fires the campaign webhook) | — |
GPT | instructions (+ provider, model) | Pro plan, AI provider |
FINDER | — (enriches the lead with an email address) | Pro plan |
QUALIFIER | personaId | Pro plan, AI provider |
SEND_TO_CAMPAIGN | newCampaignId | — |
ASSIGN_TAG | tagId | — |
TRIGGER | trigger (+ optional yes / no branches) | — |
Step fields
| Field | Type | Applies to | Description |
|---|---|---|---|
type | enum | all | Which step this is. Required. |
delay | integer (0–365) | all | Wait after the previous step completes. Default 1, or the trigger default for TRIGGER. |
delayType | days | hours | minutes | all | Unit for delay. Default days. |
note | string (≤300) | CONNECT | The invitation note. LinkedIn caps this at 300 characters, or 200 without Premium. |
shortNote | string (≤200) | CONNECT | Fallback note used once the account exhausts its long-note allowance. |
connectWithoutMessage | boolean | CONNECT | Send a bare invitation. Higher accept rate, no personalisation. |
subject | string | EMAIL, INMAILS | Subject line. |
message | string | MESSAGE, EMAIL, INMAILS, VOICE, GROUP_MESSAGE, EVENT_MESSAGE | Body. Supports {{firstName}}-style merge fields. |
attachment | object | messaging steps | { url, name?, type? }. Must already be hosted at a publicly reachable URL the platform can fetch. |
useCredits | boolean | INMAILS | Spend InMail credits when the lead is not an Open Profile. |
abTestingEnabled | boolean | messaging steps | Split traffic between the A copy and the B copy. |
bNote / bShortNote / bSubject / bMessage | string | messaging steps | Variant B copy. Required when abTestingEnabled is set. |
postsToLike | integer (0–10) | ENGAGEMENT | Recent posts to like. Default 2. |
commentsToAdd | integer (0–10) | ENGAGEMENT | Posts to comment on. Default 0. |
skillsToEndorse | integer (0–10) | ENGAGEMENT | Skills to endorse. Default 0. |
followCompanyUrl | string | FOLLOW_COMPANY | LinkedIn company page to follow. |
eventUrl | string | EVENT | LinkedIn event to invite the lead to. |
newCampaignId | string | SEND_TO_CAMPAIGN | Campaign to move the lead into. |
tagId | string | ASSIGN_TAG | Tag to apply. See tag_list. |
provider / model | string | GPT | Which connected AI provider and model to call. |
instructions | string | GPT | Prompt used to draft the personalised opener. |
personaId | string | QUALIFIER | Persona to score the lead against. Required — the flow save fails without it. |
mismatchAction | enum | QUALIFIER | NONE | TAG | MARK_NOT_QUALIFIED | REMOVE_FROM_CAMPAIGN. Default MARK_NOT_QUALIFIED. |
mismatchNext | CONTINUE | STOP | QUALIFIER | Whether a mismatched lead continues down the flow. Default STOP. |
title | string | TASK | What your team should do. |
trigger | enum | TRIGGER | The branch condition. |
prompt / branches | string / object[] | TRIGGER CUSTOM | Classification prompt and the two branch labels. |
yes / no | step[] | TRIGGER | Steps to run on each branch. Omit one to end the sequence there. |
Merge fields
Available in note, shortNote, subject and message:{{firstName}}, {{lastName}}, {{designation}}, {{location}}, {{companyName}}, {{industry}}, {{senderName}}, {{signature}} — plus anything from placeholder_list and any CSV column mapped to customVariable.
Branch conditions
ATRIGGER step branches on one of these conditions. Put the steps for each outcome under yes and no.
| trigger | Condition | Default wait |
|---|---|---|
If_Replied | If replied | 1 days |
If_Connected | If connection accepted | 1 days |
If_Interested | If reply classified as interested (Pro) | 0 days |
If_InMail_Open | If InMail opened | 0 days |
If_Email_Exists | If an email address was found | 0 days |
If_Email_Opened | If email opened | 1 days |
If_Email_Bounced | If email bounced | 1 days |
If_Link_Clicked | If a tracked link was clicked | 1 days |
If_Visited_Profile | If the lead viewed your profile | 1 days |
CUSTOM | AI Decision Maker — classify with an LLM (Pro) | 0 days |
A
TRIGGER is always the last entry in its list — anything that comes after it goes under yes or no. An omitted branch simply ends the sequence for that lead.Example sequence
Connect with a note, then branch on acceptance. Accepted leads get a LinkedIn message and, if they don’t reply, an email. Leads who don’t accept within two weeks have their invitation withdrawn.[
{
"type": "CONNECT",
"delay": 0,
"note": "Hi {{firstName}} — noticed you're running RevOps at {{companyName}}. Mind if I share how similar teams cut CRM admin?"
},
{
"type": "TRIGGER",
"trigger": "If_Connected",
"delay": 2,
"yes": [
{
"type": "MESSAGE",
"delay": 1,
"message": "Thanks for connecting, {{firstName}}. How are you handling pipeline hygiene today?"
},
{
"type": "TRIGGER",
"trigger": "If_Replied",
"delay": 4,
"no": [
{
"type": "EMAIL",
"delay": 3,
"subject": "The teardown I mentioned",
"message": "Hi {{firstName}},\n\nSending this over in case LinkedIn is not where you live."
}
]
}
],
"no": [
{
"type": "WITHDRAW",
"delay": 14
}
]
}
]
