You’ve set up your WooCommerce store. Products are uploaded. Payments are configured. Everything looks fine. Then the first customer tries to check out… and nothing works.
The cart is empty. The payment button does nothing. The order gets stuck on “pending payment” forever. Or worse, customers are charged but the order never registers.
If you run a WooCommerce store long enough, you will encounter these bugs. The good news? Most have known fixes. This article covers the most common checkout failures, why they happen, and exactly how to resolve them, from quick user-level fixes to deep debugging for developers.
Customer adds products to cart. Clicks “Checkout.” The checkout pageStatic content (e.g., "About Us," "Contact") not part of chr... More loads… with an empty cart. The customer leaves. You lose a sale.

Why it happens:
This is almost always a session or caching issue. WooCommerce uses PHP sessions (or sometimes WordPress transients) to store cart data. If something clears or blocks that session between the cart pageStatic content (e.g., "About Us," "Contact") not part of chr... More and checkout, the cart appears empty.
Common causes:
How to fix it:
Step 1: Exclude WooCommerce pages from caching
If using a caching pluginSoftware that adds specific features or functionality to a W... More (WP Rocket, W3 Total Cache, LiteSpeed Cache, etc.), exclude:
Example for WP Rocket: Add these to “Never Cache URLs”:
/checkout/ /cart/ /my-account/
Step 2: Check your hosting-level cache
Many hosts (Kinsta, WP Engine, Cloudways) have their own caching. Whitelist the same WooCommerce pages in your host’s cache settings.
Step 3: Test with caching disabled
Temporarily disable all caching plugins and any CDN. Clear your browser cache. Test again. If it works, re-enable caching one layer at a time.
Step 4: Fix mixed content
If your site loads over HTTPS but some resources over HTTP, the session cookie might not persist. Use a pluginSoftware that adds specific features or functionality to a W... More like “Really Simple SSL” or add to wp-config.php:
$_SERVER['HTTPS'] = 'on';
Step 5: Force cart to persist (developer fix)
Add to functions.php as a temporary workaround:
add_action( 'init', 'wc_force_cart_persistence' );
function wc_force_cart_persistence() {
if ( function_exists( 'WC' ) && is_null( WC()->session ) ) {
WC()->session = new WC_Session_Handler();
WC()->session->init();
}
}Customer completes payment. Money leaves their account. But in WooCommerce, the order stays on “Pending payment” forever. No confirmation email. No order in your dashboardThe dashboard, or admin panel, is the backend interface wher... More.
Why it happens:
The payment gateway sent the successful transaction to WooCommerce, but WooCommerce never received or processed the callback (webhook/IPN). Common causes:
http:// but webhook sent to https://)How to fix it:
Step 1: Manually check the payment gateway’s transaction log
Log into Stripe, PayPal, or your gateway’s dashboardThe dashboard, or admin panel, is the backend interface wher... More. Find the transaction. Does it show “Completed” or “Pending”? If it’s completed on their end but not yours, the webhook failed.
Step 2: Verify webhook URLs
For Stripe: DashboardThe dashboard, or admin panel, is the backend interface wher... More → Developers → Webhooks. Ensure the endpoint is https://yoursite.com/wc-api/stripe/ (or similar for your gateway).
For PayPal: IPN URL should be https://yoursite.com/wc-api/paypal/.
Step 3: Check security plugins
Wordfence, Sucuri, and other firewalls sometimes block webhook IPs. Whitelist the gateway’s IP addresses. Temporarily disable the firewall to test.
Step 4: Manually complete the order
If you confirmed payment outside WooCommerce, you can manually mark the order as “Completed” or “Processing” from the WooCommerce → Orders screen. Then email the customer manually.
Step 5: Resend failed webhooks (Stripe)
Stripe allows you to resend failed webhook events from the dashboardThe dashboard, or admin panel, is the backend interface wher... More. Look for “Failed” events and click “Resend.”
Step 6: Debug logging
Add to wp-config.php to log all WooCommerce errors:
php
define( 'WC_LOG_DIR', WP_CONTENT_DIR . '/wc-logs/' );
Then check wp-content/wc-logs/ for fatal-errors.log or gateway-specific logs.
Customer clicks “Place Order” or the PayPal/Stripe button. The button spins, or nothing happens. No error message. No redirect.
Why it happens:
JavaScriptA programming language used to create interactive elements o... More conflict, browser console error, or AJAX failure. Most common: a pluginSoftware that adds specific features or functionality to a W... More or themeTheme A collection of files that determine a site's design, ... More script is breaking the checkout JavaScriptA programming language used to create interactive elements o... More.
How to fix it:
Step 1: Open browser console
Press F12 → Console tab. Look for red errors. Common ones:
Uncaught ReferenceError: jQuery is not definedUncaught TypeError: Cannot read property 'xxx' of undefinedFailed to load resource (blocked scripts)Step 2: Check for JavaScriptA programming language used to create interactive elements o... More conflicts
Temporarily switch to a default themeTheme A collection of files that determine a site's design, ... More (Storefront, Twenty Twenty-Four). Test checkout. If it works, your themeTheme A collection of files that determine a site's design, ... More is the problem.
If still broken, deactivate all plugins except WooCommerce and your payment gateway. Test. Reactivate one by one.
Step 3: Fix common jQuery issues
WooCommerce requires jQuery. If your themeTheme A collection of files that determine a site's design, ... More calls jQuery incorrectly, add:
function ensure_jquery_on_checkout() {
if ( is_checkout() ) {
wp_enqueue_script( 'jquery' );
}
}
add_action( 'wp_enqueue_scripts', 'ensure_jquery_on_checkout' );Step 4: Check for missing payment gateway scripts
Some gateways require additional scripts on the checkout pageStatic content (e.g., "About Us," "Contact") not part of chr... More. Ensure your themeTheme A collection of files that determine a site's design, ... More calls wp_head() and wp_footer() in header.php and footer.php.
Step 5: Enable checkout debug mode
In WooCommerce → Settings → Payments → [Your Gateway] → Enable “Debug Mode” (log errors). Then check wp-content/uploads/wc-logs/.
Customer clicks “Checkout” and sees a white screen or a loading spinner that never ends.

