What does keywords in top 10 measure, and how do you track it in Metabase?
Keywords in top 10 counts how many of your tracked keywords rank on page one at each snapshot. It's the visibility metric that survives averaging: a count only moves when a keyword crosses the boundary that changes click behavior, which makes it harder to fool than average position and easy to act on when read next to its striking-distance companion bucket.
LAG() movers table shows what crossed the boundary each week.What keywords in top 10 measures
Organic clicks concentrate on page one, and within it on the top three results — a keyword moving from position 14 to 8 changes real traffic in a way that 44 to 38 does not. Counting keywords per bucket measures exactly those consequential crossings: the top-10 count is your page-one footprint, the top-3 count is where the clicks actually are, and the 11–20 count is the striking-distance queue worth working next.
The count's integrity depends on two disciplines: deduplicate to the best position per keyword per snapshot (SERP data can surface several of your URLs for one query), and version the tracked keyword set so the count is comparable across time. With those held, the trend line reads cleanly — every step up is a keyword that actually crossed onto page one.
What data does it need?
- A
seo_keyword_positionstable withkeyword,target_domain,stat_date,position, andsearch_volume, one row per keyword per snapshot at best position. - A consistent snapshot cadence — daily or weekly — since the movers comparison depends on adjacent snapshots existing.
- A versioned keyword set, with set changes annotated so count jumps can be attributed to tracking changes rather than rankings.
SQL patterns
SELECT
stat_date,
COUNT(*) FILTER (WHERE position <= 3) AS top_3,
COUNT(*) FILTER (WHERE position <= 10) AS top_10,
COUNT(*) FILTER (WHERE position BETWEEN 11 AND 20)
AS striking_distance,
COUNT(*) AS keywords_tracked
FROM seo_keyword_positions
WHERE target_domain = 'yourdomain.com'
AND stat_date >= CURRENT_DATE - INTERVAL '6 months'
GROUP BY 1
ORDER BY 1;WITH ranked AS (
SELECT
keyword,
stat_date,
position,
LAG(position) OVER (
PARTITION BY keyword ORDER BY stat_date
) AS prev_position
FROM seo_keyword_positions
WHERE target_domain = 'yourdomain.com'
AND stat_date >= CURRENT_DATE - INTERVAL '14 days'
)
SELECT
keyword,
prev_position,
position,
prev_position - position AS change
FROM ranked
WHERE stat_date = (SELECT MAX(stat_date) FROM ranked)
AND prev_position IS NOT NULL
AND (
(position <= 10 AND prev_position > 10)
OR (position > 10 AND prev_position <= 10)
)
ORDER BY change DESC;Pitfalls
keywords_tracked on the same card, and restate history when the set changes materially.Where this metric applies
- SE Ranking + Metabase — daily rank tracking by project, search engine, and location
- Ahrefs + Metabase — tracked positions with search volume for the weighted companion view
- DataForSEO + Metabase — raw SERP snapshots to build buckets over any keyword universe
Related
Metrics
Dashboards
FAQ
Why count keywords in the top 10 instead of average position?
What position buckets are worth tracking?
Does a growing top-10 count always mean progress?
keywords_tracked, and consider a volume-weighted companion like share of voice so ten low-volume wins don't read the same as one head-term win.Should the count use best position per keyword?
How do you track keywords in the top 10 in Metabase?
LAG(). Pin both to a keyword rank tracking dashboard next to your Search Console trend.