Retry Policy
| Retry | Timing |
|---|---|
| 1st retry | 1 minute after initial failure |
| 2nd retry | 5 minutes after initial failure |
| 3rd retry | 30 minutes after initial failure — final attempt |
| Auto-disable | After 10 consecutive failures across events, the webhook is deactivated (is_active: false, disabled_reason set). |
Deduplication
Every retry delivers the stored payload as-is — event_id is stable across all attempts and is safe to use as a deduplication key per webhook endpoint. When multiple webhooks in the same workspace match an event, they all receive the same event_id, so dedupe per endpoint, not globally.
Re-enabling a disabled webhook
Re-enable via the API — this resets failure_count and clears disabled_reason, keeping the same secret:
curl -X PATCH https://slazbvfvliieskvkjtav.supabase.co/functions/v1/api-gateway/v1/webhooks/{webhook_id} \
-H "X-SalesLobe-Key: sl_live_..." \
-H "Content-Type: application/json" \
-d '{"is_active": true}'
Inspecting deliveries
GET /v1/webhooks returns per webhook: failure_count, disabled_reason, last_delivery_at, and last_error (HTTP status + response body snippet of the most recent failed delivery).
To verify your endpoint end-to-end, fire a signed test.ping event:
curl -X POST https://slazbvfvliieskvkjtav.supabase.co/functions/v1/api-gateway/v1/webhooks/{webhook_id}/test \
-H "X-SalesLobe-Key: sl_live_..."