Free SEO Tools

CTR Calculator: Expected CTR by Position

Calculate click-through rate from clicks and impressions, or upload a Search Console export to find the queries earning fewer clicks than their position should.

CTR is clicks divided by impressions: 40 clicks from 2,000 impressions is a 2% CTR. Whether that is good depends on the position you rank at, so the Search Console mode compares each query with an expected CTR for its average position and ranks the gaps by the clicks you are missing.

Click-through rate calculator

Solve for

Result

2.00%

40 clicks ÷ 2,000 impressions × 100

CTR = clicks ÷ impressions × 100. In Search Console, an impression is a time your page appeared in someone’s search results, and CTR is worked out per query or page over the dates you choose.

See this for your own site, free: connect Search Console once and get every page missing clicks for its position, with the searches behind it.

Search Console mode: find queries below the expected CTR

Runs in your browser. Your file is read in this tab and never uploaded: nothing is sent to RankHive or anyone else.

In Search Console open Performance → Search results, pick a date range (three months gives most rows enough impressions), then Export → Download CSV. Upload the ZIP, or the Queries.csv or Pages.csv inside it.

Rows with fewer impressions are too noisy to judge.

Upload or paste an export to see the queries earning fewer clicks than their position usually gets.

Expected CTR by position

These defaults are assumptions, not measurements. They are round numbers chosen as a starting point. Published CTR studies disagree with each other by wide margins, and real CTR depends on the query, the device and what else is on the results page (ads, AI Overviews, maps, videos). Edit them, or compare against your own site’s median instead.

%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%

Three sums in the simple calculator

The top panel solves for one of three things. Choose CTR and it divides clicks by impressions: 40 clicks from 2,000 impressions is 2.00%, and the line under the answer shows the sum, “40 clicks ÷ 2,000 impressions × 100”. Choose Clicks and it multiplies impressions by a CTR: 2,000 impressions at 2.5% is 50 clicks. Choose Impressions needed and it divides clicks by a CTR and rounds up: 40 clicks at 2.5% needs 1,600 impressions.

The third sum is the one for planning. Say a page gets 8,000 impressions a month at a 3% CTR, which is 240 clicks, and you want 500. From the same impressions you would need a 6.25% CTR, more than the default table expects at position 5. At 3% you would need 16,667 impressions. The first asks for a better snippet, the second for more rankings.

Counts accept thousands separators (1,200), and the CTR takes a decimal point or comma (2.5 or 2,5). The CTR must be above 0 and at most 100, and clicks cannot exceed impressions.

How Search Console counts what you upload

An impression is counted when a link to your page appears on the page of results someone loaded. Google’s help page on impressions, position and clicks says an ordinary result does not need to be scrolled into view to count. Results inside carousels and expandable sections usually do. So a result at position 9 collects impressions from people who never scrolled that far, which is one reason CTR falls so steeply down the page.

Position is an average of the topmost position your site held each time it appeared. A row at 4.6 might be a page that sat at 3 on some days and 7 on others, or two of your pages taking turns.

The export holds at most 1,000 rows per table. On a bigger site, export in slices: filter to a folder, a country or a device, and export each slice. Queries that Google treats as too rare are anonymized and left out of the query table to protect searchers’ privacy, so the query rows usually add up to fewer clicks than the totals above the chart.

The CTR column in the export is rounded, so the tool ignores it and divides clicks by impressions itself. Rows with no impressions, or with more clicks than impressions, are skipped and counted in a note.

Getting the export into the tool

The tool reads the standard Performance export as it comes.

  1. 1.In Search Console, open Performance → Search results.
  2. 2.Set the date range. Three months gives most rows enough impressions to judge, and the report keeps 16 months.
  3. 3.Add any filters you want, such as Device: Mobile or a page folder. The export follows them.
  4. 4.Click Export → Download CSV. You get a ZIP file.
  5. 5.Upload the ZIP here, or open Queries.csv or Pages.csv from it and paste the contents into the box.

