MEASURED, NOT ESTIMATED

What a WooCommerce shop's
performance actually looks like.

There is no public baseline for this. Everyone asks "is 400 ms bad?" and gets an opinion back. Below are the numbers from five production WooCommerce shops over 24 hours — 96,871 requests — so you have something to compare your own against.

What this data is. Traffic recorded from working WooCommerce shops and replayed onto a public read-only account, with site names removed and every SQL value stripped before storage. It is real traffic, not synthetic load, and it is not five shops serving customers at this second. Every number here was pulled from our public endpoint when this page was built (2026-09-24) — you can query the same endpoint yourself, with no account: claude mcp add --transport http phpray https://phpray.dev/mcp

Measure your own shop Or read a full report first

Both free, both without an account. The rest of this page is the data.

Five shops, 24 hours

ShopRequests / 24 hp95FailedDatabase share
northwind-supplies.example26 176139 ms2.9%11%
roastery-coffee.example10 428192 ms5.7%8%
bergen-outdoor.example11 452100 ms1.1%15%
vintage-audio.example6 457118 ms1.9%12%
harbourside-books.example16 29444 ms0.3%32%
atelier-lumen.example9 18658 ms0.4%25%
meadow-organics.example5 40673 ms0.8%19%
staging.northwind-supplies.exam…2 737121 ms4.7%11%
studio-verde.example4 50259 ms0.5%19%
clearwater-fitness.example4 23345 ms0.2%26%

Two things surprise people here. First, p95 varies four-fold between shops running the same software — 55 ms on a content site against 235 ms on a young shop. Second, the database is not where the time goes: it is 8–32% of wall time, and the busiest shop sits at the low end. The time is in PHP.

Which plugin spends it

From the busiest shop, self time per profiled request — that is time spent inside that plugin's own code, not in what it calls:

Plugin or themeSelf time per profiled request
plugins/woocommerce33.81 ms
themes/storefront23.58 ms
plugins/wordpress-seo5.75 ms
plugins/wpforms-lite5.01 ms
plugins/advanced-custom-fields6.13 ms
plugins/really-simple-ssl2.96 ms
plugins/wp-smushit1.60 ms
plugins/contact-form-71.20 ms

WooCommerce itself is the single largest cost and there is no way around that; it is the shop. What is worth looking at is everything below it. A security plugin at 2.96 ms on every request is a decision, not a fact of nature.

The queries that cost the most

Ordered by total time — average times call count — because that is what the database actually pays, not the single slowest query:

Total in 24 hCallsQuery (values masked)
2.1 s5019SELECT option_name, option_value FROM wp_options WHERE autoload IN (?)
1.9 s9043SELECT DISTINCT t.term_id, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id I
1.6 s7341SELECT option_name, option_value FROM wp_options WHERE option_name IN (?)
1.5 s379UPDATE `wp_options` SET `option_value` = ? WHERE `option_name` = ?
1.2 s4354SELECT wp_comments.comment_ID FROM wp_comments JOIN wp_posts ON wp_posts.ID = wp_comments.comment_post_ID LEFT JOIN wp_p
1.1 s4757SELECT a.action_id FROM wp_actionscheduler_actions a WHERE ?=? AND a.hook=? AND a.status IN (?) LIMIT ?, ?

Notice the shape: nothing here is slow. Every one of these is a fraction of a millisecond. They cost because they run thousands of times. Optimising the "slowest query" on such a shop finds nothing; the cost is in volume.

The part nobody sees

The busiest shop returned 2.9% 5xx responses in 24 hours. Here is the uncomfortable detail:

100 failed requests, showing 5. NONE of them raised a PHP error — these are 5xx responses, so the cause is outside PHP's error handler (a fatal before the handler, a timeout, the web server, or an upstream). Open one with phpray_trace to see the queries and outbound calls it made.

None of them raised a PHP error. They are invisible to error_log, to any tool that watches PHP's error handler, and to the shop owner — who only finds out when a customer writes in. They show up on product pages and on the home page, which means they cost orders.

How to compare your own shop

Three numbers are enough to know where you stand: p95, the share of 5xx, and self time of your three biggest plugins. If your p95 is under 200 ms and your 5xx share is under 1%, you are doing better than three of the five shops above.

Measure yours the same way

The local core is Apache-2.0, free without limits, and installs without root — including on shared hosting. On WordPress there is a plugin that needs neither an extension nor a daemon.

Install in one line See a full report first

Read next