# Send lead events to your own endpoint

URL: https://useembers.com/help/integrations/webhooks/
Category: Integrations
Plan: Solo and above
Updated: 2026-10-30
Last verified: 2026-10-30

> Create a signed HTTPS webhook endpoint in Embers, choose its events, save the signing secret, send a sample, and read the 30-day delivery log.

A webhook endpoint sends every lead event, as signed JSON, to a URL you control. Choose it when you want every field Embers has, or when the tool you use is not one of the native destinations you can [choose from for your leads](/help/integrations/overview/).

> **Warning: Solo and above, administrators only**
>
> Webhook endpoints require Solo or above, and only workspace admins can create them, see their signing secrets, or read their delivery logs. Other members see "Administrator access required" on the screen. [Plans and limits](/help/account-and-billing/plans-and-limits/) lists what each plan includes.

## Before you start

- A public HTTPS receiving URL on the default port (443). Embers rejects plain HTTP, any other port, a username or password in the URL, a hostname that resolves to a private address, and any URL containing `#`, because a fragment is never sent in an HTTP request.
- With a service such as Webhook.site, copy the unique receiving URL, not the dashboard or viewer URL open in your browser.
- Somewhere safe for the signing secret, such as your receiver's secret manager.

## Create an endpoint

For Zapier, Make, or Clay you can skip these steps: **Set up** on the tool's row on **Integrations** adds an endpoint named after the tool, subscribed to new leads. See the guides for [Zapier](/help/integrations/zapier/), [Make](/help/integrations/make/), and [Clay](/help/integrations/clay/).

### Open the Webhooks page

Open **Integrations** in the sidebar (`/integrations`). On the **Build your own** shelf, choose the button on the **Webhooks** row: **Configure**, or **Fix** when an endpoint needs you. It opens the Webhooks page (`/integrations/webhooks`).

**Settings**, then **API and webhooks**, then **Webhooks** (`/developer/webhooks`) manages the same endpoints in its own layout, and every step below works there too. The API and webhooks entry only appears for administrators.

### Add the endpoint

Choose **Add endpoint** on the **Endpoints** card. Give it a **Name** that says where the events go, for example `Sales CRM`, and paste the receiving URL into **Endpoint URL**. With no endpoints, **Add endpoint** is in the empty state below the heading. A workspace can have up to 10 endpoints; at the tenth, the sentence "10 of 10 endpoints. Delete one to add another." takes the button's place. Under Settings, then **API and webhooks**, **Add endpoint** is in the top bar instead, once your endpoints have loaded, and at ten the top bar carries the same sentence (on a phone, "10 of 10 endpoints").

### Choose the events

Each endpoint has its own subscriptions, and at least one must be selected:

| In the app | Event type | Fires when | New endpoint |
| --- | --- | --- | --- |
| New ICP lead | `lead.created` | A scored engager matches your ICP or is approved manually | Selected |
| New engagement | `lead.engagement.added` | A lead you already have engages again. One event per lead per scan | Not selected |
| Lead status changed | `lead.status_changed` | A lead moves to a different pipeline status | Selected |
| Lead changed | `lead.changed` | Embers confirms a change at a lead or their company: a new role, a title change, headcount growth, hiring, team hiring, funding, a new leader, or an acquisition | Not selected |
| Report ready | `report.generated` | A client report finishes generating or regenerating | Selected |

**New engagement** is the highest-volume event, which is why a new endpoint does not subscribe to it. Add it once your receiver can handle repeats. **Lead changed** is not selected either, so an endpoint never starts receiving it unasked.

### Save the signing secret

When you choose **Create endpoint**, Embers shows **Save the signing secret** with a secret that starts `whsec_`. Copy it into your receiver's secret manager, then choose **I saved the secret**. It is not shown again.

### Send a sample event

Open the endpoint's **...** menu and choose **Send test**. It sends a sample of the first event the endpoint subscribes to, and the delivery shows on the **Activity** card. **Send test** beside the status at the top of the page does the same for the first endpoint that can deliver. Under Settings, then API and webhooks, **Test** lets you pick the event under **Send a sample event**.

The sample arrives with the event type `webhook.test` and `data.is_test` set to `true`, so your receiver can tell it apart from a real event. The lead or report inside matches the production shape of the sampled event, which is what you map fields from in the recipes for [Zapier](/help/integrations/zapier/), [Make](/help/integrations/make/), [Clay](/help/integrations/clay/), and [n8n](/help/integrations/n8n/).

Before your receiver trusts a request, [verify its signature](/help/integrations/verify-webhook-signatures/). The [webhook payload reference](/help/integrations/webhook-payload-reference/) lists every field.

## Which leads trigger an event

`lead.created` and `lead.engagement.added` fire only for qualified leads: a score above zero, an [ICP match or a manual approval](/help/leads/icp-matching-and-feedback/), and a company that is not on your [company blocklist](/help/leads/company-blocklist/). Each person produces `lead.created` once, the first time they qualify. When a lead qualifies in the same scan that found new engagement, you get `lead.created` alone, because it already carries that engagement.

