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
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)
- 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.
- 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.
- A firewall / WAF / security plugin is blocking Stripe's requestsStripe reports a failed delivery or timeout; the request never reaches WooCommerce at all.
- 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.
- 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
- In WooCommerce → Payments → Stripe, copy your webhook URL — you'll match it against Stripe next.
- In Stripe → Developers → Webhooks, confirm an endpoint with that exact URL exists — add it if it's missing.
- Match the signing secret to your store's mode (test vs live) — a mismatch fails silently, so Stripe thinks it delivered while WooCommerce rejects every event.
- Send a test event from Stripe and expect a 200 — a timeout means a firewall or security plugin is blocking it, so allowlist Stripe's IPs or disable the rule.
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
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.