Troubleshooting
Running into issues? This guide covers common problems and their solutions. If you don't find your answer here, reach out to support@webhook.rodeo—we're happy to help!
Webhook not receiving events
Problem
You've configured a webhook in the sending service (GitHub, Stripe, etc.) but events aren't showing up in webhook.rodeo.
Solutions
Check the webhook URL format
Make sure the URL is exactly:
https://webhook.rodeo/w/your-username/webhook-name
Common mistakes:
- ❌
http://instead ofhttps:// - ❌ Missing
/w/prefix - ❌ Extra
/at the end - ❌ Username or webhook name with spaces/uppercase
Verify the webhook exists
Log into webhook.rodeo and confirm the webhook is listed in your dashboard. Check for typos in the name.
Check webhook status
Inactive webhooks reject all events with 403 Forbidden. Make sure your webhook is active (toggle switch should be green).
Test with curl
Send a test request directly:
curl -X POST https://webhook.rodeo/w/your-username/webhook-name \
-H "Content-Type: application/json" \
-d '{"test": true}'
If this works but the service doesn't, the issue is with their webhook configuration, not webhook.rodeo.
Forward failures
Problem
Events are arriving at webhook.rodeo, but forwarding to your destination URL is failing.
Solutions
Check the forward URL
- Must be HTTPS (not HTTP)
- Must be publicly accessible (not localhost or private IPs)
- Must be a valid URL format
Check your endpoint
Test it directly:
curl -X POST https://your-app.com/api/webhooks \
-H "Content-Type: application/json" \
-d '{"test": true}'
If this fails, the issue is with your endpoint, not webhook.rodeo.
Check response time
If your endpoint takes longer than 30 seconds to respond, webhook.rodeo will timeout. Solutions:
- Return
202 Acceptedimmediately - Process the webhook asynchronously
- Optimize your handler code
Review delivery attempts
In the event details, check all delivery attempts:
- What status code is your endpoint returning?
- What's in the response body?
- How long is it taking to respond?
Common issues:
- 500 errors - Bug in your webhook handler
- Connection timeout - Endpoint unreachable or too slow
- SSL errors - Invalid HTTPS certificate
Local development
For local testing, use:
- ngrok:
ngrok http 3000 - Tailscale Funnel:
tailscale funnel 3000
Then use the public URL as your forward URL.
Signature verification failing
Problem
Signature verification is enabled but webhooks are being rejected with 401 Unauthorized.
Solutions
Check signature computation
Make sure you're computing the HMAC-SHA256 signature correctly:
const crypto = require('crypto')
const signature = crypto
.createHmac('sha256', secret)
.update(requestBody) // Raw body, not parsed JSON!
.digest('hex') // Hex encoding, not base64!
Common mistakes:
- ❌ Using
JSON.stringify()on parsed body - ❌ Using base64 instead of hex encoding
- ❌ Using wrong hash algorithm (SHA1, MD5)
- ❌ Adding newlines or whitespace
Check the header name
The signature must be in:
X-Rodeo-Signature: abc123...
Not:
- ❌
X-Signature - ❌
Authorization - ❌
X-Hub-Signature(that's for GitHub's own verification)
Verify the secret matches
The secret in your webhook sender must exactly match the secret configured in webhook.rodeo. Copy-paste to avoid typos.
Check character encoding
Use UTF-8 encoding for both the payload and secret. Other encodings can cause mismatches.
Test without signature first
Remove signature verification temporarily:
- Remove the secret from your webhook configuration
- Send webhooks without the signature header
- Verify they're received successfully
- Re-enable signatures and debug from there
This isolates whether the issue is with signature computation or something else.
Rate limit errors
Problem
Getting 429 Too Many Requests responses.
Solutions
Check your plan limits
- Free: 10 requests/minute
- Starter: 300 requests/minute
- Pro: 1,500 requests/minute
Implement backoff
When you receive a 429 response:
async function sendWithRetry(url, payload, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, {
method: 'POST',
body: JSON.stringify(payload)
})
if (response.status !== 429) {
return response
}
// Wait before retrying
const retryAfter = parseInt(response.headers.get('retry-after') || '30')
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000))
}
throw new Error('Rate limit exceeded after retries')
}
Upgrade your plan
If you're consistently hitting rate limits, upgrade to a plan with higher limits.
Batch webhooks
If possible, have the sending service batch multiple events into fewer webhooks instead of sending individually.
Slack delivery issues
Problem
Slack destination is configured but messages aren't appearing in the channel.
Solutions
Check bot is in channel
For private channels, the webhook.rodeo bot must be invited manually:
- Go to the Slack channel
- Type:
/invite @Webhook Rodeo - Press Enter
For public channels, the bot joins automatically.
Verify workspace connection
In webhook.rodeo:
- Go to Integrations
- Check that your Slack workspace shows as "Connected"
- If not, reconnect it
Check channel still exists
If the Slack channel was deleted or renamed, remove and re-add the Slack destination with the correct channel.
Review Slack API errors
In the event details, check the Slack delivery attempt for error messages like:
channel_not_found- Channel was deletednot_in_channel- Bot needs to be invitedinvalid_auth- Workspace needs to be reconnected
Test with a different channel
Try changing to a different channel temporarily to isolate whether it's a channel-specific issue.
Getting help
Still stuck? We're here to help!
Before reaching out
Please have ready:
- Request ID - From the event that's having issues
- Webhook name - Which webhook is affected
- What you expected - Desired behavior
- What happened - Actual behavior
- Steps to reproduce - How to trigger the issue
Contact support
Email us at: support@webhook.rodeo
Include:
- Relevant request IDs
- Screenshots if helpful
- Error messages you're seeing