Skip to main content
Technical Tracking

Tracking Google AI Overviews: What opi and ved Can't Tell You

By , 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 as opi and ved never leave google.com, and opi=89978449 isn’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’s utm_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:

  1. Open DevTools on a Google results page, go to the Network tab and tick Preserve log.
  2. Click any organic result.
  3. Select the first document request to the destination and open Headers → Request Headers. Referer reads https://www.google.com/.
  4. In the destination’s console, document.referrer returns 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.

  • ved encodes 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.
  • opi is a page-level value. The results page script appends it from a global setting (search the page source for kOPI) to URLs it builds, whichever result you click. opi=89978449 has 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?

SignalWhat it tells youWhereCaveat
Generative AI performance reportImpressions of your pages in AI Overviews and AI ModeSearch ConsoleImpressions only: no clicks, no queries
Performance report, Web search typeClicks and impressions from web results, AI features includedSearch ConsoleAI feature clicks aren’t broken out
Text-fragment landingsVisits that landed on a highlighted passage (#:~:text=)A GA4 event you addFeatured snippets use them too; may stop working
ChatGPT’s UTM tagVisits from links cited in ChatGPTGA4 session sourceChatGPT only
Other assistants’ referrersVisits from assistants that send a referrer, such as Perplexity or GeminiGA4 Traffic acquisitionConfirm 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:

  1. 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)
      }
    }
  2. Create a GA4 Event tag with the event name text_fragment_landing and an event parameter fragment_text set to {{JS - Text fragment}}. Fire it on a Page View trigger with the condition JS - Text fragment does not equal undefined. 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.

  3. In GA4, register fragment_text as 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

  1. Introducing Search Generative AI performance reports in Search Console (Google Search Central, June 3, 2026)
  2. Generative AI performance report (Search Console Help)
  3. Announcing web multimodal Search performance reporting in Search Console (Google Search Central, September 24, 2026)
  4. AI features and your website (Google Search Central)
  5. Featured snippets and your website (Google Search Central)
  6. URL Fragment Text Directives (WICG draft specification)
  7. Url Fragment exposed to Navigation Timing (Chromium issue 40136467)