How to build custom CTR curves

Published: August 6, 2026 | Author: Aubrey Yung

Follow aubreyyung.com as a preferred source on Google

Unless you are starting a new website, using the “industry standard” click-through rate (CTR) curves floating around the web doesn’t tell the correct story that is specific for your niche.

Your CTR-by-position relationship is shaped by various factors, such as brand strength, content types, the SERP features triggered around the queries, and audience's intent.

Therefore, when I work with new clients for creating a prioritised content plan and traffic forecast, I usually start with building a custom CTR curve.

This article walks through how I build my custom CTR curve with a ready-to-use Google Colab notebook and Google Sheets template.

What is a CTR curve?

A CTR curve plots expected click-through rate against average ranking position. It helps you understand: if a page moves from position 8 to position 5, how many more clicks should I expect?

However, if you just type “CTR curve” in Google and use whatever data is available, you are getting CTR curves that are built from aggregated, cross-industry data. As searcher behavior at each position differs by intent, an e-commerce site can have a vastly different CTR curve than a B2B SaaS, for example..

That’s why, a custom and segmented curve is more credible than industry benchmarks, since it's the site's own historical behavior rather than a number pulled from third-party data.

An example of custom CTR curve using Colab Notebook

Of course, if you are just starting out and have a fresh site, a generic curve is a fine sanity check.

Should I use query-level or page-Level data?

I use query and page level CTR for different purposes.

Query-level data gives the cleanest signal, because "position" genuinely reflects where that specific query ranked. This is the standard approach used in most published CTR studies. The downside is that query-level exports in GSC can be noisy - I noticed that my performance reports are sometimes filled with long-tail, one-off, and automated/bot-driven query strings that don't represent real searcher behavior at any kind of volume. So it’s best to exclude a query that doesn’t bring any click.

Page-level data, on the other hand, is a cleaner dataset, and it lets you segment by page type (blog post, product page, category page, etc.) to understand how different templates convert differently at the same position. This is more actionable for me when doing analysis.

How to build the custom CTR Curve

What You Need to Build a Custom CTR Curve:

  • Google Search Console access to the property to export performance data
  • A reasonable data volume.
  • (Optional) A way to identify page types, most simply by URL subfolder (e.g., /blog/, /products/, /guides/)

Google Sheets

Custom CTR curve in Google Sheets

This Google Sheets allows you to directly paste your queries data and have a clean CTR curve mapped:

  1. Paste your Queries export into the "Raw Data" tab, replacing the sample rows but keeping the header row and columns in place (Query, Clicks, Impressions, CTR, Position).
  2. The Position Bucket column (F) fills itself in automatically via a single ARRAYFORMULA — you don't need to drag anything down, even if you paste in more or fewer rows than before.
  3. Switch to the "CTR Curve" tab — the position-by-position table and chart update immediately, since every formula there references the Raw Data tab directly.

Google Colab

I build a custom CTR curve in Google Colab notebook for a more advanced analysis. In addition to a CTR curve, you can use the script to see:

  • Brand vs non-brand queries CTR
  • Page Types CTR
  • Optimization opportunity based on CTR gap

After copying the Colab Notebook:

  1. Upload your CSV export directly in the notebook (Query, Page, Clicks, Impressions, Position columns)
  2. Enter your brand terms as a simple list — the notebook flags each row as brand or non-brand
  3. Set your subfolder segments — the notebook extracts the first path segment from each URL and lets you map subfolders to readable segment names
  4. The notebook then aggregates to page level, builds position buckets, fits a curve per segment, and outputs:
    • A summary table (position, weighted CTR, impression volume) per segment
    • A comparison chart of all segments plotted together
    • A fitted curve formula per segment you can plug into a forecasting spreadsheet
    • A downloadable CSV of the final curve data

Pro Tips:
Remember to re-run the curve regularly - I usually do it on a yearly basis. But if there are major changes in Google SERPs, you can rerun it again.

How to use the custom CTR Curves in SEO Analysis

1. SEO forecasting and prioritization

This is what I find most useful when creating a custom CTR curve. When you need to collaborate with other teams, having strong data to back your work can help other teams understand the impact and prioritise the effort accordinly.

Simply saying optimizing the title will bring you more traffic is not as convincing as showing how much more money you can bring to the table. If you also have conversion data (goal completions, revenue, leads) tied to those pages, you can multiply the forecasted click gain by the page's conversion rate and average order value or lead value.

If you're deciding between ten possible optimization tasks, a forecast built on your own CTR curve lets you rank them by expected impact instead of gut feeling.

2. Identify optimization opportunities

This is what the opportunity score in the Colab notebook is built for. A page ranking well but sitting below its segment's expected CTR at that position is earning fewer clicks than pages like it typically do. This usually points to a weak title tag, an unappealing meta description, or a mismatch between what the page promises and what the searcher is looking for.

Sorting by estimated opportunity clicks (the CTR gap converted into click volume) rather than the CTR gap alone is what makes this actionable: a small CTR shortfall on a high-impression page is often worth fixing before a large shortfall on a page nobody sees. This turns "which pages should we rewrite titles for" from a guessing game into a ranked list.

3. Analyze what works on overachievers

With the same CTR opportunity scoring, you can also see which pages sitting above their segment's expected CTR at their position. Once you spot a pattern across several overachievers in the same segment, you can apply that insight to the underperformers you identified above, rather than rewriting titles from scratch based on intuition each time.

4. Track CTR change over time

As the SERPs are constantly changing, you should also re-run the CTR curve on a regular basis, and save each run's export. Tracking the changes can help you identify users behavior changes and its impact on the traffic.

For example, if your CTR curve for brand queries is trending down, it's worth investigating: a competitor bidding on your brand term in paid search, a negative review or PR issue surfacing near your listing, or a SERP feature (an AI Overview, a "People Also Ask" box) inserting itself above your branded result.

The non-branded curve tends to shift for different reasons. A broad SERP layout changes, such as AI Overview format, an expanded "People Also Ask" box, more shopping or video results crowding a query type, can push non-branded CTR down across many queries at once, not just one page.

If the drop shows up as the whole curve sinking rather than a handful of individual pages, then it's more likely a site-wide or industry-wide shift. And if the drop happens only across specific page types, then you can check whether there are new SERP features or are the intent shifted.

Related Post

Analytics

How to Use the Google Search Console API

This guide documents how I use Search Console API to be more flexible in accessing Google Search Console data, so I can easily replicate the setup in another computer