{
  "slug": "weighted-ctr",
  "name": "Weighted CTR at a position bucket",
  "aliases": [
    "Bucket CTR",
    "Pooled CTR"
  ],
  "definition": "The click-through rate of a whole results-page position, pooled across every keyword-and-page row that landed at that position: total clicks over total impressions.",
  "category": "Content opportunity",
  "type": "rate",
  "unit": "share of impressions that clicked (0 to 1)",
  "direction": "higher-better",
  "verification": "verified",
  "calculation": "Each row's average position is rounded to an integer and clamped to the range 1 to 20. Rows are grouped by branded flag × intent × device × bucket, and the bucket's rate is SUM(clicks) / SUM(impressions), never the mean of the per-row rates, which would let a two-impression row weigh as much as a two-million-impression one.",
  "numerator": "Clicks summed across the bucket's rows",
  "denominator": "Impressions summed across the bucket's rows",
  "aggregation": "Recompute from the summed columns at every level. A mean of bucket rates is not a curve.",
  "grain": "One position bucket inside one branded × intent × device cell, for the fitted window.",
  "dimensions": [
    "position bucket",
    "brand",
    "intent",
    "device"
  ],
  "requiredFilters": [
    "date range"
  ],
  "sources": [
    "search-console"
  ],
  "reports": [
    "ctr-opportunity-report"
  ],
  "skills": [
    "ctr-opportunity-audit",
    "striking-distance-sprint",
    "content-decay-refresh"
  ],
  "verbs": [
    "ctr_curve_model"
  ],
  "rungs": [
    "R2"
  ],
  "levers": [
    "L3"
  ],
  "questions": [
    "What CTR do we actually get at position 5?",
    "How does our click-through rate fall off by position?",
    "Is branded CTR different from non-branded at the same position?"
  ],
  "interpretation": "The raw observed shape of this site's own curve, before any smoothing. It is where the branded and non-branded gap becomes visible, which is the reason the model refuses to emit one blended curve for the whole site.",
  "caveats": [
    "Only positions 1 through 20 are bucketed; anything deeper is clamped into the last bucket rather than fitted.",
    "Rows without positive impressions or without a position are dropped before bucketing rather than counted as zero.",
    "The window is pinned to organic web search, so image, video and news rows never enter the fit.",
    "A bucket's rate is only as reliable as the number of rows behind it, the support count and its low-confidence flag travel with each bucket."
  ],
  "freshness": "1 to 2 days behind, Google's own reporting lag. Any answer touching the last 48 hours says so on the card.",
  "failureModes": [
    "Averaging per-row CTRs into a bucket and getting a curve dominated by tiny rows.",
    "Reading one blended curve across branded and non-branded demand."
  ],
  "notSameAs": [
    {
      "slug": "ctr",
      "why": "Search Console's average CTR is a warehouse measure returned on a 0 to 100 scale for whatever slice was queried; weighted CTR is computed in our own compute pass as a 0 to 1 fraction for one position bucket inside one segment cell. Same arithmetic, different scale and a completely different grain."
    }
  ],
  "related": [
    "expected-ctr",
    "actual-ctr",
    "ctr-bucket-support"
  ],
  "workflows": [],
  "lastVerified": "2026-08-04"
}