siteline Start free trial Log in

SiteLine vs Google Analytics: an honest grid

See your data

Most "X vs Google Analytics" pages pretend the products compete for the same slot. They do not. Google Analytics 4 is a free measurement and Ads platform with a first-party cookie. SiteLine is a paid Search Console companion with cookieless on-site analytics and two read-only MCP servers. You might run both. You might replace the GA4 tag on the marketing site and keep Google Ads elsewhere. You will not get a GA4-shaped product with the logo filed off.

If you want the identity mechanics, read cookieless analytics vs GA4. If you want the job split, GA4 alternatives. This page is the grid. Chris Richards builds SiteLine at Aglet Technologies ([email protected]). Who operates the service is on /trust.

Feature comparison

Google Analytics 4 SiteLine
Licence Free (Google is the product) Starter $4.99 / 1M events; Growth $19.99 / 10M; Scale $99.99 + $2.99 / extra 1M
Trial n/a 7 days, no card to start, visibility about 50,000 events
On-site identity First-party cookie; optional signals / user-id Daily SHA-256 of truncated IP (IPv4 /24, IPv6 /48) + user agent + rotating salt; UTC reset; raw IP not stored on the event
Cookie from this tracker Yes No; fetch with credentials: 'omit'
Search Console Separate Google product Read-only webmasters.readonly; 16-month backfill of whatever Google still holds; kept while subscribed; 25,000 rows/day/report; refreshed every 4 hours (last 7 days, including fresh rows); CTR computed
Sites / domains Properties you configure Unlimited GSC sites and analytics domains; shared event pool
Events High-cardinality parameters Max 10 props; key 64 chars; value 256
Conversions Configured events / key events Goals and funnels derived in the UI; not extra billable events
Ads attribution Native Not offered
BigQuery export Yes (linked) Not offered
Session replay / heatmaps Not native (other Google or third-party tools) Not offered
Cross-day person Yes, if cookie or user-id survive Not offered
Self-host No No
Agent access None native Two read-only MCP servers, for Search Console and for on-site analytics
Sampling Explorations can sample; GA4 sampling quotas On-site unsampled; billing visibility cap on Starter/Growth
Retention (analytics) 2 or 14 months user-level; aggregated longer While subscribed; 30-day grace after access ends
Bots Filters you configure Known bots dropped before quota
Hostname control Measurement IDs can be leaked Allowlist; other hosts rejected
Script gtag / GTM /js/script.js to POST /api/analytics/event; @siteline.tools/tracker, @siteline.tools/react
First-party collect Server-side GTM (you build) You reverse-proxy two paths; no managed CNAME in v1

Google's introduction to GA4 describes an event-based property, privacy controls that include cookieless measurement and behavioral and key event modeling, and direct integrations to media platforms. That is the product you get for $0: measurement tied to Google's media stack. SiteLine does not model a missing cookie into a conversion. It counts the events the script actually sent, under a visitor id that expires at UTC midnight.

The Search Console column is the actual difference

Plenty of privacy-first counters beat GA4 on cookies. Few keep query-level organic history past Google's rolling Performance window and past the 1,000-row UI. The window teams plan around is 16 months of whatever Google still holds. SiteLine backfills that window, then stores each subsequent day for the life of the subscription. How the window works is Search Console's 16-month limit. A refresh every 4 hours reimports the last 7 days, including fresh rows, because Google revises recent days. An MCP client that ignores coverage dates will hallucinate a crash. SiteLine's tools expose those dates so that is harder to do by accident.

The Performance report is the human surface for this data. Google defines four metrics there: clicks (a user clicked your site from Search results), impressions (your site appeared), CTR (the click count divided by the impression count), and average position (the average position of the topmost result from your site). The default view is the past three months. The chart aggregates by property. The table groups by the dimension you picked, and Google notes that chart totals can differ from table totals because aggregation differs (property versus page). The overview's default range is three months. The longer horizon teams plan around, 16 months, is Google's rolling Performance window. SiteLine's job is keeping each imported day after that window moves on.

Google's export help says a report export is truncated to 1,000 representative rows. Smaller sites may already have most or all of their rows inside that cut. Larger sites do not. The totals shown are the actual totals, not the sum of the truncated table. The Performance data deep dive adds the API ceiling: 50,000 rows per day per site per search type, with rowLimit up to 25,000 and startRow to page the rest. SiteLine stores up to 25,000 rows per day per report. It does not store the second page that would take a property from 25,001 to 50,000.

GA4's organic channel will never be that table. It is a session grouping. Clicks are not sessions. If SEO is how a SaaS is bought, comparing SiteLine to GA4 on bounce rate is a category error. The unit split is Search Console clicks vs analytics sessions.

Three numbers people mash together:

Number What it is What to do with it
Chart total for the property Google's clicks and impressions for that day and search type, including anonymized queries The headline
Sum of query rows you imported Named queries only, after anonymization, after the 25,000-row cap "Of the queries we can see"
Sum of the 1,000-row UI export A further cut of the named queries A working list

Google's deep dive uses a small illustration, not a customer: four named queries totaling 450 clicks, and a chart total of 550, because anonymized queries stay in the chart and never appear as rows. The same rule applies on a real property. Do not average CTR or position across rows to "fix" the gap. CTR is a fraction of 1. Position is impression-weighted. A plain average of row-level CTR treats a one-impression query like a query with a hundred thousand impressions.