`lead.status_changed` fires whenever someone moves a lead to a different status, including when blocking a company dismisses the lead. `lead.changed` fires once per lead and change when Embers confirms a [company change](/help/leads/company-changes/), for leads that match your ICP; a change at a company reaches its 25 best-scored leads in the workspace at most. `report.generated` fires when a [client report](/help/reports-and-workspaces/client-reports/) is ready.

[Delivery rules](/help/integrations/delivery-rules/) do not apply to webhook endpoints. The endpoint receives every event it subscribes to, and your receiver decides what to keep.

## Read the Webhooks page

The page reads top to bottom by urgency:

- **Status**: one sentence, such as "Sending to Zapier", "Delivery to Zapier is paused", "Every endpoint is turned off", or "Not sending yet: add an endpoint", with **Send test** beside it once there is an endpoint.
- **Needs attention**, only when something does: a paused endpoint with its reason and **Resume**, an endpoint that is off with **Turn on**, and the newest three failed deliveries across every endpoint, each with **Replay**.
- **Endpoints**: one row each, with an **Active**, **Paused**, or **Disabled** badge, where it **Sends to**, its **Events**, and a switch under **On**.
- **Activity**: one endpoint's deliveries, newest first, filtered **All** or **Failed** (pick the endpoint at the top of the card). Webhooks have no delivery rules, so nothing is held back; a delivery kept while the endpoint was paused or off is **Blocked**, under **All**. Each row names the lead, its state, and why it did not go out, such as "Your endpoint answered HTTP 500".
- **Works with** (the Zapier, Make, and Clay rows), **Signatures**, and the **Payload schema**.

A row's chevron opens **Delivery details**: its status, the attempt count, when it was created, the next attempt, the JSON payload, and every attempt with its HTTP status (or "Network error"), duration, and the start of your response. Under Settings, then API and webhooks, the same history is **Recent deliveries**, filterable by status and by event. There, and on the Webhooks page's **Activity**, each row's status is a dot and a word: **Delivered**, **Retrying** (an attempt failed and it waits for the next one), **Queued** (not tried yet, or its first attempt is on its way), **Failed**, or **Blocked** (amber: kept while the endpoint was paused or off, waiting for a replay). The status filter's **Retrying or queued** shows both Retrying and Queued deliveries.

History is kept for 30 days. **Replay** appears on Failed and Blocked deliveries while the endpoint is active. [Webhook retries and pauses](/help/integrations/webhook-retries-and-pauses/) explains the retry schedule and what pauses an endpoint.

## Change, pause, or remove an endpoint

Choose an endpoint's row to edit it, use its switch, or open its **...** menu (**Edit**, **Send test**, **Rotate secret**, **Resume** while it is paused, and **Remove**):

- **Edit** changes the name, URL, or events. Changing the URL of a paused endpoint also clears the pause.
- **The switch**, the same setting as **Send events** inside Edit, stops deliveries without deleting anything. Events created while it is off are kept as Blocked rather than sent, and you can replay them later.
- **Rotate secret** issues a new secret and shows it once. New deliveries are signed with it straight away.
- **Remove** deletes the endpoint and its delivery history after a confirmation.

Workspace admins are emailed when an endpoint is created, updated, removed, paused, resumed, or has its secret rotated. The email names the endpoint, workspace, destination hostname, who acted, and what changed, never the URL path, query parameters, or secret.

## Troubleshooting

**The URL is rejected when you save.** It uses HTTP, a non-default port, credentials, or a `#` fragment, or its hostname does not resolve to a public address. Paste the receiving URL your tool gives you, exactly as given.

**Send test is unavailable.** The endpoint is paused or switched off. Resume it or turn it back on, then test.

**A new lead never produced an event.** The person has not qualified yet, the endpoint does not subscribe to that event, or the delivery is sitting in Blocked. Check the endpoint's **Activity** to find out which.

**Requests arrive but your receiver rejects them.** Your receiver answered with a `4xx`. A `400`, `409`, or `422` fails only that event, until five in a row pause the endpoint; any other `4xx` pauses it at once. Work through [a webhook endpoint is paused](/help/troubleshooting/webhook-endpoint-paused/).

## Related

- [Webhook payload reference](/help/integrations/webhook-payload-reference/): The envelope, every event type, and every lead field.

- [Verify webhook signatures](/help/integrations/verify-webhook-signatures/): Check the HMAC before you trust a request.

- [Webhook retries and pauses](/help/integrations/webhook-retries-and-pauses/): The eight attempts, and what pauses an endpoint.

- [Send Embers leads to Zapier](/help/integrations/zapier/): The same endpoint, feeding a Zap.

## Frequently asked questions

**How many endpoints can one workspace have?**

Up to 10. Each has its own name, event subscriptions, signing secret, and delivery history.

**Can I see the signing secret again later?**

No. It is shown once when the endpoint is created or the secret is rotated. If you lose it, choose Rotate secret and update your receiver.

**Do delivery rules filter what reaches a webhook?**

No. Delivery rules apply to Slack, HubSpot, Salesforce, Pipedrive, Attio, HeyReach, Instantly, Smartlead, and Emelia. A webhook endpoint receives every event it subscribes to, and your receiver does the filtering.
