WordPress 5 min read

WooCommerce payment taken but order still Pending: what I check

Customer was charged, but the WooCommerce order sits on Pending payment. Here is the checklist I run: gateway webhooks, holds, Action Scheduler, and plugins that rewrite status.

WooCommerce payment taken but order still Pending: what I check

The bank or Stripe dashboard shows a successful charge. The customer has a receipt. In WooCommerce the order is still Pending payment, so no processing email, no stock move, and your fulfilment queue never sees it. That mismatch is one of the most stressful tickets I get on live stores.

I treat “money taken, order Pending” as a payment-to-Woo handshake problem first, not a theme tweak. Below is the order I work through before I touch live gateway settings during trading hours.

Match the gateway charge to the Woo order

Open the order and note the order number, total, currency, and payment method. In Stripe, PayPal, Square, or your bank portal, find the matching charge by amount and approximate time. Confirm it is a completed capture, not an authorisation that never settled, and not a different order that just looks similar.

I copy the gateway transaction ID into the Woo order notes while I work. If there is no matching charge, stop and treat it as a failed or abandoned checkout, not a status bug.

Check whether Woo ever received the webhook

Most modern gateways move an order off Pending when a webhook or IPN lands. In Stripe look at the Developers → Webhooks (or the Woo Stripe plugin’s status page) for delivery failures, 4xx/5xx responses, or events that never reached the site. PayPal has IPN / webhook history the same way.

A common pattern: the thank-you page loaded, the customer saw “order received”, but the async callback never updated the order because the site blocked the request, returned HTML instead of 200, or the webhook URL still pointed at staging.

Holds, fraud, and manual review

Some gateways capture successfully and still tell Woo to hold the order. Stripe Radar, PayPal seller protection, AVS mismatches, and “needs review” flags can leave Woo on Pending or On hold even though money moved. Check the gateway’s dispute / review queue and the order’s status history for an automatic hold note.

If the hold is intentional, completing the review in the gateway usually fires the status update. Forcing Completed in Woo without clearing the hold can create refund and chargeback headaches later.

Action Scheduler and failed status transitions

Woo and many gateway plugins queue status changes through Action Scheduler. Under WooCommerce → Status → Scheduled Actions, filter for failed or pending actions tied to that order or the payment plugin. A stuck or failed action explains a charge that never flipped the order.

I also check for a flood of failed actions after a plugin update. One broken payment job can leave a trail of Pending orders that all share the same error in the log.

Plugin and custom code that rewrites order status

Membership plugins, B2B gates, custom checkout fields, multi-currency, and “approve before processing” add-ons often hook woocommerce_payment_complete or gateway callbacks. A rule that expects a user role, a filled meta field, or a wholesale approval can leave paid orders on Pending forever.

On staging I disable non-essential payment and membership plugins, replay a test charge, and watch whether status moves. When it does, I re-enable until it sticks again, then read that plugin’s payment-complete settings rather than editing the live order by hand first.

SSL, firewalls, and blocked callbacks

WAF rules, bot fights, basic auth on staging clones, and hosts that block unknown POSTs to /?wc-api= or REST routes will accept the customer’s card flow and reject the server-to-server update. The customer experience looks fine. Your admin does not.

I confirm the live site uses a valid HTTPS certificate, that the webhook URL in the gateway matches production (not a temporary URL), and that security plugins are not challenging gateway IPs.

When a one-off needs a manual fix

If the charge is real, the webhook will not replay cleanly, and the customer is waiting, I document the transaction ID in the order notes, then move the order to Processing only after I am sure stock and emails will behave. I still fix the webhook path so the next ten orders do not need the same rescue.

Do not mark Completed and ship if the gateway shows a refund, a partial capture, or an open review. Sort the money state first.

When to stop guessing

If several paid orders are stuck Pending, webhooks are failing in the gateway dashboard, and Action Scheduler is full of payment errors, stop shotgun-changing gateway keys on production mid-day. At that point you want a staging clone, the failing webhook payload, and someone who has traced Woo payment callbacks before.

Need this sorted properly? If payments clear in the gateway but Woo stays on Pending, I dig into webhooks, holds, and the plugins that rewrite order status on live stores.

WordPress & WooCommerce support →

Most of these tickets come down to a missed webhook, a fraud hold, a stuck Action Scheduler job, or a plugin that blocks payment-complete. Match the charge to the order first, then fix the handshake so the next payment lands on Processing on its own. Cheers.

Need a hand with this?

Get help with a broken order journey, custom store features or ongoing WooCommerce care.

A related project

A custom price history feature for WooCommerce

Bespoke plugin work to record product price changes and present the history by date, delivered through an agency.

Talk directly to Adam

Share this article

Back to Blog