Webhook Error Reference

Debugging a broken webhook at 2am? This reference covers every common webhook error — what causes it, how to fix it, and how to reproduce it with WebhookWhisper to verify your fix.

400

Bad Request

high

Your endpoint rejected a malformed body — parse error, missing required field, content-type mismatch. Most providers do not retry 400s, so the event is dropped.

All providers
401

Unauthorized

critical

Signature verification failed. The computed HMAC does not match the header value — usually caused by using parsed JSON instead of the raw request body.

StripeGitHubShopifyTwilio
403

Forbidden

high

A WAF, IP allowlist, or auth gate blocked the request before your handler ran. Common with Cloudflare bot protection or strict origin rules.

All providers
404

Endpoint Not Found

high

The webhook URL returned a 404. Either the URL path is wrong, the route is not registered, or the server is returning 404 for unrecognized paths.

All providers
405

Method Not Allowed

medium

Route exists but is registered for the wrong HTTP method. Webhooks are POST — a 405 means your handler is configured for GET, PUT, or missing OPTIONS preflight.

All providers
413

Payload Too Large

high

Body exceeded a size cap somewhere in your stack — framework parser, reverse proxy, or platform limit. Big Shopify orders and GitHub push events routinely hit this.

ShopifyStripeGitHub
422

Unprocessable Entity

medium

Body parsed but failed schema validation. Usually a strict validator rejecting an evolved provider payload, or an event type your handler did not anticipate.

All providers
429

Too Many Requests

medium

A rate limiter rejected the delivery. Often self-inflicted — too-tight per-IP limits applied to provider egress IPs, or retry storms after recovery.

All providers
500

Internal Server Error

critical

Unhandled exception in your handler. Provider retries on schedule, duplicate deliveries pile up. The structural fix is to ack fast and process async.

All providers
502

Bad Gateway

high

Reverse proxy could not reach your handler. Container restart, OOM kill, or app crash. Usually deploy-window blip; sometimes signal of operational fragility.

All providers
503

Service Unavailable

high

Service intentionally refused — maintenance mode, dependency unavailable, circuit breaker open. Always include Retry-After header so retries pace correctly.

All providers
504

Gateway Timeout

high

Reverse proxy gave up waiting for your handler. Either the handler is too slow or the proxy timeout is too short. Webhook handlers should respond in under 100ms.

All providers
SIG

Signature Mismatch (Generic)

critical

Generic HMAC verification failure. Wrong secret, parsing body before verifying, or charset mismatch. See provider-specific pages for tailored fixes.

All providers
STR

Stripe Signature Mismatch

critical

stripe.webhooks.constructEvent throws SignatureVerificationError. Usually express.json() before express.raw(), wrong secret, or 5-minute timestamp tolerance exceeded.

Stripe
GH

GitHub Signature Mismatch

critical

X-Hub-Signature-256 verification failed. Common causes: SHA1 vs SHA256 confusion, missing sha256= prefix, body parsed before HMAC.

GitHub
SHP

Shopify HMAC Validation Failed

critical

X-Shopify-Hmac-Sha256 mismatch. Shopify uses base64 (not hex like Stripe/GitHub) — copy-pasted Stripe verification fails 100% on Shopify.

Shopify
TW

Twilio Signature Validation Failed

critical

X-Twilio-Signature mismatch. Twilio signs URL+form-params (not raw body) — most failures are URL reconstruction issues behind reverse proxies.

Twilio
SLK

Slack Signature Mismatch

critical

X-Slack-Signature mismatch. Common causes: using bot token instead of signing secret, missing v0 prefix in signed string, or body parsed before HMAC.

Slack
TLS

SSL Certificate Error

critical

Your webhook endpoint's TLS certificate is invalid, expired, or self-signed. All major providers require a valid HTTPS certificate to deliver webhooks.

All providers
DNS

DNS Resolution Failed

critical

Source could not resolve your webhook hostname. Domain expired, DNS not propagated, missing AAAA record on IPv6-only network, or DNSSEC misconfiguration.

All providers
REF

Connection Refused

high

TCP RST from your server — application down, listening on wrong interface, firewall blocked, or port mismatch. Different from 502: no proxy is involved.

All providers
RST

Connection Reset

high

Connection established and then severed mid-request. Mid-request crash, OOM kill, idle-timeout mismatch, or reverse-proxy buffer overflow.

All providers
TMO

Webhook Timeout

high

Your endpoint did not respond within the provider's timeout window (usually 3–30 seconds). The provider will retry. Respond immediately and process asynchronously.

StripeSlackShopifyGitHub
RAW

Raw Body Required

critical

Verification SDK errors saying it needs raw bytes. The body was parsed by middleware before your verification code ran. Use express.raw() on the webhook route.

All providers
DUP

Duplicate Event Received

medium

Same event arriving multiple times — expected under at-least-once semantics. Implement idempotency keyed on the provider event ID; duplicates should be 200 no-ops.

StripeGitHubShopify
MISS

Event Not Firing

medium

Expected events are not arriving. Common causes: event type not in subscription, endpoint auto-disabled, scope mismatch, or wrong test/live environment.

All providers

The 3 Most Common Webhook Mistakes

1

Parsing the body before verifying the signature

HMAC signature verification requires the raw request bytes — exactly as sent. Using express.json() or body parsers before verification changes the byte sequence and breaks the HMAC. Always use express.raw({ type: 'application/json' }) for webhook endpoints.

2

Not responding quickly enough

Most providers timeout after 3–30 seconds. If your handler processes synchronously (database writes, API calls, emails), you will hit timeouts and get duplicate deliveries. Return HTTP 200 immediately and process the event in a background queue.

3

Not implementing idempotency

Providers retry on failure. If your endpoint returns 500 or times out, the same event arrives again. Without idempotency checks on the event ID, this creates duplicate orders, charges, or emails. Always deduplicate using the provider's event ID.

Debug Webhook Errors in Real Time

WebhookWhisper captures every request with full headers, body, and timing — so you can see exactly what the provider sent and reproduce the error.

Start Debugging Free