WooCommerce PayPal order stuck on "pending" or "on hold" after payment? Here's the fix

PayPal shows the money came in, but the WooCommerce order is sitting on "Pending payment" — or it flipped to "On hold" and never completed. Stock wasn't reduced, no receipt went out, and the customer is confused. This is one of the most-reported PayPal Payments issues, and there are two distinct causes. Here's how to tell them apart, fix a stuck order safely, and stop it quietly costing you sales.

Short version: Two things cause it. A missed webhook/IPN — PayPal captured the payment and sent the event, but it never reached or processed on your site, so WooCommerce never moved the order off "Pending". Or a manual-review hold — PayPal flagged the payment and is holding the funds, so "On hold" is correct until it clears. Check the order notes (the PayPal status is recorded there) to know which. For a confirmed-completed payment, complete the order; to stop the missed-webhook case, you need something that re-queries PayPal and reconciles the truly-paid orders.

Two different causes — tell them apart first

💡 Read the order notes first. The PayPal Payments plugin records the PayPal status there. If there are no payment-related notes at all, that itself points to a webhook that never arrived.

How to check what happened

  1. Order notes: open the order and read the PayPal status notes — completed, pending, or under review.
  2. PayPal dashboard: confirm the transaction actually completed (not just authorised or held), and note the transaction ID.
  3. PayPal Payments → Connection tab: enable Logging and check the Webhooks Status section — make sure your site is subscribed to the latest webhooks and they're reaching you.
  4. Firewall / cache / security: confirm the webhook/IPN endpoint isn't blocked or rate-limited.

How to safely fix a stuck order

Once you've confirmed in PayPal that a specific order completed (not authorised, not under review) with a real transaction ID, mark it Processing/Completed in WooCommerce so stock, receipts and integrations fire. If the order is genuinely On hold for manual review, don't force it — wait for PayPal to release or decline it.

⚠️ Never bulk-complete pending orders. Some are genuinely unpaid, declined, or under review — completing those means fulfilling without cleared funds. Every order must be verified against PayPal's completed status and transaction ID first.

Stop the silent revenue loss

Fixing webhook delivery helps, but webhooks and IPN are structurally unreliable — firewalls, timeouts and outages will always leak some events. Checking every pending order by hand doesn't scale, and each missed-webhook order is money you already earned sitting invisible on "Pending".

● Launching soon on WordPress.org

Let PaidRadar recover them automatically

PaidRadar — the sibling tool to PayDrift in the famosMedia Payment-Integrity family — scans your pending / on-hold / failed orders, re-queries the gateway (PayPal, Stripe) read-only, and for the ones that actually completed it finishes them correctly via payment_complete() — with a full audit trail. Conservative by default: it only completes an order on a confirmed PAID status with a transaction ID, and never touches unpaid, under-review or refunded ones. Self-hosted, no cloud.

Get notified when PaidRadar launches

FAQ

Why is the PayPal order pending when the money came in?

Usually a missed webhook/IPN — PayPal completed the payment and sent the event, but it didn't reach or process on your site. Sometimes it's a manual-review hold, where PayPal is holding the funds. Check the order notes to tell which.

Pending vs on hold — what's the difference?

Pending usually means a sync/webhook problem; on hold usually means PayPal is holding the payment for manual review. The order notes show the PayPal status.

How do I fix one stuck order?

Confirm it completed in PayPal (note the transaction ID), then mark it Processing/Completed. Don't force an order that's genuinely under manual review.

How do I stop it happening?

Fix webhook delivery, and because webhooks always leak, use a tool that re-queries PayPal and reconciles the truly-completed orders — that's what PaidRadar does.

Related: the same problem on Stripe (missed-webhook fix) →