Industry Payment Guides

WooCommerce Orders Stuck on Pending Payment: Causes and Fixes

WooCommerce order stuck on pending payment? Learn how to confirm the charge before shipping and fix webhooks, WP-Cron and held stock.

Row of red leather office chairs along a long white conference table with microphones in an empty boardroom

Photo: Pixabay

On this page 9 sections
  1. What the WooCommerce Pending Payment Status Really Means
  2. How Webhooks and IPN Update Your Order Status
  3. Common Causes: Blocked Webhooks, Firewalls and Broken WP-Cron
  4. How to Diagnose a WooCommerce Order Stuck on Pending Payment
  5. Payment Received but Order Pending: Confirming the Charge
  6. Auto-Cancel Settings and Held Stock
  7. Preventing Duplicate Charges When Customers Retry
  8. A Prevention Checklist for WooCommerce Store Owners
  9. Next Steps

Key takeaways

  • Pending payment means WooCommerce hasn't received payment confirmation. It doesn't prove the customer wasn't charged.
  • Most stuck orders trace back to a blocked or failing gateway webhook, a security rule or a WP-Cron setup that isn't running scheduled tasks.
  • Always check the gateway dashboard before you ship, cancel or refund a pending order. Never rely on a customer's screenshot.
  • Send customers back to the original order's payment link instead of letting them place a second order. This reduces duplicate charges and refund work.

A WooCommerce order stuck on pending payment is one of the most confusing problems a store owner can face. The customer says they paid, the order says they didn't, and you have to decide whether to ship, wait or cancel. This guide explains how WooCommerce decides an order's status and how gateway webhooks, IPN callbacks and WP-Cron fit into that process. It then walks through the common causes of stuck orders, how to confirm whether money was actually captured, and how to stop a stuck order from turning into a duplicate charge.

Menu names and settings can shift between WooCommerce versions and gateway plugins. Treat the paths below as a guide, and check your own version and your gateway's documentation.

What the WooCommerce Pending Payment Status Really Means

WooCommerce creates an order the moment a customer submits checkout. That happens before payment is confirmed. The order starts as Pending payment and waits for something to tell it what happened next.

Here is how the main statuses relate to payment:

StatusWhat WooCommerce believesTypical next step
Pending paymentOrder created, no payment confirmation receivedWait for gateway confirmation, or investigate
On holdAwaiting manual payment or review (e.g., bank transfer, check, gateway review)Confirm funds, then move to Processing
ProcessingPayment confirmed, stock reducedFulfill the order
CompletedOrder fulfilledNone
FailedPayment attempt was declined or erroredCustomer may retry
CancelledOrder cancelled by you, the customer or an automatic timeoutStock is released

The key point is that pending payment describes what WooCommerce knows, not what happened at the bank. If the confirmation message never arrived, the order stays pending even when the card was charged successfully. That is the "payment received but order pending" scenario store owners dread.

How Webhooks and IPN Update Your Order Status

Most payment gateways tell your store about a payment in two ways.

  1. The customer redirect. After paying, the customer returns to your thank-you page, and the gateway plugin checks the result. If the customer closes the tab, loses signal or gets stuck on a 3-D Secure screen, this step never happens.
  2. The server-to-server notification. The gateway's servers send a message directly to an endpoint on your site, usually called a webhook. Older integrations, such as PayPal Standard, call it IPN (Instant Payment Notification). This message doesn't depend on the customer's browser, so it acts as the reliable backup.

When the webhook arrives, the gateway plugin checks that it's genuine (usually with a signing secret or by verifying it with the gateway). The plugin then updates the order to Processing, Failed or another status and adds an order note.

WP-Cron is the third piece. WordPress runs scheduled tasks through WP-Cron, and WooCommerce queues many background jobs through its Action Scheduler. Those jobs include cancelling unpaid orders, releasing held stock and, for some gateway plugins, processing incoming webhook events. By default, WP-Cron only runs when someone visits your site. If it's disabled or broken, those jobs pile up quietly.

