The silent revenue killer
Your WooCommerce store can be online, your homepage can load perfectly, your product pages can look beautiful — and your checkout can be completely broken. Orders are not going through. Customers are clicking "Place Order" and getting errors, timeouts, or blank screens. Some try once and leave. Most do not try at all.
The Baymard Institute puts the average cart abandonment rate at 70%. That is under normal conditions, when checkout works. When checkout is broken, your abandonment rate hits 100%. Every single customer who was ready to pay you money walks away. And the worst part is that your server is returning a 200 OK status code the entire time, so your uptime monitor says everything is fine.
Checkout failures are not always visible. Sometimes the page loads but the payment form does not render. Sometimes the "Place Order" button is there but clicking it does nothing. Sometimes the customer gets a cryptic error they do not understand. In every case, you are losing money, and you probably have no idea it is happening.
Here is every major cause of WooCommerce checkout failures, how to fix each one, and how to set up monitoring that catches checkout problems before your customers give up.
1. Payment gateway timeout
The customer clicks "Place Order." WooCommerce sends an Ajax request to your server. Your server sends the payment details to your gateway — Stripe, PayPal, Authorize.net, or whichever you use. And then it waits.
If the gateway takes too long to respond — because of an outage on their end, network latency, or high load — your server hits its PHP max_execution_timelimit and kills the request. The customer sees a spinning indicator that never resolves, or a generic "An error has occurred" message. The payment may or may not have actually been charged. The order is not created in WooCommerce.
How to fix it: Check your payment gateway's status page for outages. Log into your gateway dashboard and look for pending or failed charges. Increase your PHP max_execution_time to at least 300 seconds in php.ini or .htaccess. If you are on shared hosting with a 30-second limit you cannot change, contact your host or upgrade to a plan with higher limits. Consider adding a secondary payment method — if Stripe is having issues, PayPal can still process orders.
2. SSL mismatch on checkout
WooCommerce requires SSL on the checkout page. If your SSL certificate is misconfigured — covering www.yourstore.com but not yourstore.com, or expired, or using a mixed content configuration where some resources load over HTTP — the checkout page can break in ways that are not immediately obvious.
The payment form might not render because the payment gateway's JavaScript refuses to load on an insecure page. The customer might see a browser warning that scares them away. Or the Ajax request that processes the order might fail silently because the browser blocks the mixed-content request.
How to fix it: Check your SSL certificate covers both www and non-www versions of your domain. Ensure your WordPress Address and Site Address in Settings > General both use https://. Enable the "Force secure checkout" option in WooCommerce > Settings > Advanced. Use your browser's developer tools to check for mixed content warnings on the checkout page. If you use Cloudflare, make sure SSL mode is set to "Full (strict)" — not "Flexible," which can cause redirect loops and mixed content issues.
3. Ajax errors breaking checkout
WooCommerce's checkout process is heavily dependent on Ajax — asynchronous JavaScript requests that update the order review, apply coupons, validate fields, and submit the order without a full page reload. If any of these Ajax requests fail, the checkout breaks.
Common causes: a plugin enqueues a JavaScript file with an error that breaks all subsequent scripts on the page. A theme overrides WooCommerce's checkout template but does so incorrectly. A security plugin blocks Ajax requests to admin-ajax.php or the WooCommerce REST API. A CDN or caching plugin serves a stale version of the JavaScript files.
How to fix it: Open your browser developer tools (F12), go to the Console tab, and reload the checkout page. Look for red JavaScript errors. Then go to the Network tab, attempt to place an order, and look for failed requests — anything with a red status. If you see a 403 on admin-ajax.php, your security plugin is blocking it. If you see a JavaScript error from a specific plugin, deactivate that plugin and test again. If the error is in a theme file, switch to a default theme temporarily to confirm.
4. Plugin conflicts breaking checkout
This is the most common cause and the hardest to diagnose. WooCommerce checkout involves multiple plugins working together: WooCommerce core, your payment gateway plugin, shipping plugins, tax plugins, coupon plugins, and often a page builder or theme that customises the checkout layout. A conflict between any two of these can break checkout.
A shipping plugin calculates rates and returns an unexpected value. A coupon plugin modifies the order total at the wrong hook. A page builder overrides the checkout template and strips out a hidden field that WooCommerce needs. A recently updated plugin changes a function signature that another plugin depends on.
How to fix it: Deactivate all plugins except WooCommerce and your payment gateway. Test checkout. If it works, reactivate plugins one at a time, testing checkout after each one. When checkout breaks, you have found the conflict. Check the WooCommerce plugin page for known conflicts and compatibility notes. Update all plugins to their latest versions. If two plugins conflict, contact both developers — one of them needs to fix the compatibility issue.
5. Caching serving a stale or broken cart
Page caching is essential for WordPress performance. But caching the checkout page is a guaranteed way to break your store. When a caching plugin serves a cached version of the checkout page, every customer sees the same page — with someone else's cart contents, an expired nonce token, or an empty order form.
The customer clicks "Place Order" and gets "Sorry, your session has expired." Or they see items in their cart that they did not add. Or the checkout page shows a total of zero because the cached version had an empty cart. Some caching plugins are smart enough to exclude WooCommerce pages automatically. Others are not.
How to fix it: In your caching plugin settings, exclude these URLs from caching: /checkout/*, /cart/*, /my-account/*, and any page that uses the [woocommerce_checkout] or [woocommerce_cart]shortcodes. Also exclude pages for logged-in users entirely if your caching plugin supports it. If you use a CDN like Cloudflare, create a page rule that sets Cache Level to "Bypass" for your checkout and cart URLs. After changing settings, purge the entire cache and test.
6. PHP fatal error on the checkout page only
Here is the scenario that catches most store owners off guard. Your homepage loads. Your product pages load. Your blog loads. Only the checkout page crashes — because the checkout page loads plugins and WooCommerce functions that other pages do not. A payment gateway plugin with a PHP error, a checkout field editor with a bug, or a shipping calculator that crashes on specific cart contents can all produce a fatal error that only appears on checkout.
Your uptime monitor checks your homepage, sees a 200 response, and reports everything as healthy. Meanwhile, every customer who tries to buy something sees a white screen or a critical error on the checkout page specifically.
How to fix it: Enable WP_DEBUG_LOG in wp-config.php and visit the checkout page. Check /wp-content/debug.log for the exact error, file, and line number. The fix depends on the cause — deactivate the offending plugin, increase the PHP memory limit, or contact the plugin developer. But the real lesson is that you need to monitor the checkout page itself, not just your homepage.
Why standard uptime monitoring cannot protect your checkout
Standard uptime monitoring has two blind spots when it comes to WooCommerce checkout.
Blind spot one: it checks the wrong page. Most monitoring setups check the homepage. The homepage uses completely different code paths than the checkout page. WooCommerce, your payment gateway, shipping calculators, and checkout field plugins only load on the checkout page. A problem that only affects checkout is invisible to a homepage monitor.
Blind spot two: it checks the wrong thing.Even if you point your monitor at the checkout URL, a standard HTTP check only verifies that the server returned a 200 status code. A checkout page that loads but shows "There was an error processing your order" still returns 200. A checkout page where the payment form did not render still returns 200. A checkout page with a JavaScript error that prevents the Place Order button from working still returns 200.
You need monitoring that checks what the checkout page actually contains.
How to monitor your WooCommerce checkout with Uptrue
Uptrue's keyword monitoringchecks the actual content of your checkout page. If the "Place Order" button disappears, if an error message appears, or if the page content changes unexpectedly, you know about it before your next customer tries to check out.
Step 1: Set up a keyword monitor to verify the checkout page works
- Sign up at uptrue.io/signup (free plan available)
- Click Add Monitor from your dashboard
- Select Keyword as the monitor type
- Enter your checkout page URL — typically
yourstore.com/checkout/ - Set the keyword to "Place order"
- Set the check type to "Page must contain"
- Set the check interval to 1 minute
- Configure alerts — Slack, email, or Microsoft Teams
If the "Place Order" button is not on the page — because of a PHP crash, a JavaScript error that prevents rendering, or a plugin conflict that strips the checkout form — Uptrue detects it and alerts you immediately.
Step 2: Add a negative keyword monitor to detect error messages
- Click Add Monitor again
- Select Keyword as the monitor type
- Enter your checkout page URL
- Set the keyword to "error"
- Set the check type to "Page must NOT contain"
- Set the interval to 1 minute
This catches any error message that appears on the checkout page — "An error has occurred," "There has been a critical error," "Your session has expired," or any other message containing the word "error." A healthy checkout page should never show the word "error" to customers.
Step 3: Add an HTTP monitor for checkout page availability
- Add an HTTP/HTTPS monitor for your checkout URL
- Set expected status to 200
- Set check interval to 1 minute
This catches outright crashes where the checkout page returns a 500, 502, or 503 error. Between the keyword monitors and the HTTP monitor, you are covering both content-level and server-level failures.
Step 4: Monitor your cart page and order confirmation page
Checkout is not the only critical page. Set up additional keyword monitors for:
- Cart page — verify it contains "Proceed to checkout"
- Order confirmation page — verify it contains "Order received" or "Thank you"
- My Account page — verify login and order history work
- Any landing page receiving paid traffic
Step 5: Configure alerts that reach you immediately
A broken checkout page is costing you money every minute. Configure your alerts to go where you will see them within minutes, not hours:
- Slack — instant notification in a dedicated channel
- Microsoft Teams — same idea, different platform
- Email — fine as a backup, but not fast enough for revenue-critical pages
- Webhook — pipe alerts into PagerDuty, Opsgenie, or your own incident management system
Check your WooCommerce store health right now
Instant health score across uptime, SSL, DNS, security headers, and performance. See your vulnerabilities before they cost you sales.
Check Your Website ScorePreventing WooCommerce checkout failures
Monitoring catches the problem fast. But these habits reduce the chances of checkout breaking in the first place.
Test checkout after every plugin update
Every time you update WooCommerce, your payment gateway plugin, or any plugin that touches checkout, place a test order. Use Stripe's test mode or your gateway's sandbox environment. Do not assume the update is safe because it worked on someone else's site — your combination of plugins is unique.
Use a staging environment
Test every update on staging before applying it to production. Most managed WordPress hosts offer one-click staging. Update all plugins on staging, test checkout, verify orders go through, and only then update production. This one habit prevents the majority of checkout failures.
Exclude checkout pages from caching
Verify that your caching plugin, CDN, and any server-level caching all exclude /checkout/, /cart/, and /my-account/. Check this every time you change caching settings. Some caching plugins reset exclusions on update.
Keep a secondary payment method active
If your primary gateway goes down, customers can still pay via a backup. Stripe as primary and PayPal as secondary is a common setup. The few minutes it takes to configure a second gateway can save you thousands in lost revenue during an outage.
Monitor your payment gateway's status
Subscribe to status updates from your payment gateway. Stripe, PayPal, and most major gateways have status pages with email and RSS notifications. If they are having an incident, you know before your checkout starts failing.
Stop losing sales to a broken checkout
Your WooCommerce checkout could be broken right now and you would not know. Your uptime monitor says the site is up. Your homepage loads fine. But on the checkout page — the one page that actually makes you money — customers are seeing errors, timeouts, and blank forms. They leave. They do not come back. They do not email you to report the problem.
Uptrue checks your checkout page every 60 seconds. If the "Place Order" button disappears, if an error message appears, if the page stops loading — you know in under a minute. Before the next customer gives up. Before you lose another sale. Before a checkout bug costs you a day of revenue.
Protect your WooCommerce revenue
Free plan available. Keyword monitoring that watches your checkout page for errors. Alerts via Slack, Teams, email, and webhook. No credit card required.
Frequently asked questions
Why is my WooCommerce checkout page not loading?
The most common causes are a plugin conflict breaking the checkout JavaScript, a caching plugin serving a stale or empty cart page, or a PHP fatal error in WooCommerce or an extension. Check your browser console for JavaScript errors, disable caching temporarily, and enable WP_DEBUG_LOG to see any PHP errors. If the checkout page loads for logged-out users but not logged-in users, a session or cookie conflict is likely the cause.
Can uptime monitoring detect WooCommerce checkout failures?
Standard HTTP uptime monitoring only checks whether the page returns a 200 status code. A broken checkout page can still return 200 while showing an error message or a blank form instead of the Place Order button. Keyword monitoring is the reliable solution: it checks that the checkout page contains expected content like "Place Order" and does not contain error messages. If the button disappears or an error appears, you are alerted immediately.
Why does my WooCommerce checkout spin forever when I click Place Order?
The spinning indicator means WooCommerce sent an Ajax request to process the order but never received a response. This is almost always a payment gateway timeout — your server sent the payment request to Stripe, PayPal, or your gateway, and the gateway took too long to respond, or your server timed out before the response arrived. Check your PHP max_execution_time setting and your gateway dashboard for failed or pending charges. Also check for JavaScript errors in the browser console that might be preventing the Ajax request from completing.
How do I fix the "Sorry, your session has expired" error on WooCommerce checkout?
This error means the WordPress nonce token has expired before the customer submitted the form. It is caused by aggressive page caching that serves a stale checkout page with an old nonce, by the customer leaving the page open too long before completing the order, or by a plugin that interferes with nonce generation. Exclude the checkout page, cart page, and my-account page from all caching. If you use a CDN, ensure those pages are excluded from the CDN cache as well.