Verify common webhook HMAC signatures locally (no uploads). Supports Stripe-style t=/v1= and GitHub sha256=.
These fill the form with a synthetic secret/payload and a matching signature generated in-browser.
Real-world gotcha: you must verify against the exact raw request body. For JSON, avoid pretty-printing, trimming, or newline normalization.
whsec_... (Stripe) or your repo webhook secret (GitHub).
v1 digest.|now - t| ≤ tolerance.Warning: some providers sign the exact raw bytes. If you paste a transformed payload (pretty JSON, normalized newlines), verification will fail even with the right secret.
Goal: copy the exact request body bytes used to compute the signature (before your JSON parser modifies anything).
express.raw({type:'application/json'}) or Stripe’s recommended stripe.webhooks.constructEvent(rawBody, sig, secret) pattern. Keep the raw buffer.X-Hub-Signature-256: sha256=....If you still get INVALID with the right secret, the #1 cause is payload mismatch (whitespace/newlines/encoding).