SEO reporting from Search Console: four routes and how to reconcile them
Reporting tools are layers over the same Search Console data. This guide compares the four routes by what Google documents about them, explains why site and URL tables never match, shows how to weight average position and gives criteria for client-reporting platforms.
✓ Checked against Google documentation · 8 October 2026
Pick the route before you pick the tool
Most reporting tools are a layer over the same Search Console data, so the choice that matters is the route: which data reaches the report, how much history it keeps and who maintains it. Four routes cover most cases. Client-reporting platforms and SEO suites sit on top of these; we did not verify their documentation, so this guide gives criteria for them instead of claims.
Four routes and what each documents
| Route | Strength | Documented limits |
|---|---|---|
| Looker Studio connector (help) | Free dashboards on live data; no code | One data source uses either site or URL aggregation; URL impressions add Discover and Google News; privacy-hidden queries may collapse into one blank row |
| Bulk export to BigQuery (overview, setup) | Daily export, kept forever unless you set an expiration | No history before you start; first export up to 48 hours later; your Cloud project pays above the free level |
| Search Analytics API or an MCP server (all your data) | Any slice, scripted and scheduled | 25,000 rows per request, 50K rows a day per search type, data typically after 2–3 days |
| Manual export from the report | Zero setup | A snapshot you must repeat by hand |
Why two tables never match
The site table is aggregated by property and the URL table by URL (table reference). A report that sums URL rows will not equal one that reads the property table, and Looker Studio makes you choose one per data source. Neither is wrong; they answer different questions. Use the site table for totals and queries, and the URL table for page-level work. When you need both, build two data sources and label them.
Average position must be weighted
In the exported tables position is stored as a sum. For the URL table, average position (1-based) is SUM(sum_position) ÷ SUM(impressions) + 1; the site table uses sum_top_position the same way (table reference). Illustrative example: one day has 400 impressions with sum_position 1,200, another has 100 impressions with sum_position 800. The weighted figure is (1,200 + 800) ÷ (400 + 100) + 1 = 5.0. Averaging the two daily positions (4.0 and 9.0) gives 6.5, which overstates how far down you sit. Weight by impressions whenever you roll up.
A reconciliation check before you share a report
- Same table: every number in the report comes from the site table or the URL table, and the label says which.
- Same dates: end the range three days back, because data is typically available after 2–3 days, and note that exported dates are Pacific Time.
- Anonymised rows: total clicks include queries Google hides, so a sum of visible query rows is lower than the total.
- History start: say when the BigQuery export began, because earlier data is not in it.
Criteria for client-reporting platforms and suites
- Source: does it read Search Console directly (measured) or its own index (modelled)?
- Depth: row caps, history length and whether site and URL data are labelled.
- Delivery: scheduled PDF, client login, your branding.
- Cost shape: per client, per dashboard, per data source or per seat; estimate it for your own client count.
SEOKit, which we build, also shares saved reports with signed-in people by email; judge it by the same criteria.
SEO reporting, answered
Is Looker Studio enough?
For dashboards on live data, often yes; for history beyond what the connector shows or heavy joins, add the BigQuery export.
Can I backfill BigQuery?
No. The export does not include history before you start; use the API for earlier dates.
Why do my totals differ between reports?
Check whether one uses the site table and the other the URL table.
What to read next
Read continuous analysis with an AI agent for the scheduled route and join Search Console and GA4 for sessions.