Back to blog
TroubleshootingPublished

WooCommerce Orders Stuck on Processing: Causes and Fixes

By Hassan Tahrioui

First, check whether anything is actually wrong: in WooCommerce, Processing means payment succeeded and the order is waiting for you to fulfill it. Orders only move to Completed when you ship them (or automatically for virtual, downloadable products). If orders sit on Pending payment or On hold instead, or Processing orders are missing emails and stock updates, then something is broken, and it is usually a payment webhook or a stalled task queue.

Here is how to tell the difference, and the exact fix for each case.

Is "Processing" actually a problem?

For a store selling physical products, no. The intended lifecycle is Pending payment, then Processing once the gateway confirms the charge, then Completed when you fulfill. WooCommerce never auto-completes physical orders because it cannot know you shipped the box.

You have a real problem when one of these is true:

  • Orders stay on Pending payment even though the customer's card was charged.
  • Digital-only orders stay on Processing instead of auto-completing.
  • Processing orders trigger no confirmation email and no stock reduction.
  • The status changes hours after the purchase instead of within a minute.

If you only want digital orders to auto-complete, that is one filter in your child theme's functions.php:

add_filter( 'woocommerce_payment_complete_order_status', function( $status, $order_id, $order ) {
    return 'completed';
}, 10, 3 );

Use it deliberately: auto-completing physical orders makes fulfillment mistakes invisible.

Why do orders stay on "Pending payment" after the customer paid?

The gateway's confirmation callback is not reaching your site. Stripe, PayPal, and Mollie all confirm asynchronously: the customer pays on the checkout, then the gateway calls a webhook URL on your server, and only that call moves the order to Processing. When a firewall, security plugin, or a wrong URL blocks the callback, money arrives but the order never updates.

Where to look, gateway by gateway:

  • Stripe: in the Stripe dashboard go to Developers > Webhooks and check the endpoint for your domain. A pile of failed deliveries with 403 or timeout responses is your answer. In WordPress, go to WooCommerce > Settings > Payments > Stripe and confirm the webhook secret matches the endpoint. The Stripe plugin logs every callback under WooCommerce > Status > Logs, in files named stripe-....
  • PayPal: the equivalent mechanism is IPN or the newer webhooks. In the WooCommerce PayPal Payments plugin, resubscribe the webhooks from WooCommerce > Settings > Payments > PayPal > Connection, then place a test transaction.
  • Any gateway: Cloudflare rules, ModSecurity, and security plugins like Wordfence sometimes block POST requests from gateway IPs. Check their block logs around the timestamp of a stuck order.

After fixing the webhook, stuck orders do not repair themselves. Use the order's Order actions dropdown (right side of the order screen) and run the gateway's "verify payment status" action if the plugin provides one, or reconcile against the gateway dashboard manually.

Why do status changes and emails lag by hours?

WooCommerce runs follow-up work (emails, webhooks to other apps, subscription renewals) through Action Scheduler, which by default piggybacks on WordPress cron. WordPress cron only runs when someone visits the site, and some hosts disable it entirely. The result is a growing backlog where an order changes status but its side effects run hours later, which looks exactly like "orders are stuck."

Check the backlog at WooCommerce > Status > Scheduled Actions. Thousands of actions in the Pending tab, with the oldest ones hours old, confirms the diagnosis.

The fix is to run cron from the server instead of from page visits. Add this to wp-config.php:

define( 'DISABLE_WP_CRON', true );

Then create a real cron job on your host (every hosting panel has a cron section) that hits wp-cron.php every five minutes:

*/5 * * * * wget -q -O /dev/null https://yourstore.com/wp-cron.php?doing_wp_cron

On stores with heavy traffic, ask your host about running Action Scheduler via WP-CLI instead; managed WooCommerce hosts usually have this ready.

What if the whole checkout broke after an update?

If new orders stopped appearing at all, or customers report paying without getting a confirmation page, stop reading about statuses; your checkout itself is failing. Plugin and theme updates are the leading cause. Go to WooCommerce > Status > Logs and open the fatal-errors log for today, which names the plugin and line that crashed.

The frustrating part is that these failures are silent from the store owner's side. Revenue just slows down, and the checkout errors that cause it only show up on specific combinations like "mobile Safari plus PayPal plus a coupon." That is the argument for testing the full checkout automatically instead of waiting for an angry email: a scheduled bot that adds a product, pays with a test card, and confirms the order reached Processing catches a broken webhook or a fatal error within the hour.

FAQ

What is the difference between Processing and Completed in WooCommerce? Processing means payment is confirmed and stock is reduced; the order is waiting for fulfillment. Completed means the order is finished, typically after shipping. Only virtual plus downloadable orders skip Processing automatically.

How do I make WooCommerce auto-complete orders? Mark products as both Virtual and Downloadable for the built-in behavior, or use the woocommerce_payment_complete_order_status filter shown above to force it for everything. Plugins like "Autocomplete WooCommerce Orders" do the same thing with a settings page.

Why does WooCommerce say Pending payment when Stripe shows the charge as succeeded? Stripe's webhook never reached your site. Check Stripe's Developers > Webhooks delivery log for failures, verify the webhook secret in the plugin settings, and check your security plugin's firewall log for blocked Stripe IPs.

Are orders stuck On hold the same problem? Usually not. On hold means the gateway is waiting for manual confirmation or the payment method is slow by design (bank transfer, some anti-fraud reviews). Check the payment method on the stuck orders before assuming a bug.

If you would rather find out about a dead webhook from an alert than from a customer, that is what Tracefox is for: it places a scheduled test order on your real WooCommerce checkout, verifies the order confirmation actually renders, and emails you with a screenshot the moment any step fails.

Catch broken checkouts before your customers do

Tracefox replays your checkout on a schedule on the desktop, mobile or tablet viewport you pick for each test, and alerts you when a scheduled run fails. Bonus on every plan: tracking pixel, script, and consent banner monitoring.

Start free