You do not need a keyword tool to find your fastest SEO wins. The pages that already appear in Google a lot but get few clicks are the cheapest to improve: a better title or description costs an hour, not a new article. This post gives you a script that reads a Search Console export and ranks those pages.
The numbers in the output below come from invented sample data so you can see the logic. They are not real traffic and not a benchmark. The definitions come from Google's Performance report help page, which I read on 2026-10-16. The thresholds and the flag rule are my own heuristics.
What do the Search Console columns mean?
From Google's help page:
- Clicks: the number of times a user clicked your site from Google Search results.
- Impressions: how many times your site appeared in Search results.
- CTR: the click count divided by the impression count.
- Average position: in the table, the average for that URL or grouping.
Two gotchas from the same page:
- Aggregation differs. Data grouped by Pages is aggregated by page, while the chart is aggregated by property, so totals can differ.
- Zeros in exports. Values shown as
~or-in the interface "will be zeros in the downloaded data". A page with zeros may be missing data, not truly zero. The script drops pages under 500 impressions, which also removes these rows.
Also, the newest data can be preliminary and may change within hours, so avoid judging yesterday.
How do you get the data?
In the Performance report, open the Pages tab, set a date range (a full 28 days or longer avoids weekday swings), and use the export button to download the table as CSV. You need four columns: page, clicks, impressions, position. Column names differ by export format and language, so rename them in the script if needed.
How does the script decide which pages to flag?
It does three things:
- Drops pages under 500 impressions.
- Groups the rest into position bands: top 5, 6 to 10, and 11 or lower. CTR depends heavily on position, so comparing a position 3 page with a position 9 page would mislead.
- Compares each page's CTR with the median CTR in its band and flags pages below 60% of that median.
def band(pos):
return "top5" if pos < 5 else "6-10" if pos < 10 else "11+"
med = {}
for b in {r["band"] for r in rows}:
med[b] = statistics.median(r["ctr"] for r in rows if r["band"] == b)
for r in sorted(rows, key=lambda r: -r["imp"]):
m = med[r["band"]]
flag = "REWRITE TITLE/DESC" if r["ctr"] < 0.6 * m else ""
The 60% rule is arbitrary. Loosen or tighten it and see how many pages you can realistically rewrite in a week.
What does the output look like?
Run on eight invented rows (two dropped for low impressions):
page impr pos ctr peer median flag
/blog/a 4000 3.1 3.0% 1.4%
/blog/b 3500 3.4 0.4% 1.4% REWRITE TITLE/DESC
/blog/c 2500 3.0 2.4% 1.4%
/blog/h 2200 3.2 0.4% 1.4% REWRITE TITLE/DESC
/blog/d 1800 9.2 0.2% 1.0% REWRITE TITLE/DESC
/blog/e 1700 9.5 1.8% 1.0%
Pages b and h rank at about position 3 but get a fraction of their peers' clicks. Those are the first candidates. Page d sits near position 9 with a low CTR, which is less surprising, but still worth a look at the snippet.
What do you do with a flagged page?
Work through these in order, cheapest first:
- Search the main query yourself and look at the result. Is your title cut off, generic, or a mismatch with what people want?
- Check what sits above you. If an answer box or other feature takes the top of the page, a low CTR may be the layout, not your title. Google's help pages I read do not quantify this effect, so I give no number.
- Rewrite the title to promise the specific outcome, and keep the keyword near the front. Rewrite the description to answer the question in the first sentence.
- Make the page deliver the answer early, since a better snippet that leads to a slow answer will not hold readers. The answer-first rewrite prompts help here.
- Record the change and the date. Compare the same page over an equal period afterwards. Do not change five things at once.
If you want an LLM to draft titles, give it the query, the current title and the page text, and review every output. The metadata generation pipeline includes a length and format checker you can reuse.
What can go wrong with this analysis?
- Small samples. Under a few hundred impressions, one click moves CTR by whole percentage points.
- Mixed queries. One page can rank for a navigational query where nobody needs to click and for a research query where everybody does. The Pages table averages them. Use the Queries tab for the page to look closer.
- Seasonality and news. A spike in impressions from a short event lowers CTR for reasons unrelated to your title.
- Changing search results. Layouts and AI features change over time. Google says AI feature traffic is included in overall Search Console data under the Web search type, so you cannot isolate it here. The AEO checklist covers what that page says.
Pair this with the AI referral tracking routine so you see both Google clicks and assistant referrals each month.
What I could not verify
- A reliable CTR benchmark by position. I found none from Google and give none.
- How many days of data Search Console keeps. The page I read did not state a retention period.
- Whether title rewrites move CTR for your site. That is what the before-and-after comparison is for.