From a ZIP, the tool reads Queries.csv and Pages.csv, skips the other files, and opens on the queries; the File menu switches between them. Upload Dates.csv or Countries.csv on its own and it tells you so, rather than reading dates or countries as queries.

Exports from other locales work. Comma, semicolon and tab separators are all detected, and column names are recognized in English and several other languages, such as Klicks, Impresiones and Posizione. A five-column file with names it does not know is read in Search Console’s standard column order, and a note says so. If your Search Console runs in another language, the ZIP’s file names may not be Queries.csv and Pages.csv; pick the right file in the File menu, or upload that CSV on its own.

The file is read in this browser tab and never uploaded. The limit is 20 MB.

Where the expected CTR numbers come from

Each row is judged against an expected CTR for its position. By default that is a table of 20 numbers in the tool’s code. They are not taken from a study. The code marks them as assumptions, round numbers picked as a starting point with no source attached, and the page says so above the table.

Average positionDefault expected CTR
Position 130%
Position 216%
Position 310%
Position 47%
Position 55%
Position 64%
Position 73%
Position 82.5%
Position 92%
Position 101.5%
Positions 11 to 201% each

Positions between whole numbers are interpolated in a straight line. An average position of 2.5 expects 13%, halfway between 16% and 10%. Position 4.6 expects 5.8%, and 10.5 expects 1.25%. Rows past position 20 are not compared at all.

Why not use a published curve? Because published curves disagree. CTR studies use different data, years, countries, devices and query mixes, and their figures for the top result differ by wide margins. The results page moves the numbers too: ads, AI Overviews, map packs, videos and People also ask boxes push the first ordinary result down, and which appear depends on the query. Google publishes no expected CTR by position. Any single curve, this one included, is a rough average that will be wrong for many of your queries.

So treat the defaults as a filter, not a verdict. Edit any value in the Expected CTR by position panel and the results update at once; Reset brings the defaults back. Your edits are not saved, so note them if you settle on your own table.

Comparing against your own site instead

Set Compare against to “Your site’s median CTR at each position” and the tool builds a curve from your own export. For each whole position from 1 to 20, it takes every row whose average position rounds to that number and uses the median CTR of those rows. Each row counts once, however many impressions it has.

A position needs at least 5 rows before its median is used; rows at a position with fewer are not compared, and a note counts them. The Expected CTR panel then shows a “Your site” figure under each default value.

This mode does not interpolate. A row at 4.6 is compared with the median at position 5, and a row at 4.4 with the median at position 4.

Remember what a median means: about half the rows at each position sit below it by definition. In this mode the flagged rows are the weaker half of your own results, not proof of a fault, so lean on the missed-clicks order to pick the few worth your time.

Two things distort a site curve. Branded queries earn very high CTR at position 1, which raises that median and flags the non-branded queries around it. Filter your brand out before you export: add a Query filter, choose Custom (regex), set it to exclude matches, and enter your brand name and its common misspellings. And the curve is built from every row in the file, including rows under the impressions minimum, so a handful of tiny rows can move the median at positions with little data.

How missed clicks are worked out

For every row with enough impressions at position 20 or better, the tool compares the actual CTR with the expected one. If the actual CTR is lower, the row is flagged and its missed clicks are impressions × (expected CTR − actual CTR). That is the extra clicks the row would have earned over the export’s date range at the expected CTR.

Rows are sorted by missed clicks, highest first, with impressions breaking ties. That order matters more than the size of the CTR gap. A query at 0.5% instead of 2% on 300 impressions misses about 5 clicks. A query at 4% instead of 7% on 20,000 impressions misses 600. The second gap is smaller and worth far more.

The Minimum impressions field, 100 by default, keeps out rows too small to judge. At 40 impressions a single click moves CTR by 2.5 points. Raise the minimum on a large site to cut the noise; lower it on a small site if too few rows are left.

