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 all 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:

{
  "...": "...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 [email protected].

Last updated