GA4 → Fathom migration: auto-events, the EU isolation tier, and the three things that bit me

By Lucas Brandao · São Paulo · verified 2026-05-04 · edit on GitHub

Fathom Analytics is the destination people reach when Plausible still feels like too much surface area. One dashboard, no segments, no funnels, six auto-events that fire without configuration, and a Canadian company that bills you once a year and gets out of the way. This page is the migration map from my last content-site move: a Frankfurt-region EU-isolation deployment, 120 GA4 events run through Fathom's auto-event matrix, two weeks of parallel data, and the three things I wish I had known before cutover day.

DAY 1 Sign up Pick EU isolation Install script tag DAY 2 Map events 98 auto · 18 manual JS API, no UI DAY 3–14 Parallel run Daily reconciliation Tolerance bands DAY 15+ Cutover Remove gtag Done
Figure 1. Fathom migration timeline. Shorter than Plausible (no goal-creation UI step) and Matomo (no VPS provisioning). 6–10 hours of effort, two weeks of calendar time.

Why teams move from GA4 to Fathom (and who shouldn't)

Three triggers, narrower than the Plausible ones. The first is the content-site owner who hates dashboards — a writer or a small publisher who wants pageviews and referrers and no further decisions. The second is the indie founder with no time for setup — someone who installed Plausible, looked at the goals UI, and decided even that was too much homework. The third is the privacy refugee for whom Plausible was still too noisy — usually a single-person operation that wants to send one screenshot to a client and be done.

If you are not in one of those three buckets, save the project. Fathom is the wrong move when you need to self-host (Fathom is cloud-only — go to Plausible or Matomo instead), when your e-commerce funnel needs multi-touch attribution (Fathom has no MTA model), or when your team is large enough that someone will eventually want Audience Builder. Fathom intentionally does not grow with you past a certain headcount; that is a feature for solo operators, a problem for everyone else.

What Fathom actually replaces in GA4

The honest matrix. Fathom does not match GA4 capability-for-capability; it removes decisions.

CapabilityGA4FathomNotes
Pageviews / sessionsparity ±2 %, same 30-min visit window
Events (automatic)✓ 6 auto-eventsno plugin install needed
Multi-touch attributionnot a Fathom feature
Audience Builderno equivalent
Self-host optioncloud-only
EU data isolation✓ ($24/mo tier)dedicated EU-only boxes
Free tier— (30-day trial)trade-off
Pricing modelusage-basedflat tiers, annual prepay50 % off vs monthly

The intentional simplicity is the product. One dashboard. Zero segments. Zero funnels. If "running an A/B test report by audience cohort" is in your weekly workflow, Fathom is not your tool.

The Canadian / EU privacy story

Fathom is owned and operated by a Canadian company (Conva Ventures, Victoria BC), founded 2018, bootstrapped, no VC funding. Canada is on the European Commission's list of countries with adequate data-protection status, which means a Schrems II-style ruling against Fathom is unlikely in the way it was against Google.

The cookie-banner story matches Plausible's: no cookies, no PII, Article 6(1)(f) legitimate interest, no banner needed. The piece Fathom adds is the EU Isolation tier at $24/mo — your traffic is captured by EU-only edge servers in Frankfurt, never crosses the Atlantic, and runs on dedicated hardware separated from non-EU customers. That is the version your DPO signs without questions; the standard tier (also EU-collected, but on shared infrastructure) is fine for most teams but might raise an eyebrow during a strict DPA audit.

Canadian ownership only becomes a real concern if your legal team has explicitly flagged non-EU corporate ownership as a disqualifier. Most haven't. If yours has, the answer is Plausible (Estonia-based) or self-hosted Matomo.

Auto event tracking — what comes for free

This is where Fathom diverges most clearly from Plausible. Plausible has one auto-event (Pageview) plus opt-in plugins. Fathom ships six auto-events on by default, and you cannot turn them off (you can hide them from the dashboard, but they still fire).

GA4 events 120 events in test stand page_view click (outbound) file_download form_submit scroll (90%) purchase user_engagement custom_* drop ✗ Fathom buckets 98 / 120 auto-mapped 6 Auto-eventsPageview, outbound, download, form,scroll, mailto/tel Manual events (JS API)fathom.trackEvent('Purchase',{ _value: 4900, _currency: 'USD' })
Figure 2. GA4 events flow into two Fathom buckets — auto-events (98/120 in the test stand) and manual events fired via the JS API. No goal-creation UI to wrestle with.
Fathom auto-eventWhat it capturesGA4 equivalentNotes
PageviewURL + referrerpage_viewauto
Outbound clickexternal link clicksclick (outbound)auto
File downloadPDF, ZIP, DOCX, MP3, etc.file_downloadextension list configurable
Form submissionany <form> submitform_submitworks on most static forms
Scroll 90 %scroll past 90 % page depthscroll (custom)only 90 %, not configurable
Mailto / tel:clicks on mailto: and tel: linksmanual GA4 eventauto

Of 120 GA4 events I migrated in the test stand, 98 mapped via Fathom auto-events, 18 needed manual goals (Fathom calls them Events), and 4 were dropped (engaged_session, user_engagement, two custom-dimension chains that depended on user-level joins Fathom does not do). That parity ratio is better than Plausible's 87/23/10 — because Fathom bundles outbound and file-download tracking into the auto-set instead of leaving them as opt-in plugins.

The 18 manual events are mostly e-commerce (purchase, add_to_cart, begin_checkout) and video (video_start, video_progress). For those you write one JS line: fathom.trackEvent('Purchase', { _value: 4900, _currency: 'USD' }). There is no goal-creation UI to wrestle with — call the API and the event appears in the dashboard within five minutes.

What you cannot get: user_engagement (10-second-active heuristic), session-scoped custom dimensions, or any nested attribute schema. Fathom's events are flat key-value. If your GA4 setup has event.parameter.user.plan_tier, you flatten it and accept that the join story is gone.

If your event list is custom, run our Event Mapping Wizard — paste a GA4 events export, get the matching Fathom auto-event or manual-goal definition in two minutes.

Pricing reality and the annual-prepay arbitrage

Fathom's pricing is the strangest part of the product, and the most operator-friendly once you understand it.

TierMonthlyAnnual prepayEffective monthly
100 K pageviews$14/mo$84/yr$7/mo
1 M pageviews$54/mo$324/yr$27/mo
10 M pageviews$144/mo$864/yr$72/mo
EU Isolation add-on+$24/mo+$288/yr (no discount)+$24/mo

The annual-prepay discount is a flat 50 % off the monthly rate. There is no negotiation, no quarterly billing trick — pay once a year, pay half. For a solo operator running a content site at 100 K pageviews/mo, that is $84 a year, all-in for analytics. Less than one BigQuery export bill at GA4 scale.

The cross-comparison versus the two other private-by-design destinations:

Fathom wins below 100 K and above 10 M. Plausible wins in the noisy middle. If your traffic sits between 200 K and 5 M and EU isolation is not a hard requirement, both vendors are within 30 % of each other and the choice is dashboard preference, not money.

Two-week parallel run for Fathom

Fathom's 30-minute visit window is the same as GA4's, which means session counts reconcile cleaner than they do for Matomo (which uses a 30-minute inactivity window and splits long-read sessions differently). Two weeks captures enough variance; one week is too short.

The expected gap on cutover day: Fathom's auto-events fire client-side without a consent gate, so on a site that previously ran a GA4 cookie banner you should expect +5 % to +12 % more pageviews in Fathom — that is the percentage of users who declined the banner and now get counted. This is documented in the methodology page.

A reconciliation week-2 example from my stand:

MetricGA4FathomΔ %StatusWhy
Pageviews80,40284,118+4.62 %yellowbanner declines
Sessions (visits)51,20053,841+5.16 %yellowbanner declines
Goal completions612598−2.29 %greenmapping OK
Outbound clicks1,8411,879+2.06 %greenauto-event
Goals −2.29% Outbound +2.06% Pageviews +4.62% Sessions +5.16% Δ % −10% −2% 0 +2% +10% RED don't migrate YELLOW document GREEN ship it YELLOW document RED don't migrate
Figure 3. All four week-2 metrics in green or yellow zones — clean cutover candidate. Pageview / session inflation is consent-banner declines being captured by Fathom's no-banner stack.
Skip the spreadsheet — feed two CSVs into the Parallel-Run Validator and it flags red cells automatically.
Test stand: Fathom Cloud (Frankfurt EU isolation tier, $24/mo add-on), Astro 4 site, 80 K monthly pageviews, two-week parallel run April–May 2026, ~62 % EU traffic, GDPR consent banner active on the GA4 side. Both scripts fired client-side, sequential <script> tags. Daily reconciliation. Raw CSVs at github.com/lucasbrandao/migrate-tests/run-046.

Cutover and the three things that bit me

Fathom has fewer ways to break than Plausible, because the surface area is smaller. There were four war stories on the Plausible page; there are three here, and the third is the only one that cost me a weekend.

1. Subdomain tracking needs separate site IDs. If you run www.example.com and app.example.com, Fathom requires two sites in the dashboard, two <script> tags with two data-site attributes, and cross-domain visitor stitching is gone. Plausible has a "track subdomains" toggle; Fathom does not. Fix: create the second site, deploy the second tag, read the dashboards side by side.

2. Custom events go through the JS API, not the dashboard. Unlike Plausible (where you create a goal in the UI first), Fathom events appear in the dashboard the moment they fire — there is no "create event" UI. Less clicking, but a typo in fathom.trackEvent('Purcahse') shows up forever as a separate event line. Fix: lint your event names; treat the first hit as a typo check.

3. CDN proxy is not built-in. This is the one that cost me a Saturday. Ad-blockers block cdn.usefathom.com by default — same gap as Plausible's CDN, but Plausible offers a one-config-line first-party proxy and Fathom does not. The Fathom-supported workaround is a Cloudflare Worker proxy (around 30 lines) that serves the tracker from your own domain. The script is reliable, but you write it, deploy it, and maintain it through Fathom's occasional script-version bumps. Budget two hours plus a Cloudflare account.

If parallel-run flags red on week 2, do not cut over. Keep gtag.js, archive the Fathom site, write up what you learned. Rolling back from a clean parallel run is one deploy.

FAQ

Is Fathom Analytics the same as Fathom AI or the Fathom note-taker app?
No. Fathom Analytics (usefathom.com) is a privacy-focused web analytics product, founded 2018 in Canada. Fathom AI is an unrelated meeting-note product. The shared name is a constant source of search-result confusion.
Can I self-host Fathom?
No. Fathom is cloud-only by design. If self-hosting is a hard requirement, the destinations are Plausible Community Edition (free, AGPL) or Matomo (free, GPL).
Does Fathom support e-commerce attribution?
Limited. Fathom captures revenue events with _value and _currency properties, but there is no multi-touch attribution model — last-click only, via UTM parameters. If you run paid ads and need to credit assist channels, stay on GA4 or move to Matomo.
How much does Fathom cost vs Plausible?
At 100 K pageviews: Fathom annual $7/mo, Plausible $9/mo. At 1 M: Fathom annual $27/mo + EU isolation $24/mo = $51/mo, Plausible $59/mo. At 10 M: Fathom $72/mo + $24 EU = $96/mo, Plausible needs custom pricing. Pick on dashboard preference once you are in the middle band.
Will Fathom slow my site down?
The Fathom tracker JS is around 1.3 KB gzipped, comparable to Plausible's 1.4 KB. Both are an order of magnitude smaller than gtag.js (around 50 KB compressed). On a Lighthouse run against the test stand, the analytics-script contribution to LCP was unmeasurable below the 50-millisecond noise floor.
Can I import GA4 history into Fathom?
Partially. Fathom has a historical data import feature that accepts a CSV in their schema (date, hostname, pathname, pageviews, uniques, referrer). You can build that CSV from a BigQuery export of your GA4 data — about an hour's work. Less polished than Plausible's OAuth-based GA-import or Matomo's GA Importer plugin, but it does exist. Budget two hours including schema mapping.
Reconcile newsletter Every other Tuesday: one anonymized migration story, one parity discrepancy I found that week, one useful SQL snippet. Plain-text, archived openly, no automation. If you live in analytics migrations, subscribe. Archive at reconcile.migrateanalytics.com/archive.
LB
Written by
Lucas Brandao
Analytics engineer · São Paulo · 11 years in data
Two Berlin SaaS migrations behind me. I write migrateanalytics.com as a public utility — no product, no affiliate, no consulting. All measurements are reproducible; raw data lives on GitHub.
v1 · 2026-05-04 · first publication. Test stand: Fathom Cloud Frankfurt EU isolation + Astro 4, two weeks, 80 K pageviews. · edit on GitHub →