katman / AI traffic study
FIRST-PARTY STUDY · 28 DAYS · MEASURED 2026-09-03
ChatGPT sent 52.6% of sessions. Google organic sent $0.
Over 28 days, frutti.ai recorded 2,187 sessions. ChatGPT accounted for 1,150 of them and roughly 46% of revenue. Google organic search accounted for 242 sessions and no revenue at all, for the third consecutive month. This page gives the numbers, the method, and the four attribution errors we had to fix before the numbers meant anything.
What was measured
One site, one 28-day window ending 2026-09-03. Sessions from GA4, crawl and query data from Google Search Console, raw requests from nginx access logs, and completed payments from Stripe, reconciled against each other rather than trusted individually.
| Channel | Sessions | Share of sessions | Revenue |
|---|---|---|---|
| ChatGPT | 1,150 | 52.6% | ~46% of revenue |
| Direct | 466 | 21.3% | ~46% of revenue |
| Google organic | 242 | 11.1% | $0, third month running |
| Bing | 97 | 4.4% | $19 |
The finding in one sentence: the channel that produced the sessions and the revenue was the one with no budget attached to it, and the channel with the budget produced none.
Four attribution errors we found first
Every number above was wrong before it was right. These are the corrections, published because a study that hides them is not evidence.
Stripe recorded a Google acquisition source that was not Google search
The referrer on a completed checkout was often accounts.google.com, appleid.apple.com, checkout.stripe.com or an auth host. Those are sign-in and payment returns, not discovery. Counting them as Google search would have inflated Google and deflated everything else.
Direct was inflated by our own infrastructure
A PostgREST host on a subdomain generated requests that landed in the direct bucket. Matching the referrer exactly against the apex and www hosts removed them.
ChatGPT's fetcher does not identify itself as a bot
The ChatGPT-User agent string contains no "bot" token, so a standard bot filter lets it through as human traffic. It has to be excluded by name.
Attribution was missing entirely on organic landings
With no UTM and no referrer the attribution record was null, so an organic visit that converted carried no source at all.
What this does and does not show
It shows that for one site in one window, a channel that most marketing dashboards report badly carried the majority of sessions and roughly half the revenue. It does not show that this holds for your site, your category or your window. It is a single dated observation, and the honest use of it is as a reason to measure your own logs, not as a benchmark to copy.
It also does not establish causation between any specific content change and the traffic mix. Nothing here was an experiment with a control.
How to run this measurement yourself
- Read your server logs, not only your analytics. AI crawlers do not execute JavaScript, so GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot and Perplexity-User are invisible in a client-side analytics tool and fully visible in access logs.
- Exclude auth and payment hosts from acquisition source. A referrer of accounts.google.com is a sign-in return, not a search.
- Match your own hosts exactly when filtering direct traffic. A subdomain of your own infrastructure will otherwise be counted as a visitor.
- Add ChatGPT-User to your bot filter by name. Its user agent contains no "bot" token.
- Isolate what you can. ChatGPT appends utm_source=chatgpt.com to many outbound links, which makes those sessions separable in analytics.
Questions
Does this prove ChatGPT drives revenue for every site?
No. This is one site, one 28-day window, one category. It shows that for this site the traffic mix that produced revenue was not the one the marketing budget assumed. Run the same measurement on your own logs before drawing a conclusion about your own site.
Why is Google organic revenue exactly zero?
242 sessions arrived from Google organic search in the window and none of them completed a purchase. This was the third consecutive month with no revenue from that channel. It is a small enough sample that zero and near-zero are not meaningfully different; the point is the gap against a channel with five times the sessions, not the precision of the zero.
How do you separate AI traffic from direct traffic?
AI answer engines are visible in three places that analytics alone misses: server logs (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot and Perplexity-User do not execute JavaScript, so they never appear in a client-side analytics tool), the utm_source=chatgpt.com parameter ChatGPT appends to many outbound links, and Search Console crawl stats, where crawler activity precedes traffic by weeks.
Is a visibility score the right way to track this?
Not on its own. Being named by a model, being recommended by it, and having your own domain cited are three different outcomes, and a single blended score hides which one you are missing. We report them separately for that reason.
Want the same measurement for your own site? The technical audit is free and runs in seconds. It checks whether the crawlers above can reach and read your pages at all, which is the precondition for any of this.
Measured 2026-09-03 · 28-day window · first-party data from frutti.ai, published with permission · this page will be re-run and re-dated