Migration
Moving off Google Analytics
Most of your history comes across. Some of it cannot, and we would rather tell you which before you start than after. Here is the whole picture.
GA4 API behaviour verified 6 September 2026
Four steps
- 01
Add your site and paste one line
A single script tag, 1270 bytes gzipped. Our installer checks it for you and shows you the HTML it actually fetched, so a failure tells you what went wrong instead of just failing.
about two minutes - 02
Connect Google Analytics
Read-only OAuth against the GA4 Data API. We pull every day from your first GA4 hit up to the day your script went live, so the two never double-count the same visit.
a few minutes to start - 03
Let the import run
Google's API allows 40,000 tokens an hour and ten concurrent requests, so a long history is measured in hours, not seconds. It resumes on its own if it is interrupted, and it is safe to re-run.
up to 48 hours - 04
Read the fidelity report
When the import finishes we tell you exactly what came across, what did not, which metrics are defined differently, and how far apart the two tools should be. Nobody else does this.
five minutes, well spent
The honest part
What comes across, and what does not
Every analytics vendor with a GA4 importer has this list. Most of them bury it in a documentation footnote. It belongs on the page you decide from.
| Data | Imports | Notes |
|---|---|---|
| Pageviews and sessions, per day | Yes | Daily aggregates, from your first GA4 hit. |
| Traffic sources and referrers | Yes | |
| UTM campaigns | Yes | Campaign names import; see below for utm_source. |
| Countries, regions and cities | Yes | |
| Devices, browsers and operating systems | Yes | |
| Top pages and entry pages | Yes | |
| Conversions against your GA4 key events | Yes | Goals are recreated by hand, then counts attach to them. |
| utm_source as a separate dimension | No | Google's API does not expose it separately from sessionSource. We import the source and leave utm_source empty rather than guess. |
| Exit pages | No | GA4 does not report them. |
| Scroll depth and engaged time | No | Not in the GA4 export. Ours start the day you install. |
| Hour-by-hour breakdowns of past days | No | The import is daily. Hourly data starts when your script does. |
| Browser and OS versions | No | Only the family imports. |
| Ecommerce revenue | No | Attributed by GA4’s own model, which we cannot reproduce honestly. |
| Universal Analytics history | No | Google stopped processing UA on 1 July 2023 and has since deleted the data. Nobody can import it — be sceptical of anyone who says they can. |
Before you commit
Run both for a month
Leave GA4 installed next to us. We show you both numbers side by side, day by day, and explain each gap: ad blocking, bot filtering, or a metric that is simply defined differently in the two tools.
The real barrier to switching analytics has never been price. It is not knowing whether the new numbers are true. This is how you find out without taking our word for it.
Then read the fidelity report
Every import ends with one: what was imported, what was skipped and why, which metric definitions differ, and the variance band you should expect against your old tool.
We built it because “your numbers are wrong” is the largest support category in this industry, and almost all of it is a definition nobody explained.
Why do my numbers not match Google Analytics?
They will not, and anyone promising otherwise is selling you something. Four real reasons:
Ad blockers. Google Analytics is blocked for a large share of technical audiences — Plausible measured 58% of hits missing on their own site. Our script is far less widely blocked, so we usually report more traffic than GA, not less.
Bounce rate means something different. GA4 redefined it as the inverse of engagement rate. It is not comparable to the single-interaction definition every other tool uses, including ours. Imported GA4 bounce rates stay labelled as GA4's.
Sampling and thresholding. GA4 samples large queries and withholds rows that could identify individuals. Those numbers are estimates before they reach us.
Unique visitors cannot be de-duplicated across days. The GA4 export is daily aggregates, so a 30-day total is a sum of daily figures and overcounts anyone who came back. We show imported uniques as a sum and say so.
What is the (other) row in my imported data?
GA4 buckets high-cardinality dimensions into a row literally called (other) once it hits an internal limit. That traffic is real but permanently unattributable — Google discarded the detail before we ever saw it. We import the row as-is rather than silently redistributing it, because inventing an attribution would be worse than admitting one is missing.
Can I run both at once?
Yes, and we recommend it. Keep GA4 installed alongside us for 30 to 60 days. We will show you a day-by-day comparison of the two with the variance explained — which part is ad blocking, which is a metric definition, which is bot filtering. It is the only honest way to answer "are the new numbers right?", and it is the reason most people hesitate to switch at all.
Do I still need a cookie banner?
Not for us. We set no cookies and store no IP addresses, so there is nothing on the visitor’s device to consent to under PECR or the ePrivacy Directive. If you remove Google Analytics entirely and have no other tracking, most sites can drop the banner — but that depends on everything else you run, so check with whoever advises you. We are not your lawyer.
How much does the migration cost?
Nothing, on every plan. No charge for the volume of history, and no charge for us to run it for you. Seline charges $99 for onboarding; the incumbents mostly leave you to it.
How big is the script compared with Google Analytics?
1270 bytes gzipped against gtag.js at roughly 145 KB gzipped — about 117 times smaller, measured like for like on 6 September 2026. Exact bytes vary with your GA4 configuration.
Ready
We will do the migration for you
The importer costs nothing on every plan, and you can run it inside the 30-day trial before you are charged for anything.