Worked example: Tuesday, one property, queries

Labeled hypothetical. Not a customer. Not a measured traffic result. The only numbers are the caps.

It is Tuesday. The search type is web. The dimension is queries. The Search Console UI shows 1,000 query rows. You export Google Sheets, Excel, or CSV and you still have 1,000 representative rows, which is what the export help says the download contains. SiteLine's import for that day and that report holds 25,000 rows. Subtract. 24,000 query rows never appear in the UI export.

Those 24,000 rows are the tail the screen will not hold: queries with a handful of impressions, new URLs, country splits you only see when the row budget is larger than a spreadsheet export. They are still not the site total. If the property is small, Tuesday may already fit in 1,000 rows, and Google says the row limit will not affect the majority of properties. Say that out loud before you buy a tool to recover a tail you do not have. The page that walks the ceiling itself is Search Console's 1,000-row limit.

What the import does not do on that Tuesday: it does not turn a click into a session, it does not attach the click to a SiteLine visitor hash, and it does not keep a 50,000th row. Google's API can expose up to 50,000. SiteLine stops at 25,000 per day per report.

A careful read of the same day also separates fresh rows from finalized ones. Google's guide to retrieving performance data says to query one day at a time, that data is typically available after 2–3 days, and that the API exposes a maximum of 50,000 rows per day per search type. SiteLine's refresh is more aggressive than "wait three days and freeze the file": every 4 hours it reimports the last 7 days, including fresh rows, because those days can still change. An agent that treats yesterday's partial day as a finalized crash is misreading coverage, not discovering an outage. Both clocks are in SEO analytics for AI agents.

Money

$4.99 is not competing with $0. It is competing with consent-rate damage, CMP complexity, and the afternoon you spend in Explorations. GA4 sampling starts when an event-level query passes 10 million events on a standard property (up to 1 billion on Analytics 360, with a 100 million default). The data-quality icon shows how much of the data was used. SiteLine does not sample on-site events. Soft caps are a visibility rule: after 1 million or 10 million events, Starter and Growth keep ingesting and hide the overflow in charts until you upgrade. Scale does not hide; it meters at $2.99 per extra million. Every tier includes unlimited Search Console sites, unlimited analytics domains, both MCP servers, and CSV. Quotas reset on the Stripe anniversary. The trial is 7 days, no card to start, with visibility of about 50,000 events. Full rules: /docs/billing.

Cancel: you keep access through the paid period; analytics then has 30 days before purge. There is no warehouse export to take with you. Download CSVs if you need them.

Gaps we will not close to look bigger

We will not add session replay. We will not persist a visitor across days. We will not ingest Mixpanel-class event graphs. We will not connect Google Ads. We will not run your CNAME for you in v1. If a competitor promises those and cookieless simplicity, read their network tab.

The two MCP servers are read-only and split on purpose. One answers Search Console questions (queries, pages, clicks, impressions, position, coverage dates). One answers on-site questions (pageviews, the daily visitor hash, events, goals). A single token can authorize both. They stay two unit systems. Clicks are not visitors.

Install path: enable analytics on a domain, allowlist hostnames, add the script or React SDK, optionally proxy. Privacy notice: /privacy. Product privacy: /docs/privacy. Signup: /register. For open-source self-host options that are in the same shopping tab, open-source web analytics. For Plausible and Fathom-style peers, privacy-first comparison.

How to run both without lying

A sane month looks like this. Leave the GA4 property in place if Ads still needs it. Add the SiteLine script on the marketing hostnames you allowlist. Connect Search Console with webmasters.readonly only. SiteLine cannot submit sitemaps, request indexing, or change users. For four weeks, read three numbers and refuse to force them equal:

  1. Search Console chart totals for clicks, from the property, not from a sum of query rows.
  2. SiteLine pageviews and daily unique hashes on the URLs you care about.
  3. GA4 sessions and users, remembering they are a consented cookie population, and that an Exploration may be a sample.

The relationship you want is stable, not identical. A documentation URL can gain impressions in Search Console on a day the on-site script sees a quiet afternoon, because an impression is not a visit. A visit from a newsletter is a pageview with no query row at all. Write that down next to the chart. The identity limits of the hash are in unique visitors without cookies.

FAQ

Can SiteLine replace GA4 for Google Ads?

No. Keep GA4 or Google's Ads tags for paid. SiteLine does not import or export Ads conversions. Google's own GA4 overview treats media-platform integrations as part of the product. That is a reason to keep GA4 where the ads run, not a reason to put the same tag on every marketing hostname.

Will pageviews match GA4?

Not closely. GA4 users are cookied and often consent-gated. SiteLine uniques are a daily hash and include people who refused a CMP but did not block the script. The hash resets at UTC midnight, so a person on Tuesday and Wednesday is two visitors. Use Search Console as the organic check, not GA4 users as a target to hit.

Is Google a processor for SiteLine analytics?

On-site events go to SiteLine (Aglet Technologies), not to a GA4 property. Search Console data is copied from Google under webmasters.readonly and Limited Use. Two processors, two datasets. That is the architecture. The notice is /privacy. The operator page is /trust.

Does the import store 50,000 rows because the API allows it?

No. Google's deep dive says the API can return up to 50,000 rows per day per site per search type, in pages of 25,000. SiteLine stores up to 25,000 rows per day per report. The UI export is a third, smaller cut: 1,000 representative rows.