What does a competitor share of voice dashboard show in Metabase?
A competitor share of voice dashboard answers the question rankings alone can't: of the demand in your keyword set, how much does each player capture? It combines volume- and CTR-weighted share of voice from rank-tracker positions, top-10 SERP share from raw SERP snapshots, and monthly market traffic share from Similarweb — the competitive layer of SEO analytics, over a fixed keyword set and a fixed competitor set.
For: SEO and product-marketing leads reporting competitive position. Grain: one row per keyword × domain × snapshot date across your domain and each tracked competitor.
Which cards belong on a competitor share of voice dashboard?
Share of voice by domain over time (stacked area)
Top-10 SERP share by domain, latest crawl (bar)
SoV winners and losers vs. last month (table)
SoV by keyword group — where each player wins (bar)
Market traffic share by month — Similarweb (stacked bar)
Keywords where a competitor outranks you, by volume (table)
SERP-feature ownership — snippets and AI overviews by domain (table)
Head-to-head — your position vs. top competitor per keyword (table)
What data does the dashboard need?
seo_keyword_positions covering competitor domains — keyword, target_domain, stat_date, position, search_volume — from Semrush or Ahrefs tracking the same keyword set for every domain.
serp_snapshots — keyword, stat_date, position, domain, serp_feature_type — one row per result slot per crawl, from DataForSEO, for SERP share and feature ownership.
similarweb_traffic_monthly — domain, month, visits — for the market traffic share card.
Every number here is modeled, and only comparable inside a fixed frame: same keyword set, same competitor set, same vendor. Change any of the three and the trend breaks. Chart shares, not absolutes — especially for Similarweb's panel-based estimates.
How do you build it?
Freeze the frame: pick the keyword set and five to eight competitor domains by SERP overlap, and version both tables in the warehouse.
Sync positions for all domains (rank-tracker APIs) and schedule SERP snapshot tasks; land Similarweb monthly rows via its Batch API, which can deliver straight to Snowflake or S3.
Model estimated clicks per keyword × domain with a maintained CTR curve, and SoV as each domain's share per snapshot date.
Assemble the cards with a keyword-group filter, and annotate any change to the keyword or competitor set directly on the dashboard.
Example card SQL
Volume- and CTR-weighted share of voice by domainPostgreSQL
WITH weighted AS (
SELECT
stat_date,
target_domain,
search_volume * CASE
WHEN position = 1 THEN 0.32
WHEN position = 2 THEN 0.16
WHEN position = 3 THEN 0.10
WHEN position <= 5 THEN 0.07
WHEN position <= 10 THEN 0.03
ELSE 0
END AS estimated_clicks
FROM seo_keyword_positions
)
SELECT
stat_date,
target_domain,
ROUND(
100.0 * SUM(estimated_clicks)
/ NULLIF(SUM(SUM(estimated_clicks))
OVER (PARTITION BY stat_date), 0), 1
) AS share_of_voice_pct
FROM weighted
GROUP BY 1, 2
ORDER BY 1, 3 DESC;
Market traffic share by month (Similarweb)PostgreSQL
SELECT
month,
domain,
ROUND(
100.0 * visits
/ NULLIF(SUM(visits) OVER (PARTITION BY month), 0), 1
) AS traffic_share_pct
FROM similarweb_traffic_monthly
WHERE domain IN (
'yourdomain.com', 'competitor-a.com', 'competitor-b.com'
)
ORDER BY month, traffic_share_pct DESC;
The standard method: for every tracked keyword, estimate each domain's clicks as search volume × a click-through-rate curve applied to its position, then take each domain's share of the summed estimates — the share of voice metric. The CTR curve is an approximation (the example SQL hardcodes one; you can maintain yours from measured organic CTR by position), so SoV is a modeled index, not a traffic measurement. Its value is that the same model applies to every competitor, making the comparison fair even though the absolute numbers are estimates.
Why did SoV jump when nobody's rankings changed?
Almost certainly the denominator moved: SoV is only comparable within a fixed keyword set and a fixed competitor set. Adding keywords changes every domain's share; adding a competitor shrinks everyone else's slice; a vendor refreshing search-volume estimates reshuffles weights silently. Freeze both sets for the trend cards, annotate any change on the dashboard, and version the keyword set in the warehouse so old numbers stay reproducible.
Can Similarweb traffic numbers be trusted?
Similarweb models visits from panel and clickstream data — it does not measure competitors' analytics, and its estimate of your own domain will not match your GA4 numbers. Used as shares, the numbers are genuinely useful: the modeling bias applies to every domain roughly equally, so relative position and direction are informative even when absolutes are off. Chart traffic share percentages, never raw visit counts presented as fact.
What does top-10 SERP share add over SoV?
It is a count, not a model: from raw DataForSEO SERP snapshots, the share of tracked top-10 result slots each domain occupies — no CTR curve, no volume weighting, just presence. It moves faster than SoV (one new ranking = one slot) and catches SERP-feature dynamics, since snapshots record who owns snippets and AI overviews. Read them together: SERP share is the leading indicator, volume-weighted SoV is the business-weighted one.
How should the competitor set be chosen?
By SERP overlap, not org charts. Your search competitors are whoever ranks for your tracked keywords — often publishers, marketplaces, or adjacent tools rather than the companies in your sales battlecards. Pull the domains appearing most often in the top 10 of your keyword set (SERP snapshots make this one query), pick five to eight, and freeze the list. Revisit annually, and cross-check the backlink growth dashboard to see whether the same set is out-building you on authority.