> ## Documentation Index
> Fetch the complete documentation index at: /help/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Get notified when things happen in Kerux.

> [!NOTE]
>
> **Pro plan.** Webhooks are part of Pro and Agency (and the free trial). On Starter, adding an endpoint shows **Part of Pro** with an **Upgrade to Pro** button. Endpoints you already have keep receiving events. See [Plans and billing](/help/account/billing.md).

Kerux sends events (for example `linkedin.invitation_accepted` or a reply's type, like `reply.positive`) to your URL as they happen. `linkedin.invitation_received` fires when someone sends one of your LinkedIn accounts an invitation (with their name, headline, profile link and note), once Kerux sees it (within about an hour in the daytime). `email.opened` and `email.clicked` fire when a contact opens a campaign email (once per email; a first click also counts as an open) or clicks a link in it (once per link), with the email's subject and the link; opens and clicks flagged as automatic (mail apps, security scanners) are left out. See [Email opens and clicks](/help/campaigns/email-opens-and-clicks.md). `sms.message_received` fires when a contact texts back one of your [Twilio](/help/integrations/twilio-sms.md) numbers, with `message.text` and `message.channel` (`sms`). A reply on LinkedIn is `linkedin.message_received`; WhatsApp and email replies also arrive as `linkedin.message_received` for now, with `message.channel` set to `whatsapp` or `email` so you can tell them apart. `linkedin.message_reacted` fires when a contact reacts to one of your LinkedIn messages (with the emoji; a reaction is never a reply). `linkedin.message_read` fires when a contact sees one of your LinkedIn messages (only when they share read receipts on LinkedIn; see [Seen, Delivered and Not seen yet](/help/inbox/read-receipts.md)). `sender.status_changed` fires when one of your LinkedIn accounts needs attention (locked, restricted, signed out, removed or not answering) or is back to normal, with what happened and what to do; see [LinkedIn asked to verify your account](/help/account-safety/account-health.md). `meeting.booked` and `meeting.cancelled` fire when a contact books or cancels a meeting (with `meeting.start`, `meeting.end` in UTC, `meeting.title`, `meeting.link` and `match`: `sure` or `confirmed`); `meeting.possible` fires when a meeting might be a contact's and waits for someone to confirm it. `meeting.transcript_ready` fires once per contact and call when a Google Meet or Zoom call's transcript is saved and its AI summary is ready (or won't be), with `meeting`, `transcript` (`source`, `chars`, `truncated`, `speakers`), `summary` (`discussed`, `interest`, `key_points`, `objections`, `next_steps`, `follow_up_date`) and `summary_reason`; see [Call transcripts and summaries](/help/campaigns/call-transcripts.md). `call.recorded` fires once per contact and call as soon as a call's transcript is stored (Google Meet, Zoom, another tool, an upload or a pasted transcript), before the summary, with `call` (`id`, `source`, `source_name`, `title`, `started_at`, `duration_minutes`, `transcript_url`, `recording_url`, `meeting_id`, `chars`); see [Automations driven by calls](/help/campaigns/call-automations.md). See [Meetings booked by contacts](/help/campaigns/meetings.md). `lead.stage_changed` fires when a contact moves to another [pipeline](/help/leads/pipeline.md) stage or off the board (by hand, through the API, or by itself on a reply or a booked meeting), with the stage it came from, the one it went to and whether it moved by itself. `linkedin.post_published` and `linkedin.post_failed` fire when a LinkedIn post scheduled in [Social posts](/help/campaigns/social-planner.md) goes out (with its link and when it was published) or can't (with the reason); `social.post_published` and `social.post_failed` do the same for Facebook, Instagram and X posts, with `platform`. With [Comment automation](/help/campaigns/comment-automation.md) on a post, `linkedin.post_comment_received` fires for each new comment (its text and author), `linkedin.comment_keyword_matched` when a comment had a keyword (with the contact and whether they entered the campaign), and `linkedin.comment_reply_sent` / `linkedin.comment_reply_failed` when Kerux's answer to a comment goes out or can't (with the reason). `inbox.reply_sent` fires when a reply typed in the [inbox](/help/inbox/use-the-inbox.md) (or sent through the API) goes out, on any channel, with `detail.channel` (`linkedin`, `email`, `whatsapp` or `sms`) and, for email, WhatsApp and SMS, `detail.to`, `detail.from` and the text. `lead.engagement_hot` fires when a contact's [engagement score](/help/leads/routing-and-engagement.md) reaches the workspace's hot threshold (once, until it cools down), with the score, the threshold and the signal that made it hot. `booking.created`, `booking.rescheduled` and `booking.cancelled` fire when someone books, moves or cancels a time on one of your [booking pages](/help/campaigns/booking-page.md), with `booking` (its `id`, `link_id`, `status`, `start`, `end` in UTC, `name`, `email`, `company`, `answers`, `lead_id`, `host_user_id`, `meeting_id` and `video_link`); the meeting itself also fires `meeting.booked` / `meeting.cancelled`.

**1. Add an endpoint**

In **Integrations > Developers**, under **Webhooks**, add your HTTPS URL and choose which events it receives (for example `lead.*`, or all of them).

**2. Verify the signature**

Every delivery is signed with the [Standard Webhooks](https://www.standardwebhooks.com) format. Use the endpoint's secret (starts with `whsec_`) to check the `webhook-signature` header. The `webhook-id` header stays the same across retries, so you can skip duplicates.

**3. Send a test**

Click **Send test event** to check your endpoint.

## Every event

Pick events one by one, a whole group (for example `enrollment.*`) or all of them.

| Group | Events |
| - | - |
| Contacts | `lead.created`, `lead.updated`, `lead.tag_added`, `lead.tag_removed`, `lead.stage_changed`, `lead.engagement_hot` |
| Contacts in campaigns | `enrollment.created`, `enrollment.node_entered`, `enrollment.moved`, `enrollment.paused`, `enrollment.resumed`, `enrollment.completed`, `enrollment.exited`, `enrollment.failed` |
| Campaigns | `workflow.published`, `workflow.paused`, `workflow.resumed` |
| LinkedIn actions | `linkedin.profile_visited`, `linkedin.invitation_sent`, `linkedin.invitation_accepted`, `linkedin.invitation_withdrawn`, `linkedin.invitation_received`, `linkedin.message_sent`, `linkedin.inmail_sent`, `linkedin.followed`, `linkedin.post_liked` |
| Messages | `linkedin.message_received`, `linkedin.message_read`, `linkedin.message_reacted`, `sms.message_received`, `inbox.reply_sent`, `email.opened`, `email.clicked` |
| Reply types | `reply.positive`, `reply.meeting_requested`, `reply.question`, `reply.not_now`, `reply.referral`, `reply.negative`, `reply.unsubscribe`, `reply.out_of_office`, `reply.other` |
| Meetings and calls | `meeting.booked`, `meeting.cancelled`, `meeting.possible`, `meeting.transcript_ready`, `call.recorded`, `booking.created`, `booking.rescheduled`, `booking.cancelled` |
| Posts and comments | `linkedin.post_published`, `linkedin.post_failed`, `social.post_published`, `social.post_failed`, `linkedin.post_comment_received`, `linkedin.comment_keyword_matched`, `linkedin.comment_reply_sent`, `linkedin.comment_reply_failed` |
| LinkedIn accounts | `sender.status_changed` |

## Send from a rule or a campaign

A [rule](/help/integrations/rules.md) (**Send to a webhook endpoint**) or a campaign's **Always on** box (**Send to another app (webhook)**, see [Meetings booked by contacts](/help/campaigns/meetings.md)) can send to one endpoint you pick, for example your chat tool, a CRM, Zapier or Make. That endpoint gets the event with the contact and the rule's name, even if the event isn't in its **Events** list, signed and retried like any other delivery. If the endpoint is turned off, the rule's run fails and shows in its run log.

## Retries

If your endpoint doesn't answer with a 2xx, Kerux tries again after 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 24 hours and 24 hours more (7 retries over about two days), then marks the delivery as **Gave up**. After 10 deliveries in a row that gave up, the endpoint is turned off and you get an alert in the app. Every delivery can be sent again from the log (kept 30 days).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.