# Destinations (/docs/destinations)

A destination forwards matching events the moment they arrive. Datahop stays the place you send events from your app, and other tools get the ones they need. **Destinations** in the sidebar lists them with how many events each one has delivered.

## Slack [#slack]

Post a message to a channel for the events you care about, such as every new signup or every order over $100.

1. In Slack, create an [incoming webhook](https://api.slack.com/messaging/webhooks) for the channel and copy its URL.
2. **New destination → Slack**, then paste the URL.
3. Write the message. Click a variable to insert it, and the preview shows how it'll look:

```
*New order* {{properties.amount}} {{properties.currency}} from {{person.properties.email}}
```

| Variable | Is |
| --- | --- |
| `{{event}}` | The event name |
| `{{distinct_id}}` | The id your app sent |
| `{{properties.key}}` | An event property |
| `{{person.properties.key}}` | A property of the person, such as their email |
| `{{timestamp}}` | When it happened |

A variable with no value shows as `—`. Slack accepts about one message a second per webhook, so busy events queue up briefly.

## Telegram [#telegram]

Post to a Telegram channel or group.

1. **New destination → Telegram**. The page shows the Datahop bot's name.
2. Add the bot to your channel or group. In a channel, make it an admin that can post messages.
3. Enter the chat id. A public channel can use its `@name`. Otherwise, forward a message from the chat to [@userinfobot](https://t.me/userinfobot), which replies with the id. Channel and group ids start with `-100`.
4. **Send test**. If the bot isn't in the chat yet, the error says so.

Messages use the same variables as Slack, as plain text. Telegram allows about 20 messages a minute in a group, so busy events queue up.

## Webhook [#webhook]

Send each event as a JSON `POST` to Zapier, Make, n8n, your CRM or your own API. Add headers, such as `Authorization`, if the endpoint needs them.

```json
{
  "uuid": "0193c4f2-…",
  "event": "order_completed",
  "distinct_id": "user_123",
  "person_id": "0190…",
  "timestamp": "2026-11-02T10:00:00.000Z",
  "properties": { "amount": 49, "currency": "USD" },
  "person": { "properties": { "email": "alex@example.com", "plan": "pro" } },
  "project": { "id": 1, "name": "Acme" },
  "destination": { "id": 3, "name": "Orders to CRM" }
}
```

A `2xx` response counts as delivered. On a `429` or `5xx`, or if the endpoint can't be reached, Datahop tries 3 more times over about a minute. Destinations must be public `https` addresses.

## Choose the events [#choose-the-events]

- **Which events**: pick one or more events, or leave it empty to send every event.
- **Only when**: filter on event properties, such as `amount ≥ 100` or `plan = pro`.

**Send test** posts a sample event, so you can check the endpoint or the Slack message before saving.

## Watch it work [#watch-it-work]

A destination's page shows how many events it has delivered or failed, the last error, and a log of recent deliveries. Pause one with the switch. Events that arrive while it's paused aren't sent later.

## Agents [#agents]

Agents can set these up over MCP with `create_destination`, `list_destinations`, `get_destination`, `update_destination` and `delete_destination`. For example: *"Post every order over $500 to #sales with the customer's email."* They'll ask you for the URL or chat id.
