Webhooks

Testing and replay

Send test events, resend a single delivery, and replay everything that failed while your server was down.

Send a test event

On an endpoint in Developers → Webhooks, choose Send test event and pick an event type.

  • The test is a real delivery: same envelope, same headers, signed with the endpoint's real secret. If your verification passes on it, it will pass on real events.
  • Its payload is a valid example of the event you picked, so your real handler runs on it end to end. Pick nothing and you get the neutral webhook.test ping.
  • It is marked "test": true, on the envelope and in the payload, so your handler can recognise it and skip side effects.
  • The result (status, latency, your response) appears at once in the delivery log.

Local development

Your laptop is not on the public internet, so Gauge cannot reach localhost. Use a tunnel that gives you a public HTTPS URL for a local port (for example cloudflared tunnel --url http://localhost:3000 or ngrok http 3000) and register that URL as a separate endpoint. Delete it when you are done.

Use a test key and a sandbox App while developing: events about sandbox data arrive with "livemode": false.

Resend one delivery

Open any delivery in the log and choose Resend. Gauge sends it again as a new delivery, with the same event id, so your deduplication still works.

Replay failed deliveries

After an outage, replay everything that did not land: on the endpoint, choose Replay failed and pick a start time.

  • Every delivery that failed or went dead since then is sent again, newest first, as new deliveries with their original event ids.
  • At most 100 deliveries per replay, and the start time can be up to 7 days back. If more than 100 qualify, the result says so: run it again for the rest.
  • Deliveries already resent are skipped.
  • A workspace can run 20 replays an hour, shared with POST /v2/events/{id}/redeliver.

From code: the event log

Every event delivered to an endpoint on API version 2026-10-21 or later is kept for 30 days, with the exact body that was (or would be) delivered.

  • GET /v2/events (scope events:read) lists them, newest first, filtered by type (an exact name or family.*), since (ISO time) and conversationId. Message and conversation events are listed only for conversations the key's member can see.
  • GET /v2/events/{id} returns one, as { id, type, conversationId, createdAt, data }, where data is the envelope.
  • POST /v2/events/{id}/redeliver (scope webhooks:write, with an Idempotency-Key) sends it again, as a new delivery with the same event id, to every endpoint that received it, or to one with { "endpointId": "…" }. The answer is { "redelivered": 1, "deliveries": [{ "id", "endpointId" }] }.

Redelivery spends the same budget as Replay in the console: 20 an hour per workspace. Over it, 429 rate_limited with reason webhook_replay_limit.

POST /v2/webhook-endpoints/{id}/test sends a test event from code, exactly like Send test event.

On this page