A customer adds a product to their cart, fills in the shipping address, hits "Place Order" — and nothing happens. Or worse, the payment goes through on the bank's end but the order never shows up in WooCommerce. Checkout problems are the single most expensive bug a store can have, because every hour it's broken is an hour of lost sales. Here's how to track down the cause and get orders flowing again.
Symptom: What a Broken Checkout Looks Like
WooCommerce checkout failures rarely announce themselves clearly. You'll usually see one of these patterns:
- The "Place Order" button spins forever and never completes.
- Customers get a blank white page or a generic "error processing checkout" message.
- Payment succeeds at the gateway (Razorpay, PayU, Stripe, PayPal) but the order stays stuck in "Pending payment."
- The checkout page loads but the payment method options are missing entirely.
- Coupons or shipping calculations throw a JavaScript error and freeze the form.
Each of these points to a different layer — server, plugin conflict, gateway configuration, or caching — so the fix depends on nailing down which one you're actually dealing with.
Cause 1: A Caching or Optimization Plugin Is Interfering
This is the most common culprit, and it's the first thing to rule out. Cache and "speed" plugins (WP Rocket, LiteSpeed Cache, Autoptimize, W3 Total Cache) will happily minify or cache the checkout page's JavaScript, which breaks the AJAX calls WooCommerce relies on to calculate totals and submit orders.
Check whether your cache plugin is excluding the checkout, cart, and my-account pages. Most have a setting for this — in WP Rocket it's under Cache > Never Cache These Pages, and WooCommerce itself usually auto-detects popular cache plugins and sets sensible exclusions. If those exclusions got overwritten by a plugin update, checkout breaks silently.
Cart, checkout, and my-account pages should NEVER be page-cached or have their JS/CSS combined/minified.
Cause 2: A Plugin or Theme Conflict
Second most common cause. A recently updated theme or a new plugin (especially anything touching forms, popups, or "checkout customization") can throw a fatal JavaScript error that silently kills the checkout script before it ever submits.
Open the browser console (F12 → Console tab) on the checkout page and look for red errors. A message like Uncaught TypeError or jQuery is not defined almost always points to a script conflict, not a server problem.
To isolate it fast:
- Switch to a default theme like Storefront or Twenty Twenty-Four temporarily.
- If checkout works, the theme is the problem — check for outdated WooCommerce template overrides in the theme's
woocommerce/folder. - If it still fails, deactivate all plugins except WooCommerce and your payment gateway, then reactivate one at a time, testing checkout after each.
Cause 3: Payment Gateway Misconfiguration or SSL Problems
If the button submits but the payment step fails, the issue usually lives in the gateway settings, not WooCommerce itself:
- Test mode left on: gateways like Razorpay and PayU have separate test/live API keys. If the site is live but test keys are still in the plugin settings, real cards get rejected.
- Webhook URL not reachable: most gateways send a callback to your site to confirm payment. If your firewall, a security plugin, or a "block XML-RPC" rule is also blocking the gateway's callback URL, WooCommerce never hears back — the customer's money moves, but the order stays "Pending payment."
- Expired or mismatched SSL certificate: gateways refuse to redirect back to a checkout page serving an SSL warning. Confirm the padlock is green and AutoSSL hasn't lapsed in cPanel.
To check webhook delivery, log into your payment gateway's dashboard (Razorpay Dashboard → Webhooks, for example) and look at the delivery log. A string of failed deliveries with a timeout or 403 response confirms the server-side block.
Cause 4: PHP Errors or Resource Limits on the Server
WooCommerce is a heavier application than plain WordPress — checkout alone touches the cart session, tax calculation, shipping zones, and the payment gateway's API in one request. On tight shared hosting resources, that request can hit a PHP timeout or memory limit and simply die mid-checkout.
Turn on WooCommerce's built-in logging to see what's actually failing server-side:
WooCommerce > Status > Logs (in wp-admin)
Look for entries dated around the time of the failed order — "fatal error," "memory," or gateway API timeouts will show here.
If you see repeated memory exhaustion, bump the WordPress memory limit in wp-config.php:
define( 'WP_MEMORY_LIMIT', '256M' );
And check max_execution_time in your PHP configuration via MultiPHP INI Editor in cPanel — 30 seconds is often too tight for a checkout that's calling out to a payment API; 60-90 seconds gives it breathing room.
Cause 5: Stale Cart or Session Data
Sometimes the problem isn't the store at all — it's one customer's browser holding onto a broken session. This shows up as "it fails for me but works for my colleague." Ask the customer to:
- Clear cookies for your domain, or try an incognito/private window.
- Disable browser extensions (ad blockers frequently strip out payment gateway scripts).
- Try a different network — some corporate or campus firewalls block payment gateway domains outright.
On the store side, WooCommerce sessions live in the wp_woocommerce_sessions table. If that table has ballooned to tens of thousands of rows, stale sessions can start causing odd cart behavior. WooCommerce prunes expired sessions automatically via cron, so if WP-Cron isn't firing (a separate, common issue), this table just keeps growing.
Quick Diagnostic Table
| Symptom | Most Likely Cause | Where to Look First |
|---|---|---|
| Button spins, nothing happens | Cache/minify plugin, JS conflict | Browser console (F12) |
| Payment methods missing | Gateway plugin not configured or disabled | WooCommerce > Settings > Payments |
| Paid but order stuck "Pending" | Webhook blocked or SSL issue | Gateway dashboard webhook logs |
| Blank page / 500 error on submit | PHP memory or timeout | WooCommerce > Status > Logs |
| Works for some customers, not others | Browser extension or network block | Ask customer to try incognito |
Prevention: Keep Checkout From Breaking Again
A handful of habits save you the 2 a.m. "customers can't pay" ticket:
- Run a test transaction (a real ₹1 order, or your gateway's sandbox mode) after every plugin, theme, or WooCommerce core update.
- Keep a staging copy of the store for testing updates before they hit production — most cPanel accounts can host a staging subdomain for exactly this.
- Set up an uptime/transaction monitor that actually places a test order periodically, not just one that pings the homepage.
- Review WooCommerce > Status > Logs weekly, even when nothing seems wrong — silent failures show up there before customers complain.
- Keep WooCommerce, WordPress core, and your payment gateway plugin on the latest stable versions; gateway APIs change and old plugin versions quietly stop working.
If you've gone through all five causes and checkout is still failing, it's worth pulling the raw PHP error log (public_html/error_log in cPanel's File Manager) alongside the WooCommerce log — the two together almost always show the real failure point, whether that's a server limit or a plugin throwing a fatal error.
Frequently Asked Questions
Why does my WooCommerce order show "Pending payment" even though the customer was charged?
This almost always means the payment gateway's webhook/callback couldn't reach your site to confirm the transaction. Check the gateway's webhook delivery log for failed callbacks, then confirm your firewall or security plugin isn't blocking the gateway's IP range or the callback URL.
Does WooCommerce need a specific PHP version?
WooCommerce recommends PHP 7.4 or higher, and current versions run best on PHP 8.1+. You can switch versions per domain in cPanel's MultiPHP Manager — just test checkout right after switching, since some older extensions or custom gateway plugins may not support the newest PHP version yet.
Can a cache plugin really break checkout even if I never touched checkout settings?
Yes. A plugin update can silently reset page-exclusion settings back to defaults, which re-enables caching or JS minification on the cart and checkout pages. Always re-check cache exclusions after updating a caching plugin.
How do I test checkout without charging a real customer's card?
Every major gateway (Razorpay, PayU, Stripe, PayPal) offers a test/sandbox mode with dummy card numbers. Switch the gateway plugin to test mode, place a full order end-to-end, then switch back to live mode once confirmed.
Should I disable all plugins to troubleshoot checkout on a live store?
Not on production during business hours — do it on a staging copy of the site, or schedule a short maintenance window. Deactivating plugins one at a time on a live store risks breaking something else for real customers while you're testing.