So a WooCommerce order not completing usually means one of three things: the redirect failed, the webhook failed, or the background job that should act on the webhook never ran.

Common Causes: Blocked Webhooks, Firewalls and Broken WP-Cron

When the WooCommerce Webhook Is Not Working

  • Wrong endpoint URL. After a domain change, an HTTPS switch or a move from staging to live, the gateway may still be posting to the old address.
  • Mismatched signing secret. If you regenerated API keys or switched between test and live mode, the webhook secret saved in the plugin may no longer match. Your site then rejects messages it should accept.
  • Redirects on the endpoint. Some gateways won't follow a 301 redirect (for example, http to https or www to non-www). The notification fails even though the URL looks right in a browser.
  • Test and live mix-ups. A staging site running live keys, or live keys paired with a test webhook, sends events to the wrong place.

Security Tools That Block Gateway Traffic

Security plugins, hosting firewalls and CDN bot protection are built to stop automated POST requests. A legitimate gateway webhook is an automated POST request. Common culprits include:

  • Firewall or bot-fight rules that challenge or block requests with no browser
  • Country blocking that happens to include a gateway's server locations
  • Rate limiting during a sales spike
  • Maintenance mode, "coming soon" plugins or password protection left on after launch
  • Page caching applied to the webhook endpoint

Server and Plugin Errors

A PHP fatal error, a memory limit or a plugin conflict can make your endpoint return a 500 error. The gateway sees a failure and may retry later. Some gateways may eventually stop sending to an endpoint that keeps failing, so check your gateway's policy.

Broken WP-Cron

Low-traffic stores are especially exposed, because WP-Cron needs visits to trigger. Hosts sometimes disable WP-Cron (the DISABLE_WP_CRON setting) and expect you to set up a real server cron job instead. If nobody does, scheduled actions never run.

How to Diagnose a WooCommerce Order Stuck on Pending Payment

Work through these in order. Most problems show up in the first three steps.

  1. Read the order notes. Look for gateway messages, transaction IDs or error text on the order edit screen.
  2. Check the gateway's webhook log. Most gateway dashboards list each webhook attempt with the HTTP response your site returned. A 200 means your site accepted it. A 403 usually points to a firewall or security rule, a 404 to a wrong URL, a 301 to a redirect and a 500 to a server or plugin error.
  3. Check WooCommerce logs. Go to WooCommerce > Status > Logs and look for your gateway's log file and any fatal-error logs around the order time. Turn on debug logging in the gateway settings if it's off.
  4. Check scheduled actions. Under WooCommerce > Status > Scheduled Actions, look for a large backlog of past-due or failed actions. A backlog suggests WP-Cron isn't running.
  5. Test after each fix. Place a test order in sandbox mode, or use your gateway's "send test webhook" tool if it has one, and confirm the order moves to Processing.

If several orders are stuck at once, suspect a site-wide cause such as a firewall rule, a migration or a secret mismatch. If only one order is stuck, the customer probably abandoned checkout or a single webhook failed.

Payment Received but Order Pending: Confirming the Charge

Before you ship or cancel, find out what actually happened at the gateway. WooCommerce can't tell you.

Search the gateway dashboard by order number, customer email or transaction ID, then compare what you find:

