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.
If you've ever looked up what a visitor to your store is worth, you always find the same formula: revenue divided by visits. You get a number — say 1.40 € — and from there you're supposed to know what you can pay for a visit.
The formula isn't the problem. The problem is that it describes a visitor who doesn't exist.
I measured it today, and the result is extreme enough to start there.
The measurement
A real WooCommerce collectibles store, 25 August to 24 September 2026 (31 days), measured today against its own search log and its catalogue.
| Products in the catalogue | 5,621 (1,608 in stock) |
| Sessions that used the search | 11,273 |
| Searches | 52,095 (4.62 per session) |
| Clicks on results | 17,378 |
| Sessions that clicked anything | 5,299 (47.0%) |
For each session I know what it searched for, which product pages it opened, and what each of those products costs. That lets me put a figure on what a session puts on the table: the sum of the prices of the distinct products it actually opened. It isn't what they spent — that's a different thing, and it comes later — but it is what that visitor was genuinely looking at, in euros.
Across all 11,273 sessions:
| Average | 73.67 € |
| Median | 0.00 € |
| 90th percentile | 199.99 € |
| 99th percentile | 833.78 € |
| Maximum | 8,479.93 € |
The first two rows are the same store, the same month, the same sessions. One says 73.67 € and the other says zero.
The median is zero because 5,974 sessions (53.0%) searched for something and opened nothing. They searched, looked at the list of results and moved on. And since they're more than half, the middle visitor of this store — literally the one standing in the centre of the queue — is worth nothing.
The spread, which is what actually matters
Sorting the 11,273 sessions from most to least value opened and splitting them into ten equal groups:
| Decile | Sessions | Value opened | % of total |
|---|---|---|---|
| 1st (top 10%) | 1,128 | 514,368 € | 61.9% |
| 2nd | 1,128 | 160,492 € | 19.3% |
| 3rd | 1,128 | 85,831 € | 10.3% |
| 4th | 1,127 | 45,744 € | 5.5% |
| 5th | 1,127 | 24,088 € | 2.9% |
| 6th to 10th | 5,635 | 0 € | 0.0% |
The top 10% accounts for 61.9%. The top 20%, for 81.2%. The bottom half, for nothing.
That's why average value per visitor misleads. You aren't buying traffic to bring in average visitors: you're buying to bring in that first decile, and the moment you average it with the other nine it disappears. Two stores with the same "1.40 € per visit" can be one with lots of people spending a little and one with very few people spending a lot, and they aren't run the same way, advertised the same way, or written to the same way.
A second figure points the same direction. The average price in this store's catalogue is 46.57 €, but the average price of what people open from the search is 57.18 € — 22.8% more expensive. The medians say the same (32.98 € against 39.91 €). People who search don't look at the same things as people who browse: they look at more expensive things. And 1,504 of those clicks went to products of 100 € or more.
Among the 5,299 sessions that do click, the typical one opens 2.77 distinct products adding up to a median of 79.82 € (156.73 € on average — the tail pulling upwards again). And 1,558 sessions opened more than 150 € of catalogue in a month. In a store with a low average order value, that is a list of specific people worth paying attention to.
So how do you calculate it properly?
In three steps, and none of them needs you to install anything.
1. The starting number, understood for what it is
You still want the classic ratio, but as a baseline, not as a conclusion:
-- Revenue and orders, last 90 days
SELECT
COUNT(*) AS orders,
ROUND(SUM(total_sales), 2) AS revenue,
ROUND(AVG(total_sales), 2) AS average_order
FROM wp_wc_order_stats
WHERE status IN ('wc-completed', 'wc-processing')
AND date_created >= DATE_SUB(NOW(), INTERVAL 90 DAY);
Divide that revenue by the sessions your analytics reports for the same period and you have your value per visitor. Write it down, but don't make decisions with it yet.
(wp_wc_order_stats is a WooCommerce Analytics table; it's been there since WooCommerce 4.0. Change wp_ for your prefix.)
2. The spread of your customers, which is where the information is
This is the sales version of the decile table above. It answers "how much of my revenue comes from the top 10% of my customers?", and that's a question you can act on:
-- Revenue split by customer decile, last 12 months
WITH customers AS (
SELECT customer_id, SUM(total_sales) AS spent
FROM wp_wc_order_stats
WHERE status IN ('wc-completed', 'wc-processing')
AND date_created >= DATE_SUB(NOW(), INTERVAL 12 MONTH)
AND customer_id > 0
GROUP BY customer_id
),
d AS (
SELECT spent, NTILE(10) OVER (ORDER BY spent DESC) AS decile
FROM customers
)
SELECT decile,
COUNT(*) AS customers,
ROUND(SUM(spent), 2) AS revenue,
ROUND(100 * SUM(spent) / SUM(SUM(spent)) OVER (), 1) AS pct
FROM d
GROUP BY decile
ORDER BY decile;
If your first decile is above 50%, those customers are your business, even if your homepage is talking to someone else. (NTILE and OVER need MySQL 8.0 or MariaDB 10.2; if your host is behind, pull the customers list sorted and add up the top 10% by hand.)
3. Separating the ones who tell you what they want
A visitor who types into your search has given you something no one else does: what they want, in their own words. That's why they're worth something different, and measuring them separately is what turns value per visitor into something you can act on.
If you don't log your searches, the article on why Google Analytics doesn't tell you what's happening in your store has the 30-line mu-plugin that stores them — just the term and the result count, no cookies and no personal data. With a month of logs, this query tells you how much the search weighs in your store:
-- Last month's search volume, to cross against your sessions
SELECT
COUNT(*) AS searches,
COUNT(DISTINCT DATE(creado)) AS days,
ROUND(COUNT(*) / COUNT(DISTINCT DATE(creado)), 1) AS searches_per_day,
SUM(resultados = 0) AS zero_results
FROM wp_wr_busquedas
WHERE creado >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 30 DAY);
And with that you can run the comparison that matters: revenue from sessions that searched, divided by those sessions, against the same calculation for the ones that didn't. I'm not going to give you a "typical" multiple here, because I haven't measured it across enough stores to claim one and I'd be making it up. The calculation takes ten minutes and the number that comes out is yours, which is the one you need.
What to do with this on Monday
- Pull the decile table for your customers. It takes a minute and tells you, with no room for interpretation, who your store depends on.
- Stop optimising the average. Raising conversion in the sixth decile means working on people who open zero euros of catalogue. The room is at the top and in the middle.
- Look at who opens a lot and doesn't buy. In this store that's 1,558 sessions a month above 150 €. That's real purchase intent that left for a specific reason: price, shipping, stock or trust. Any of the four can be fixed; none of them can be fixed without knowing it's there.
- Log your searches if you don't. It's the difference between knowing how many visitors you had and knowing what they were asking you for.
The numbers in this article come from a real store's search log: what was searched, what was shown 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
The 6 store metrics that actually move money
Measured today on a real WooCommerce store with 5,621 products: 255 of them take half the clicks. That's 4.5% of the catalogue. And 4,163 products got none at all in 31 days. Here are the six metrics that actually change decisions — concentration, dead catalogue, demand with no stock — with the SQL to pull each one from your own database today.
Synonyms in WooCommerce search: 495 searches returning zero because they were spelled differently
"blue lock" finds 22 products; "bluelock", zero. Measured today on a real store: six words customers write differently from the catalogue added up to 495 searches in 68 days, and the store had zero synonyms configured. How to find yours and fix them today.
