# Lemlist webhook trigger

> Run a workflow on Lemlist activity: email, LinkedIn, calls, SMS, WhatsApp, enrichment, and campaign events, optionally scoped to one campaign.

Source: https://cotera.co/docs/reference/webhooks/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](https://cotera.co/docs/reference/webhooks.md).

## 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](https://developer.lemlist.com/api-reference/endpoints/webhooks/add-webhook)). Without it, install fails with `lemlist_credentials_missing`.

## Setup

1. Add a **From an app** trigger and pick **Lemlist**, and enter your Lemlist API key.
2. Choose a channel, then the event within it (see the catalog below).
3. Optionally set a **campaign ID** to scope the trigger to a single campaign. Leave it empty to receive the event across all campaigns.
4. 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:

```json
{
  "_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.                                                                         |

### Email

| 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.  |

### LinkedIn

| 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                                                                                                                                  |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| WhatsApp             | `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`                                                                                          |

