Why Did My Stripe Subscription Payment Fail in WooCommerce?
Why This Happens
The WooCommerce Stripe integration charges a saved payment method token on the renewal date, and Stripe reports back either a successful charge or a decline with a specific reason code. Separately, Stripe sends webhook events back to WooCommerce to confirm the outcome and update the order — if that webhook doesn't arrive or isn't processed, WooCommerce can be left showing an incorrect status even when Stripe's own side succeeded or failed clearly.
That split — "did the charge actually fail" versus "did WooCommerce correctly hear about it" — is the first thing to separate, because the fix is completely different depending on which one it is.
Common Causes
- Genuine card decline. Insufficient funds, an expired card, or the issuing bank blocking the transaction. Stripe's decline codes (
insufficient_funds,expired_card,do_not_honor, and similar) tell you this directly. - Strong Customer Authentication (SCA) required. EU/UK cards increasingly require an interactive 3D Secure step. An automatic background renewal can't complete that step, so the charge fails until the customer completes authentication manually.
- Webhook not configured or not reaching the site. A firewall rule, a security plugin, or an incorrect webhook URL in the Stripe dashboard can silently block the events WooCommerce needs to update order status correctly.
- Expired or regenerated API keys. Rotating Stripe API keys without updating them in WooCommerce → Settings → Payments → Stripe breaks every subsequent charge attempt at once.
- Payment method token no longer valid. A customer removing a card from their own Stripe-connected wallet, or Stripe's card-updater failing to refresh an expired card automatically.
How to Fix It
- Check the decline code in the Stripe dashboard first. Payments → search the relevant charge — the specific decline reason immediately tells you whether this is a customer-side card issue or something to fix on the site.
- Confirm webhooks are actually arriving. Stripe's dashboard (Developers → Webhooks) shows delivery attempts and response codes for the configured endpoint — a string of failed deliveries points at a server-side block, not a Stripe problem.
- For SCA-related failures, send the customer an authentication link. WooCommerce Subscriptions with the Stripe gateway can generate a "complete payment" link the customer clicks to finish 3D Secure manually.
- Re-verify the API keys currently in use. Compare the publishable/secret keys in WooCommerce settings against the live keys shown in the Stripe dashboard, especially after any recent Stripe account change.
- Ask the customer to re-add their card if the token itself is invalid — this generates a fresh payment method and clears most token-level failures immediately.
See custom WooCommerce development if the webhook or API integration itself needs fixing rather than a one-off customer card issue.