Activity
Registers one lemlist hook per chosen activity type at publish and starts one run per delivery. Emits {id, type, campaign_id, lead_id, lead_email, payload}.
Start a run when a lemlist activity happens (a reply, an open, a bounce, a LinkedIn action, a campaign alert).
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- lemlist
- Secret shape
- the lemlist API key
- Resolved by
- config.connection_id, else node.connection_id
- Note
- The same API key the lemlist.* action nodes use — lemlist authenticates with HTTP Basic, empty username, key as the password, and has no per-scope keys. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to a URL lemlist can reach.
Configuration
3 fields, none required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
types Which lemlist activity types to subscribe to — one hook is registered per type. Any name lemlist accepts works, not only the ones listed; "*" subscribes to every activity type, which is noisy (every email sent, opened and clicked starts a run). | array | No | ["emailsReplied"] | 1–20 characters; array of string | — |
campaign_id Listen to one campaign only (cam_…). Leave blank to listen to every campaign on the team. Unlike the lemlist action nodes, this does not fall back to the connection's default campaign — a trigger narrowed by a setting nobody looked at is a trigger that silently misses most of the team's activity. | string | No | — | matches ^cam_[A-Za-z0-9]+$ | — |
first_only Fire only on the first occurrence of the activity for a lead — lemlist's isFirst. Off by default, so a lead who replies twice starts two runs. | boolean | No | — | — | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"types": [
"emailsReplied"
]
}Output
One shape.
lemlist activity
The flattened activity. `payload` carries lemlist's own keys, including the lead's variables, so the shape is open below the declared fields.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
id lemlist's activity id (act_…). Also the idempotency key: a redelivery carries the same id, so it joins the run it already started instead of starting a second. | string | act_xXR99r2dyRedXb8pc |
type The activity type, e.g. emailsReplied. Branch on this when the trigger subscribes to more than one. | string | emailsReplied |
created_at When lemlist recorded the activity (ISO 8601, UTC). | string | 2024-07-22T15:25:13.610Z |
campaign_id The campaign the activity belongs to (cam_…), or empty for a team-level alert such as connectionIssue or sendLimitReached. | string | cam_6mKKdaC5PNQiBu2jT |
campaign_name That campaign's name, as lemlist sent it. | string | — |
lead_id The lead the activity is about (lea_…). Pass it straight to lemlist.update_lead, lemlist.pause_lead and the rest. | string | lea_u2H5qeBCGWKDdaj6B |
lead_email That lead's email address — the value most downstream nodes match on. | string | john.doe@lempire.co |
team_id The lemlist team the activity happened in (tea_…). | string | — |
sequence_step Which step of the campaign sequence produced the activity, when the activity has one. Null for team-level alerts. | number | 1 |
is_first True when this is the first activity of this type for this lead — the same flag the 'Only the first occurrence' option filters on. | boolean | true |
payload The activity exactly as lemlist sent it, including the lead's own variables (firstName, companyName, and any custom ones). | object | — |
{
"campaign_id": "cam_6mKKdaC5PNQiBu2jT",
"campaign_name": "Example's campaign",
"created_at": "2024-07-22T15:25:13.610Z",
"id": "act_xXR99r2dyRedXb8pc",
"is_first": true,
"lead_email": "john.doe@lempire.co",
"lead_id": "lea_u2H5qeBCGWKDdaj6B",
"payload": {
"_id": "act_xXR99r2dyRedXb8pc",
"campaignId": "cam_6mKKdaC5PNQiBu2jT",
"leadEmail": "john.doe@lempire.co",
"leadFirstName": "John",
"type": "emailsReplied"
},
"sequence_step": 1,
"team_id": "tea_KAiTn2K9RoYA85MuY",
"type": "emailsReplied"
}Notes
- Publishing creates the hooks in lemlist; unpublishing, disabling or archiving deletes them. A workflow that is off is off at lemlist too.
- lemlist signs nothing — its webhook documentation defines no signature header and no shared secret — so the callback URL's unguessable id is the only thing protecting this endpoint. Treat the emitted lead as untrusted.
- One run per activity, idempotent on lemlist's own activity id (act_…), so a redelivery inside 24 hours cannot start a second run.
- The team-level alerts (connectionIssue, sendLimitReached, lemwarmPaused, customDomainErrors) carry no campaign and no lead — campaign_id and lead_email come through empty for those.
See Activity run in a workflow.
In a technical demo we add the lemlist connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.