Cluster Analytics
Measuring Cluster Performance
Set up KPIs and dashboards that show how clusters work as systems. Track cohorts from publish date, watch rank distribution by cluster, and detect content decay before traffic slips. This guide excludes prioritization models and focuses only on measurement.
Scope and data sources
Everything here is cluster level measurement. You already grouped keywords and pages into clusters. Now you need visibility. The fastest stack uses Google Search Console for queries and positions, Google Analytics 4 for engagement and conversions, and a sheet or database to join data. Review Google docs for Search Console performance reports, Search Console API, and GA4 reporting.
- Cluster name and type like problem, feature, comparison, onboarding
- Publish date and last updated date
- Primary intent and canonical URL
- Top linked keywords or a canonical head term for the page
KPI framework
Pick KPIs that show coverage, quality, and business impact. Keep a small core set and segment by cluster. Below is a practical list you can build with standard tools.
Coverage
- Keywords captured per cluster from Search Console
- Pages indexed per cluster and sitemap health
- New queries per month entering the cluster
Quality
- Rank distribution across buckets 1 to 3, 4 to 10, 11 to 20, 21 to 50, 51 plus
- Average position weighted by clicks
- Click through rate by bucket and by page type
Outcome
- Sessions and engaged sessions per cluster
- Primary conversions from GA4 events like demo, signup, lead
- Assisted conversions where cluster pages appear on the path
Use Search Console for impressions, clicks, position. Use GA4 for engagement and conversions. Keep names stable so joins are painless.
Data model
Store URLs and queries with cluster labels. Many teams start with a sheet then move to a database. Below is a lightweight schema you can use in Sheets, BigQuery, or any SQL store.
Tables
- pages(url, cluster, type, publish_date, updated_date, canonical, status)
- gsc_daily(date, url, query, clicks, impressions, ctr, position)
- ga4_daily(date, url, sessions, engaged_sessions, conversions)
Joins
- Join gsc_daily to pages on url to roll up by cluster
- Join ga4_daily to pages on url for outcomes
- Keep a cluster_meta table for owners and goals
Example SQL for cluster daily facts
SELECT
p.cluster,
d.date,
SUM(d.clicks) AS clicks,
SUM(d.impressions) AS impressions,
SAFE_DIVIDE(SUM(d.clicks), SUM(d.impressions)) AS ctr,
AVG(d.position) AS avg_position
FROM gsc_daily d
JOIN pages p ON p.url = d.url
GROUP BY 1,2
ORDER BY 1,2;Example SQL for rank buckets
SELECT
p.cluster,
COUNTIF(d.position >= 1 AND d.position <= 3) AS top3,
COUNTIF(d.position >= 4 AND d.position <= 10) AS p1,
COUNTIF(d.position >= 11 AND d.position <= 20) AS p2,
COUNTIF(d.position >= 21 AND d.position <= 50) AS p3_5,
COUNTIF(d.position >= 51) AS beyond50
FROM (
SELECT url, query, MIN(position) AS position
FROM gsc_daily
WHERE date = CURRENT_DATE()
GROUP BY 1,2
) d
JOIN pages p ON p.url = d.url
GROUP BY 1;Rank distribution by cluster
Rank distribution is the fastest way to see cluster momentum. Track how many unique query and url pairs sit in each bucket. Watch the shift from page two to page one, then into top three. Distribution beats a single average because it shows depth and headroom.
Bucket design
- 1 to 3 shows win zone
- 4 to 10 shows page one coverage
- 11 to 20 shows near wins
- 21 to 50 shows early traction
What good looks like
- Near win bucket shrinks over time
- Top three grows and stabilizes
- New queries appear in early buckets and move right to left
Tips
- Deduplicate by query and url per day with best position
- Exclude branded queries when you want a clean view
- Segment by page type to see where support pages help hubs
Read the Search Console docs on position and filters in the performance report.
Cohort tracking
Cohorts answer how fast new content starts to work. Group pages by publish month and follow their clicks, impressions, and rank distribution over time. You can also measure time to first click or time to top ten.
Cohort fields
- publish_month like 2025-07 for each url
- cluster and page type
- days_since_publish calculated in queries
Questions cohorts answer
- How many days to reach top ten for at least one head term
- How many days to first 100 clicks
- Which clusters warm up faster
Example SQL for time to top ten
WITH best_pos AS (
SELECT url, query, MIN(position) AS pos, MIN(date) AS first_seen
FROM gsc_daily
GROUP BY 1,2
),
first_top10 AS (
SELECT p.url, MIN(b.first_seen) AS top10_date
FROM best_pos b
JOIN pages p ON p.url = b.url
WHERE b.pos <= 10
GROUP BY 1
)
SELECT
p.cluster,
DATE_DIFF(f.top10_date, p.publish_date, DAY) AS days_to_top10
FROM first_top10 f
JOIN pages p ON p.url = f.url
WHERE f.top10_date IS NOT NULL;Use GA4 for cohort engagement if you want a behavior view. See GA4 explorations.
Dashboards
Dashboards should help decisions. Start with one page per cluster. Charts should be readable on one screen with no scrolling.
Charts that matter
- Clicks, impressions, CTR by cluster over time
- Rank distribution bars for the latest week
- New queries captured this month
Tables to keep
- Top movers: queries that changed buckets
- Pages with rising CTR but flat position
- Pages with falling clicks and rising position flagging SERP shifts
Stack ideas
- Looker Studio with the Search Console connector
- BigQuery plus Looker Studio for custom SQL
- Sheets for quick pilots with IMPORTDATA or app scripts
Google explains the Search Console data model in the Search Analytics API. Review GA4 event basics in the events guide.
Content decay detection
Content decays when a page loses traffic or rankings after a period of stability. Detect decay at the cluster level so you refresh the right parts of the system. The method below is simple and works with standard data.
Rule of thumb
- Compute a rolling 28 day average of clicks for each url
- Flag urls where the latest 28 day average is down at least 30 percent vs the best 28 day average in the last 12 months
- Require stability first like at least 84 days above a baseline to avoid false alarms
Why it works
- Removes weekly noise with rolling windows
- Uses relative change rather than a fixed target
- Easy to compute in SQL or Sheets
Example SQL for decay flags
WITH daily AS (
SELECT date, url, SUM(clicks) AS clicks
FROM gsc_daily
GROUP BY 1,2
),
roll AS (
SELECT
url, date,
SUM(clicks) OVER (PARTITION BY url ORDER BY date
ROWS BETWEEN 27 PRECEDING AND CURRENT ROW) / 28.0 AS avg28
FROM daily
),
stats AS (
SELECT url,
MAX(avg28) OVER (PARTITION BY url) AS best28,
ANY_VALUE(avg28) KEEP (DENSE_RANK LAST ORDER BY date) AS latest28
FROM roll
)
SELECT url,
latest28, best28,
SAFE_DIVIDE(latest28, best28) AS pct_of_best,
CASE WHEN SAFE_DIVIDE(latest28, best28) <= 0.70 THEN 1 ELSE 0 END AS is_decayed
FROM stats
GROUP BY url, latest28, best28;Roll up to cluster
SELECT p.cluster,
COUNTIF(s.is_decayed = 1) AS decayed_pages,
COUNT(*) AS total_pages,
SAFE_DIVIDE(COUNTIF(s.is_decayed = 1), COUNT(*)) AS decay_rate
FROM page_decay s
JOIN pages p ON p.url = s.url
GROUP BY 1;Use the Search Console performance report for click data. See filters and dimensions. If seasonality is strong, compare to the same period last year as a second check.
Alerting and QA
You do not need a full data team to catch problems. A few simple alerts go a long way.
Weekly alerts
- Decay rate per cluster rises by more than 5 percentage points
- Near win bucket grows while page one shrinks
- New queries captured falls below a rolling median
Monthly QA
- Pages with many impressions but weak CTR check titles and descriptions
- Pages with strong CTR but weak position check internal links and depth
- Clusters with traffic but few conversions review alignment and CTAs
Governance
- Stable cluster names and a single source of truth for page labels
- Change log for redirects and slug updates
- Sitemaps and canonicals consistent with the cluster map
FAQ
How often should I refresh dashboards
Daily for Search Console rollups. Weekly for cohort summaries. Monthly for content decay and outcome trends. Pick a cadence you can maintain and automate exports with the API.
Do I track branded and non branded together
Track both, but segment. Branded queries hide cluster problems because they convert easily. Use Search Console filters to exclude brand when you want a clean view.
What if a page ranks for queries across two clusters
Keep one canonical cluster for the page. If it genuinely serves two intents, consider splitting content or adding a sibling page with clearer scope. Measurement improves when each page has one job.
Can I do this without SQL
Yes. Looker Studio and Sheets work for smaller sites. For larger sites, SQL saves time and reduces manual errors. Google documents the Search Console API and GA4 exports.
Have a quick question? Send a message.
