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

# Webhooks

> Push workspace events to your own systems and watch every delivery

A webhook endpoint is a URL of yours that Invent calls when something happens in your workspace that your systems have to react to: a contact who can no longer be reached, a send that did not land, a conversation that changed hands. Instead of polling the API, your server is told.

Manage endpoints at **Settings → Webhooks**.

<Frame>
  <img src="https://mintcdn.com/invent/feuvmDb2ILpdg_zK/assets/workspace-management/webhooks-list.png?fit=max&auto=format&n=feuvmDb2ILpdg_zK&q=85&s=d6b1e2514183d7a5902199720515d350" alt="Webhook endpoints" style={{ maxHeight: '400px' }} width="1440" height="900" data-path="assets/workspace-management/webhooks-list.png" />
</Frame>

Each row shows the endpoint's name and URL, how many events it subscribes to, whether it is enabled, and when it was last delivered to.

<Note>
  This page covers managing endpoints in the app. For the payload shape, the event catalog, signature verification, and code samples, see the [Webhooks API reference](/api-reference/getting-started/webhooks).
</Note>

## Creating an endpoint

<Steps>
  <Step title="Click New Webhook">
    Enter the **endpoint URL** that receives the requests. It has to be HTTPS, and it cannot be a private or loopback address.
  </Step>

  <Step title="Name it">
    The name is for you, so you can tell "Production CRM" from "Staging" at a glance.
  </Step>

  <Step title="Pick the events">
    Subscribe only to what you act on. You can change the selection later.
  </Step>

  <Step title="Copy the signing secret">
    It is shown once, right after creation. Store it in your secret manager.
  </Step>
</Steps>

<Frame>
  <img src="https://mintcdn.com/invent/feuvmDb2ILpdg_zK/assets/workspace-management/webhooks-create.png?fit=max&auto=format&n=feuvmDb2ILpdg_zK&q=85&s=4eb95821ab210093716d53ecf1ec0792" alt="Add a webhook endpoint" style={{ maxHeight: '400px' }} width="1440" height="900" data-path="assets/workspace-management/webhooks-create.png" />
</Frame>

<Warning>
  The signing secret (`whsec_…`) is displayed only on creation and on rotation. It is what proves a request came from Invent, so your handler should reject any request whose signature does not verify. If you lose the secret, rotate it to get a new one.
</Warning>

### The events you can subscribe to

| Group             | Events                                                                                  |
| :---------------- | :-------------------------------------------------------------------------------------- |
| **Conversations** | `chat.assigned`                                                                         |
| **Contacts**      | `contact.blocked`, `contact.unsubscribed`                                               |
| **Broadcasts**    | `broadcast.failed`, `broadcast.bounced`, `broadcast.complained`, `broadcast.suppressed` |

The catalog is deliberately narrow: these are events an external system has to *act* on. Routine create and update traffic belongs to the API, not to a push feed.

## Managing an endpoint

The options menu on each row holds everything else.

<Frame>
  <img src="https://mintcdn.com/invent/feuvmDb2ILpdg_zK/assets/workspace-management/webhooks-options.png?fit=max&auto=format&n=feuvmDb2ILpdg_zK&q=85&s=f9d41f4c1a2bc1bc82f52bf503afe3ab" alt="Webhook options menu" style={{ maxHeight: '400px' }} width="1440" height="900" data-path="assets/workspace-management/webhooks-options.png" />
</Frame>

| Action               | What it does                                                                                                                                   |
| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------- |
| **Edit**             | Change the URL, name, or event subscriptions                                                                                                   |
| **Send Test Event**  | Delivers a signed `ping` to the endpoint and reports back whether it was accepted. The quickest way to prove your URL and signature check work |
| **View Deliveries**  | The delivery log for this endpoint                                                                                                             |
| **Disable / Enable** | Stop or resume deliveries without deleting the endpoint                                                                                        |
| **Rotate Secret**    | Issue a new signing secret. The current one stops signing immediately, so deploy the new one first                                             |
| **Delete**           | Remove the endpoint. Events stop being delivered to it                                                                                         |

## Watching deliveries

**View Deliveries** lists every attempt from the last 7 days, most recent first.

<Frame>
  <img src="https://mintcdn.com/invent/feuvmDb2ILpdg_zK/assets/workspace-management/webhooks-deliveries.png?fit=max&auto=format&n=feuvmDb2ILpdg_zK&q=85&s=e7b034654d889fa6d72d74bdbb16329b" alt="Recent webhook deliveries" style={{ maxHeight: '400px' }} width="1440" height="900" data-path="assets/workspace-management/webhooks-deliveries.png" />
</Frame>

Each row shows the event, the delivery status, the attempt number and the HTTP status your server returned:

* **DELIVERED**: your endpoint returned a `2xx`.
* **PENDING**: the attempt failed and a retry is scheduled.
* **FAILED**: every retry was used up.
* **SKIPPED**: the event was not sent, because the endpoint was disabled or the workspace had no balance to cover the outbound request.

Use the **replay** action on any row to send that event again. Replay is how you backfill after an outage on your side, or reprocess events once your handler is fixed.

## When deliveries fail

Failed attempts are retried on a widening schedule (5s → 5m → 30m → 2h → 5h → 10h), seven attempts in total. Requests time out after 10 seconds, so acknowledge fast and do the real work afterwards.

An endpoint that fails 30 deliveries in a row is **disabled automatically**, and the reason is shown on the endpoint. Fix your side, then enable it again, which clears the failure streak.

Delivery is at-least-once and order is not guaranteed, so make your handler idempotent and deduplicate on the event id.

## Next Steps

<CardGroup cols={2}>
  <Card title="Webhooks API reference" icon="code" href="/api-reference/getting-started/webhooks">
    Payloads, headers, signature verification, and code samples
  </Card>

  <Card title="API Keys" icon="key" href="/workspace-management/api-keys">
    Manage endpoints programmatically instead of in the app
  </Card>
</CardGroup>
