WooCommerce fixes / Stripe webhook not working

WooCommerce Stripe Webhook Not Working? Causes & Fix

Stripe took the payment (or seemingly didn't) but your WooCommerce orders stay on Pending payment — or no order appears at all. That's the Stripe webhook failing to reach your store, so the payment confirmation never lands. Here's how to find the exact reason and fix it.

Last updated: 14 Jul 2026 · ~6 min read

Quick answer

The Stripe webhook endpoint isn't reaching WooCommerce. Usually the endpoint URL is missing or wrong in the Stripe Dashboard, the signing secret doesn't match the store's mode (a test secret on a live store, or vice versa), or a firewall is blocking Stripe's requests. Because the confirmation never arrives, the charge can succeed on Stripe while the order sits pending. Fix the endpoint and the secret, then send a test event and confirm a 200.

What a Stripe webhook actually does

Stripe confirms payment asynchronously: after the customer pays, Stripe POSTs an event (like payment_intent.succeeded) to your store's webhook URL. WooCommerce listens for that event and uses it to move the order to Processing and reduce stock. If the webhook never arrives — wrong URL, rejected signature, blocked request — the charge can succeed on Stripe while the order sits on pending, because your store was never told the money cleared. So a broken webhook isn't a payment problem; it's a notification problem.

The most common causes (most likely first)

  1. The webhook endpoint URL is missing or wrong in the Stripe DashboardNo endpoint added at all, or it's pointing at the wrong site/path — Stripe has nowhere valid to send the event. By far the #1 cause.
  2. Signing secret mismatch — test secret on a live store (or vice versa)Signature verification fails: Stripe shows the delivery attempt but WooCommerce rejects it as unverified.
  3. A firewall / WAF / security plugin is blocking Stripe's requestsStripe reports a failed delivery or timeout; the request never reaches WooCommerce at all.
  4. Store or keys in test mode while taking live paymentsLive events are sent to a test-mode endpoint, or test keys are installed on a live store, so nothing matches up.
  5. The endpoint returns a non-200 (PHP error, plugin conflict, or timeout)Stripe shows 400/500 responses in the webhook attempt log — the request arrives but the store errors out handling it.

Where to look first

Not sure which cause is yours?

That's the slow part — checking the endpoint, the secret and your firewall by hand. DiagnosticIQ's free dashboard flags Stripe key-mode mismatch and webhook health in one screen, and the AI names the exact failure — down to "webhook returning 401 in live mode" — in about 30 seconds. And it keeps watching after the fix — so if the webhook drops again, you hear it from DiagnosticIQ, not from a customer.

Get the free plugin

Made by Prima Digital — the team behind this guide. Free forever; no card to install.

How to know you fixed it

Verify

In Stripe → Developers → Webhooks, the endpoint should show recent successful (200) deliveries. Then place a real test order: it should move from Pending payment → Processing on its own, with no manual nudge. If both are true, the webhook is reaching WooCommerce again.

Frequently asked

Where do I find my Stripe webhook URL?

In WooCommerce under Settings → Payments → Stripe — it lists the endpoint URL to register in the Stripe Dashboard, and the two must match exactly.

What's the difference between the test and live signing secret?

Stripe issues a separate whsec_ signing secret for each mode, and each verifies only its own mode's events — so a test secret on a live store fails every event.

Why does Stripe show the payment succeeded but there's no order?

The charge and the order confirm on two different paths — Stripe processed the card, but the webhook that tells WooCommerce to create the order never arrived.

>_
John O'Keane — Founder, Prima Digital · LinkedIn
Contributions by David Zhang · LinkedIn
I build DiagnosticIQ, the WooCommerce diagnostic plugin, and I've walked store owners through this exact Stripe-webhook failure more times than I can count.