Attribution When Buyers Research in ChatGPT
ChatGPT passed 900 million weekly users while AI channels sent 0.14% of measured web visits. Here are the four proxies that still work, how to run a self-report field, and the arithmetic showing why 34 answers decide nothing.
Table of contents
Last-click attribution cannot see a buyer who reads about you inside ChatGPT and then types your domain into the address bar. That session lands in your analytics as Direct with no source, no medium, no keyword. You are left with four usable proxies: branded search volume in Search Console, the shape of your direct traffic, a self-reported attribution field on high-intent forms, and referrals from review and community sites. All four are indirect. None replaces a controlled test. This post covers how to read each one, how to word and normalise a self-report field, and the confidence arithmetic that decides whether your answers mean anything yet.
The gap between reach and measurable referral
Two verified numbers frame the problem, and they point in opposite directions.
OpenAI said ChatGPT passed 900 million weekly active users on 27 February 2026, reported by Search Engine Land from OpenAI's own announcement. That is the audience.
Now the referral side. Semrush's traffic channel mix study analysed billions of visits across more than 50,000 websites and 17 industries across the whole of 2025. AI channels accounted for 0.14% of total visits. Google AI Mode added 0.01%. Organic search was 16.04%. Direct traffic was 64.69%. AI traffic grew 66.02% year on year against organic search's 2.38%, so the direction is not in doubt — the absolute base is just very small.
Nine hundred million weekly users producing 0.14% of measured visits is the entire dark funnel argument in one line, with one caveat: the two figures are a year apart. The user count is 27 February 2026; the referral share is calendar 2025, when the audience was smaller. Read it as a rough gap, not a ratio. The reading happens; the click mostly does not.
Prompting volume is smaller than the headlines suggest
SparkToro and Datos published Search Happens Everywhere using a 2025 desktop clickstream panel across the US, the 27 EU states and the UK, covering 41 search-heavy domains. In Q4 2025 in the US, Google took 73.7% of desktop searches. Every AI tool combined took 3.2%.
I bring that up because the dark funnel is usually sold with an inflated denominator. The honest framing is that AI research is a small, fast-growing, disproportionately high-intent slice that your instrumentation cannot see at all. Semrush's separate AI search traffic study (21 July 2025) claims an AI search visitor is 4.4x as valuable as an organic one by conversion rate. I am citing it with a caveat: that article discloses its topic set — over 500 marketing and SEO terms — but no sample size, date range or conversion definition. Treat 4.4x as a directional vendor claim, not a benchmark you can plan against.
What breaks in last-click, mechanically
Three separate failures, and they compound.
The referrer never arrives. A user reading a ChatGPT answer often copies your URL and pastes it, or opens it in the mobile app's in-app browser. Either way the session starts with no referrer and lands in Direct.
The influence happens weeks before the click. The model surfaced your name in a comparison in March. The buyer searched your brand in July. Last-click credits brand search, which credits nothing.
There is no query to see. Google Search Console shows you the query. ChatGPT shows you nothing. There is no export, no impressions table, no position. The blindness is structural. There is no setting to fix.
I went looking for a rigorous study quantifying how much AI traffic is misfiled as Direct and did not find one I would stand behind. The share that circulates most widely traces back through a chain of agency posts to a single vendor blog with no stated sample construction, no date range and no definition of how an AI-referred session was identified, so I am leaving it out rather than laundering it through one more citation. The same goes for a much-quoted analyst figure on how little of a B2B buying cycle is spent with suppliers: I have only ever seen it in summaries, never in a document that says how it was measured. A number with no method attached is not evidence, and the gap is more useful left visible.
The four proxies, and where each one lies
| Signal | What it proxies | How to read it | Where it lies |
|---|---|---|---|
| Branded search impressions (GSC) | Someone learned your name somewhere untracked | Plot impressions for queries containing your brand, weekly. Step changes matter; the level does not | Rises after any PR, podcast or LinkedIn spike. Cannot separate AI from word of mouth |
| Direct traffic to deep URLs | Pasted links, usually from an AI answer or a DM | Segment Direct by landing page. Direct to a deep service URL is pasted; Direct to the homepage is a returning visitor | Bots, email clients stripping referrers, and your own team all land here |
| Self-reported attribution on forms | The channel the buyer consciously remembers | Read as a ranking of memorability, not a share of influence | Recency bias, social desirability, and answers people give to get past the field |
| Review and community referrals (G2, Reddit, Slack groups) | The places models actually quote | Referral report filtered to those domains; also check whether the model cites them when you prompt it | Volume is tiny, so month-to-month noise looks like signal |
The column that matters most is the last one. Each proxy fails in a specific, predictable direction, and if you know the direction you can still use the number. I wrote more about picking metrics that survive contact with a real business in marketing analytics for non-data people.
The proxy that changed my mind about my own site
On santoshpaudel.me, Search Console for the 85 days to 3 September 2026 shows 22 clicks from 4,553 impressions, a 0.48% CTR. The query "santosh paudel" ranks at average position 8.2 and earns zero clicks. Branded impressions with no branded clicks is not a dark funnel signal. It is a title-and-snippet problem, or a page that does not deserve position 8.2.
Before you spend a quarter instrumenting proxies, check that the pages the proxies point at are worth arriving on. In my case 111 of 182 ranking pages earned five or fewer impressions in the quarter, and I ended up cutting the published count from 267 to 103 — the full teardown is in 389 pages, 22 clicks. If your corpus is in that shape, a content audit will move more revenue than any attribution project will.
Running a self-report field properly
This is the only proxy you actively control, so it is worth doing carefully.
Placement and wording
Put it on the highest-intent form you have (demo request, contact, checkout) and nowhere else. Newsletter signups produce answers from people who will never buy, which pollutes the sample you actually care about.
Ask "How did you first hear about me?" as an open text field. The moment you list options you have decided the answer set in advance, which is exactly the failure mode that hides new channels; a dropdown written in 2024 has no ChatGPT option. Make it required if you can stand the friction, and read the answers back on the call — my discovery call framework has a slot for exactly this.
Normalising the free text
Free text is only useful once it is bucketed the same way every quarter. My own site does not carry this field yet, and it is worth being precise about why that matters: contact_submissions stores name, email, service, subject and message, with no attribution column at all, and the only buyer-facing source column is a fixed six-value enum on the clients table. There is a free-text source on newsletter_subscribers, but it records which form or lead magnet fired, not what the person would have told you. That enum is the dropdown failure above, shipped. So the query below is the one I will run once the free-text column exists. It is demonstrated here against a literal list of the kind of answers people actually write, so you can paste it into any Postgres console and watch the buckets fall out:
WITH answers(id, src) AS (VALUES
(1, 'ChatGPT told me about you'), (2, 'a colleague recommended you'),
(3, 'Googled content audit'), (4, 'your linkedin post'),
(5, 'Perplexity cited your blog'),(6, 'your newsletter'),
(7, ' '), (8, 'saw you somewhere')
)
SELECT
CASE
WHEN src ~* 'chatgpt|openai|perplexity|claude|gemini|copilot|llm' THEN 'AI assistant'
WHEN src ~* 'friend|colleague|referr|recommend|word of mouth|coworker' THEN 'Person'
WHEN src ~* 'google|search|seo|bing' THEN 'Search engine'
WHEN src ~* 'linkedin|twitter|reddit|youtube|discord|slack' THEN 'Social'
WHEN src ~* 'newsletter|email|mailing' THEN 'Email'
WHEN btrim(COALESCE(src, '')) = '' THEN 'Blank'
ELSE 'Unmatched'
END AS bucket,
count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 1) AS pct
FROM answers
GROUP BY 1
ORDER BY n DESC;
Two deliberate choices in there. The AI branch runs first, so "asked ChatGPT then googled you" counts as AI, because the model was the discovery event and the search was navigation. And a bare "AI" with no product name falls through to Unmatched on purpose. Read the Unmatched bucket by hand every quarter; that is where next year's channel shows up before you have a regex for it.
The arithmetic that stops you over-reading the answers
Say a quarter produces 34 answers and ChatGPT leads with 9. Here is what that is worth, using a Wilson score interval, which behaves correctly at small counts and at zero where the textbook normal interval does not:
"""Self-reported attribution: share, 95% Wilson interval, and whether it decides anything."""
from math import sqrt
Z = 1.96 # 95%
def wilson(k, n):
"""(low, high) for k of n. Correct at k=0 and k=n."""
if n == 0:
return (0.0, 1.0)
p = k / n
d = 1 + Z * Z / n
centre = (p + Z * Z / (2 * n)) / d
half = (Z / d) * sqrt(p * (1 - p) / n + Z * Z / (4 * n * n))
return (max(0.0, centre - half), min(1.0, centre + half))
def report(counts, min_n=30, max_width=0.15):
n = sum(counts.values())
rows = []
for channel, k in sorted(counts.items(), key=lambda kv: -kv[1]):
lo, hi = wilson(k, n)
rows.append({"channel": channel, "k": k, "share": k / n, "lo": lo, "hi": hi,
"actionable": n >= min_n and (hi - lo) <= max_width})
return n, rows
if __name__ == "__main__":
q3 = {"ChatGPT or other AI assistant": 9, "Referral from a person": 7,
"Google search": 6, "LinkedIn": 5, "Newsletter": 3, "Other / blank": 4}
n, rows = report(q3)
print(f"n = {n}\n")
print(f"{'channel':<32}{'k':>4}{'share':>8}{'95% CI':>18} act?")
for r in rows:
ci = f"{r['lo']:.1%} - {r['hi']:.1%}"
print(f"{r['channel']:<32}{r['k']:>4}{r['share']:>8.1%}{ci:>18} "
f"{'yes' if r['actionable'] else 'NO'}")
assert wilson(0, 34)[0] == 0.0 and wilson(34, 34)[1] == 1.0
assert not any(r["actionable"] for r in rows), "34 answers decide nothing"
print("\nself-check passed")
Output:
n = 34
channel k share 95% CI act?
ChatGPT or other AI assistant 9 26.5% 14.6% - 43.1% NO
Referral from a person 7 20.6% 10.3% - 36.8% NO
Google search 6 17.6% 8.3% - 33.5% NO
LinkedIn 5 14.7% 6.4% - 30.1% NO
Other / blank 4 11.8% 4.7% - 26.6% NO
Newsletter 3 8.8% 3.0% - 23.0% NO
self-check passed
ChatGPT's true share sits somewhere between 14.6% and 43.1%. Person referrals sit between 10.3% and 36.8%. Those ranges overlap almost completely, so "AI is our biggest channel" is a claim this data will not carry.
How many answers you actually need
Holding the observed 26.5% share and asking when the interval narrows:
- —Width under 15 points (roughly plus or minus 7.5): 130 answers
- —Width under 5 points: 1,194 answers
A solo consultancy collecting 34 answers a quarter reaches 130 in about four quarters, and that assumes almost everyone fills the field in; blanks and skipped forms push it further out. That is the real cadence of this measurement. Anyone reporting a monthly self-report breakdown from a dozen answers is reporting noise with a chart on top.
None of this is a test
Every proxy above is observational. They tell you what correlated with a good quarter. They cannot tell you what caused it.
The cleanest read I have on my own site is closer to a natural experiment than a designed one. Nepal produced 8 clicks from 74 impressions — a 10.8% CTR at position 9.2 — while the United States produced zero clicks from 970 impressions at average position 38.8. Same author, same domain, same quarter. Position and name recognition explain that gap. No attribution model would have found it.
If you want causation you need a holdout: switch a channel off in one segment for a defined window and watch enquiries, or stagger a publishing push by geography. That is slow and expensive, which is why almost nobody does it, and why the honest version of this discipline is "here are four indicators, here are their biases, here is the direction we lean."
For tracking whether the models mention you at all, a scheduled prompt log beats a dashboard. I built a small AI visibility monitor for that, and wrote up how small brands show up in AI answers separately.
FAQ
Can I see traffic from ChatGPT in Google Analytics?
Only partially. Sessions that arrive via a clicked link carry chatgpt.com as the referrer and can be grouped into a custom channel. Sessions from pasted URLs and in-app browsers arrive with no referrer and land in Direct, and there is no way to recover them after the fact. Semrush measured AI channels at 0.14% of total visits across 50,000+ sites in 2025, so whatever GA4 shows you will already be a small number before any undercount.
Is self-reported attribution accurate?
No, and it is not meant to be. It measures which channel a buyer consciously remembers, which is biased toward whatever happened most recently and toward answers that sound reasonable out loud. Its value is that it is the only instrument that can name a channel you never tagged. Treat it as a rough ordering of what buyers remember, and always read it beside your branded search trend rather than on its own.
How do I know if buyers are researching me in ChatGPT?
Ask the models directly on a schedule, logging the same set of buying prompts weekly and recording whether you are named and what gets cited. Then watch branded search impressions in Search Console for step changes with no campaign behind them. Both are indicators. Neither is proof.
Should I stop reporting last-click attribution?
Keep it and stop calling it attribution. Last-click is a reliable record of the final touch and nothing more. Report it beside branded search, direct-to-deep-URL sessions and self-report counts, and label the whole panel as indicators rather than a model.
Worried your attribution is measuring an underperforming corpus rather than a dark funnel? Most sites I look at have a content problem wearing an attribution problem's clothes. Get a content audit or get in touch.
Get the AI-SEO Content Checklist
A practical checklist for getting your own content cited by Google AI Overviews, ChatGPT, and Perplexity — not just ranked.
Browse all free guides →Run this on your own numbers
Content ROI & Payback Calculator — free, no signup, runs in your browser.
Want to implement this with guidance?
Santosh helps founders turn insights like this into real systems.
External Resources
Further Reading & Tools
Forrester B2B Marketing
Enterprise marketing research on buyer journey, content effectiveness, and channel ROI
Gartner Marketing Research
CMO spending surveys, content ROI research, and marketing tech stack guidance
LinkedIn Marketing Solutions
B2B marketing benchmarks and buyer journey research
Demand Gen Report
B2B buyer behavior and demand generation strategy research