What the gateway showsWhat it meansWhat to do
Captured / succeeded / settledMoney was collectedMove the order to Processing and note the transaction ID
Authorized, not capturedFunds held, not yet collectedCapture it (if that's your workflow) or void it, then update the order
Incomplete / requires actionCustomer didn't finish (often 3-D Secure)Don't ship. Contact the customer or let the order cancel
Declined / failedNo money collectedLeave as Failed or Cancelled
No record at allPayment was never attempted at the gatewayTreat as unpaid. Check for card-testing activity

A few rules protect you here:

  • Don't ship based on a customer's bank screenshot. A "pending" line on a bank app can be a temporary authorization that later drops off, not a completed charge.
  • Record the transaction ID when you update an order manually. Many gateway plugins need it to process refunds from inside WooCommerce later.
  • Replay the webhook if you can. Many gateway dashboards let you resend an event. Once your endpoint is fixed, resending lets the plugin update the order properly instead of you editing it by hand.

If you see many pending orders with no matching gateway record and odd customer details, you may be looking at bots, not glitches. Our guide to stopping card testing on your WooCommerce checkout covers that pattern.

Auto-Cancel Settings and Held Stock

WooCommerce can reserve stock for unpaid orders and cancel them after a set time. The control is the Hold stock setting, typically under WooCommerce > Settings > Products > Inventory, where you enter a number of minutes. Leaving it blank generally turns off automatic cancellation of unpaid orders. In current versions, this generally applies to orders placed through checkout, not orders you create manually in the admin, but confirm this for your version.

This setting interacts with webhooks and WP-Cron in ways that cause real problems:

  • If WP-Cron is broken, unpaid orders never cancel and their stock may stay reserved. Products can appear out of stock even though nothing sold.
  • If the hold time is too short, a slow payment can arrive after the order has already been cancelled, for example a customer working through bank authentication or an alternative payment method. You end up with a cancelled order and a paid customer. Gateway plugins handle late confirmations differently, so test what yours does.
  • If the hold time is too long, limited stock can sit locked behind abandoned carts during a launch or flash sale.

Illustrative example: a store selling a limited-run product sets a short hold time to keep inventory moving. A customer whose bank requires an extra authentication step finishes paying just after the order auto-cancels. The money is captured, but the stock has gone back on sale. Before you pick a hold time, check how long your gateway's slowest payment methods can take to confirm.

Preventing Duplicate Charges When Customers Retry

When customers see an error or a pending order, many simply try again. That can create two orders and, sometimes, two charges.

  • Send customers back to the original order. Pending orders have a customer payment page link on the order edit screen. Email that link instead of asking them to check out again.
  • Make the thank-you and error pages clear. Say plainly whether payment went through and what to do next, so customers aren't left guessing.
  • Check for duplicates before refunding. Search the gateway by customer email for every attempt, not just the order in front of you.
  • Refund true duplicates quickly and tell the customer. A fast, explained refund is far less likely to become a chargeback.
  • Explain authorization holds. If a failed attempt left a temporary hold on the customer's card, let them know it should release on their card issuer's timeline. The exact timing varies by issuer.

Many modern gateway integrations use idempotency controls to stop the same request from being charged twice. Ask your provider how their integration handles retries. If declines are what's sending customers back to retry, see fixing declines at your WooCommerce checkout.

A Prevention Checklist for WooCommerce Store Owners

  • Confirm the webhook URL and signing secret after every migration, domain change or API key change.
  • Allow your gateway's webhook endpoint through firewalls, bot protection and caching rules.
  • Replace unreliable WP-Cron with a real server cron job if your host supports it.
  • Review Scheduled Actions and gateway logs on a regular schedule, not only when something breaks.
  • Set a hold-stock time that fits your slowest payment method.
  • Keep staging sites on test keys only.
  • Test a full order, including a 3-D Secure card, after plugin or theme updates.

If you're weighing whether your current setup is the problem, our store owner's checklist for choosing a WooCommerce payment gateway covers support, logging and integration quality.

Next Steps

Most stuck pending orders trace back to a short chain of causes: a webhook that didn't arrive, a security tool that blocked it or a scheduled task that never ran. Fix the chain, confirm every questionable order against the gateway, and steer retrying customers back to their original order.

If you'd like a second set of eyes on your setup, MannyPay supports WooCommerce payment processing integrations and gateways such as Authorize.net and NMI as part of its online payment solutions. You can request a free quote, and a MannyPay specialist will respond within one business day.

About the author

MannyPay Editorial Team

Beyond the Swipe's editorial desk researches the publication's guides and news and cites its sources in every article. Articles reviewed by a named MannyPay editor carry that editor's byline.

This article is for general educational purposes and is not legal, tax or financial advice. Card network rules and state laws change; confirm current requirements for your business.

Related reading