Four figures sum up the run: Rows read, Compared, Below expected and Missed clicks. A sentence under them accounts for rows not compared: unreadable, under the minimum, past position 20, or without a site median. The table lists the top 50 flagged rows; Show all lists the rest, and Download as CSV saves them all as below-expected-ctr.csv.

Missed clicks is an estimate built on whatever expected value you chose. Change the curve and it changes. Use it to rank rows against each other, not as a forecast of the traffic a rewrite will bring.

Worked example: a plumber’s query export

These values are illustrative, not real data. A plumbing company exported three months of queries and uploaded Queries.csv with the default curve and the 100-impression minimum. Six rows went in.

QueryClicksImpressionsPositionWhat the tool did
fix running toilet384,2004.6Flagged: 0.90% against 5.80%, 206 missed clicks
why does my toilet keep running126,00014.2Flagged: 0.20% against 1.00%, 48 missed clicks
toilet flapper replacement2109001.3Flagged: 23.33% against 25.80%, 22 missed clicks
hartley plumbing1403101.0Compared, not flagged: 45.16% against 30.00%
running toilet water bill91,30023.0Not compared: past position 20
toilet fill valve noise1603.1Not compared: under 100 impressions

The summary reads 6 rows read, 4 compared, 3 below expected and 276 missed clicks. The three flagged rows need three different responses.

Only the first is a snippet job. Under 1% at an average of 4.6 on 4,200 impressions is low against almost any curve you might pick, and the row holds three quarters of the missed clicks. The query is a task, so the title should promise the fix: something like “Running Toilet? How to Fix the Flapper or Fill Valve Yourself”. Search the query first, though. If an answer box already lists the steps, expect a smaller gain.

The second is flagged, but its fix is ranking. At 14.2 the page is mostly on page two, where a better title has few readers. Improve the answer on the page and link to it from related posts.

The third is close enough to leave. 23.33% against 25.80% at position 1.3 is well within the error of a round-number curve.

The branded row, at 45%, would lift the position 1 site median for every other query, so filter brand out before you switch baselines.

Why a flagged query underperforms: troubleshooting by symptom

A flag says a row earns fewer clicks than its position suggests, not why. Search the query in a private window, on the device that brings most impressions, before you change anything.

SymptomLikely causeWhat to check
Low CTR in the top three on a question queryThe answer shows on the results page, in an AI Overview, an answer box or People also ask, so fewer people need to click.If the answer is visible without a click, a new title will not recover much. Offer what the summary cannot: a checklist, a calculator, photos, local detail.
Low CTR on commercial queries onlyAds and shopping results sit above the ordinary results.Compare your title with the offers around it, and say what your page has that theirs do not.
Low CTR on “near me” and city queriesA map pack with business listings takes most of the clicks.Your Google Business Profile matters more here than the page title.
CTR fell while position heldThe shown title or description changed, through a Google rewrite or a plugin template, or a new feature appeared above you.Compare the title Google shows with the one you set, and check your SEO plugin’s title template for recent changes.
Good average position, poor CTRThe average hides a spread: half the impressions at 1 and half at 7 average 4, or two of your pages take turns.Filter Search Console to the query and open the Pages tab. If several of your URLs appear, choose one and point your internal links at it.
Low CTR mostly on phonesMore of the screen goes to ads and features, and less of the description shows.Filter by Device: Mobile, export again, and check the mobile preview in the title and meta description checker.

Fixing flagged pages in WordPress

Titles and descriptions belong to pages, not queries. When Queries.csv shows a problem, switch the File menu to Pages.csv, or filter Search Console to the query and open its Pages tab, to find the URL that earns the impressions. Then read that page’s flagged queries together. They show the words people typed and what they expected to find, which is what the new title should answer.

