Skip to main content
Every webhook request includes two headers for signature verification:

Verification steps

  1. Extract the timestamp and signature from headers
  2. Reject timestamps older than 5 minutes (replay protection)
  3. Compute HMAC-SHA256(secret, "{timestamp}.{raw_body}")
  4. Compare the computed signature with the received one using constant-time comparison
Always use a constant-time comparison function (e.g., crypto.timingSafeEqual in Node.js) to prevent timing attacks.

Implementation examples

Make sure you use the raw request body (not a parsed/re-serialized version) when computing the signature. Re-serializing JSON can change key ordering or whitespace, which will cause verification to fail.

Testing signatures

Use the Send test button on the webhook settings page to send a test event to your endpoint. Check that your signature verification passes before subscribing to real events.