Lemlist
Run a workflow on Lemlist activity — a lead replies, a LinkedIn invite is accepted, an enrichment finishes, a campaign completes. Lemlist has a large, channel-organized event catalog; each activity becomes the workflow's input.
For behavior shared by every provider (the delivery URL, testing), see the webhook triggers reference.
Prerequisites
Lemlist webhooks are auto-registered: Cotera creates the hook for you over Lemlist's API. You supply a Lemlist API Key on the trigger's setup page (see Lemlist's webhook API docs). Without it, install fails with lemlist_credentials_missing.
Setup
- Add a From an app trigger and pick Lemlist, and enter your Lemlist API key.
- Choose a channel, then the event within it (see the catalog below).
- Optionally set a campaign ID to scope the trigger to a single campaign. Leave it empty to receive the event across all campaigns.
- Save. Cotera registers the hook with Lemlist for that activity
type, pointed at the trigger's unique URL.
Deleting the trigger removes the hook from Lemlist. When a campaign is set, Lemlist filters server-side so the trigger only ever receives that campaign's deliveries.
Authentication
Lemlist doesn't sign deliveries or send a signature header. Instead, Cotera sets a shared secret when it creates the hook, and Lemlist echoes that secret inside the JSON body of every delivery. Cotera constant-time compares it against the trigger's secret and rejects anything that doesn't match. Cotera strips the secret field out before the payload reaches your workflow, so it never lands in a run input.
Payload
Each delivery is a Lemlist activity object, passed through as the workflow input (minus the stripped secret). The type field is the event key. An emailsOpened delivery looks like:
{
"_id": "act_ExAmPlE0123456789",
"type": "emailsOpened",
"teamId": "tea_ExAmPlE0123456789",
"createdAt": "2026-01-15T10:30:00.000Z",
"campaignId": "cam_ExAmPlE0123456789",
"campaignName": "Q1 Outbound",
"sequenceId": "seq_ExAmPlE0123456789",
"sequenceStep": 1,
"leadId": "lea_ExAmPlE0123456789",
"leadEmail": "jane@example.com",
"leadFirstName": "Jane",
"leadLastName": "Doe",
"contactId": "ctc_ExAmPlE0123456789",
"sendUserId": "usr_ExAmPlE0123456789",
"sendUserName": "Alex Rep",
"sendUserEmail": "alex@mycompany.com",
"subject": "Quick question, Jane",
"to": [{ "address": "jane@example.com", "name": "Jane Doe" }],
"cc": [],
"bcc": []
}
| Field | Description |
|---|---|
_id | The activity's unique id, used to deduplicate retries. |
type | The event key — matches the trigger's selected event. |
createdAt | When the activity happened. |
campaignId / campaignName | The campaign the activity belongs to. |
sequenceId / sequenceStep | The sequence and step within it. |
leadId / leadEmail / leadFirstName / leadLastName / contactId | The lead the activity is about. |
sendUserId / sendUserName / sendUserEmail | The sending user. |
subject / to / cc / bcc | Present on email events. |
Event catalog
Pick a channel, then an event. The event key is Lemlist's activity type — the same string that appears in the delivery's type field.
Lead journey
Aggregate lead-state events that span channels — Lemlist's engagement funnel.
| Event | Fires when |
|---|---|
contacted | A lead was contacted for the first time (first outreach sent). |
hooked | A lead became "hooked" — the aggregate opened stage, when they open a message on any channel. |
attracted | A lead became "attracted" — the aggregate clicked stage, when they click a link or accept a LinkedIn invite. |
warmed | A lead became "warmed" — the aggregate replied stage, when they reply on any channel. |
interested | A lead was marked as interested (an opportunity). |
notInterested | A lead was marked as not interested. |
| Event | Fires when |
|---|---|
emailsSent | An email step was sent to the lead. |
emailsOpened | The lead opened one of your emails. |
emailsClicked | The lead clicked a link in one of your emails. |
emailsReplied | The lead replied to one of your emails. |
emailsBounced | An email bounced — the recipient's server rejected delivery. |
emailsFailed | An email failed to send. |
emailsInterested | The lead was marked interested from an email interaction. |
emailsNotInterested | The lead was marked not interested from an email interaction. |
emailsUnsubscribed | The lead unsubscribed from your emails. |
Unsubscribe
| Event | Fires when |
|---|---|
entityUnsubscribed | The lead unsubscribed and was removed from all outreach. |
variableUnsubscribed | The lead unsubscribed via an unsubscribe link/variable. |
| Event | Fires when |
|---|---|
linkedinSent | A LinkedIn message was sent to the lead. |
linkedinOpened | The lead opened your LinkedIn message. |
linkedinReplied | The lead replied to your LinkedIn message. |
linkedinInterested | The lead was marked interested from a LinkedIn interaction. |
linkedinNotInterested | The lead was marked not interested from a LinkedIn interaction. |
linkedinSendFailed | A LinkedIn message failed to send. |
linkedinVisitDone | A LinkedIn profile-visit step completed. |
linkedinVisitFailed | A LinkedIn profile-visit step failed. |
linkedinFollowDone | A LinkedIn follow step completed. |
linkedinFollowFailed | A LinkedIn follow step failed. |
linkedinFollowSkipped | A LinkedIn follow step was skipped. |
linkedinInviteDone | A LinkedIn connection request was sent. |
linkedinInviteFailed | A LinkedIn connection request failed to send. |
linkedinInviteAccepted | The lead accepted your LinkedIn connection request. |
linkedinEndorseDone | A LinkedIn skill-endorsement step completed. |
linkedinEndorseFailed | A LinkedIn skill-endorsement step failed. |
linkedinEndorseSkipped | A LinkedIn skill-endorsement step was skipped. |
linkedinVoiceNoteDone | A LinkedIn voice note was sent to the lead. |
linkedinVoiceNoteFailed | A LinkedIn voice note failed to send. |
linkedinLikeLastPostDone | A step to like the lead's last post completed. |
linkedinLikeLastPostNoPost | A step to like the lead's last post found no post to like. |
linkedinLikeLastPostFailed | A step to like the lead's last post failed. |
linkedinWithdrawInvitationDone | A pending LinkedIn invitation was withdrawn. |
linkedinWithdrawInvitationFailed | Withdrawing a pending LinkedIn invitation failed. |
Other channels
The remaining channels follow the same sent → delivered → opened → replied → failed shape as email, plus per-channel and workspace events. Every key below is a valid activity type.
| Channel | Events |
|---|---|
whatsappMessageSent, whatsappMessageDelivered, whatsappMessageOpened, whatsappReplied, whatsappMessageFailed | |
| SMS | smsSent, smsDelivered, smsReplied, smsFailed |
| Call (Aircall) | aircallCreated, aircallEnded, aircallDone, aircallInterested, aircallNotInterested, callRecordingDone, callTranscriptDone |
| API steps | apiDone, apiInterested, apiNotInterested, apiFailed |
| Manual | manualInterested, manualNotInterested |
| Workspace / Campaign | paused, resumed, stopped, campaignComplete, customDomainErrors, connectionIssue, sendLimitReached, lemwarmPaused |
| Tasks / Notes | annotated |
| Enrichment | enrichmentDone, enrichmentError |
| Inbox | inboxLabelUpdated |
| Signal Agent | signalRegistered |
| Deliverability | deliverabilityAlertTriggered |
| Contact Sourcing | contactSourcingDone, contactSourcingFailed |