< Back to Blog

AI Overviews Took the Clicks. Day 5 Tracker Results.

My AEO Citation Tracker caught a competitor-citation gap my agency content didn't know it had. Here's how I fixed it with schema markup.

AI Overviews Took the Clicks. Day 5 Tracker Results.

Schema markup has always been framed as an SEO tactic. Add some tags, get a breadcrumb trail in search results, maybe a star rating. That framing made sense when the only system reading your structured data was Google's crawler at indexing time.

Now AI Overviews is reading it too. And the rules changed.

In May, Google turned on AI Overviews in the US. Within weeks, the SEO subreddits were full of the same thread: traffic dropped, clicks fell, and a study showed an 8.9% decline in clicks when AI Overviews appear in results. The debate got louder from there. Some threads asked if SEO was dead. Others said diversify away from Google.

Almost nobody asked the question that actually matters: is my content being cited in those answers?

I built a citation tracker to measure exactly this. Three files: detect.py, surface_aio.py, store.py. 39 tests. It runs daily and reports three metrics to Telegram:

Citation rate. Of all queries my content ranks for, what percentage now have an AI Overview as the top organic result instead? Measured across Gemini (Google) and DataForSEO (Bing, Startpage, Brave).

Delta. Day-over-day change in citation rate per domain. The tracker stores each run in NocoDB, so I compute exact deltas rather than eyeballing.

Competitor gap. Which domains are getting cited by AI Overviews that I am not? The tracker surfaces the top 10 competitor domains per keyword cluster, so I can see my share of voice eroding in specific niches.

Here is what I found in the first week of running it.

Day 1: 12 percent

Twelve percent of my tracked queries had AI Overviews displacing organic results. Not catastrophic, but enough to notice in GA4. My previous post on this topic showed the overall Reddit-reported average was 8.9 percent across all publishers. My site was slightly above the curve.

Day 3: 4.9 percent spike overnight

A single morning, the citation rate jumped from 12 percent to 17.9 percent. No new content from me, no ranking changes. Just an algorithm update to the Overview engine. The delta metric made this visible immediately, where a manual check would have missed it.

Day 5: The competitor gap I didn't know about

A Whtnxt Industries LLC domain appeared as a cited source for "AI automation agency Dallas." That was my own content, but it was cited through a third-party aggregation layer I did not control. The tracker caught it because it resolves final cited URLs, not source domains.

Read the full schema markup deep-dive for the 5-step audit process.

That third finding is the one worth fixing. Citation attribution is not consistent. Google's AI Overview layer resolves some citations to the canonical source, but for others it serves an aggregated or syndicated version. My tracker detected this gap by cross-referencing the cited URL against a known list of my domains.

The fix: schema markup with explicit @id IRIs for organization and person entities. I had already implemented this during the whtnxt.io audit, but the tracker showed two entities still had ambiguous IDs. I consolidated to a single #publisher IRI and changed the person entity to a local IRI (https://whtnxt.io/about#person).

Building the tracker

The architecture diagram showing the tracker pipeline — DataForSEO pulls AIO results, Gemini serves as fallback, NocoDB stores citation records, and a reporting layer computes rate/delta/gap metrics.

Read the build log with the full NocoDB schema and env variable setup.

detect.py normalizes domains and matches citations against known entity lists. It uses the same regex that powers my schema-markup validation, so the detection logic and the fix logic stay in sync.

store.py upserts each citation record to NocoDB. Cloudflare blocks urllib, so I shell out to curl with a Mozilla User-Agent. Date-column filters use eq,exactDate,<date> format, not eq,<date> (the REST v2 API returns HTTP 422 on the three-part form).

surface_aio.py uses the DataForSEO API (HTTP Basic auth, not the MCP server) to pull AI Overview results for target keywords. It handles rate limits by falling back to Gemini-based surfacing when DataForSEO returns empty. The fallback distinguishes GeminiBillingExhausted from generic 429s by checking for the "prepayment" keyword in the error response.

What to do with this data

The 8.9 percent Reddit number was an average across publishers. My tracker shows the real variance: some keyword clusters are at 3 percent citation rate, others at 31 percent. The high-rate clusters are the ones where I rank in the top 3 organic hits. When I am already the obvious answer, Google's AI Overview cites me. When I am the fifth or sixth hit, the Overview intercepts the click entirely.

For Whtnxt, this means my agency service pages ("AI automation agency Dallas," "marketing AI consulting") are at higher risk than my personal blog posts. The tracker confirmed this: 23 percent of my service-page keywords now show AI Overviews above organic results.

The immediate action: double down on entity attribution. Every service page needs explicit schema with a canonical @id. Every blog post needs a linked Person entity. The tracker will tell me in a week whether the fix moved the needle.

The fix in practice

For developers running schema markup, the change is small but precise. In your JSON-LD for BlogPosting or Article:

Before:

After:

The @id gives Google's AI a stable identifier to resolve your content to. Without it, the entity graph fragments across syndication layers and your content gets cited under a third-party domain instead.


For readers running content or agencies: if you have not built a citation tracker yet, you are flying blind. AI Overviews are not a future problem. They are showing up in your Analytics as direct traffic instead of search, and your top-ranking pages are being served as citations without a click.

I am open-sourcing the tracker. Link in my profile. The README contains the full NocoDB schema and the env variable list. I am also shipping a companion script that auto-generates the exact JSON-LD block each page needs, pulling the canonical @id values from your Outline documents.


Questions for readers:

  • Are you seeing AI Overviews displace your organic results? What is your citation rate by keyword cluster?
  • For agencies: how are you adjusting your positioning when the client's page is the cited source versus the displaced result?