Table of Contents
Most SEO advice about click-through rate starts with a published "CTR by position" curve: position one gets roughly a quarter of all clicks, position two gets less, and so on down the page. Those curves are useful for a rough mental model, but they describe an aggregate of thousands of sites across every imaginable query type. They do not describe your site, your branded searches, your SERP features, or your audience's intent. When you use a generic curve to judge your own pages, you end up chasing the wrong opportunities.
The better approach is to build a CTR-by-position benchmark from your own Google Search Console data. Your account already contains everything you need: for every query and page, GSC reports impressions, clicks, CTR, and average position. With a little bucketing, you can calculate what a typical page on your site earns at each position range, then flag the pages that fall short of their own benchmark (the real opportunities) and the pages that beat it (the ones to protect).
This guide walks through why a personal CTR curve beats published averages, how position and CTR actually interact, how to export and bucket your data, and how to compute and act on your expected CTR per bucket. There is a worked example near the end and a steps list you can follow today.
Why your own CTR curve beats published averages
Published CTR-by-position studies are built by aggregating clickstream or sampled SERP data across a huge, diverse set of sites. That averaging hides everything that actually drives clicks on a given query. A handful of factors make your real CTR diverge sharply from any industry table:
- SERP features. Featured snippets, People Also Ask, image packs, video carousels, AI overviews, shopping units, and local packs all push organic results down the page and absorb clicks. A "position 3" result under a fat snippet block behaves nothing like a clean position 3 on a ten-blue-links page.
- Branded vs. non-branded intent. Branded queries routinely see CTRs far above any published curve because searchers already want you. If your data mixes brand and non-brand, your "average" is meaningless. Many people segment these out first; our guide to regex filters in Google Search Console shows how to split branded from non-branded cleanly.
- Query intent and type. Navigational, transactional, and informational queries pull very different CTRs even at identical positions. A how-to article ranking #2 and a product page ranking #2 are not comparable.
- Title and meta quality. Your own titles and descriptions are a variable the industry curve cannot account for. Improving them is the most direct CTR lever you control.
- Device and country mix. Mobile CTR distributions differ from desktop, and the position-to-clicks relationship shifts with the SERP layout on each device.
Because all of these vary by site, the only honest benchmark for "what should this page earn at this position?" is the one computed from the rest of your own site. That is the whole idea here: stop comparing your pages to the internet and start comparing them to each other.
How position and CTR interact
Average position in GSC is itself an average, weighted across every impression for that query or page over the date range you select. A page showing an average position of 4.2 was probably sometimes at 3, sometimes at 6, and occasionally on page two. That blurriness matters: a small change in average position near the top of page one can correspond to a large change in clicks, while movement within page two often changes very little. If average position confuses you, our average position explainer breaks down exactly how the metric is calculated.
The relationship between position and CTR is steep at the top and flat at the bottom. Moving from position 1 to 2 typically costs a meaningful share of clicks; moving from 15 to 12 usually changes almost nothing because so few people scroll that far. This is why a CTR-by-position benchmark needs buckets rather than a single number, and why you cannot judge a page's performance without knowing roughly where it ranks.
General CTR-by-position ranges (reference only)
The table below shows approximate, widely-cited ranges from published industry studies. Treat these as a sanity check, not a target. The numbers are approximate and vary enormously by study, year, and query type.
| Position | Approximate organic CTR (industry ranges) | | --- | --- | | 1 | ~25-35% | | 2 | ~12-18% | | 3 | ~8-12% | | 4 | ~5-8% | | 5 | ~4-6% | | 6-10 | ~2-4% | | 11-20 (page 2) | ~1-2% or less |
If your own position-1 pages average well below that range, you likely have a title/snippet problem or heavy SERP-feature competition. If they sit above it, you probably have strong branded demand. Either way, the point of the next sections is to replace this generic table with your own.
Exporting your query data with position and CTR
You can build the benchmark from the standard Performance report. Open Search results, set a meaningful date range (the last 3 months is a good default for stable averages), and enable all four metric columns: Clicks, Impressions, CTR, and Average position. If you need a refresher on the report itself, see our Google Search Console performance report guide.
A few practical export notes:
- Export by Page, by Query, or both. For a page-level benchmark, export the Pages tab. For finer analysis, export Queries and filter to a single page. Each row needs all four metrics.
- Use the API or a bulk export for scale. The UI export caps at 1,000 rows. For larger sites, the Search Console API or the BigQuery bulk export gives you every query/page combination, which makes your buckets far more reliable.
- Filter out noise first. Drop rows with very low impressions (say, under 30-50 in your window). CTR computed on a handful of impressions is statistically meaningless and will distort your bucket averages.
- Segment before you benchmark. Separate branded from non-branded, and ideally separate by device or country if your traffic is mixed. A benchmark is only as good as the homogeneity of the data behind it.
Bucketing by position
Because the position-to-CTR curve is steep then flat, group your rows into position buckets rather than treating every decimal of average position as distinct. A simple, effective bucketing scheme:
- Bucket 1: position 1 (the top spot, its own category)
- Bucket 2: positions 2-3 (rest of the visible top)
- Bucket 3: positions 4-10 (the rest of page one)
- Bucket 4: positions 11-20 (page two)
You can split further if you have the data volume (for example 2 and 3 separately), but four buckets are enough to act on and keep each bucket large enough to produce a stable average. Anything ranking past position 20 is usually a content or relevance problem rather than a CTR problem, so set it aside.
In a spreadsheet, add a "bucket" column with a formula that reads average position and returns the label. In Looker Studio, create a calculated field with a CASE WHEN expression on average position and use it as a dimension. Either way you are about to aggregate within each bucket.
Computing expected CTR per bucket
Within each bucket, compute a weighted average CTR, not a simple average of the per-row CTR values. Weighting by impressions prevents a tiny, weird query from swinging the benchmark. The formula is straightforward:
Expected CTR for a bucket = total clicks in the bucket / total impressions in the bucket
Do that for all four buckets and you have your personal CTR-by-position curve. This single set of four numbers is the benchmark you will measure every page against.
You may also want a median alongside the weighted mean, since a few high-CTR branded outliers can pull the mean up. If your mean and median diverge a lot, that is a strong signal you still have branded queries mixed in, or a couple of dominant pages skewing the bucket. If you want to chase those branded outliers separately, the striking distance keywords workflow pairs well with this analysis.
Finding under- and over-performers
With a per-bucket benchmark in hand, the analysis becomes simple subtraction. For every page (or query), look up its bucket, then compare its actual CTR to the bucket's expected CTR:
- CTR delta = actual CTR − bucket expected CTR
Sort by that delta.
Under-performers (negative delta) are your real opportunities. A page ranking at position 3 that earns half its bucket's expected CTR is leaving clicks on the table even though its ranking is fine. The fix is rarely "rank higher" and usually "earn more clicks at the rank you already have": rewrite the title to match intent, sharpen the meta description, add structured data, or target a SERP feature. Our guide on how to fix low CTR in Google Search Console covers those tactics in depth. Prioritize under-performers that also have high impressions, because closing the gap there yields the most incremental clicks.
Over-performers (positive delta) are pages to protect. A page beating its bucket benchmark is doing something right with its snippet, brand pull, or intent match. Note what it does well, avoid careless title rewrites that could undo it, and watch it for ranking erosion. These pages are also a template: copy their title and description patterns onto your under-performers.
To estimate the prize for any under-performer, multiply its impressions by the CTR gap:
Potential extra clicks = impressions × (bucket expected CTR − actual CTR)
That converts a vague "this could do better" into a ranked, click-weighted to-do list.
Worked example
Suppose you exported your Pages report for the last 90 days, filtered to non-branded, and dropped rows under 50 impressions. After bucketing and computing weighted CTR per bucket, your own benchmark comes out like this:
| Your bucket | Total impressions | Total clicks | Your expected CTR | | --- | --- | --- | --- | | Position 1 | 40,000 | 11,200 | 28.0% | | Positions 2-3 | 90,000 | 12,600 | 14.0% | | Positions 4-10 | 300,000 | 18,000 | 6.0% | | Positions 11-20 | 250,000 | 3,750 | 1.5% |
Now evaluate three pages against it:
- Page A ranks at average position 2.6 (bucket 2-3) with 20,000 impressions and a 7% CTR. Your bucket benchmark is 14%. Delta is −7 points. Potential extra clicks: 20,000 × (0.14 − 0.07) = 1,400 clicks. This is a top-priority title/snippet rewrite.
- Page B ranks at average position 5.5 (bucket 4-10) with 50,000 impressions and a 9% CTR. Benchmark is 6%. Delta is +3 points. This is an over-performer; study its snippet and protect it.
- Page C ranks at average position 14 (bucket 11-20) with 8,000 impressions and a 0.8% CTR. Benchmark is 1.5%. The gap is real but tiny in absolute clicks (about 56). At this depth, CTR work barely matters; the better move is improving rankings toward page one.
Notice how the generic industry table would have misled you. Page A's 7% CTR looks fine against the generic "position 2-3" range, so an industry curve would have hidden a 1,400-click opportunity. Your own benchmark, built on your own snippets and intent, exposed it.
Steps to build your benchmark
- Open the Performance report, set a 3-month range, and enable Clicks, Impressions, CTR, and Average position.
- Export the Pages tab (and Queries if you want query-level detail). Use the API or BigQuery bulk export if you exceed 1,000 rows.
- Filter out low-impression rows and segment branded vs. non-branded (and device/country if mixed).
- Add a bucket column: position 1, 2-3, 4-10, 11-20.
- For each bucket, compute weighted CTR = total clicks / total impressions. That is your benchmark.
- For each page, compute CTR delta = actual CTR − bucket benchmark, and potential extra clicks = impressions × the gap.
- Sort under-performers by potential extra clicks and work the top of the list first.
- Log over-performers, protect them, and reuse their title/snippet patterns.
- Re-run monthly so your benchmark tracks SERP-layout changes over time.
A spreadsheet handles all of this with SUMIF and a CASE/IF bucket column. If you prefer a live view, Looker Studio connected to your GSC property lets you add a calculated bucket dimension and chart CTR by bucket, refreshed automatically. For other tools that speed up this kind of analysis, see our roundup of the best Google Search Console tools for 2026.
If you would rather skip the spreadsheet entirely, Search Console Tools connects to your property with Google OAuth and benchmarks your CTR by position automatically, flagging under- and over-performers and turning the gaps into prioritized content briefs. Try it free and let it build your personal CTR curve for you.
Frequently Asked Questions
What is a good CTR by position in Google Search Console?
There is no single "good" number, because it depends on your query mix, brand strength, and the SERP features competing for clicks. As an approximate industry reference, position 1 often sees around 25-35% and it declines steeply from there, but the only benchmark that truly matters is the weighted CTR your own pages earn at each position bucket. Compare each page to that personal benchmark, not to a generic table.
Why is my actual CTR lower than the published average CTR by position?
Published averages aggregate thousands of diverse sites, so they rarely match any individual property. SERP features like featured snippets, People Also Ask, and AI overviews push your result down and absorb clicks, while a weak title or meta description, non-branded intent, or a mobile-heavy audience can all lower your CTR at a given position. Building your own benchmark removes the false comparison.
How do I export CTR and position data from Google Search Console?
Open the Performance (Search results) report, set your date range, and enable the Clicks, Impressions, CTR, and Average position columns. Export the Pages or Queries tab from the UI for up to 1,000 rows, or use the Search Console API or BigQuery bulk export for larger sites that need every query and page combination.
Should I use a simple average or a weighted average for each bucket?
Use a weighted average: total clicks in the bucket divided by total impressions in the bucket. A simple average of per-row CTR values lets tiny, low-impression queries distort the benchmark. Looking at the median alongside the weighted mean also helps you spot when branded outliers are still skewing the numbers.
How do I find pages that are underperforming their position?
Compute each page's CTR delta as its actual CTR minus its bucket's expected CTR, then estimate the prize as impressions multiplied by that gap. Negative deltas with high impressions are your biggest opportunities, and they usually call for a better title, meta description, or structured data rather than a higher ranking. Pages with positive deltas are over-performers worth protecting and copying.
How often should I rebuild my CTR-by-position benchmark?
Monthly is a sensible cadence for most sites, since SERP layouts, seasonality, and your own content changes shift the curve over time. If you ship a lot of new pages or operate in a fast-moving niche, refresh more often. Rebuilding regularly also lets you confirm that title and snippet edits actually moved CTR toward or past the benchmark.
Run a Free AI Citation Audit
Are you in the AI Overview? Get a free report showing how often ChatGPT, Claude, and Gemini cite your brand, plus the 3 blockers preventing your discovery in 2026.
No spam. 1-click unsubscribe. Join 1,200+ SEO teams managing the GEO pivot.