◉GEMINI LABJP
●VEO 3.1 — The three veo-3.1 preview models shut down Oct 22, 13 days left. Move to gemini-omni-1.1-flash●OMNI — gemini-omni-flash-preview also shuts down Oct 22. Check the deprecations table●NANO 2.1 — gemini-nano-banana-2.1 is GA. gemini-3.1-flash-image is deprecated with no shutdown date yet●Q&A — Users report Gemini CLI returns a 400 error once more than 128 tools are loaded●TTS/LIVE — 2.5-era audio and TTS previews shut down Nov 17, 39 days left●NEW — Free tier shown but 429 "limit: 0"? What to check in the first hour●VEO 3.1 — The three veo-3.1 preview models shut down Oct 22, 13 days left. Move to gemini-omni-1.1-flash●OMNI — gemini-omni-flash-preview also shuts down Oct 22. Check the deprecations table●NANO 2.1 — gemini-nano-banana-2.1 is GA. gemini-3.1-flash-image is deprecated with no shutdown date yet●Q&A — Users report Gemini CLI returns a 400 error once more than 128 tools are loaded●TTS/LIVE — 2.5-era audio and TTS previews shut down Nov 17, 39 days left●NEW — Free tier shown but 429 "limit: 0"? What to check in the first hour
Articles/Advanced
⬡ Advanced/2026-08-25Advanced

Rebuilding the CTR Denominator After AI Search Fans Out Your Queries

My top five queries by impressions all had zero clicks, and four of them were not phrases a person would type. Here is how I rebuilt the denominator and where I let Gemini make the call.

gemini116ai-modesearch-consoleanalyticsstructured-output28

✦ Premium Article

I sorted last week's search data by impressions and looked at the top of the list. The first five rows all had zero clicks.

My first instinct was that the titles were weak. Decent positions, nobody clicking — that usually points at the headline.

Then I actually read the queries.

rork.com core business features target audience — I could not picture a person typing that into a search box.

The five queries sitting at the top

The site in question is one I run alongside my work as an indie developer: a technical site covering app development tooling. Total impressions for the period were 41,700.

QueryImpressionsClicks
rork.com core business features target audience1,3710
rork max swiftui features and ai capabilities1,2820
onspace vs rork for complex app logic1,1490
expo audio continue playing screen locked react native 20251,0230
rork max swiftui features and native app generation6240

That is 5,449 impressions, or 13.1% of the total, with zero clicks across the board.

Three of the first four read wrong. core business features target audience is a stack of attribute nouns. features and ai capabilities follows the same shape. onspace vs rork for complex app logic even carries its own comparison axis inside the phrase.

People do not search that way. A person types rork max pricing — short, only the words they need.

These are sub-queries that an AI search layer generated internally. One question comes in, and the system decomposes it into somewhere between eight and sixteen retrieval queries to assemble an answer. The behaviour is documented as query fan-out, and Google describes how impressions are counted on AI-powered search surfaces — but the report does not separate them from human searches for you.

So my CTR denominator contains impressions that structurally cannot produce a click.

Never put click count in the classifier

I nearly walked into the obvious trap here.

"Zero clicks plus high impressions" would make a tidy rule. All five rows above satisfy it.

But apply that rule and CTR rises the moment you exclude anything. You are removing exactly the impressions that contribute nothing to the numerator. That is not an improvement; it is arithmetic engineered to flatter itself.

I have built metrics like that before — the kind that always move in the direction you were hoping for. The danger is not the first wrong number. It is that once a metric starts agreeing with you, you stop checking it.

So I decided the classifier would ignore clicks entirely and look only at the shape of the query string. If a high-click query ever gets flagged as synthetic, that tells me the rule is wrong, and I want that failure mode to stay visible.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦You will be able to tell, from your own data, whether a rise in impressions came from readers or from machine-generated sub-queries
✦You will know when a falling CTR calls for a rewrite and when it calls for a look at what is sitting in the denominator
✦You will be able to report effective CTR honestly, knowing the exclusion policy alone moves it from 0.73% to 0.81%
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $15 for lifetime access
View Membership →

Related Articles

⬡ Advanced2026-08-24
A Provenance Gate That Never Asks Gemini to Name the Country
How I rebuilt the pre-publish provenance check for a ukiyo-e wallpaper app, moving from asking the model to name a country to asking it only to list the marks physically present on the paper. Includes the working code, the decision table that lives on my side, and why an abstain path had to come before accuracy.
⬡ Advanced2026-04-27
Self-Healing Architecture for Gemini Computer Use — Production Patterns That Keep Browser Automation Alive Beyond Day Three
Gemini Computer Use looks magical in demos but breaks daily in production: vanishing elements, surprise modals, network jitter, off-by-four-pixel clicks. This guide builds a five-layer self-healing architecture in Python that classifies failures and recovers them automatically, with working code you can drop into your agent loop today.
⬡ Advanced2026-04-25
Building Self-Critiquing Agents with Gemini API: A Production-Ready Guide to Reflection and Critic-Refiner Patterns
A production-grade walkthrough of Reflection and Critic-Refiner patterns with Gemini 3 Pro and 3.5 Flash-Lite. Covers implementation, cost guards, over-correction defenses, and monitoring signals from real deployments.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links