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.
Two different causes — tell them apart first
- Missed webhook / IPN (a sync bug): PayPal completed the payment and sent a webhook to your site, but a firewall, cache, security plugin or timeout stopped it reaching or processing — so the order is stuck on "Pending" even though the money is in. Widely reported: WordPress.org threads on PayPal Payments order-sync issues.
- Manual-review hold (working as intended): PayPal has flagged the payment for review and is holding the funds, so "On hold" is correct until it releases — see GitHub issue #3483 ("Multiple PayPal Payments Stuck in Pending / On hold – Manual Review Triggered Without Completion").
How to check what happened
- Order notes: open the order and read the PayPal status notes — completed, pending, or under review.
- PayPal dashboard: confirm the transaction actually completed (not just authorised or held), and note the transaction ID.
- 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.
- 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.
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".
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.
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.