Metric · SEO

What is organic click-through rate, and how do you measure it in Metabase?

Organic CTR is clicks divided by impressions in organic search, from Google Search Console data. Unlike the generic CTR of ads and email, its dominant driver is a position you don't fully control on a page Google composes — so the metric only speaks clearly when read by position bucket, with branded queries separated out.

TL;DR — CTR falls off a cliff outside the top 3, so never average it across positions: bucket into 1–3, 4–10, and 11+. Watch CTR at stable position to catch what rankings can't show — SERP features and AI Overviews depress clicks without moving your rank — and strip branded queries before celebrating a high number.

What organic CTR measures

Within a position bucket, CTR measures how compelling your result is — title, snippet, URL, and rich-result markup competing for a searcher's glance. Across buckets it mostly measures position, which is why one blended number is uninterpretable: the top three results absorb the large majority of organic clicks, and CTR decays steeply with every slot after that. Bucketed, the metric isolates the thing you can actually fix with copy.

Increasingly, organic CTR also measures the SERP itself. Featured snippets, ad blocks, and AI Overviews answer or intercept queries above the organic results, and a growing share of searches end with no click at all. CTR sliding while position holds steady is the signature of that shift — a layout problem, not a ranking problem, and the reason the stable-position trend belongs on the dashboard.

What data does it need?

  • A gsc_performance_daily table with stat_date, query, page, clicks, impressions, ctr, and position, synced daily from the Search Console API.
  • A branded-query classification, so brand searches don't inflate the non-branded picture.
  • Optionally, SERP snapshots with serp_feature_type per keyword to attribute CTR shifts to layout changes.

SQL patterns

CTR by position bucketPostgreSQL
SELECT
  CASE
    WHEN position <= 3 THEN '1-3'
    WHEN position <= 10 THEN '4-10'
    ELSE '11+'
  END AS position_bucket,
  SUM(clicks) AS clicks,
  SUM(impressions) AS impressions,
  ROUND(
    100.0 * SUM(clicks) / NULLIF(SUM(impressions), 0), 2
  ) AS ctr_pct
FROM gsc_performance_daily
WHERE stat_date >= CURRENT_DATE - INTERVAL '3 months'
GROUP BY 1
ORDER BY 1;
Weekly CTR at stable (top 10) positions to spot SERP-layout effectsPostgreSQL
SELECT
  date_trunc('week', stat_date) AS week,
  ROUND(
    100.0 * SUM(clicks) / NULLIF(SUM(impressions), 0), 2
  ) AS ctr_pct,
  ROUND(
    SUM(position * impressions) / NULLIF(SUM(impressions), 0), 1
  ) AS avg_position,
  SUM(impressions) AS impressions
FROM gsc_performance_daily
WHERE position <= 10
  AND stat_date >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;

Pitfalls

Averaging CTR across positions.→ A blended 2.1% is the weighted result of a cliff-shaped curve — improving rankings can drag average CTR down as you gain impressions at lower positions for new queries. Compare CTR only within a position bucket, and trend each bucket against its own history.
Letting branded queries inflate the number.→ People searching your brand click your result at rates approaching navigation, not discovery. A rising blended CTR may just be brand growth. Split branded from non-branded before drawing any conclusion about titles, snippets, or content.
Reconciling query-level CTR with property totals.→ Search Console omits anonymized queries from query-level rows, so the grains never reconcile — and low-impression rows produce absurd CTRs from a handful of clicks. Trend each grain separately and require a minimum impression floor before ranking anything by CTR.
Diagnosing a CTR drop as a ranking drop.→ If clicks fell, check position first — but if position held and CTR fell, the SERP changed around you: a new snippet, ads block, or AI Overview is absorbing the clicks. The fixes differ completely (win the feature or target different queries vs. improve rankings), so make the stable-position check before assigning the work.

Where this metric applies

Metrics

Dashboards

Terms

FAQ

How is organic CTR different from regular click-through rate?
The formula is the same — clicks divided by impressions — but the generic click-through rate page covers ads and email, where you control the creative, the audience, and the placement. Organic CTR comes from Google Search Console, and its dominant driver is your position on a results page Google composes — so it can only be interpreted conditioned on position, and a change usually means a rank or SERP-layout change before it means a copy problem.
What is a good organic CTR?
Only per position bucket. Aggregate benchmarks are meaningless because CTR falls off a cliff outside the top three results: the first organic result typically draws several times the clicks of the fifth, and page two is close to zero. The honest evaluation is your CTR in the 1–3 bucket versus your own history in that bucket, and likewise for 4–10 — with branded queries separated out, since people searching your name click at rates no non-branded page ever reaches.
Can organic CTR fall while rankings hold?
Yes, and it's increasingly common: SERP features do it. A featured snippet, ads block, shopping carousel, or AI Overview inserted above your result pushes the same position 3 further down the page, and zero-click searches end without any result being clicked. Your rank is stable; your share of attention isn't. That's why the stable-position CTR trend is the diagnostic to watch — CTR sliding at constant position is a SERP-layout signal, not a content signal.
Why doesn't my query-level CTR match the property total?
Search Console omits anonymized queries — rare or privacy-filtered searches — from query-level rows, so summing query CTRs never reconciles with the property-level number, and pages with heavy long-tail traffic are most affected. Trend each grain against itself and don't mix them. The same caution applies to low-impression rows, where a handful of clicks swings CTR wildly: filter to a minimum impression count before ranking pages by CTR.
How do you track organic CTR in Metabase?
Sync Search Console daily rows into a SQL database, chart CTR by position bucket, and add a weekly CTR-at-stable-position trend to catch SERP-layout shifts. Join DataForSEO SERP snapshots to see which features appeared on your keywords, and pin everything to an organic search performance dashboard.