Webhook Payload Tester
Build mode: select an event template and generate a signed payload + headers. Verify mode: paste payload, signature, and secret — recompute HMAC-SHA256 locally and get PASS/FAIL. Nothing leaves your browser.
Runs 100% client-sideOn this page5 sections
Local payload builder and signature verifier — this tool does not send or receive real webhooks. The signing secret and payload are computed in your browser via Web Crypto and never leave your device.
Signature header: X-Hub-Signature-256
HOW TO USE
- 01Choose a mode: Build (generate a signed payload) or Verify (check a payload + signature).
- 02Build: pick a provider template, enter your signing secret → get the JSON body, signature header, and a curl command.
- 03Verify: paste the received payload, the signature, and your secret → see the computed vs received HMAC.
- 04Everything is computed locally; copy the payload or curl to replay against your handler.
Try it
Build → Stripe checkout.session.completed → copy the curl commandWHEN TO USE
Use in two scenarios: (1) Build mode — you're writing a webhook handler and need a realistic signed payload to test against without triggering a real event; (2) Verify mode — you have a payload and signature from a provider and want to confirm your signing secret and algorithm produce the expected HMAC-SHA256 match. All computation is local; the secret and payload never leave your browser.
WHAT BUGS THIS FINDS
Wrong HMAC encoding — hex vs base64
Stripe uses hex; some providers use base64. Using the wrong encoding produces a valid HMAC value that never matches, causing all webhooks to be rejected silently.
Signature header not verified — trust without check
A handler that processes the payload without verifying the HMAC accepts forged events from anyone who knows the endpoint URL.
Signature verified on modified payload
Logging middleware that compresses or reformats the body before the handler reads it changes the payload bytes — HMAC verification always fails.
QA USE CASES
Generate a Stripe-style signed payload
Build mode → select Stripe checkout.session.completed template → get a JSON body + Stripe-Signature header + curl command to replay against your handler.
Debug a signature mismatch
Verify mode → paste the exact payload your handler received, the signature from the header, and your signing secret → see the computed vs received HMAC and exactly where they diverge.
Test your HMAC verification logic
Verify mode with correct inputs → PASS confirms your algorithm and encoding are correct. Tamper one byte → FAIL confirms rejection works.
Test the missing-signature path
Leave the signature field blank and confirm your handler returns 401 rather than processing the unauthenticated payload.