> This page is part of the [Customer.io documentation](https://docs-customerio.netlify.app). For the complete index, see [llms.txt](https://docs-customerio.netlify.app/llms.txt).
> Last updated: June 27, 2025

# Webhook Destination

## About this integration

Webhooks submit real-time user data to your own HTTP endpoints. A Webhook is an HTTP callback: a simple HTTP POST event to any URL you want when something happens—like when data comes in from a source.

[Mode How we forward source data to the destination: through Customer.io's servers or directly from our JavaScript client.](/cdp/destinations/getting-started/#connection-mode)

[Web sources Indicates whether or not this integration supports our the JavaScript client.](/cdp/sources/getting-started/#types-of-sources)

[API sources Indicates whether or not this integration supports our server libraries (Go, NodeJS, Python), API, Mobile SDK, and other data sources.](/cdp/sources/getting-started/#types-of-sources)

[Supported calls The API methods this integration supports.](/cdp/sources/source-spec/source-events/)

[Integration name The name of this integration if you want to enable or disable it in the `integrations` object.](/cdp/sources/source-spec/common-fields/#the-integrations-object)

Standard

[alias](/api/cdp/#operation/alias), [group](/api/cdp/#operation/group), [identify](/api/cdp/#operation/identify), [page](/api/cdp/#operation/page), [screen](/api/cdp/#operation/screen), and [track](/api/cdp/#operation/track)

Webhook

## Getting started[](#getting-started)

Our webhook destination lets you transform and send data to any URL you maintain. It’s basically a custom destination, letting you handle source data however you want.

1.  Go to **[Data & Integrations > Integrations](https://fly.customer.io/workspaces/last/journeys/integrations/all/directory)** and select the **Webhooks** entry in the *Directory* tab.
    
2.  (Optional) Select the data sources that you want to connect to your outbound integration. You can always connect data sources later. We’ll only show you data sources that work with your integration.
    
3.  Configure your integration.
    
    1.  **Shared Secret**: If set, request will be signed with an HMAC in the "X-Signature" request header. The HMAC is a hex-encoded SHA1 hash generated using this shared secret and the request body.
4.  Click **Enable Destination**.
    

### Securing webhook requests[](#securing-webhook-requests)

We recommend that you use a **Shared Secret** to secure your webhook URL and ensure that you only ingest requests that come from Customer.io. When you use a shared secret, we’ll sign requests with an `X-Signature` header containing a hex-encoded SHA1 hash from the shared secret and request body. You can use this signature to verify that the request came from Customer.io.

## Actions[](#actions)

A webhook request has one action: **Send**. This action lets you map incoming data to a URL you maintain.

When you set up a webhook *Send* action, you’ll set:

1.  The **Trigger** for the action: typically this is the type of incoming data (`identify`, `track`, etc). But you may also want to send specific events like `email_opened` or `product_viewed`.
2.  The **URL** to send the data to.
3.  The **HTTP method** to use: `POST`, `PUT`, `PATCH`, or `DELETE`.
4.  Whether or not to batch events: We batch up to 1000 events matching the trigger in a single request. See [Batching](#batching) for more information.
5.  Set your **HTTPS Headers** and the data you want to send in the payload. Like most actions, we typically recommend that you send the `userId`, event name, and `properties` or `traits` from the incoming call, but you may want to set up specific mappings.

[![Set up a webhook action trigger and data](https://docs.customer.io/images/cdp-webhook-action.png)](#76edaaed504655b275c9ee22c25f0dbc-lightbox)

### Batching[](#batching)

If you want to send fewer calls to your webhook endpoint, you can batch your webhook requests in groups of up to 1000 events. We send each batch as an array of objects where each object is the body of an incoming request that matches your trigger criteria.

For example, imagine that you’ve mapped `track` events as shown in the image below. The code sample below the image is an example of what we’d send to your webhook endpoint.

[![batching requests with a request body](https://docs.customer.io/images/cdp-webhook-batch.png)](#398b57777fcfc2a1feeae13e2019cc1e-lightbox)

```json
[
  {
    "type": "track",
    "userId": "123",
    "event": "Signed Up",
    "properties": {
      "plan": "Startup",
      "referred_by": "Friend"
    }
  },
  {
    "type": "track",
    "userId": "456",
    "event": "Signed Up",
    "properties": {
      "plan": "Free",
      "referred_by": "Ad"
    }
  }
]
```