SEO KPIs & Reporting

Choose the right metrics to measure SEO success and prove ROI.

Good SEO reporting focuses on outcomes, not vanity metrics. Track KPIs that connect to business goals.

Core SEO KPIs

KPIWhat it tells you
Organic trafficOverall reach from search
Keyword rankingsVisibility for target terms
Organic conversionsBusiness value of SEO
Impressions & CTRSERP visibility and appeal
Indexed pagesTechnical health
Backlinks / referring domainsAuthority growth

Report on trends

SEO moves slowly. Compare periods (month over month, year over year), tie results to actions taken, and always link metrics back to revenue or leads.

Example

Example · bash
# A simple monthly SEO scorecard
Organic sessions      : 24,500  (+12% MoM)
Organic conversions   : 310     (+8% MoM)
Avg position (top 20) : 8.4     (improving)
Referring domains     : 142     (+6 new)

When to use it

  • An SEO director reports organic revenue attribution to the CFO by connecting GA4 conversion data to Search Console clicks, making SEO's financial contribution concrete.
  • A content team tracks 'organic sessions to lead form submissions' as the primary KPI instead of rankings, aligning SEO reporting with the sales team's pipeline language.
  • A SaaS company uses share of voice (the percentage of tracked keywords where they rank in the top 3) as a strategic KPI alongside organic MRR to measure competitive positioning.

More examples

SEO KPI dashboard query in BigQuery

Mapping each KPI to its data source makes it explicit which system owns which metric, preventing teams from reporting conflicting numbers for the same KPI.

Example · bash
python3 - << 'EOF'
# Key SEO KPIs pulled from GA4 BigQuery export + Search Console API
KPIS = {
    "Organic sessions":          "ga4.organic_sessions_mtd",
    "Organic goal completions":  "ga4.organic_conversions_mtd",
    "Organic conversion rate":   "ga4.organic_cvr",
    "Avg. position (GSC)": "gsc.avg_position",
    "Total clicks (GSC)":  "gsc.total_clicks",
    "Total impressions":   "gsc.total_impressions",
    "Click-through rate":  "gsc.ctr",
}
for kpi, source in KPIS.items():
    print(f"  {kpi:35} <- {source}")
EOF

Calculate share of voice

Share of Voice expresses how dominant a site is across its tracked keyword set, providing a competitive benchmark that rankings alone do not convey.

Example · bash
python3 - << 'EOF'
# Share of Voice: % of tracked keywords where site ranks in top 3
tracked_keywords = [
    {"kw": "trail running shoes",     "position": 2},
    {"kw": "best trail runners 2024", "position": 1},
    {"kw": "trail shoe review",       "position": 11},
    {"kw": "waterproof trail shoes",  "position": 5},
    {"kw": "trail running tips",      "position": 3},
]
top3 = sum(1 for k in tracked_keywords if k["position"] <= 3)
sov = top3 / len(tracked_keywords) * 100
print(f"Share of Voice (top 3): {sov:.0f}%  ({top3}/{len(tracked_keywords)} keywords)")
EOF

Monthly SEO report template

A consistent monthly report template with the same KPIs in the same order lets stakeholders track trends at a glance and compare month-over-month performance.

Example · bash
#!/usr/bin/env bash
# Generate SEO KPI summary for monthly report
echo "=== Monthly SEO KPI Report: $(date +%B\ %Y) ==="
echo
echo "Traffic"
echo "  Organic sessions:        12,450  (+8% MoM)"
echo "  Organic new users:        9,120  (+6% MoM)"
echo
echo "Engagement (Search Console)"
echo "  Total clicks:            18,300  (+11% MoM)"
echo "  Total impressions:      245,000  (+9% MoM)"
echo "  Average CTR:              7.5%  (prev 7.1%)"
echo "  Average position:          14.2  (prev 15.8)"
echo
echo "Conversions"
echo "  Organic leads:              234  (+15% MoM)"
echo "  Organic conversion rate:   1.9%  (prev 1.7%)"
echo "  Estimated organic value: \$22k/mo (at \$1.80 avg CPC)"

Discussion

  • Be the first to comment on this lesson.