Migrating away from Google Analytics 4
This page is the index, not the deep guide. If you already know which destination you want — Plausible, Matomo, or Fathom — go directly to the pair page; that is where the auto-event mapping, parallel-run reconciliation, and the war stories live. If you do not yet know, work the decision tree below first; the wrong destination is the most expensive mistake in any GA4 exit, and switching after cutover means a second parallel-run cycle. The five destination questions take ten minutes. Allocate them before you allocate the migration weekend.
Decision tree — five questions, one answer
The questions are not equal. Question 1 is a filter; everything else is a tie-break.
If two destinations tie after the five questions, run a one-week parallel test on the cheaper one before committing. Reconciling once costs a working day. Re-migrating after cutover costs a weekend.
Comparison matrix
| Dimension | Plausible | Matomo | Fathom |
|---|---|---|---|
| Cost at 100 K pageviews | $9/mo | €23/mo Cloud, free self-host | $7/mo annual prepay |
| Self-host option | yes (CE, AGPL) | yes (free, GPL) | no — cloud-only |
| EU residency built-in | yes (Estonia) | yes (Cloud Frankfurt) | yes ($24/mo isolation tier) |
| Multi-touch attribution | no | yes (last-click + position-based) | no |
| Heatmaps / recordings | no | yes (paid plugins / Cloud add-on) | no |
| Dashboard simplicity | one screen, ten tiles | full GA4-equivalent surface | one screen, six tiles |
| Domain-rating (Ahrefs) | DR 79 | DR 81 | DR 67 |
| Migration time (test stand) | 8–14 hrs | 14–24 hrs (self-host: +1 day) | 6–10 hrs |
DR figures from Ahrefs as of 2026-05. The migration-time column counts engineering hours only; the calendar runs longer because a parallel run is two weeks regardless of destination. Self-hosted Matomo adds a VPS-provisioning day.
The columns that matter most are rows 2 (self-host), 4 (MTA), and 5 (heatmaps). Those three are the load-bearing differences. Cost is a tie-breaker, not a decision driver — the spread between cheapest and most expensive at typical traffic is around $40 a month, less than the cost of one engineering hour.
What you keep, what you lose
What every GA4 exit preserves: pageviews, sessions, referrers, top-pages, top-referrers, country breakdown, device breakdown, unique-visitors (under a different definition — none of the three destinations use the GA4 client-id cookie), and revenue events fired through a JS API. That covers about 80 % of what most teams actually look at in GA4 weekly.
What you lose, regardless of destination: the BigQuery export and any SQL pipeline downstream of it; user-level joins (any analysis that says "users who did X then did Y N days later"); custom-dimension nesting more than one layer deep; engaged-sessions as GA4 defines it (10-second-active heuristic); and Google Signals demographic enrichment. Plausible and Fathom give you nothing of the BigQuery story; Matomo gives you a self-hosted SQL database, which is closer but not identical.
What only Matomo preserves: heatmaps, session recordings, multi-touch attribution, full funnel reports, A/B testing module, custom segments. If your weekly workflow depends on any of those, the decision tree collapses to one cell.
Five-step GA4-exit playbook
The destination differs; the steps do not. Each pair page goes deeper on its specific quirks.
- Export your historical GA4 data. BigQuery export is the only reliable path; the GA4 UI export caps at 10 K rows and rounds session counts. Schedule the export once, into a dated table, before you touch anything else. If you skip this, the cutover is irreversible — GA4 deletes data on a 14-month rolling window for free properties, 26 months for GA360.
- Pick a destination via the decision tree above. Do not pick on price alone; the wrong destination is the most expensive mistake. If two tie, run a one-week throwaway test on the cheaper one.
- Install the destination tracker in parallel with
gtag.js. Two<script>tags, both fire client-side, no cookie banner change yet. Each pair page documents the script-tag specifics: Plausible, Matomo, Fathom. - Run a two-week parallel period and reconcile daily. Tolerance bands: pageviews ±10 % is yellow, ±5 % is green, ±20 % is red and means a tracker bug. The expected gap is +5 to +12 % cookieless inflation on the destination side, because cookieless trackers count visitors who declined the GA4 banner. Document, do not panic.
- Cutover: remove
gtag.js, archive the GA4 property in read-only mode, keep the BigQuery export queryable for 12 months. The archive is the rollback path. Do not delete the GA4 property for at least a year; you will want to re-query it.
The cutover deploy itself is one commit. Everything before it is reconciliation; everything after is monitoring.