An agency Search Console report fails in predictable ways. The PDF quotes the UI's "average position." The query sheet is 1,000 rows because that is what the export allowed. Last year is missing because nobody paid for storage. Organic sessions from GA4 are pasted next to GSC clicks with a red variance arrow. The client asks why the numbers disagree. The meeting becomes a methodology seminar.
You can run a shop that does not do this. The rules are mechanical.
One property, one pair of ledgers
For each client site, report Search Console and on-site analytics as siblings, not as a reconciliation.
| Slide / section | Source | Allowed metrics | Forbidden |
|---|---|---|---|
| Demand | GSC site totals, Web unless specified | Clicks, impressions, CTR = clicks÷impressions, impression-weighted position | Sum of query rows, AVG(position), mixed search types |
| Where it moved | GSC pages, then queries | Top movers, striking-distance queries | Treating the list as the site |
| After the click | Cookieless analytics | Pageviews, visitor-days, goals | "Organic sessions (GSC)" |
| Coverage | Import status | Date from / through, including fresh data before Google finalizes it | Charting through today and panicking |
Google anonymises rare queries. SiteLine caps 25,000 rows per day per report. Query totals will sit below site totals. Put that sentence in the appendix once; do not rediscover it every month.
Position on a row is already impression-weighted. If you roll a folder or a date range, re-weight with impressions. CTR is never an average of CTRs. SiteLine does not even store a CTR column, which is the correct amount of paranoia.
Limits you should name in the SOW
- 16 months in Google, then gone. SiteLine backfills those 16 months on connect and keeps days while the client (or you) subscribes. Year-over-year is a product feature, not an intern with a Drive folder. 16-month limit.
- 1,000 rows in the GSC UI. Do not attach that CSV as "all queries." To find the real gaps in an export, run it through the free Search Console opportunity analyzer. 1,000-row limit.
- Read-only. SiteLine uses
webmasters.readonly. You cannot accidentally request indexing through it. You also cannot fix Search Console settings through it. - Nightly refresh of 7 days. Early-week numbers will move. Snapshot a report on a fixed weekday, or note that Monday's clicks are still revising.
- On-site is cookieless. Daily hash, no analytics cookie. That is easier under GDPR than GA4; it is not a user-level CRM. /docs/privacy.
Unlimited Search Console sites and unlimited analytics domains are on every SiteLine plan. You are not paying per property. You are paying $4.99 / $19.99 / $99.99 for an event pool. /docs/billing. That is the agency-shaped part.
How an agent should enter the account
SiteLine exposes MCP for Search Console and for analytics. A well-prompted agent can draft the demand section from get-site-overview and get-movers, then the behaviour section from get-analytics-overview and get-analytics-goals. A poorly prompted one will average CTR, sum query rows, and interpret the two-day lag as a traffic crash.
Put this in the agency playbook the model sees:
- Totals only from site overview / site totals.
- Breakdowns are "of visible rows."
- Position is impression-weighted; do not average it.
- CTR is clicks ÷ impressions.
data_throughis the last complete GSC day.- Analytics is a different unit; do not subtract.
The longer version is the Google Search Console MCP guide. The pairing is Search Console plus on-site analytics.
A monthly pack that takes an hour, not a day
- Connect the property once. Wait for backfill. Do not screenshot the GSC UI.
- Pull Web site totals for the last complete 28 GSC days vs the prior 28. CTR from the sums. Position from the weighted figure.
- List the ten pages with the largest click losses and gains. For each, attach query movers and on-site goal counts for that path.
- One paragraph on lag, anonymisation, and search type.
- Stop.
If the client wants "average position for the site," give them the impression-weighted site position and explain it in a footnote. If they want GA4 organic next to GSC, send clicks vs sessions instead of a variance chart.
Install analytics with the script or React SDK. Trial at /register. Search Console alone is not enough; neither is a session export.
Agencies do not have a reporting problem. They have a unit problem, a retention problem, and a 1,000-row problem. Name those and the PDF gets shorter.
FAQ
Can one SiteLine account cover every client property?
Unlimited sites per subscription, one user today. If several people need logins, that is not built yet. MCP tokens are team-scoped to the sites on that account — do not share a token across agencies.
Should we average CTR across the portfolio?
No. A 40% brand CTR on client A and a 2% CTR on client B is not "21% for the book." Sum clicks and impressions if you must roll up, then divide. Better: do not roll up CTR across clients at all.
Do we still need GA4 for agency work?
If the contract includes ads or a GA4 property the client already worships, keep it. For SEO reporting, GSC site totals plus cookieless landings and goals are the two ledgers that match the work. Mixing GA4 organic into the GSC slide is how the methodology seminar starts.