- Created three leads with different channel availability.
- Created a multichannel sequence in draft state.
- Added a LinkedIn branch and an email branch.
- Optionally validated leads before enrollment.
- Enrolled leads into the sequence.
- Launched the sequence.
This tutorial assumes your sender profile already exists and is ready to use. The guide still covers how to list sender profiles and assign one to the sequence.
Prerequisites
Prepare these values before you start:WORKSPACE_IDSALESFORGE_API_KEYSENDER_PROFILE_ID- a base URL for the Salesforge public API
- a base URL for the multichannel public API
SALESFORGE_API_KEY for requests to both services.
Both APIs use bearer authentication.
Step 1: Create leads in the workspace
Start by creating the leads you want to target. For this guide, create three lead shapes:- one lead with email only,
- one lead with LinkedIn only,
- one lead with both email and LinkedIn.
POST /workspaces/{workspaceID}/contacts/bulk
The Salesforge public API uses
contacts in endpoint paths and response field names. In this guide, those same records are referred to as leads to keep the sequencing terminology consistent.firstNameis required.- At least one of
emailorlinkedinUrlmust be present. - Each lead must include at least one tag through
tagsortagIds. customVarsis optional, but it cannot be an empty object.
contacts field, with fields such as id, email, linkedinUrl, tags, and customVars.
The action examples later in this guide use {{segment}} in message content, so make sure each lead you plan to enroll has that custom variable populated.
Store the returned IDs for later steps. In this tutorial, refer to them as:
EMAIL_ONLY_LEAD_IDLINKEDIN_ONLY_LEAD_IDOMNICHANNEL_LEAD_ID
GET /workspaces/{workspaceID}/contacts
Step 2: Discover the available multichannel actions and conditions
Do not hardcode action or condition IDs in client code. Use the reference endpoints first, then resolve the IDs you need from the response.List email actions
GET /multichannel/actions?channel=email
The action catalog includes a name, channel, branching type, and description. For an email step, the action you usually want is the one whose name is send_email.
List LinkedIn actions
GET /multichannel/actions?channel=linkedin
Common LinkedIn actions include these names:
li_connection_requestli_send_messageli_send_inmailli_view_profileli_withdraw_connection_requestli_like_latest_postli_follow_profile
id for li_send_message and store it as LINKEDIN_MESSAGE_ACTION_ID.
List available conditions
GET /multichannel/conditions
Use this endpoint to resolve the condition IDs you want to use in the graph.
For the sample flow below, resolve the condition whose name is has_linkedin_url and store its ID as HAS_LINKEDIN_URL_CONDITION_ID.
Other useful conditions you may see in the same catalog include:
has_email_addressrequest_accepted_within_daysli_is_already_connectedli_contact_replied_within_dayscheck_email_validation_status
Step 3: Create the multichannel sequence
Create the sequence in draft state first.POST /multichannel/workspaces/{workspaceID}/sequences
idstatustimezonenamedescriptionsettings
id as SEQUENCE_ID.
espMatchingEnabled is part of the public settings model, but enabling it can be feature-gated by workspace plan. Keep it omitted or false unless you know the workspace supports it.PATCH /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}
Step 4: Set an explicit schedule
New sequences receive a default schedule, but production integrations should normally set the schedule explicitly.PUT /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/schedule
enabled, from, and to values, where hours are integers from 0 to 23 and to must be greater than from.
To verify the schedule that is now attached to the sequence, call:
GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/schedule
Step 5: Assign an existing sender profile
The sender profile is the execution identity for the sequence. It is where mailbox and LinkedIn execution context come together. First, list sender profiles for the workspace if you need to confirm the correct profile ID.GET /multichannel/workspaces/{workspaceID}/sender-profiles
Then assign the sender profile to the sequence.
POST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/sender-profiles
123 with your actual sender profile ID or the SENDER_PROFILE_ID you already prepared.
To verify the assignment, call:
GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/sender-profiles
Step 6: Get the root branch before adding nodes
When a multichannel sequence is created, the root node is created automatically. You do not create that node yourself. Before you can add an action or condition, you need the branch ID that leaves the root node.GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/branches
Each branch record includes:
idfromNodeIdtoNodeIdnamedescription
ROOT_BRANCH_ID.
Desired sequence shape
This is the sequence you are building in the next steps. The root node already exists when the sequence is created, then a condition node routes leads by LinkedIn availability: leads with a LinkedIn identity go to the LinkedIn message branch, while email-only leads go to the email branch.Step 7: Add the first condition node
This tutorial uses one condition node first so the sequence can route leads by channel availability. Leads with a LinkedIn URL will go down the LinkedIn path. Leads without one will go down the email path.POST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/nodes/conditions
1001withROOT_BRANCH_ID12withHAS_LINKEDIN_URL_CONDITION_ID
GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/branches
The condition node creates outgoing branches that you can identify by name, typically yes and no.
Store them as:
LINKEDIN_BRANCH_IDfor theyesbranchEMAIL_BRANCH_IDfor thenobranch
Step 8: Add a LinkedIn action and an email action
Now create one action node on each branch.LinkedIn message action
Use the branch for leads that do have a LinkedIn URL.POST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/nodes/actions
2001withLINKEDIN_BRANCH_ID31withLINKEDIN_MESSAGE_ACTION_ID
Email action
Use the branch for leads that do not have a LinkedIn URL.POST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/nodes/actions
2002withEMAIL_BRANCH_ID14with the action ID whosenameissend_email
Step 9: Inspect the graph you just created
Before you validate or enroll leads, inspect the sequence structure. Useful inspection endpoints are:GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/nodesGET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/nodes/{nodeID}GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/branches
- the sequence is still in
draftstatus, - the correct sender profile is attached,
- the nodes are present with the right
actionIdorconditionId, - the branch IDs and
yesornorouting look correct.
Step 10: Optionally run validation before enrollment
Validation is optional, but it is useful if you want to enroll leads based on email quality or re-use a validation run as part of your selection logic.Validation in this flow is email-only. Use it for leads that have an email address, and add LinkedIn-only leads through a separate enrollment filter instead of putting them in the validation run.
POST /multichannel/workspaces/{workspaceID}/validations
validationJobID. Use that value as the run identifier in later steps.
To inspect the results, call:
GET /multichannel/workspaces/{workspaceID}/validations/{runID}/results
Validation filters can be broader than leadIds. The API also supports filters such as:
tagIdsespsvalidationStatusescustomVarssearchQueryhasValidLinkedInhasEmailexcludeContacted
Step 11: Enroll leads into the sequence
The multichannel public API supports several enrollment styles.Option A: Enroll explicit lead IDs
Use this when you already know the leads you want in the sequence.POST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/enrollments
Option B: Enroll from a validation run
Use this when you want the validation job to become the source for enrollment.POST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/enrollments
Option C: Add LinkedIn-only leads with another enrollment filter
Use this as a second enrollment call when you also want to add the LinkedIn-only segment to the same sequence.POST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/enrollments
linkedin-only segment in the workspace. This keeps the LinkedIn-only audience out of the email-validation step while still adding it through the same enrollment endpoint.
The enrollment filters support these selectors:
leadIdstagIdsespsvalidationStatusesvalidationRunIdhasValidLinkedInhasEmaillimit
validationRunId with explicit leadIds, the service resolves the validation run and intersects it with the lead ID list instead of treating those filters as unrelated sets.
In practice, that means a common pattern is: first enroll the validated email-capable leads with validationRunId, then make a second enrollment call with a different filter such as tagIds to add the LinkedIn-only audience.
The enrollment response returns the leadIds that were actually enrolled.
Step 12: Verify enrollments and launch the sequence
Before launch, re-check the sequence details.GET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}
The detailed response includes:
sequencenodesbranchesactiveEnrollmentCount
PATCH /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/launch
This endpoint does not require a request body. A successful response returns the sequence in its launched state, with status set to active.
The response returns the sequence in its launched state. That is the point where the sequence can begin active execution.
Step 13: Know the follow-up endpoints you will use next
After the first launch, these are the endpoints you will usually use operationally:GET /multichannel/workspaces/{workspaceID}/sequencesto list sequencesGET /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}to inspect one sequence in detailPATCH /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/statusto pause or resume a sequencePOST /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/enrollments/removeto remove leads by filterPATCH /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/nodes/actions/{nodeID}to update an action nodeDELETE /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/nodes/{nodeID}to remove a nodeDELETE /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}to delete the sequence
