
Introduction
WooCommerce load testing is essential if you want your online store to stay fast and reliable during traffic spikes, seasonal promotions, product launches, and holiday sales. A slow product page, an unresponsive cart, or a failed checkout can directly reduce revenue and damage customer trust. Because WooCommerce runs on top of WordPress, store performance depends on more than just PHP execution time—it also involves database queries, caching behavior, plugins, themes, payment integrations, and third-party APIs.
In this guide, you’ll learn how to load test WooCommerce with LoadForge using realistic Locust scripts that simulate actual shopper behavior. We’ll cover product browsing, add-to-cart flows, logged-in customer sessions, and checkout-related scenarios so you can identify bottlenecks before they affect real users.
LoadForge makes this especially practical by combining Locust scripting with cloud-based infrastructure, distributed testing, real-time reporting, global test locations, and CI/CD integration. That means you can test your WooCommerce store from multiple regions and validate performance continuously as your catalog, plugins, and traffic grow.
Prerequisites
Before you begin load testing WooCommerce, make sure you have the following:
- A WooCommerce store running in a staging or pre-production environment
- Permission to test the environment at load
- A list of important store URLs and workflows, such as:
- Homepage
- Category pages
- Product pages
- Cart
- Checkout
- My Account
- WooCommerce AJAX endpoints
- Store API or REST API endpoints if applicable
- Test products already created in WooCommerce
- At least one test customer account
- A payment gateway configured for safe testing, such as:
- Stripe test mode
- WooCommerce Cash on Delivery
- WooCommerce Check Payments
- Knowledge of any caching, CDN, WAF, or bot protection layers in front of the site
- A LoadForge account
It also helps to know whether your WooCommerce store uses:
- Full-page caching for anonymous traffic
- Redis or object caching
- Search plugins like ElasticPress
- Dynamic pricing or inventory plugins
- Custom themes or builders
- Headless storefronts calling WooCommerce APIs
These factors can significantly affect performance testing results.
Understanding WooCommerce Under Load
WooCommerce performance can degrade in different ways depending on the user journey being tested. Anonymous browsing often benefits from page caching, but cart and checkout flows are dynamic and usually bypass cache layers. That means your store might look fast in synthetic page speed tools while still failing under real transactional load.
Common WooCommerce bottlenecks
Database-heavy product and catalog queries
WooCommerce relies heavily on WordPress post tables, post meta, taxonomy tables, and order-related records. Product filters, sorting, related products, and inventory checks can create expensive queries under concurrency.
Admin AJAX and cart fragment requests
Many WooCommerce themes and plugins use AJAX requests like /wp-admin/admin-ajax.php or cart fragment refreshes to update mini carts and dynamic UI elements. These requests are often uncached and can become a major source of load.
Session and cart handling
WooCommerce tracks customer sessions and cart contents, which creates more work than serving cached product pages. High volumes of add-to-cart and cart update requests can expose issues with PHP workers, session storage, and database writes.
Checkout and order creation
Checkout is one of the most resource-intensive parts of a WooCommerce store. It may involve:
- Customer validation
- Shipping calculations
- Tax calculations
- Coupon validation
- Payment gateway calls
- Inventory updates
- Order creation emails
- Webhook triggers
Plugin and theme overhead
A WooCommerce store with many plugins may perform well at low traffic but fail under load because each request triggers extra hooks, queries, or external calls.
What to test
A strong WooCommerce load testing strategy should include:
- Anonymous browsing load testing
- Product page performance testing
- Add-to-cart and cart update stress testing
- Checkout reliability testing
- Logged-in user performance testing
- API performance testing for headless or integrated storefronts
- Spike testing for sales events
- Soak testing for sustained traffic
Writing Your First Load Test
Your first WooCommerce load test should simulate a basic shopper browsing the storefront. This gives you a baseline for homepage, category, and product performance before you add cart and checkout complexity.
Basic WooCommerce browsing test
from locust import HttpUser, task, between
class WooCommerceBrowserUser(HttpUser):
wait_time = between(2, 5)
@task(3)
def view_homepage(self):
self.client.get("/", name="GET /")
@task(2)
def view_category(self):
self.client.get("/product-category/clothing/", name="GET /product-category/clothing/")
@task(4)
def view_product(self):
self.client.get("/product/hoodie-with-logo/", name="GET /product/hoodie-with-logo/")
@task(1)
def search_products(self):
self.client.get("/?s=hoodie&post_type=product", name="GET /?s=search&post_type=product")What this test does
This script simulates anonymous users who:
- Visit the homepage
- Browse a product category
- Open a product page
- Search for products
This is a good starting point for performance testing WooCommerce because it helps establish:
- Time to serve cached and uncached pages
- Category page query performance
- Product page rendering speed
- Search response time
If your store uses page caching, these pages may look healthy even at high concurrency. That’s useful, but it doesn’t tell the whole story. WooCommerce stress testing should always move beyond browsing and include transactional flows.
Running this in LoadForge
In LoadForge, paste the script into your test, configure user count and spawn rate, and run it from one or more global test locations. Start with something like:
- 25 users
- Spawn rate of 5 users per second
- 5 to 10 minutes duration
Then increase to larger test sizes to see where response times begin to rise.
Advanced Load Testing Scenarios
To properly load test WooCommerce, you need to simulate realistic customer actions. The following scenarios cover common high-impact workflows.
Scenario 1: Add to cart with WooCommerce AJAX
Many WooCommerce stores use AJAX add-to-cart behavior on archive or product pages. This is more realistic than only loading product URLs because it exercises session handling and cart updates.
from locust import HttpUser, task, between
class WooCommerceCartUser(HttpUser):
wait_time = between(1, 3)
def on_start(self):
self.client.get("/", name="GET /")
self.client.get("/product/beanie/", name="GET /product/beanie/")
@task
def add_product_to_cart(self):
headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
payload = {
"product_sku": "",
"product_id": "15",
"quantity": "1"
}
with self.client.post(
"/?wc-ajax=add_to_cart",
data=payload,
headers=headers,
name="POST /?wc-ajax=add_to_cart",
catch_response=True
) as response:
if response.status_code == 200 and '"error":false' in response.text:
response.success()
else:
response.failure(f"Add to cart failed: {response.text}")
@task(2)
def view_cart(self):
self.client.get("/cart/", name="GET /cart/")
@task(1)
def refresh_cart_fragments(self):
headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
self.client.post(
"/?wc-ajax=get_refreshed_fragments",
data={},
headers=headers,
name="POST /?wc-ajax=get_refreshed_fragments"
)Why this matters
This script targets one of the most important WooCommerce performance testing paths:
- AJAX add-to-cart
- Cart session creation
- Mini-cart fragment refresh
- Cart page rendering
These requests are often uncached and can put significant pressure on PHP workers, database connections, and object cache layers. If your store slows down under load, this is often where the problem starts.
Scenario 2: Logged-in customer flow with account authentication
Many stores have repeat customers who log in, view account pages, and shop while authenticated. Logged-in traffic is usually less cache-friendly and can expose performance issues hidden from anonymous users.
WooCommerce login typically uses the My Account page form and WordPress session cookies.
from locust import HttpUser, task, between
from bs4 import BeautifulSoup
class WooCommerceLoggedInUser(HttpUser):
wait_time = between(2, 4)
username = "testcustomer@example.com"
password = "TestPassword123!"
def on_start(self):
self.login()
def login(self):
login_page = self.client.get("/my-account/", name="GET /my-account/")
soup = BeautifulSoup(login_page.text, "html.parser")
csrf_token = ""
nonce_input = soup.find("input", {"name": "woocommerce-login-nonce"})
if nonce_input:
csrf_token = nonce_input.get("value", "")
payload = {
"username": self.username,
"password": self.password,
"woocommerce-login-nonce": csrf_token,
"_wp_http_referer": "/my-account/",
"login": "Log in"
}
with self.client.post(
"/my-account/",
data=payload,
name="POST /my-account/ login",
catch_response=True
) as response:
if response.status_code in [200, 302]:
response.success()
else:
response.failure("Login failed")
@task(2)
def view_account_dashboard(self):
self.client.get("/my-account/", name="GET /my-account/ dashboard")
@task(2)
def view_orders(self):
self.client.get("/my-account/orders/", name="GET /my-account/orders/")
@task(3)
def browse_product(self):
self.client.get("/product/belt/", name="GET /product/belt/")
@task(1)
def add_to_cart(self):
headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
payload = {
"product_sku": "",
"product_id": "22",
"quantity": "1"
}
self.client.post(
"/?wc-ajax=add_to_cart",
data=payload,
headers=headers,
name="POST /?wc-ajax=add_to_cart (logged-in)"
)Notes on this script
This example uses BeautifulSoup to extract the WooCommerce login nonce from /my-account/. That’s important because many WooCommerce login forms include nonce-based validation and realistic load tests should follow the actual authentication pattern.
This scenario helps you test:
- Authenticated session handling
- My Account page performance
- Order history queries
- Logged-in browsing and cart activity
If your store has membership plugins, subscriptions, B2B pricing, or customer-specific discounts, logged-in performance testing becomes even more important.
Scenario 3: Checkout flow using WooCommerce AJAX checkout endpoint
Checkout is where performance testing matters most for revenue. A realistic WooCommerce checkout load test should simulate billing details, shipping data, and order submission.
This example uses the standard WooCommerce AJAX checkout endpoint. For safety, use a staging environment and a non-live payment method like Cash on Delivery or Check Payments.
from locust import HttpUser, task, between
from bs4 import BeautifulSoup
class WooCommerceCheckoutUser(HttpUser):
wait_time = between(3, 6)
def on_start(self):
self.add_item_to_cart()
def add_item_to_cart(self):
headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
payload = {
"product_sku": "",
"product_id": "33",
"quantity": "1"
}
self.client.post(
"/?wc-ajax=add_to_cart",
data=payload,
headers=headers,
name="POST /?wc-ajax=add_to_cart"
)
@task
def complete_checkout(self):
checkout_page = self.client.get("/checkout/", name="GET /checkout/")
soup = BeautifulSoup(checkout_page.text, "html.parser")
nonce = ""
nonce_input = soup.find("input", {"name": "woocommerce-process-checkout-nonce"})
if nonce_input:
nonce = nonce_input.get("value", "")
headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
payload = {
"billing_first_name": "Jane",
"billing_last_name": "Doe",
"billing_company": "",
"billing_country": "US",
"billing_address_1": "123 Test Street",
"billing_address_2": "",
"billing_city": "Austin",
"billing_state": "TX",
"billing_postcode": "78701",
"billing_phone": "5125550101",
"billing_email": "jane.doe@example.com",
"shipping_first_name": "Jane",
"shipping_last_name": "Doe",
"shipping_company": "",
"shipping_country": "US",
"shipping_address_1": "123 Test Street",
"shipping_address_2": "",
"shipping_city": "Austin",
"shipping_state": "TX",
"shipping_postcode": "78701",
"order_comments": "",
"payment_method": "cod",
"shipping_method[0]": "flat_rate:1",
"terms": "on",
"terms-field": "1",
"woocommerce-process-checkout-nonce": nonce,
"_wp_http_referer": "/?wc-ajax=update_order_review"
}
with self.client.post(
"/?wc-ajax=checkout",
data=payload,
headers=headers,
name="POST /?wc-ajax=checkout",
catch_response=True
) as response:
if response.status_code == 200 and '"result":"success"' in response.text:
response.success()
else:
response.failure(f"Checkout failed: {response.text}")What this checkout test validates
This script is useful for WooCommerce stress testing because it covers:
- Cart-to-checkout transition
- Checkout page rendering
- Nonce generation and validation
- Shipping and billing form processing
- Order creation
- Payment method handling
- AJAX checkout response times
If checkout latency increases sharply under load, you may have issues with:
- Slow database writes
- Payment plugin overhead
- Shipping/tax calculation plugins
- Email or webhook processing
- Insufficient PHP workers
- Locked sessions or object cache contention
Scenario 4: WooCommerce Store API testing for headless or block-based stores
Modern WooCommerce setups may use the Store API, especially with block-based carts and checkouts or headless frontends. If your storefront relies on these endpoints, they should be part of your load testing plan.
from locust import HttpUser, task, between
class WooCommerceStoreApiUser(HttpUser):
wait_time = between(1, 3)
@task(2)
def list_products(self):
self.client.get(
"/wp-json/wc/store/v1/products?per_page=12&page=1&category=clothing",
name="GET /wp-json/wc/store/v1/products"
)
@task(3)
def get_single_product(self):
self.client.get(
"/wp-json/wc/store/v1/products/33",
name="GET /wp-json/wc/store/v1/products/:id"
)
@task(1)
def get_cart(self):
self.client.get(
"/wp-json/wc/store/v1/cart",
name="GET /wp-json/wc/store/v1/cart"
)When to use this scenario
Use Store API tests if your WooCommerce implementation includes:
- WooCommerce Blocks
- Headless React, Vue, or Next.js storefronts
- Custom frontend apps
- Mobile apps consuming WooCommerce endpoints
This type of performance testing helps isolate backend API performance separate from theme rendering.
Analyzing Your Results
Once your WooCommerce load test completes, the next step is understanding what the results actually mean. LoadForge provides real-time reporting and detailed request metrics, which makes it easier to identify which parts of the store fail first.
Key metrics to watch
Response time percentiles
Average response time is useful, but percentiles tell the real story. Focus on:
- P50 for typical shopper experience
- P95 for degraded user experience under load
- P99 for worst-case latency
A homepage at 300 ms average may still be a problem if checkout requests hit 8 to 12 seconds at P95.
Requests per second
This helps you understand throughput, especially for:
- Product page views
- Add-to-cart requests
- Cart fragment refreshes
- Checkout submissions
Failure rate
Even a small increase in failed add-to-cart or checkout requests is serious for e-commerce. Look for:
- 4xx errors from validation or security layers
- 5xx errors from PHP, upstream services, or database overload
- Timeouts during order placement
Response time by endpoint
Segment results by route. In WooCommerce, these paths often behave very differently:
/product/.../cart//checkout//?wc-ajax=add_to_cart/?wc-ajax=get_refreshed_fragments/?wc-ajax=checkout/my-account//wp-json/wc/store/v1/...
What healthy results look like
For many WooCommerce stores, a reasonable target might be:
- Cached pages under 500 ms at moderate load
- Product pages under 1 to 2 seconds
- Add-to-cart under 1 second
- Cart page under 2 seconds
- Checkout submission under 2 to 4 seconds
- Error rate below 1%
Your exact thresholds depend on your infrastructure, catalog size, plugin stack, and traffic expectations.
Use distributed testing for realistic geography
If your customers are spread across multiple regions, use LoadForge’s global test locations to simulate traffic from the US, Europe, or Asia-Pacific. This helps you separate origin server bottlenecks from CDN or network latency issues.
Compare test runs over time
WooCommerce performance testing is most valuable when repeated regularly. Compare results after:
- Theme changes
- Plugin additions
- WooCommerce updates
- Database growth
- Hosting changes
- CDN and cache configuration changes
LoadForge’s CI/CD integration can help automate this so performance regressions are caught before production rollout.
Performance Optimization Tips
If your WooCommerce load testing reveals slowdowns, start with the most common optimization areas.
Optimize uncached WooCommerce requests
Cart and checkout are dynamic. Improve them by:
- Increasing PHP worker capacity
- Using Redis object cache
- Reducing plugin overhead on cart and checkout hooks
- Avoiding excessive cart fragment refreshes
Reduce database pressure
WooCommerce can generate heavy query loads. Consider:
- Database indexing review
- Query monitoring with APM tools
- Cleaning expired transients and overhead
- Offloading search to Elasticsearch or OpenSearch for large catalogs
Audit plugins and theme code
Some plugins add expensive queries or remote calls on every request. Test with non-essential plugins disabled and compare results.
Tune caching carefully
Use full-page caching for anonymous catalog traffic, but ensure cart, checkout, and account pages bypass cache properly. Misconfigured caching can create broken sessions or stale cart behavior.
Optimize media and frontend assets
Large product images, JS-heavy themes, and many third-party scripts can increase server time and browser delay. Even if backend performance is acceptable, the full customer experience may still be poor.
Review payment and shipping integrations
Checkout often slows down because of synchronous calls to payment, tax, fraud, or shipping services. Use test mode and measure their impact directly during load testing.
Common Pitfalls to Avoid
WooCommerce load testing can produce misleading results if the test design is unrealistic. Avoid these common mistakes.
Testing only cached pages
A store can survive high homepage traffic and still fail during checkout. Always include transactional flows.
Ignoring AJAX endpoints
WooCommerce relies heavily on AJAX for cart actions and fragments. If you don’t test these, you’re missing some of the most important backend load.
Using unrealistic user behavior
Real shoppers do not hit /checkout/ repeatedly without browsing, adding products, or maintaining sessions. Build user journeys that reflect actual storefront behavior.
Forgetting nonces and session state
WooCommerce often requires nonces and cookies for login and checkout. If your script skips these, the test may not behave like real traffic.
Load testing production checkout with live payments
Never run aggressive stress testing against live payment gateways or real customer workflows. Use staging and safe payment methods.
Not accounting for bot protection or CDN rules
Security layers may block or throttle your load test. Coordinate allowlists for LoadForge generators if needed.
Overlooking background systems
Orders may trigger:
- Emails
- ERP syncs
- Webhooks
- CRM updates
- Inventory sync jobs
These downstream systems can become bottlenecks even when the web server looks healthy.
Conclusion
WooCommerce load testing is one of the most effective ways to protect revenue and improve customer experience. By testing realistic browsing, cart, login, and checkout flows, you can uncover the weak points that matter most before a promotion or traffic spike exposes them in production.
With LoadForge, you can run scalable cloud-based load testing for WooCommerce using realistic Locust scripts, distributed testing, real-time reporting, global test locations, and CI/CD integration. Whether you’re validating a small storefront or stress testing a high-traffic e-commerce deployment, LoadForge gives you the visibility you need to keep your store fast and reliable.
Try LoadForge to start performance testing your WooCommerce store and make sure your product pages, cart, and checkout can handle real-world demand.
LoadForge Team
LoadForge is a load and performance testing platform built on Locust. Our team has been shipping load tests against production systems since 2018, and we write these guides from real customer engagements.
Related guides
Keep going with more guides from the same category.

E-commerce Checkout Load Testing: How to Stress Test Cart and Payment Flows
Test carts, checkout, and payment flows with LoadForge to find bottlenecks and improve conversion during peak traffic.

Sanity Load Testing: Performance Testing Sanity APIs with LoadForge
Use LoadForge to load test Sanity APIs, identify response time issues, and ensure your headless CMS scales reliably.

BigCommerce Load Testing: How to Performance Test BigCommerce Stores
See how to load test BigCommerce stores with LoadForge to validate storefront speed, API performance, and checkout stability.