Your conversion rate means nothing without this
Measured today on a real WooCommerce store, 31 days and 11,044 sessions: the overall rate is 48.31%, and none of the five groups it's made of looks anything like that number. They run from 35.9% to 96.0%, split by a single field you already log. Here's why a bare percentage decides nothing, and how to split yours today, with the SQL.
"My store converts at 2.1%."
It's a sentence people say a lot and nobody can act on. Not because the number is calculated wrong, but because a bare percentage is an average, and an average is only useful when the things it averages resemble each other. In a store they don't resemble each other at all.
I measured it today, and the result is clear enough.
The measurement
A real WooCommerce collectibles store, from 2 September to 2 October 2026 (31 days), against its own search log.
| Sessions that used the search | 11,044 |
| Searches | 53,787 (4.87 per session) |
| Clicks on results | 17,449 |
| Searches returning zero results | 419 (0.8%) |
One clarification before going on, because it matters: what I measure here is not the conversion rate to order, it's the step before — what share of the sessions that search something gets as far as opening a product page. I use it because it's the funnel I have clean, complete data for across all 31 days. The argument is the same for purchase conversion, and the SQL to do it with your orders is at the end.
The overall rate for those 11,044 sessions is 48.31%.
That's the number that would go on the slide. Now let's split it.
The same month, split by one single thing
All I do is group the sessions by how many times they searched. Nothing else: no marketing segments, no cohorts, no models. A GROUP BY on a field the store was already storing.
| Searches in the session | Sessions | % of sessions | Rate | % of clicks |
|---|---|---|---|---|
| 1 | 2,852 | 25.8% | 35.9% | 9.7% |
| 2-3 | 3,603 | 32.6% | 40.7% | 16.5% |
| 4-9 | 3,439 | 31.1% | 54.4% | 28.5% |
| 10-24 | 952 | 8.6% | 82.1% | 23.9% |
| 25 or more | 198 | 1.8% | 96.0% | 21.4% |
The point of that table isn't that the rate climbs with persistence — that was predictable. It's what isn't in the column: there's no group anywhere near 48%. The overall average describes nobody's behaviour. It's the point where five populations that have nothing in common cross, and it floats in a gap where no customer lives.
And the split of the clicks says something less comfortable: the top 10.4% of sessions — the 1,150 that search ten times or more — take 45.3% of every click on a result. Nearly half your search activity comes from one visit in ten.
That changes what "lifting conversion" means. If the figure moves from 48.3% to 50%, the question isn't "what did we do right?" but "which group grew?". Maybe you convinced people in the first group, which is real work. Or maybe more persistent sessions simply turned up that week, which is nobody's achievement and won't repeat next month. The overall number can't tell those two apart, and they're opposites.
The group that never had a chance
There's a second split that turns the thing around. Instead of grouping by persistence, I group by whether the session's first search returned zero results:
| Sessions | Rate | |
|---|---|---|
| First search returned results | 10,973 | 48.6% |
| First search returned zero | 72 | 9.7% |
It's only 72 sessions, 0.7% of the month, so it doesn't move the average. What's interesting is something else: those 72 sessions never had the opportunity. It's not that the price didn't convince them, or the shipping, or the product photo. They asked for something and the store showed them an empty page.
And yet they sit in the denominator of your conversion rate, mixed in with the people who did see products and chose not to buy. While they're together, any conclusion about "why we don't convert" is a conclusion about two different problems at once: one of persuasion and one of breakage. They get fixed in different places by different people. (What to do with those searches is the article on zero-result searches.)
Widening it to sessions that had any zero-result search, not just the first, gives 158 sessions converting at 39.2%. Less damage, because many recover by rephrasing. It's the first impression that carries the weight.
One thing I tried that explained nothing
I also looked at whether query length separated populations. The hypothesis was reasonable: someone who types three words knows what they want better than someone who types one.
| Words in the first search | Sessions | Rate |
|---|---|---|
| 1 | 8,132 | 48.9% |
| 2 | 2,046 | 46.3% |
| 3 | 689 | 48.8% |
| 4 | 95 | 34.7% |
| 5 or more | 83 | 47.0% |
It separates nothing. The first three groups, which are 97% of the sessions, all sit right on the average. The 34.7% for four-word queries comes from 95 sessions, which is far too little to claim anything from.
I'm including it because a segment that explains nothing is information too, and because it's the difference between measuring and telling a story: if I only published the splits that came out pretty, these numbers would be worthless for making decisions with.
And before celebrating anything: your rate moves on its own
Last check, over the 30 complete days of the period. Same store, same search, nothing touched:
| Worst day | 43.3% (17 September, 492 sessions) |
| Best day | 56.4% (1 October, 595 sessions) |
Thirteen points of spread without anyone changing a line of code. If you measure 44% on a Tuesday, make a change, and measure 52% on Thursday, you have demonstrated precisely nothing: you're inside your own store's normal noise.
That's what makes a bare percentage worse than useless. It's not that it tells you nothing; it's that it invites you to take credit and blame that aren't yours.
How to split yours, today
Three steps. The first needs nothing installed.
1. Measure your spread before your average
Before chasing decimals, find out how much your number moves by itself. Orders are enough to get the idea:
-- Orders per day over the last month: your noise floor
SELECT DATE(date_created) AS day,
COUNT(*) AS orders,
ROUND(SUM(total_sales), 2) AS revenue
FROM wp_wc_order_stats
WHERE status IN ('wc-completed', 'wc-processing')
AND date_created >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY day
ORDER BY day;
Look at the worst day and the best day. Any improvement smaller than that distance needs weeks of data before you believe it. (wp_wc_order_stats is a WooCommerce Analytics table, around since WooCommerce 4.0. Swap wp_ for your prefix.)
2. Give your search log a session
The table above comes from being able to group searches by session. If you already have the search-logging mu-plugin — the 30-line one in why Google Analytics doesn't tell you what happens in your store — it's missing one column. This adds it:
ALTER TABLE wp_wr_busquedas ADD COLUMN sesion CHAR(16) NOT NULL DEFAULT '';
And in the mu-plugin, before the INSERT, you compute the identifier and store it with the rest:
// Session pseudonym: not reversible, and it changes every day at midnight.
// No cookie, no stored IP, no personal data in the table.
$sesion = substr(hash_hmac(
'sha256',
($_SERVER['REMOTE_ADDR'] ?? '') . ($_SERVER['HTTP_USER_AGENT'] ?? '') . gmdate('Y-m-d'),
wp_salt('auth')
), 0, 16);
What ends up in the database is 16 characters with no way back, good for knowing that two searches came from the same person that day and for nothing else. It identifies nobody and it doesn't survive midnight.
3. Split the denominator
With a couple of weeks of logging, this query gives you your own version of the table at the top:
-- Your search sessions, by depth
WITH s AS (
SELECT sesion,
COUNT(*) AS searches,
MAX(resultados = 0) AS had_zero
FROM wp_wr_busquedas
WHERE creado >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 30 DAY)
AND sesion <> ''
GROUP BY sesion
)
SELECT CASE WHEN searches = 1 THEN '1'
WHEN searches <= 3 THEN '2-3'
WHEN searches <= 9 THEN '4-9'
ELSE '10 or more' END AS depth,
COUNT(*) AS sessions,
ROUND(100 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct_sessions,
SUM(had_zero) AS with_any_zero
FROM s
GROUP BY depth
ORDER BY MIN(searches);
(WITH and OVER () need MySQL 8.0 or MariaDB 10.2. If your hosting is behind, the same query works with a temporary table.)
That tells you what your search traffic is made of. Closing the loop all the way to the order means joining the session to the sale, which is exactly what a search that measures does; but with the split above you already know something you didn't: how many different averages were hiding inside your average.
What to do on Monday
- Stop looking at the rate on its own. Always put the size of the group it came from next to it. 48% of 11,000 sessions and 48% of 200 are two different sentences.
- Get your daily spread. If your improvement fits inside it, you haven't measured anything yet.
- Separate broken from unconvinced. Sessions that saw zero results aren't a conversion problem; they're a fault, and they're contaminating the percentage you decide with.
- Split by depth before demographics. This split doesn't need you to know where people came from; it needs you to know how many times they asked you something.
The numbers in this article come from a real store's search log: what was searched, how many results came back and what was clicked. If you want to see how you get that log — and why the search is the cheapest place in a store to find out what your customer wants — there's the guide on how to choose an ecommerce search, with the price of each option checked. And all of this is measured by WildRock in the store while it runs, with no third-party cookies.
Is your store losing sales to searches that find nothing?
WildRock adds a search to your WooCommerce that understands what shoppers mean, and tells you in euros how much it generates. Free plugin, no code.
Keep reading
My search broke for four hours overnight and only 74 zero-result searches saw it
Over 90 days and 94,645 searches, a real store logged 95 searches returning zero. 74 of those 95 happened inside the same four-hour window, overnight. It wasn't missing stock: "goku" returned zero with 179 matching products in the catalogue. Zero-result searches aren't just your customers' wish list — they're the only alarm you have.
What a visitor to your store is actually worth
Measured today on a real WooCommerce store, 31 days and 11,273 sessions: the average session opens 73.67 € of catalogue and the median opens 0.00 €. The top 10% accounts for 61.9% of the total. The average visitor doesn't exist, and dividing revenue by visits gives you a number you can't decide anything with. Here's the calculation that does work, with the SQL to pull it from your own store.
