Webhook reference
How webhook providers sign, time out and retry
The signature scheme, verification code, delivery timeout, retry schedule and source IP ranges for 23 senders, taken from each provider's own documentation and checked against known test vectors.
Payments
Stripe
Stripe signs every event with an HMAC-SHA256 over the timestamp and the raw body, sent in the Stripe-Signature header, and retries failed deliveries for up to three days.
HMAC-SHA256
Stripe-Signature
Code hosting
GitHub
GitHub signs webhook deliveries with an HMAC-SHA256 of the raw body in X-Hub-Signature-256, expects a 2xx within 10 seconds and does not retry failed deliveries automatically.
HMAC-SHA256
X-Hub-Signature-256
Code hosting
GitLab
GitLab sends a plain-text secret token in X-Gitlab-Token, or, with a signing token, a Standard Webhooks HMAC-SHA256 signature in webhook-signature; failing webhooks are disabled.
Shared token (or HMAC-SHA256 with a signing token)
X-Gitlab-Token
Code hosting
Bitbucket Cloud
Bitbucket Cloud signs webhooks that have a secret with an HMAC-SHA256 of the raw body, sent as X-Hub-Signature: sha256=….
HMAC-SHA256
X-Hub-Signature
Commerce
Shopify
Shopify signs webhooks with a base64 HMAC-SHA256 of the raw body, keyed with the app's client secret, and expects a 200 within five seconds.
HMAC-SHA256
X-Shopify-Hmac-Sha256
Messaging
Slack
Slack signs requests with v0= HMAC-SHA256 of "v0:{timestamp}:{body}" using the app's signing secret, and expects an answer within three seconds.
HMAC-SHA256
X-Slack-Signature
Messaging
Twilio
Twilio signs the full webhook URL plus the sorted POST parameters with HMAC-SHA1 and your Auth Token, base64-encoded in X-Twilio-Signature.
HMAC-SHA1
X-Twilio-Signature
Payments
Paddle Billing
Paddle Billing signs notifications with HMAC-SHA256 over "{ts}:{body}" in the Paddle-Signature header, expects a 200 within five seconds and retries for about two days.
HMAC-SHA256
Paddle-Signature
Video
Zoom
Zoom signs webhooks with v0= HMAC-SHA256 of "v0:{timestamp}:{body}" using the app's secret token, validates the URL with a challenge, and retries three times.
HMAC-SHA256
x-zm-signature
Productivity
Linear
Linear signs webhooks with a hex HMAC-SHA256 of the raw body in Linear-Signature and puts the send time in webhookTimestamp for replay checks.
HMAC-SHA256
Linear-Signature
Payments
Square
Square signs the notification URL followed by the raw body with HMAC-SHA256 and the subscription's signature key, base64-encoded, and retries for 24 hours.
HMAC-SHA256
x-square-hmacsha256-signature
Payments
PayPal
PayPal signs webhooks with SHA256withRSA over "transmission id|time|webhook id|CRC32 of the body", with a certificate you fetch from PAYPAL-CERT-URL; it retries up to 25 times over 3 days.
SHA256withRSA (certificate)
PAYPAL-TRANSMISSION-SIG
SendGrid
SendGrid's signed Event Webhook uses ECDSA: a base64 signature over the timestamp header plus the raw body, checked with the public verification key from your settings.
ECDSA P-256 with SHA-256
X-Twilio-Email-Event-Webhook-Signature
Mailgun
Mailgun puts a signature object in the JSON body: hex HMAC-SHA256 of timestamp + token with your HTTP webhook signing key; a 406 answer stops retries.
HMAC-SHA256
(signature object in the JSON body)
Messaging
Discord
Discord signs interactions and webhook events with Ed25519 over timestamp + body, verified with the application's public key, and needs an answer within 3 seconds.
Ed25519
X-Signature-Ed25519
Webhook infrastructure
Svix
Svix (used by Clerk, Resend and many others) signs with HMAC-SHA256 over "{svix-id}.{svix-timestamp}.{body}" using the base64 part of a whsec_ secret, and retries over about 27 hours.
HMAC-SHA256
svix-signature
Webhook infrastructure
Standard Webhooks
The Standard Webhooks spec signs "{webhook-id}.{webhook-timestamp}.{body}" with HMAC-SHA256 (v1) or Ed25519 (v1a); the key is the base64 part of a whsec_ secret.
HMAC-SHA256 (v1) or Ed25519 (v1a)
webhook-signature
Streaming
Twitch EventSub
Twitch EventSub signs with sha256= HMAC-SHA256 over message id + timestamp + body, needs the challenge echoed as text/plain, and revokes slow endpoints.
HMAC-SHA256
Twitch-Eventsub-Message-Signature
Customer messaging
Intercom
Intercom signs webhook notifications with X-Hub-Signature: sha1= HMAC-SHA1 of the body, keyed with the app's client secret, and resends if it gets no 200 within 5 seconds.
HMAC-SHA1
X-Hub-Signature
CRM
HubSpot
HubSpot's v3 signature is a base64 HMAC-SHA256 over method + URL + body + timestamp, keyed with the app's client secret; requests older than 5 minutes should be rejected.
HMAC-SHA256
X-HubSpot-Signature-v3
Productivity
Jira Cloud
Jira Cloud webhooks registered with a secret carry X-Hub-Signature: sha256= HMAC of the raw body; failures on 408/409/425/429/5xx are retried up to five times.
HMAC-SHA256
X-Hub-Signature
Scheduling
Calendly
Calendly signs webhooks with Calendly-Webhook-Signature: t=…,v1=… (hex HMAC-SHA256 of "{t}.{body}") and retries for 24 hours before disabling the subscription.
HMAC-SHA256
Calendly-Webhook-Signature
Forms
Typeform
Typeform signs webhooks with Typeform-Signature: sha256= followed by a base64 HMAC-SHA256 of the raw body, waits 30 seconds, and disables webhooks on 404 or 410.
HMAC-SHA256
Typeform-Signature
Compare providers
Timeouts and retry windows as documented; "not published" means the provider gives no number. Reviewed October 31, 2026.
| Provider | Signature | Header | Replay window | Timeout | Retries | Source IPs |
|---|---|---|---|---|---|---|
| Stripe | HMAC-SHA256 | Stripe-Signature |
5 minutes | not published | 3 days (live), a few hours (sandbox) | published |
| GitHub | HMAC-SHA256 | X-Hub-Signature-256 |
none | 10 s | Manual redelivery for 3 days | published |
| GitLab | Shared token (or HMAC-SHA256 with a signing token) | X-Gitlab-Token |
none | 10 s | see page | published |
| Bitbucket Cloud | HMAC-SHA256 | X-Hub-Signature |
none | not published | see page | published |
| Shopify | HMAC-SHA256 | X-Shopify-Hmac-Sha256 |
none | 5 s | 4 hours | not published |
| Slack | HMAC-SHA256 | X-Slack-Signature |
5 minutes | 3 s | About 6 minutes (24 hours with Delayed Events) | not published |
| Twilio | HMAC-SHA1 | X-Twilio-Signature |
none | 15 s | see page | not published |
| Paddle Billing | HMAC-SHA256 | Paddle-Signature |
5 seconds | 5 s | About 2 days (live), 2 minutes (sandbox) | published |
| Zoom | HMAC-SHA256 | x-zm-signature |
5 minutes | 3 s | About 85 minutes | linked |
| Linear | HMAC-SHA256 | Linear-Signature |
60 seconds | 5 s | About 7 hours | linked |
| Square | HMAC-SHA256 | x-square-hmacsha256-signature |
none | 10 s | 24 hours | published |
| PayPal | SHA256withRSA (certificate) | PAYPAL-TRANSMISSION-SIG |
none | not published | 3 days | not published |
| SendGrid | ECDSA P-256 with SHA-256 | X-Twilio-Email-Event-Webhook-Signature |
none | not published | 24 hours | not published |
| Mailgun | HMAC-SHA256 | (signature object in the JSON body) |
none | not published | 8 hours | not published |
| Discord | Ed25519 | X-Signature-Ed25519 |
none | 3 s | none | not published |
| Svix | HMAC-SHA256 | svix-signature |
5 minutes | 30 s | About 27 hours | published |
| Standard Webhooks | HMAC-SHA256 (v1) or Ed25519 (v1a) | webhook-signature |
5 minutes | not published | Several days (recommendation) | not published |
| Twitch EventSub | HMAC-SHA256 | Twitch-Eventsub-Message-Signature |
10 minutes | not published | see page | not published |
| Intercom | HMAC-SHA1 | X-Hub-Signature |
none | 5 s | see page | published |
| HubSpot | HMAC-SHA256 | X-HubSpot-Signature-v3 |
5 minutes | 5 s | 24 hours | not published |
| Jira Cloud | HMAC-SHA256 | X-Hub-Signature |
none | not published | see page | published |
| Calendly | HMAC-SHA256 | Calendly-Webhook-Signature |
3 minutes | 15 s | 24 hours | not published |
| Typeform | HMAC-SHA256 | Typeform-Signature |
none | 30 s | Up to 10 hours | not published |