Track SERP feature changes, not just rankings
A keyword can hold the same rank for months while the page around it changes completely — an AI Overview appears, the local pack vanishes, a featured snippet gets awarded to a competitor. Position-only tracking sees none of it.
Presence as a metric
Every Google Search response returns each SERP block as a typed field — aiOverview, localResults, peopleAlsoAsk, knowledgePanel, ads, videos, images. Track presence as booleans per keyword per market:
res = client.monitor.google(prompt=kw, country="US")
result = res["result"]
features = {
"aio": bool(result.get("aiOverview")),
"local_pack": bool(result.get("localResults")),
"paa": bool(result.get("peopleAlsoAsk")),
"knowledge_panel": bool(result.get("knowledgePanel")),
"ads": len(result.get("ads") or []),
}
The transitions that matter
- AIO appears on your keyword → your organic position just dropped below a generated answer; check whether you’re cited inside it
- Local pack appears → the keyword went local; a national page can’t win it, a location page can
- PAA grows → new question targets for content — the PAA mining workflow
- Ads count jumps → commercial intent confirmed; expect organic CTR to fall even at the same rank
- Featured snippet flips owner → the format that won it is the format to match
The setup
Keyword × market matrix as an async batch, weekly or daily for money terms. Store the feature booleans next to organic positions; alert on transitions, not values. A month of this data answers “is the SERP getting more crowded” better than any position chart.
Field shapes on the Google Search engine page and in the reference.