# Can I send webhook events to multiple URLs?

**Yes.** Bead supports two layers of webhook delivery, and you can combine them to fan-out each event to several destinations:

| Layer                     | How to set it                                  | Scope                                | Typical use-cases                                      |
| ------------------------- | ---------------------------------------------- | ------------------------------------ | ------------------------------------------------------ |
| **Terminal webhook**      | `PUT /Terminals/{terminalId}/webhook`          | All payments created by the terminal | Core order-management system, accounting queue         |
| **Per-payment overrides** | `webhookUrls` array in `POST /payments/crypto` | Only the payment being created       | A/B testing, partner-specific listener, analytics hook |

When you include a `webhookUrls` array, **Bead POSTs the same JSON payload to&#x20;*****all*****&#x20;of these endpoints**:

1. The terminal’s default webhook URL
2. Every URL listed in `webhookUrls`

No extra configuration is needed—just add the array to your create-payment request:

```json
{
  "...": "...other fields...",
  "webhookUrls": [
    "https://orders.example.com/bead/events",
    "https://analytics.example.com/hooks/bead"
  ]
}
```

**Delivery behaviour**

* **Fan-out**: events are sent to every destination in parallel.
* **Success criteria**: each URL must return **HTTP 2xx**; any non-2xx triggers retries for that endpoint only (exponential back-off, 24 h window).
* **Same payload**: the JSON body and `x-webhook-signature` are identical for every recipient, so you can reuse the same verification code.

**Tips & best practices**

* **Idempotency** – process webhooks idempotently (e.g., by `trackingId` + `statusCode`) in case one URL retries while another succeeds.
* **Environment isolation** – point sandbox terminals to test URLs, then add production URLs in `webhookUrls` only when you go live.
* **Signing secrets** – the HMAC uses the **terminal’s `signingSecret`**, even for `webhookUrls`. Share that secret securely with every service that needs to verify events.
* **Performance** – acknowledge quickly (under 1 s) and offload heavy work to background jobs.

**Testing multiple endpoints**

1. **Sandbox first** – set a sandbox webhook URL on the terminal.
2. Include a second test URL in `webhookUrls`.
3. Create a payment in sandbox and complete it with a test wallet.
4. Confirm both endpoints receive the same event, signature verifies, and retries stop after 2xx.

Need more help? Email [**developers@bead.xyz**](mailto:developers@bead.xyz).
