Skip to content
cascadehook.

ToolsReference

Webhook signature schemes compared

Every scheme here signs with HMAC-SHA256. They differ in what is signed, how the signature is encoded, how the secret becomes the HMAC key, whether a timestamp limits replays, and how the sender retries failed deliveries.

How each request is signed

SchemeHeadersSigned messageEncodingKeyTimestamp tolerance
Standard WebhooksWebhook-Id, Webhook-Timestamp, Webhook-SignatureHMAC-SHA256(key, id + "." + timestamp + "." + body)Base64Signing secret, with the whsec_ prefix removed and the rest Base64-decodedNot fixed by the spec. The official libraries allow 5 minutes.
StripeStripe-SignatureHMAC-SHA256(secret, t + "." + body)HexEndpoint signing secret, used as text5 minutes, using t= timestamp
GitHubX-Hub-Signature-256HMAC-SHA256(secret, body)HexWebhook secret, used as textNone. No timestamp is signed, so a signature never expires.
ShopifyX-Shopify-Hmac-Sha256Base64(HMAC-SHA256(client secret, body))Base64App client secret, used as textNone. No timestamp is signed, so a signature never expires.
SlackX-Slack-Request-Timestamp, X-Slack-SignatureHMAC-SHA256(secret, "v0:" + timestamp + ":" + body)HexSigning secret, used as text5 minutes, using X-Slack-Request-Timestamp
CascadehookWebhook-Id, Webhook-Timestamp, Webhook-SignatureHMAC-SHA256(key, id + "." + timestamp + "." + body)Base64Signing secret, with the whsec_ prefix removed and the rest Base64-decoded5 minutes in the reference receivers.

Retries and response deadlines

SenderAutomatic retriesResponse deadlineSource
Standard WebhooksRecommends exponential backoff with jitter over several days. Each sender sets its own schedule.Recommends a 15 to 30 second timeout.Standard Webhooks specification
StripeUp to three days with exponential backoff in live mode; three times over a few hours in a sandbox.Not stated. Stripe asks for a quick 2xx before any slow work.Stripe: Receive events in your webhook endpoint
GitHubNone. Failed deliveries must be redelivered by hand or through the REST API.10 seconds.GitHub: Handling failed webhook deliveries
ShopifyUp to eight times over four hours. The subscription is removed if failures persist.5 seconds.Shopify: Troubleshooting webhooks
SlackUp to three retries: almost immediately, after 1 minute, and after 5 minutes.3 seconds.Slack: Events API
CascadehookUp to 8 attempts within 72 hours, with jittered backoff from about 15 seconds to 18 hours. 408, 429, 5xx, timeouts, and network errors are retried; Retry-After can lengthen a wait.30 seconds per attempt.Cascadehook: Deliveries, retries, and replay

Checked against each provider's documentation on November 7, 2026.

What the differences mean

  • GitHub and Shopify sign only the body, so a captured request keeps a valid signature indefinitely. Deduplicate on the provider's delivery or event ID to resist replays.
  • Stripe, Slack, and Standard Webhooks sign a timestamp with the body, so receivers can reject old requests. Keep the server clock synced with NTP.
  • Standard Webhooks also signs the message ID, which doubles as an idempotency key for the receiver.
  • Standard Webhooks decodes its whsec_ secret from Base64, while Stripe uses its whsec_ secret as text. Treating one like the other is a common cause of mismatches.
  • Response deadlines range from 3 to 30 seconds. Acknowledge quickly and move slow work to a queue.

Debugging a mismatch? Each scheme has a free verifier that shows which input is wrong; start from the webhook tools.