If your WooCommerce orders are stuck on "Pending Payment" or simply not completing, you're not alone. This is one of the most common — and most damaging — issues store owners face. Customers try to pay, the order never goes through, and sales are lost silently in the background.
I've fixed this exact problem for WooCommerce clients across the US and UK over my 14+ years as a WooCommerce developer. In this guide, I'll walk you through the exact steps to diagnose and fix it — no fluff, just the real causes and solutions.
Why Do WooCommerce Orders Fail to Complete?
Before jumping into fixes, here are the most common root causes:
- Payment gateway misconfiguration or expired API keys
- Webhook / IPN not reaching your server
- Caching plugin interfering with checkout sessions
- WP Cron disabled, blocking payment status updates
- Plugin or theme conflict breaking the checkout flow
- Server firewall blocking payment gateway callbacks
- SSL certificate error causing secure payment failure
Step 1: Test With a Simple Payment Method First
Before touching the payment gateway, rule out whether the issue is in your checkout flow itself or the payment method.
Go to WooCommerce → Settings → Payments and temporarily enable Cash on Delivery or Bank Transfer. Place a test order using that method.
If the order completes — your checkout flow is fine. The problem is isolated to the payment gateway. This single step saves hours of debugging in the wrong place.
If the order still doesn't complete — the issue is in your WooCommerce setup itself (caching, sessions, or a plugin conflict). Move to Step 2.
Step 2: Check Your Payment Gateway Settings
This is the most common cause of orders not completing. Even a single wrong setting can silently break all payments.
Go to WooCommerce → Settings → Payments and open your active gateway. Check:
- Live vs Test mode — are you accidentally in test/sandbox mode on a live store?
- API keys — have they been regenerated in your gateway dashboard but not updated in WooCommerce?
- Webhook URL — is it correctly configured in your gateway's developer dashboard?
For Stripe — Check Your Webhook Endpoint
Go to Stripe Dashboard → Developers → Webhooks. The endpoint should point to your site:
# Standard Stripe WooCommerce Plugin: https://yourdomain.com/?wc-api=wc_stripe # Payment Plugins for Stripe: https://yourdomain.com/wc-api/wc_stripe
If the webhook is missing, misconfigured, or failing — orders will never move out of "Pending Payment" status.
For PayPal — Check IPN Settings
Log into PayPal → Account Settings → Notifications → Instant Payment Notifications. Make sure IPN is enabled and pointing to your site URL.
Step 3: Disable Caching on Checkout Pages
Caching is a silent killer for WooCommerce checkout. A cached checkout page breaks sessions, which breaks orders.
In your caching plugin (WP Rocket, W3 Total Cache, LiteSpeed Cache, etc.), add these pages to the exclusion list:
/cart /checkout /my-account /wc-api
Also disable caching for logged-in users if your store has registered customers. After making changes, clear all cache and test again.
/checkout*.
Step 4: Check WooCommerce System Status
WooCommerce has a built-in diagnostic panel that shows server configuration issues — check it before digging deeper.
Go to WooCommerce → Status → System Status. Look for anything highlighted in red or yellow:
- PHP version — needs to be 7.4 minimum, ideally 8.1+
- Max execution time — should be 300 seconds minimum
- WordPress memory limit — 256MB recommended
- WP Cron — if disabled, payment status updates will not process
WP Cron Disabled? This Is Critical
If you see DISABLE_WP_CRON set to true in wp-config.php, scheduled payment callbacks will never fire. Either re-enable it:
// Remove or set to false in wp-config.php:
define('DISABLE_WP_CRON', false);
Or — the better approach for high-traffic stores — set up a real server-side cron job that hits wp-cron.php every 5 minutes.
Step 5: Check for Plugin or Theme Conflicts
A badly coded plugin or incompatible theme can silently break WooCommerce checkout without throwing a visible error.
The safest way to test: deactivate all plugins except WooCommerce and your payment gateway plugin. Switch to Storefront or Twenty Twenty-Four theme. Try placing a test order.
If it works — reactivate plugins one by one, testing after each, until you find the culprit. Common offenders:
- Security plugins (Wordfence with aggressive firewall rules blocking payment callbacks)
- Minification/optimization plugins breaking checkout JavaScript
- Checkout customization plugins with conflicting scripts
- Page builder plugins (Elementor, Divi) with custom checkout templates
Step 6: Check WooCommerce Logs for Errors
WooCommerce logs every payment event. This is the fastest way to see exactly what went wrong during a failed order.
Go to WooCommerce → Status → Logs. Select your payment gateway from the dropdown and look at entries around the time of a failed order. You'll often see the exact error — invalid signature, webhook timeout, failed API call, or a PHP fatal error only triggered during checkout.
Step 7: Check Your Server Firewall and Hosting Configuration
Sometimes the payment gateway sends a callback to your server — and your server blocks it. This is more common than people think.
Your server's firewall or WAF (Web Application Firewall) may be blocking incoming requests from payment gateway IP addresses. Check:
- Payment gateway IPs are not blocked in your firewall rules
- Outgoing HTTP requests from PHP (
wp_remote_post) are not restricted - ModSecurity rules are not triggering on payment callback URLs
- Your hosting doesn't block outgoing connections on non-standard ports
If you manage your own server (VPS or dedicated) on AlmaLinux, cPanel, or aaPanel — check your firewall whitelist and make sure payment gateway IP ranges are explicitly allowed.
Quick Reference Checklist
| Root Cause | Fix |
|---|---|
| Payment gateway in test mode | Switch to live mode |
| Wrong or missing webhook URL | Update in gateway dashboard |
| Caching on checkout pages | Exclude /cart, /checkout from cache |
| WP Cron disabled | Re-enable or set real server cron |
| Plugin conflict | Deactivate plugins one by one |
| Server blocking gateway callbacks | Whitelist gateway IPs in firewall |
| PHP error during checkout | Check WooCommerce and server logs |
| Expired API keys | Regenerate and update in WooCommerce |
Still Not Fixed? It's Likely a Code-Level Issue
If you've worked through every step above and orders are still not completing, the issue is almost certainly in custom code — a poorly written plugin, a theme function hook conflicting with WooCommerce, or a custom checkout page that's not passing required fields correctly.
As a WooCommerce developer with 14+ years of experience, I've fixed checkout issues like this for clients across the US and UK — from Stripe payment freezes on Safari iOS to orders stuck in pending due to webhook failures on custom server configurations. If you're losing sales and need it fixed today, get in touch and I'll dig into the root cause.
WooCommerce Orders Not Completing? Let's Fix It.
Get expert diagnosis and a permanent fix — not a workaround. I'll find the root cause and resolve it fast.
Hire a WooCommerce Developer →Frequently Asked Questions
Why is my WooCommerce order stuck on "Pending Payment"?
This usually means the payment was initiated but the gateway never confirmed it to WooCommerce. The most common causes are a missing or incorrect webhook URL, WP Cron being disabled, or a server firewall blocking the payment gateway's callback request.
WooCommerce order is not completing after payment — what should I check first?
Start with your payment gateway webhook settings and check WooCommerce logs (WooCommerce → Status → Logs) for errors around the time of the failed payment. These two steps identify the root cause in 80% of cases.
Can a caching plugin cause WooCommerce orders to not complete?
Yes — if the checkout page is cached, WooCommerce session data breaks, which causes orders to fail. Always exclude /cart, /checkout, /my-account, and /wc-api from your caching plugin and Cloudflare Page Rules.
How do I test if my payment gateway is the problem?
Enable Cash on Delivery or Bank Transfer temporarily and place a test order. If it completes successfully, the issue is specific to your payment gateway — not the WooCommerce checkout flow itself.
Does WP Cron affect WooCommerce order completion?
Yes. WooCommerce uses WP Cron to process scheduled payment status checks. If WP Cron is disabled via wp-config.php, orders that depend on delayed payment confirmation (like certain gateway callbacks) may never update from Pending to Processing.
How much does it cost to fix WooCommerce order completion issues?
It depends on the root cause. Simple fixes like webhook configuration or caching exclusions can take under an hour. Complex issues involving custom code conflicts or server-level firewall problems may take 2–4 hours of developer time. Most fixes are one-time and permanent.