Look at Pages.csv for patterns too. If most posts in one category sit below expected, a shared title template is the likely cause, and one change fixes them all.

  1. 1.WordPress core: without an SEO plugin, the title tag is usually the post title plus the site name, and there is no meta description. Edit the post title, or add an SEO plugin.
  2. 2.Yoast SEO: for one page, edit SEO title and Meta description in the Yoast SEO panel of the editor. For a pattern across a post type, change the template under Yoast SEO → Settings → Content types.
  3. 3.Rank Math: for one page, open the Rank Math panel and click Edit Snippet. For a pattern, change the defaults under Rank Math SEO → Titles & Meta.
  4. 4.SEOPress: for one page, use the Titles settings tab of the SEO metabox. For a pattern, change the templates under SEO → Titles & Metas.
  5. 5.Theme: an older theme that writes its own title tag in header.php can override the plugin. View the page source after saving; if the title is not the one you set, the theme is the place to fix.

Change one page at a time, or one template at a time, so you can tell what worked. Clear the page cache after saving.

Measuring whether the change worked

Write down the date you published the change. Google has to recrawl the page before the new title can appear, and Search Console data usually runs a couple of days behind. Search the query yourself to see when the new title shows; count from that day, not the day you saved.

Compare equal periods. In the date picker, choose Compare, and set the weeks after the change against the same number of weeks before. Filter to the page and read the queries that were flagged.

Judge CTR only where position held steady. If the average moved from 4.6 to 3.2, CTR would rise anyway, and the comparison mixes two effects. As a rule of thumb, if position stayed within about half a place and CTR rose, the snippet did the work.

Give it enough impressions: a query with 300 a month needs several weeks before a few extra clicks mean anything. For seasonal queries, compare with the same weeks last year.

Then export a full period again and run it with the same curve and minimum, so missed clicks are comparable. A row that leaves the flagged list, or drops far down it, is the result you wanted.

When a low CTR is fine

A flag is a question, not an instruction. Leave the row alone in these cases.

  • The average position is past 10. The page is mostly on page two, and the job is ranking, not the snippet.
  • The query is not what the page is about. Clicks from the wrong searchers would bounce anyway.
  • The results page answers the question in full, and your page has nothing more to add.
  • The query names another brand or product.
  • The row barely clears the impressions minimum, and one or two clicks would close the gap.
  • The page ranks in the top three, and a better-known site or an ad above you takes the click whatever you write.

Rows above the expected CTR need no attention either. A high CTR at a low position is a hint that the page deserves to rank higher, and is often a good candidate for a content update or more internal links.

FAQ about the CTR Calculator

How do you calculate click-through rate?

Divide clicks by impressions and multiply by 100. 40 clicks from 2,000 impressions is a 2% CTR. Search Console works it out the same way for each query or page over the date range you choose.

What is a good CTR for SEO?

It depends mostly on position, then on the query and what else is on the results page. Compare each query with what its position usually earns rather than with one site-wide figure. Google publishes no benchmark, and published studies disagree widely, so your own site’s median at each position is the fairest yardstick once you have enough rows.

Where do the expected CTR values come from?

They are round numbers written into the tool as a starting point: 30% at position 1, 16% at 2, 10% at 3, down to 1% from position 11 to 20. They are assumptions, not measurements, and the page labels them that way. Edit them to fit your niche, or compare against your site’s own median.

Why does my export only have 1,000 rows?

Search Console exports at most 1,000 rows per table from the Performance report. To see more, export in slices with filters, such as one folder, one country or one device at a time, and run each file through the tool.

Is my Search Console file uploaded anywhere?

No. The file is read by JavaScript in your browser tab and is never sent to RankHive or anyone else. The simple calculator runs in the browser too.

Why does the tool show a different CTR from Search Console?

The export’s CTR column is rounded, so the tool recalculates CTR from clicks and impressions, which can differ in the second decimal place. Totals differ too: the query table leaves out anonymized queries, so its rows add up to less than the chart totals.

How long should I wait before judging a new title?

Wait until Google shows the new title, then collect at least as many weeks as you compare against, and more for low-traffic queries. Compare equal periods, filter to the page, and only trust a CTR change where average position held roughly steady.