Tracking Google AI Overviews: What opi and ved Can't Tell You
By Eli C., MarTech & Analytics Engineer
Published Updated
Quick answer: You canāt pick out individual AI Overview clicks in GA4 or in your server logs. Google Search sends only its origin as the referrer (
https://www.google.com/), so parameters such asopiandvednever leave google.com, andopi=89978449isnāt specific to AI features anyway. What you can measure: AI Overview and AI Mode impressions per page in Search Consoleās generative AI report, landings on highlighted text (#:~:text=), and assistants that tag their links, such as ChatGPTāsutm_source=chatgpt.com.
Can you see opi and ved in your analytics?
No. Google Search sets a referrer policy that sends only the origin, so the request that reaches your site carries Referer: https://www.google.com/ with no path and no query string. document.referrer shows the same value, GA4 stores it as page_referrer, and Nginx or Cloudflare log exactly that. No filter downstream can recover parameters that were never sent.
You can check it in two minutes:
- Open DevTools on a Google results page, go to the Network tab and tick Preserve log.
- Click any organic result.
- Select the first document request to the destination and open Headers ā Request Headers.
Refererreadshttps://www.google.com/. - In the destinationās console,
document.referrerreturns the same string.
So any setup that looks for opi= or ved= in the referrer, whether an Nginx map or a REGEXP_CONTAINS over the GA4 BigQuery export, will match zero visits.
What are opi and ved?
Theyāre parameters on Googleās own URLs, and Google documents neither. You can see them in your browser, but your site never receives them.
vedencodes information about the clicked element and its position on the results page, for Googleās click logging. Thereās no public mapping from its prefixes to result types, so readings like ā0C means AI Overviewā are guesses.opiis a page-level value. The results page script appends it from a global setting (search the page source forkOPI) to URLs it builds, whichever result you click.opi=89978449has appeared on ordinary organic result links since 2023, so it wouldnāt identify AI Overview clicks even if you could see it.
What can you measure instead?
| Signal | What it tells you | Where | Caveat |
|---|---|---|---|
| Generative AI performance report | Impressions of your pages in AI Overviews and AI Mode | Search Console | Impressions only: no clicks, no queries |
| Performance report, Web search type | Clicks and impressions from web results, AI features included | Search Console | AI feature clicks arenāt broken out |
| Text-fragment landings | Visits that landed on a highlighted passage (#:~:text=) | A GA4 event you add | Featured snippets use them too; may stop working |
| ChatGPTās UTM tag | Visits from links cited in ChatGPT | GA4 session source | ChatGPT only |
| Other assistantsā referrers | Visits from assistants that send a referrer, such as Perplexity or Gemini | GA4 Traffic acquisition | Confirm each source in your own data |
What does Search Consoleās generative AI report show?
It shows how often your pages appeared in AI Overviews and AI Mode. Google launched the report on June 3, 2026 for a subset of sites and says it reached all websites by August 31, 2026. Per the help page, it counts impressions grouped by page, country, device and date. It has no clicks and no query dimension, and it leaves out Search Labs experiments. Discover has a separate report.
Since September 24, 2026 you can filter this report, and the regular Performance report, by search type. Web: text-based covers typed queries. Web: multimodal covers image searches from Google Lens, Circle to Search, image uploads and Chrome image search.
Clicks from AI features count towards the regular Performance report under the Web search type, as Googleās AI features documentation says, but they arenāt separated from other web clicks. One practical use of the new report: export AI impressions per page and put them next to the same pagesā clicks from the Performance report. Pages with many AI impressions and few clicks are worth a closer look.
How do you tag text-fragment landings in GA4?
A text fragment is the #:~:text= part of a link that makes the browser scroll to a passage and highlight it. Googleās featured snippets link this way: āClicking a featured snippet takes the user directly to the section of the page that appeared in the featured snippetā (Google). Links cited in AI Overviews often do too; copy one from a result and look for #:~:text=.
The spec hides the directive from page scripts, so location.href and document.URL donāt include it. Chromium still exposes it in one place: the Navigation Timing entry. I checked this in Chrome 154 with a local test page opened at /post#:~:text=text%20fragment:
location.href
// 'http://localhost:8765/post'
performance.getEntriesByType('navigation')[0].name
// 'http://localhost:8765/post#:~:text=text%20fragment'
The Chromium tracker files this as a bug (issue 40136467, āUrl Fragment exposed to Navigation Timingā), so treat it as a signal that can disappear in any browser update. I havenāt tested Safari or Firefox.
To collect it with GTM:
-
Create a Custom JavaScript variable named
JS - Text fragment. It has to be ES5, because Custom JavaScript variables go through the same compiler that rejects ES6 in Custom HTML tags.function () { var entries = window.performance && performance.getEntriesByType ? performance.getEntriesByType('navigation') : [] var url = entries.length ? entries[0].name : '' var match = (url.split(':~:')[1] || '').match(/(?:^|&)text=([^&]+)/) if (!match) return undefined try { return decodeURIComponent(match[1]).slice(0, 100) } catch (e) { return match[1].slice(0, 100) } } -
Create a GA4 Event tag with the event name
text_fragment_landingand an event parameterfragment_textset to{{JS - Text fragment}}. Fire it on a Page View trigger with the conditionJS - Text fragmentdoes not equalundefined. Donāt use a History Change trigger: on single-page apps the navigation entry keeps the landing URL, so the event would fire again on every route change. -
In GA4, register
fragment_textas an event-scoped custom dimension under Admin ā Data display ā Custom definitions. The 100-character cut in the variable matches GA4ās limit for event parameter values.
In an exploration, segment sessions with source google that include text_fragment_landing. Call that segment āGoogle text-fragment landingsā, not āAI Overview clicksā: featured snippets and any other page that links with a text fragment land the same way.
This is an ordinary GA4 event, so it follows the same consent rules as the rest of your GA4 setup. The Consent Mode post covers those for the EU.
How do you label ChatGPT and other AI assistants in GA4?
ChatGPT adds utm_source=chatgpt.com to the links it cites, so those sessions show chatgpt.com as the session source. Other assistants may or may not pass a referrer. GA4ās Traffic acquisition report, broken down by session source, shows which ones actually reach you.
To group them, add a channel named āAI assistantsā to a custom channel group (Admin ā Data display ā Channel groups) with the condition Source matches regex:
(.*\.)?(chatgpt\.com|perplexity\.ai|gemini\.google\.com|copilot\.microsoft\.com)
GA4 assigns each session to the first channel whose conditions match, so move the new channel above Referral. Keep only the sources youāve seen in your own data, and add new ones as they appear.
Setting up reporting like this, and checking which numbers hold up, is part of my analytics work.
Frequently asked questions
What does opi=89978449 mean in a Google search URL?
It's an undocumented parameter Google's results page adds to its own URLs. It appears on ordinary organic result links too, so it doesn't identify AI Overview clicks, and your site never receives it because Google sends only https://www.google.com/ as the referrer.
Can GA4 separate AI Overview clicks from regular organic clicks?
No. Both arrive as google / organic with the referrer https://www.google.com/. The closest proxies are text-fragment landings and the Search Console generative AI report, which shows impressions, not clicks.
Does Search Console report clicks from AI Overviews?
They're counted in the regular Performance report within the Web search type, but not broken out. The generative AI performance report, available to all sites since August 31, 2026, shows impressions only.
Does a #:~:text= landing mean the visit came from an AI Overview?
No. Featured snippets link with text fragments too, and so can any other site. Treat those visits as landings on a highlighted passage, and read them together with the session source.
Sources
- Introducing Search Generative AI performance reports in Search Console (Google Search Central, June 3, 2026)
- Generative AI performance report (Search Console Help)
- Announcing web multimodal Search performance reporting in Search Console (Google Search Central, September 24, 2026)
- AI features and your website (Google Search Central)
- Featured snippets and your website (Google Search Central)
- URL Fragment Text Directives (WICG draft specification)
- Url Fragment exposed to Navigation Timing (Chromium issue 40136467)