Activity

trigger.lemlist_event
TriggerCRM & salesconnection requiredruns in-engine

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.

FieldTypeRequiredDefaultConstraintsExample
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).
arrayNo["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.
stringNo—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.
booleanNo———

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.

FieldTypeExample
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.
stringact_xXR99r2dyRedXb8pc
type
The activity type, e.g. emailsReplied. Branch on this when the trigger subscribes to more than one.
stringemailsReplied
created_at
When lemlist recorded the activity (ISO 8601, UTC).
string2024-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.
stringcam_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.
stringlea_u2H5qeBCGWKDdaj6B
lead_email
That lead's email address — the value most downstream nodes match on.
stringjohn.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.
number1
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.
booleantrue
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.