Why it happens:
PHP fatal error, memory exhaustion, or infinite loop in a hookHook A point in WordPress code where developers can "hook" c... More. Often caused by a pluginSoftware that adds specific features or functionality to a W... More trying to modify checkout fields incorrectly.
How to fix it:
Step 1: Enable WP_DEBUG
Add to wp-config.php:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
Then check wp-content/debug.log for fatal errors.
Step 2: Increase memory limit
Add to wp-config.php:
define( 'WP_MEMORY_LIMIT', '256M' ); define( 'WP_MAX_MEMORY_LIMIT', '512M' );
Step 3: Check for infinite redirects
Sometimes a pluginSoftware that adds specific features or functionality to a W... More or custom code creates a loop between cart and checkout. Check your .htaccess file for odd rewrite rules. Temporarily rename .htaccess to .htaccess_old and test.
Step 4: Validate checkout field overrides
If you have custom code modifying checkout fields, commentUser feedback or discussion attached to a post or page, mana... More it out temporarily. Look for functions hooked to woocommerce_checkout_fields.
Customer clicks “Add to Cart” on a product pageStatic content (e.g., "About Us," "Contact") not part of chr... More. The button spins, but the cart counter doesn’t update. The pageStatic content (e.g., "About Us," "Contact") not part of chr... More reloads. Or nothing happens.
Why it happens:
AJAX conflict, missing wc-ajax endpoint, or caching.
How to fix it:
Step 1: Verify AJAX URL
View pageStatic content (e.g., "About Us," "Contact") not part of chr... More source. Search for wc_ajax_url. It should point to /?wc-ajax=%%endpoint%%. If it’s wrong, check your permalinks (Settings → Permalinks → Save Changes. No edits needed, just resave).
Step 2: Exclude AJAX endpoints from cache
Add wc-ajax to your caching plugin’s “Never Cache” list.
Step 3: Check for corrupted .htaccess
Resave permalinks (Settings → Permalinks → Save Changes). This regenerates .htaccess rules.
Step 4: Manual add to cart test
Visit https://yoursite.com/?add-to-cart=123 (replace 123 with a real product ID). If that works but AJAX doesn’t, the problem is JavaScriptA programming language used to create interactive elements o... More.
Customer logs in, adds items to cart, logs out, logs back in: cart is empty. Or cart empties randomly between pageStatic content (e.g., "About Us," "Contact") not part of chr... More loads.
Why it happens:
Session handler issues, databaseWhere all WordPress content, settings, and user data are sto... More table corruption, or cookie problems.
How to fix it:
Step 1: Repair WooCommerce session tables
In phpMyAdmin or similar, run:
sql
REPAIR TABLE wp_woocommerce_sessions; OPTIMIZE TABLE wp_woocommerce_sessions;
Step 2: Clear all sessions (caution: logs out all customers)
From WP CLI:
bash
wp wc tool run clear_sessions
Or use a pluginSoftware that adds specific features or functionality to a W... More like “WooCommerce DatabaseWhere all WordPress content, settings, and user data are sto... More Cleanup.”
Step 3: Check cookie settings
In WooCommerce → Settings → Advanced → PageStatic content (e.g., "About Us," "Contact") not part of chr... More setup, ensure Cart and Checkout pages are correctly assigned.
Step 4: Force session handling
Add to functions.php:
php
add_action( 'init', 'wc_force_session_start' );
function wc_force_session_start() {
if ( function_exists( 'WC' ) && ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
}WooCommerce now offers two checkout experiences:
[woocommerce_checkout])Which one breaks less?
Currently, the shortcodeA small code snippet ([example]) that simplifies adding dyna... More checkout is more stable, but the block checkout is catching up.
If block checkout is broken:
Option 1: Roll back to shortcodeA small code snippet ([example]) that simplifies adding dyna... More checkout
[woocommerce_checkout]Option 2: Fix block checkout issues
woocommerce/checkout block)Known block checkout bugs (as of 2026):
Recommendation: Use shortcodeA small code snippet ([example]) that simplifies adding dyna... More checkout for production stores until the block checkout matures.
When a checkout bug appears, use these tools before calling for help:
| Tool | What it does |
|---|---|
| WooCommerce Status Report | WooCommerce → Status → System Status. Copy and paste into support requests. |
| WP_DEBUG_LOG | Captures PHP errors. Essential for white screens. |
| Browser Console (F12) | Shows JavaScriptA programming language used to create interactive elements o... More errors breaking checkout. |
| Health Check & Troubleshooting | PluginSoftware that adds specific features or functionality to a W... More that lets you disable plugins/theme only for your session. |
| WooCommerce Logs | WooCommerce → Status → Logs. Look for fatal-errors, stripe, paypal, etc. |
| Staging site | Clone your live site to test fixes without downtime. |
Quick debug workflow:
WP_DEBUG_LOGdebug.log and WooCommerce logsMost checkout bugs are preventable. Follow these rules:
Rule 1: Never cache cart, checkout, or my account pages
Use your caching plugin’s exclusion settings religiously.
Rule 2: Keep everything updated
WooCommerce coreCore The foundational files and code of WordPress itself, ma... More, payment gateway plugins, WordPress, and your themeTheme A collection of files that determine a site's design, ... More. Old code = old bugs.
Rule 3: Test payment gateways regularly
Run a $1 test transaction once a week. You’ll catch webhook failures early.
Rule 4: Use a staging site
Never update WooCommerce or change checkout logic on your live site first.
Rule 5: Limit checkout customization
Every custom field or JavaScriptA programming language used to create interactive elements o... More snippet is a potential break point. Use hooks, not coreCore The foundational files and code of WordPress itself, ma... More file edits.
Rule 6: Monitor failed webhooks
Stripe and PayPal dashboards show failed webhook attempts. Check them weekly.
Rule 7: Choose reliable hosting
Cheap hosting with aggressive caching and low PHP limits will break WooCommerce. Use managed WordPress hosting if possible.
WooCommerce checkout bugs are frustrating, for you and for customers who just want to give you money. But almost every bug has a known fix. The key is systematic debugging: check caching first, then JavaScriptA programming language used to create interactive elements o... More conflicts, then webhooks, then databaseWhere all WordPress content, settings, and user data are sto... More issues.
When a customer reports a checkout bug, ask them:
And remember: Before touching anything on a live store, take a backupA copy of your WordPress site's files and database, saved to... More. Clone to staging if possible. And always test after every change.
Your checkout is your revenue pipeline. Keep it clean, keep it tested, and keep it monitored.