Search Console answers four questions: how often Google showed you, how often people clicked, what share that is, and whereabouts you sat in the results. On-site analytics answers a different four: who arrived, which page they landed on, what they did, and whether they converted. Treating either as a substitute for the other is how teams ship "SEO reports" that cannot explain a traffic drop.
SiteLine is built as both ledgers in one subscription. That only helps if you keep them honest.
Two ledgers, one date, one page
The join key is not "organic." It is a date plus a landing page URL.
| Ledger | Grain | Headline metrics | What a row means |
|---|---|---|---|
| Search Console site totals | One row per day per search type | Clicks, impressions, CTR, position | The whole property on Google that day |
| Search Console queries / pages | Up to 25k rows/day/report | Same four, for that slice | A query, a page, or a pair — not the site |
| On-site analytics | Pageviews and events, same day | Visitors, pageviews, events, goals | A browser hit your origin |
Read GSC headlines from site totals. Read the long tail from the dimension tables. Read behaviour from analytics. If a page gained impressions and lost clicks, that is a SERP problem (snippet, position, intent). If it kept GSC clicks and lost on-site conversions, that is a site problem (speed, offer, form). Mixing those diagnoses is how you rewrite a title when the checkout is broken.
Position on a GSC row is already impression-weighted for that slice. CTR is clicks ÷ impressions. Never average either across days, queries, or clients. To roll position up: SUM(position × impressions) / SUM(impressions). To roll CTR up: SUM(clicks) / SUM(impressions). SiteLine does not store a CTR column, so nobody can AVG one by accident.
Why the two totals will not match
A Search Console click is not an analytics session. The gap is not a bug in either product. Typical, specific causes:
- Publishing lag. Google finalises Search Console about two days behind. On a Wednesday, expect GSC through Monday. Analytics is same-day. Comparing "today" across both is theatre.
- Anonymised queries. Google withholds rare queries. Query-table clicks can sit well below site-total clicks. That is privacy, not missing import.
- Row caps. The Search Console UI shows 1,000 rows. SiteLine imports up to 25,000 rows per day per report. Even then, summing shown rows is not the site. Headlines come from site totals.
- Surfaces. Web, Image, Video, News, Discover and Google News are separate. Discover and Google News have no queries and no position. "Organic" in analytics often includes all of them.
- Script coverage. Ad blockers, the first-party proxy, and pages without the snippet change on-site counts. They do not change GSC.
The longer version is Search Console clicks vs analytics sessions. If you came from GA4's Organic Search channel, read organic traffic vs Search Console.
What SiteLine actually stores
Google access is read-only: the webmasters.readonly scope. SiteLine cannot submit sitemaps, request indexing, or change Search Console settings.
On connect, it backfills the 16 months Google still holds. Search Console drops each day once it is 16 months old; SiteLine keeps every imported day for as long as you subscribe. Every night it re-imports the last 7 days, because Google revises recent figures after first publish.
Alongside that, cookieless analytics: no first-party analytics cookie, unique visitors from a daily hash of truncated IP + user agent + a rotating salt. Install the script or the React SDK. The privacy model is in /docs/privacy.
Agents query both over MCP. Search Console tools return data_from, data_through and a notes line so a model does not treat the two-day lag as a collapse, and does not sum the top-N query rows as if they were the site. Details: the Google Search Console MCP guide.
A working reading order
When something looks wrong, use this order. Skip it and you will "fix" the wrong layer.
- Site totals, Web search type, last 28 complete GSC days (ending two days ago). Is the property actually down?
- Time series against the prior period, still on site totals. Is it a day, a week, or a slope?
- Pages dimension, still not the query table. Which URLs moved?
- Queries for those pages. Intent and cannibalisation live here. Remember the query table is incomplete.
- On-site for the same URLs, same calendar dates, knowing GSC is two days behind. Did landed visitors bounce, fail a goal, or never hit the snippet?
That is a habit, not a slide. Search Console is not enough on its own; analytics without queries is also not enough. See combining GSC with cookieless analytics for the join keys.
Cost, sites, and what you are not buying
Unlimited Search Console properties. Unlimited analytics domains. Plans are Starter $4.99, Growth $19.99, Scale $99.99, billed on events not sites. See /docs/billing. Trial at /register.
You are not buying session replay, a tag manager, or Google Ads. You are buying the two ledgers most SEO work actually needs, stored so you can still ask questions after Google's 16-month window and past the 1,000-row UI.
FAQ
Should I use GSC clicks or analytics visitors as the KPI?
Use clicks when the question is "did Google send us the visit?" Use visitors or goals when the question is "did the visit do anything?" Put both on the page. Do not pick one and pretend it is the other.
Why is the query report's click total lower than the site?
Google anonymises rare queries, and SiteLine caps 25,000 rows per day per report. Those rows are a sample of the visible tail, ranked by clicks. Quote site totals for the headline. Say "of the queries we can see" for the rest.
Can I average position across a folder of pages?
No. Re-weight with impressions, or use the position SiteLine already computed for that slice. A folder with one high-impression page at position 2 and fifty thin pages at position 40 is not "position 21."