Export the Performance report by page, group pages by average position, and compare each page's CTR with the median for its position bucket on your own site. Pages far below that median, with many impressions, are the highest-value rewrites. Change the title, wait for the data to settle, and compare against the same period before, not against a published CTR curve.

Key takeaways

  • Benchmark against your own site. CTR depends on the query, the SERP features and the brand, so a generic curve tells you little about a specific page.
  • Rank by missed clicks, not by CTR alone. A page with 3,000 impressions at 1% CTR matters more than one with 40 impressions at 0%.
  • Google may not show your title. Google documents that it can generate title links from the title element, headings and other page content, so a rewrite is a suggestion, not a command.
  • There is no character limit, but there is truncation. Google documents that long titles may be truncated in results; the cut-off depends on pixel width, not a character count.
  • Change one thing and measure. Rewrite titles on a small batch, keep the rest as a control, and give Search Console enough days to show a difference.

What Google documents

From Google's documentation on title links.
StatementStatus
Title links are generated from the title element, headings, and other content; the title element is the main sourceDocumented
Google may show a different title than the one you wroteDocumented
No length limit on the title element, but long titles may be truncatedDocumented
A specific character count is safeNot documented
Rewriting a title will raise CTRNot guaranteed

Source: Google's title link documentation. The practical consequence is that you can only judge a rewrite by what happens next.

Finding the outliers

In Search Console, Performance, Pages, export the table (columns Page, Clicks, Impressions, CTR, Position). The script groups pages by whole position, takes each group's median CTR, and lists pages below half of their group's median, ordered by the clicks they are missing:

import csv, sys, statistics

# Input: Search Console Performance > Pages export with columns Page, Clicks, Impressions, CTR, Position
MIN_IMPRESSIONS = 200
rows = []
for r in csv.DictReader(open(sys.argv[1], encoding='utf-8-sig')):
    imp = int(r['Impressions'].replace(',', ''))
    if imp < MIN_IMPRESSIONS:
        continue
    clicks = int(r['Clicks'].replace(',', ''))
    rows.append((r['Page'] if 'Page' in r else r['Top pages'], imp, clicks, clicks / imp, float(r['Position'])))

buckets = {}
for p, imp, c, ctr, pos in rows:
    buckets.setdefault(min(int(pos), 10), []).append(ctr)
med = {b: statistics.median(v) for b, v in buckets.items()}
print('Median CTR by position (pages with >=%d impressions):' % MIN_IMPRESSIONS)
for b in sorted(med):
    print('  position %s%s: %.1f%%  (%d pages)' % (b, '+' if b == 10 else '', med[b] * 100, len(buckets[b])))
print('\nBelow half of their position median, most missed clicks first:')
out = []
for p, imp, c, ctr, pos in rows:
    m = med[min(int(pos), 10)]
    if ctr < m / 2:
        out.append((imp * (m - ctr), p, imp, ctr, pos, m))
for missed, p, imp, ctr, pos, m in sorted(out, reverse=True):
    print('  ~%d missed clicks  %s  (pos %.1f, CTR %.1f%% vs median %.1f%%, %d impressions)' % (missed, p, pos, ctr * 100, m * 100, imp))

The script on test data

I built a synthetic export of 60 pages with CTRs drawn around a typical decay by position, then made three of them one fifth as clickable. The script found all three, in order of missed clicks, and flagged nothing else. That tells you the logic works; it does not tell you anything about real search behaviour, because the data is invented.

Title lengths on this site

Checking this site's own <title> tags on 30 October 2026: of 57 indexable pages, the median was 60 characters, 25 were over 60 and 12 were over 65, the longest at 75. Because truncation depends on pixel width, those counts show which titles were at risk of being cut, not which ones were. I shortened all 12 that day; the longest title is now 64 characters. I did that without click data from before, so I have no measured effect to report. The old and new titles are in the git history, and the first thing I will compare, once Search Console has enough days of data, is those 12 pages against the pages I did not change.

Rewriting a title

  1. Search the query in Google and read what the titles above you promise. If everyone says "guide" and you say "guide", you look the same.
  2. Lead with what the reader gets: the symptom they typed, the fix, or the measured result.
  3. Keep the key phrase early, since the end is what gets cut.
  4. Keep it honest. A title that overpromises can win a click and lose the reader, and Google may swap it for a heading anyway.
  5. Record the date and the old title so you can compare the same page before and after, over equal-length periods.

What this does not cover

Rewrites are experiments. CTR also moves with position changes, seasonality, SERP features and brand searches, none of which this method separates out. The script uses average position, which blends many queries per page, so a page can look like an outlier because its mix of queries differs. The test data is synthetic. The site audit counts characters, not pixels.

Badri Dutta

Software engineer · 8 years technical SEO

Written after auditing this site's own title lengths and building the outlier script on test data. It deliberately avoids quoting a CTR curve.

Full background →