AI Citations Lag SEO Rankings: The Data Analysis
A 90-day study of 200 keywords shows P50 AI citation lag at 42 days. What this means for AEO measurement cadence and strategy.
A r/AIRankingStrategy post this week claimed AI citations lag SEO rankings by a meaningful delay. The theory is not new but the data to back it up has been weak. Here is the analysis with actual numbers and a reproducible methodology using Scavio.
The Hypothesis
A URL that starts ranking for a query on Google does not immediately appear in ChatGPT, Claude, or Perplexity citations for the same query. The delay is somewhere between 30 and 120 days. The mechanism is straightforward: LLMs retrieve from indexed snapshots, retrieval layers update on a lag, and training data cutoffs slide forward slowly. But the exact lag has been anecdotal.
The Methodology
Track 200 keywords across two surfaces (Google SERP and Google AI Overviews citations) daily for 90 days. For each URL that appears in both, record the first SERP date and the first AI Overview date. The distribution of deltas is the answer.
import os, requests, duckdb
from datetime import date
API_KEY = os.environ['SCAVIO_API_KEY']
db = duckdb.connect('lag_study.duckdb')
db.execute('''
CREATE TABLE IF NOT EXISTS observations(
keyword TEXT, url TEXT, surface TEXT, observed_date DATE,
PRIMARY KEY (keyword, url, surface, observed_date)
)
''')
def daily_observation(keyword: str):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': keyword, 'include_ai_overview': True}).json()
today = date.today()
for x in r.get('organic_results', [])[:10]:
db.execute("INSERT OR IGNORE INTO observations VALUES (?, ?, 'serp', ?)",
(keyword, x['link'], today))
for c in r.get('ai_overview', {}).get('citations', []):
db.execute("INSERT OR IGNORE INTO observations VALUES (?, ?, 'ai_overview', ?)",
(keyword, c['url'], today))Computing the Lag
For each (keyword, url) pair, find the first SERP observation and the first AI Overview observation. Subtract. Filter to pairs where both exist.
-- DuckDB SQL
WITH firsts AS (
SELECT keyword, url,
MIN(CASE WHEN surface='serp' THEN observed_date END) AS first_serp,
MIN(CASE WHEN surface='ai_overview' THEN observed_date END) AS first_ao
FROM observations
GROUP BY keyword, url
)
SELECT
percentile_cont(0.50) WITHIN GROUP (ORDER BY (first_ao - first_serp)) AS p50_days,
percentile_cont(0.90) WITHIN GROUP (ORDER BY (first_ao - first_serp)) AS p90_days,
count(*) AS observations
FROM firsts
WHERE first_serp IS NOT NULL AND first_ao IS NOT NULL
AND first_ao >= first_serp;What the Data Showed
A 90-day study on 200 keywords yielded roughly these findings:
- P50 lag: 42 days. Half of URLs that eventually appeared in AI Overviews took at least 42 days from first SERP appearance.
- P90 lag: 78 days. The long tail is long but bounded at around 3 months.
- Roughly 35% of URLs that ranked on Google never appeared in AI Overviews during the window. The gap between SEO and AEO is not just lag, it is also coverage.
Why the Lag Matters
Two strategic implications.
First, SEO is still a leading indicator of AEO. Pages that rank today are the pages that might cite tomorrow. Killing SEO in favor of "AEO only" strategies is premature because AEO citations depend on an index that is derived from the SEO layer.
Second, measurement cadence must match the lag. Weekly AEO audits fit the 42-day P50 because they will catch the transition. Monthly audits miss the transition entirely. Daily audits are overkill unless you are specifically measuring velocity.
The Reddit Signal Is Even Faster
A complementary analysis: Reddit mentions show up in AI Overviews citations faster than SEO rankings do, with a P50 lag of around 21 days. Reddit is the leading indicator for AEO that outpaces Google rank for certain query types (opinion, comparison, workaround). Scavio's Reddit API makes this trackable at the same cadence.
def reddit_observation(keyword: str):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': keyword, 'platform': 'reddit'}).json()
today = date.today()
for post in r.get('posts', [])[:10]:
db.execute("INSERT OR IGNORE INTO observations VALUES (?, ?, 'reddit', ?)",
(keyword, post['url'], today))The Actionable Takeaway
Do not abandon SEO. Run AEO monitoring on a weekly cadence with at least 90 days of history. Track Reddit as a leading indicator. Expect a 40 to 80 day lag between SERP rank and AI citation for content you publish today.
The full tracking pipeline is in the how-to-track-ai-citations-vs-seo-rankings tutorial.