Safravo Logosafravo.com
Guides

Webhook Debugging

Monitor, test, and troubleshoot webhook deliveries from the Safravo dashboard.

Accessing the monitoring panel

Open the endpoint panel

Go to Settings → Webhooks and click the endpoint you want to inspect.

Read the delivery logs

The Logs tab shows the 50 most recent delivery attempts, sorted newest-first.

FieldDescription
Event typee.g. message.created
StatusHTTP response code returned by your server
TimestampWhen the delivery was attempted
LatencyHow long your server took to respond

Logs expire automatically after 30 days.


Troubleshooting common errors


Circuit breaker (auto-disable)

Safravo uses an automatic circuit breaker to prevent overwhelming failing endpoints.

StatusCondition
activeReceiving events normally
failing5+ consecutive failures — investigate immediately
disabled25 consecutive failures — auto-disabled, manual re-enable required

The failure counter resets to zero on any successful delivery. When an endpoint is auto-disabled, Safravo sends an email notification to the workspace owner.

Re-enabling a disabled endpoint

Fix the issue on your server

Resolve the underlying problem — check your application logs, verify your signature verification code, and confirm your server is publicly reachable.

Re-enable in the dashboard

Go to Settings → Webhooks, find the disabled endpoint, and click Re-enable.

Wait for the cooldown

The first delivery attempt is delayed by 5 minutes as a cooldown. After that, events resume normally.


Delivery retries

Failed deliveries are retried with exponential backoff:

AttemptDelay
1 (initial)Immediate
25 seconds
330 seconds
42 minutes
510 minutes
6–101 hour each

After 10 failed attempts, that specific event delivery is marked permanently failed.


Testing locally

Use ngrok or Cloudflare Tunnel to expose your local server:

# ngrok
ngrok http 3000

# Cloudflare Tunnel (stable URL, free)
cloudflared tunnel --url http://localhost:3000

Register the tunnel URL as your webhook endpoint in Settings → Webhooks. Update it whenever the tunnel restarts — the free tier of ngrok generates a new URL on every restart.

Cloudflare Tunnel is free and provides a stable URL that persists across restarts, making it a better choice than ngrok free tier for local development.


Deduplication

Safravo may deliver the same event more than once during retries. Use the X-Safravo-Delivery header as an idempotency key:

const deliveryId = req.headers['x-safravo-delivery'];

const alreadyProcessed = await redis.get(`webhook:${deliveryId}`);
if (alreadyProcessed) {
  return res.status(200).json({ received: true }); // idempotent
}

// ... process event ...

await redis.setex(`webhook:${deliveryId}`, 86400, '1'); // TTL: 24 hours

On this page