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

# Webhooks overview

> Receive real-time notifications when Botdog visits a profile, sends an invitation, gets a reply, and more.

**Webhooks** let Botdog push events to your own HTTP endpoint as they happen, so you can sync activity into your CRM, trigger downstream automations, or build internal dashboards without polling the API.

When a campaign performs an action — visiting a lead's profile, sending an invitation, receiving a reply — Botdog `POST`s a JSON payload to the URL you configured. Each request is signed so you can verify it really came from Botdog.

## When to use webhooks

| You want to…                                      | Webhooks are a good fit                                                       |
| ------------------------------------------------- | ----------------------------------------------------------------------------- |
| Mirror lead activity into a CRM or data warehouse | Yes                                                                           |
| Notify a Slack channel when a lead replies        | Yes                                                                           |
| Pull a daily report of campaign performance       | No — use the [API](/quickstart) or [analytics](/quickstart#4-check-analytics) |
| Build a no-code automation                        | Prefer the [Zapier integration](/zapier/overview)                             |

## How it works

1. **You create a webhook** in the Botdog dashboard at [Settings → Integrations → Webhooks](https://app.botdog.co/settings/integrations/webhooks). You pick an endpoint URL, the events you want, and the scope (all campaigns or specific ones).
2. **Botdog generates a secret** and shows it to you once. Store it — you'll use it to verify signatures.
3. **When a subscribed event happens**, Botdog `POST`s a signed JSON body to your endpoint.
4. **Your endpoint responds** with any `2xx` status code to acknowledge receipt. Anything else is treated as a failure and retried.

## Request format

Every delivery is an HTTP `POST` with:

* **Header `Content-Type`** — `application/json`
* **Header `X-Webhook-Signature`** — HMAC signature over the request body. See [Signature verification](/webhooks/signature-verification).
* **Body** — a JSON object whose shape depends on the event. See [Events and payloads](/webhooks/events).

```http theme={null}
POST /your-endpoint HTTP/1.1
Host: your-app.example.com
Content-Type: application/json
X-Webhook-Signature: t=1730000000,s=9f1c…ab

{
  "id": "…",
  "eventType": "LEAD_MESSAGE_REPLIED",
  "timestamp": "2026-05-28T12:34:56.000Z",
  …
}
```

## Responding to a delivery

* **Reply with `2xx` quickly** — ideally under a few seconds. Do the heavy work asynchronously after acknowledging.
* **Treat deliveries as at-least-once** — Botdog retries on failure, so your handler should be idempotent. Use the top-level `id` field to deduplicate.
* **Non-`2xx` responses are retried** with exponential backoff. See [Delivery and retries](/webhooks/delivery-and-retries).

## Managing webhooks

Webhooks are created and managed from the dashboard at [Settings → Integrations → Webhooks](https://app.botdog.co/settings/integrations/webhooks). From there you can:

* **Create** a webhook with a name, endpoint URL, event subscriptions, and scope.
* **Pause or resume** a webhook without deleting it.
* **Send a test event** to verify your endpoint receives and validates the request.
* **Inspect recent deliveries**, including status code, response body, and retry attempts.
* **Rotate the secret** if it may have been exposed.

## Slack channels

A webhook's destination can be a Slack channel instead of a generic HTTP endpoint. When you select **Slack channel** as the destination type, Botdog formats every event as a clean Slack message — including the contact's name, company, campaign, and a button to open their LinkedIn profile — rather than posting a raw JSON body.

**Setting it up:** In Slack, open your workspace's app directory, add the **Incoming Webhooks** app, click **Add New Webhook to Workspace**, and choose the channel you want. Copy the `https://hooks.slack.com/services/…` URL it gives you, then in the Botdog webhook form choose **Slack channel** as the destination and paste it in.

Note: signature verification does not apply to Slack destinations. Slack doesn't use the signing secret — the webhook URL itself is the secret, so keep it private.

## Next steps

* [Events and payloads](/webhooks/events) — Every event type and the exact JSON shape Botdog sends.
* [Signature verification](/webhooks/signature-verification) — How to verify the `X-Webhook-Signature` header.
* [Delivery and retries](/webhooks/delivery-and-retries) — Retry schedule, failure handling, and idempotency.
