# Webhooks for Zapier, Make and n8n

Send Ha Tang events, such as a new order, a paid payment or a new conversation, to Zapier, Make, n8n or your own server the moment they happen.

A webhook tells another tool that something happened in Ha Tang, within seconds. Each time a subscribed event occurs (an order is paid, a customer starts a conversation, a bank transfer arrives), Ha Tang sends its details to an address you choose.

With a no-code tool such as Zapier, Make or n8n, that is enough to build useful automations without a developer:

- Add every paid order as a row in Google Sheets.
- Post a message in your team's chat when a customer gives a 1-star rating.
- Create a contact in your sales CRM when a new conversation starts.
- Tell your accountant's tool about every bank transfer received.

You need the **Developer (API keys, webhooks)** access, which owners and admins always have.

## Add a webhook

1. In your no-code tool, create a trigger that receives webhooks and copy its URL:
   - Zapier: **Webhooks by Zapier** → **Catch Hook**.
   - Make: **Webhooks** → **Custom webhook**.
   - n8n: a **Webhook** node with the method set to POST (use the production URL once the workflow is active).
2. In Ha Tang, go to **Settings → Webhooks**.
3. Paste the URL in the box at the top.
4. Tick the events you want, and untick the others. A few common ones are ticked for you.
5. Click **Add endpoint**.

![Adding an endpoint and choosing its events](https://hatang.dev/help/img/en/integrations/webhooks.webp)

The endpoint's page opens and shows its **Signing secret (shown once)**. Copy it if a developer will verify signatures; it is not shown again.

To check that it works, trigger the event once (for example create a test order in a conversation), then look at **Deliveries** on the endpoint's page and at the incoming data in your tool.

## Which events to choose

Subscribe only to what your automation needs: each event is one request, and many tools count requests against your plan.

| Event | Sent when |
|---|---|
| `chat.conversation.created` | A customer starts a new conversation, on any channel |
| `chat.message.created` | A message is posted in a conversation (by the customer, an agent or a bot) |
| `chat.conversation.resolved` | A conversation is resolved |
| `chat.order.created`, `chat.order.paid` | An order is created; an order's payment arrives |
| `chat.rating.created` | A customer rates a conversation |
| `chat.ticket.created`, `chat.ticket.breached` | A ticket is opened; a ticket misses its SLA |
| `payment.succeeded`, `transaction.received` | A payment is completed; money arrives in a linked bank account |
| `invoice.issued`, `invoice.failed` | An e-invoice is issued, or fails |
| `email.delivered`, `email.bounced` | An email reaches the inbox, or bounces |

The full list, with what each event contains, is in the [webhook events reference](https://hatang.dev/docs/reference/webhooks).

## What Ha Tang sends

Each event is an HTTP POST with a JSON body:

```json
{
  "type": "chat.order.paid",
  "created_at": "2026-10-24T08:15:00.000Z",
  "data": { "code": "DH000014", "total": 2530000, "payment_status": "paid", "...": "..." }
}
```

In Zapier, Make or n8n, `data` shows up as fields you map into the next step: the order code, the total, the recipient's name and phone, and so on.

Every request also carries signature headers (`webhook-id`, `webhook-timestamp`, `webhook-signature`, and the same values as `svix-*`). Your developers use them and the signing secret to prove a request really comes from Ha Tang. No-code tools usually skip this check, so keep the webhook URL private: anyone who has it can send fake data to it. For how to verify signatures, see the [webhooks guide](https://hatang.dev/docs/guides/getting-started/webhooks) in the developer hub.

## Deliveries, retries and replays

The endpoint's page lists every **Delivery**: the event, its **Status**, the **Attempt** number, the **Response** your tool gave and how long it took, and the **Next retry**. Click an event's name to see the data that was sent and the answer received.

- Your tool must answer with a 2xx status within 15 seconds.
- If it does not, Ha Tang tries again after 5 seconds, 5 minutes, 30 minutes, 2 hours, 5 hours, 10 hours and 10 hours. After that the delivery is **Exhausted**.
- **Replay** sends a delivery again, with the same `webhook-id`, so your tool can recognize a repeat.

![An endpoint's deliveries, with status, attempts and Replay](https://hatang.dev/help/img/en/integrations/webhook.webp)

## Manage an endpoint

On the endpoint's page:

- **Disable** stops it: nothing more is sent, and deliveries waiting for a retry are dropped. **Enable** turns it back on for new events.
- **Rotate secret** creates a new signing secret, shown once. For the next 24 hours requests are signed with both the old and new secret, so your developers have time to switch.
- **Delete** removes the endpoint and stops all its deliveries.

To change the events, add a new endpoint with the right events and delete the old one.

## Troubleshooting

| Symptom | Cause | What to do |
|---|---|---|
| "endpoint: Internal hosts are not allowed" | The URL points to `localhost` or a private network | Use a public address. To test on your own computer, use a tunnel service |
| Deliveries show **Failed** with HTTP 404 or 410 | The no-code workflow is off, or the URL changed | Turn the workflow on, or add the new URL as an endpoint |
| Deliveries time out | Your tool takes more than 15 seconds to answer | Answer first, then do the slow work in the next step |
| Nothing arrives | The event is not ticked, or the endpoint is disabled | Check **Subscribed** at the top of the endpoint's page and its status |
| The same event arrives twice | A retry or a replay after a slow answer | De-duplicate on the `webhook-id` header |
