Reference

Webhook provider behaviour

What each sender does when your endpoint is slow or down, and how it signs what it sends. Every claim here has a source, and the fields we could not source are left empty rather than filled with a plausible number.

Signature columns

Verified against a working verifier for each provider, proven by a test suite. A misread spec fails a test rather than shipping.

last checked 2026-04-15

Delivery columns

Read from each vendor's own documentation, not from secondary write-ups. Source linked per row.

last checked 2026-08-06

Delivery behaviour

Sorted by how much time you get. The tightest sender you receive from is your real constraint, not the most familiar one.

ProviderResponse budgetRetryGives up / disables
Slacksource3s3 retries: immediately, after 1 min, after 5 minEvent subscriptions disabled if over 95% of attempts fail within 60 min
Discordsource3s

Interaction endpoints must send an initial response within 3 seconds

not verifiednot verified
Shopifysource5s8 attempts over 4 hoursSubscription deleted after repeated failures within a 24-hour period
Paddlesource5sLive: 60 attempts over 3 days, 20 in the first hour, 47 in the first day. Sandbox: 3 attempts over 15 minnot verified
HubSpotsource5s

Applies to the whole batch, which can carry up to 100 notifications

Up to 10 attempts spread over 24 hoursnot verified
GitHubsource10sNone. GitHub does not automatically redeliver failed deliveriesNo disable. Deliveries stay redeliverable by hand for 3 days, then the record is gone
Twiliosource15s

Configurable. rt read timeout default 15000ms (max 15000), ct connect default 5000ms (max 10000), tt total default 15000ms

Configurable: rc 0 to 5, default 1. rp selects which failures qualifynot verified
Stripesourcenot published

Stripe publishes no figure. Its docs say only to return 2xx before any slow logic. 20s is the community working number

Exponential backoff for up to 3 days in live mode. Sandbox: 3 attempts over a few hoursEndpoint disabled after continued failure, with an email first. Events stay in the Events API for 30 days
Svix (Clerk, Resend)sourcenot published8 attempts: immediately, 5s, 5 min, 30 min, 2h, 5h, 10h, 10h. Then a message.attempt.exhausted operational webhookEndpoint disabled after all attempts fail for 5 days
WooCommercesourcenot published

Delivery is queued into Action Scheduler and driven by WP-Cron, so it leaves when a page is next loaded rather than when the event happens

not verifiedWebhook disabled after more than five consecutive delivery failures

Two rows are worth reading twice. GitHub does not retry at all, so a failed delivery is lost unless somebody redelivers it inside three days. Paddle front-loads 20 of its 60 attempts into the first hour, which punishes a merely slow handler far harder than Stripe's exponential curve.

Signature schemes

The signed payload column is the one that costs people hours. Anything other than raw body means you cannot hash the request body alone.

ProviderAlgorithmSigned payloadEncodingHeaderTolerance
SlackHMAC-SHA256v0:{timestamp}:{body}hexx-slack-signature = v0=hex5 min
DiscordEd25519{timestamp}{body}hexx-signature-ed25519 + x-signature-timestampnone
ShopifyHMAC-SHA256raw bodybase64x-shopify-hmac-sha256none
PaddleHMAC-SHA256{timestamp}:{body}hexpaddle-signature = ts=X;h1=hex5s
HubSpotHMAC-SHA256POST{decodedUrl}{body}{timestamp}base64x-hubspot-signature-v35 min
GitHubHMAC-SHA256raw bodyhexx-hub-signature-256 = sha256=hexnone
TwilioHMAC-SHA1full URL + form params sorted by keybase64x-twilio-signaturenone
StripeHMAC-SHA256{timestamp}.{body}hexstripe-signature = t=X,v1=hex5 min
Svix (Clerk, Resend)HMAC-SHA256{id}.{timestamp}.{body}base64svix-signature = v1,base64none
WooCommerceHMAC-SHA256raw bodybase64x-wc-webhook-signaturenone
Lemon SqueezyHMAC-SHA256raw bodyhexx-signature + x-event-namenone
PayPalRSA-SHA256{txId}|{txTime}|{webhookId}|{crc32(body)}base64paypal-transmission-sig + 4 morenone
SendGridECDSA P-256{timestamp}{body}base64x-twilio-email-event-webhook-signaturenone
LinearHMAC-SHA256raw bodyhexlinear-signaturenone
SentryHMAC-SHA256raw body, no timestamphexsentry-hook-signaturenone
IntercomHMAC-SHA1raw bodyhexx-hub-signature = sha1=hexnone
VercelHMAC-SHA1raw bodyhexx-vercel-signaturenone

Use this data

The same table is served as JSON at /providers.json, under CC BY 4.0. Copy it, embed it, correct it. If a number here is wrong or a vendor has changed something, open an issue on the repo and it gets fixed here.

Attribution: AnyHook, Webhook Provider Behaviour Reference, https://anyhook.net/providers

Where each number came up