Guides · Free check · $9 fix pack

Guides

Stripe sent the same webhook twice. Now what?

Double emails, double credits, or a "duplicate key" crash usually mean your handler assumes each event arrives exactly once, in order. Stripe guarantees neither.

What Stripe says

A pattern that holds up

  1. Verify the signature, then insert event.id into a table with a unique constraint. If the insert conflicts, return 200 and stop.
  2. Key fulfillment on the Checkout Session ID (or your order ID), not on the event. Record "fulfilled" with a unique constraint so a concurrent second call becomes a no-op.
  3. When order matters, re-fetch the object from the API instead of trusting the event payload's snapshot.
  4. Return 2xx quickly; slow handlers cause timeouts, which cause retries, which cause more duplicates.
Check yours in 10 seconds (free).

Paste your webhook URL. WebhookProof sends 3 harmless test requests and tells you whether Stripe can reach it and whether it rejects unsigned events.

Run the free check

FAQ

Can Stripe send the same webhook event twice?

Yes. Stripe says endpoints might occasionally receive the same event more than once and recommends tracking processed event IDs.

Are Stripe webhook events delivered in order?

No. Stripe does not guarantee ordering. Fetch the latest object state from the API when order matters.

How do I stop double-fulfilling an order?

Make fulfillment idempotent: key it on the Checkout Session ID and record completion with a unique constraint so repeat calls do nothing.

More guides

Stripe webhook not working? Check these 7 things in order · A customer paid but didn't get access. What went wrong? · Stripe webhook signature verification failed · Stripe webhook getting a 307 or 308 redirect

Last reviewed 2026-10-18. WebhookProof is an independent tool, not affiliated with Stripe, Inc. Quotes are from the linked documentation.