When this migration makes sense
Fathom is the right destination if your top GA4 reports are “how many visits, what pages, where from” — and nothing else. Solo founders, small content sites, indie SaaS landing pages. If you find yourself wanting custom dimensions, audiences, or e-commerce schemas, Fathom is the wrong tool — look at Matomo or PostHog.
Pre-migration checklist
- Confirm scope. List your top 10 GA4 reports. If more than two require custom events or dimensions, Fathom won’t replace them.
- Inventory goals. Each becomes a Fathom “Event” with a fixed name. Fathom has 50 events per site limit.
- Decide on EU-isolation mode. Fathom has an EU-only data routing option for compliance — slightly slower, but keeps data within EU borders.
- Plan the cutover. Fathom doesn’t have a rich import — you start fresh. Archive GA4 BigQuery export for historical reference.
Step-by-step
1. Sign up + install (Day 1)
<br />
<script src="https://cdn.usefathom.com/script.js" data-site="ABCDEFGH" defer></script><br />
Replace ABCDEFGH with your site code from Fathom dashboard. EU-isolation mode adds data-eu="true".
2. Configure goals (Day 1-2)
In Fathom dashboard, Events → New Event. Each event gets a unique ID. Fire from your code:
<br />
fathom.trackGoal(‘SIGN_UP_GOAL_ID’, 0); // 0 = no revenue<br />
fathom.trackGoal(‘PURCHASE_GOAL_ID’, 9900); // 9900 = $99.00 in cents<br />
3. Map GA4 events to Fathom goals (Day 2-3)
Fathom doesn’t have GA4-style events with parameters. You map each GA4 event name → Fathom goal ID. Common mappings:
- GA4
sign_up→ Fathom goal “Sign Up” (no revenue) - GA4
purchase→ Fathom goal “Purchase” (revenue in cents) - GA4
add_to_cart→ Fathom goal “Add to Cart” (revenue in cents) - GA4
begin_checkout→ Fathom goal “Begin Checkout”
Goals beyond ~20 become hard to manage in Fathom’s UI. Group aggressively.
4. Dual-tag (Days 3-14)
Run both for 14 days. Use the Parallel-Run Validator to compare daily totals.
5. Cutover (Day 15)
Remove GA4 snippet. Keep BigQuery export for one more billing cycle as a hedge.
Common gotchas
- Goal IDs are opaque — Fathom assigns random IDs. Document the GA4-event → Fathom-ID mapping in your team wiki.
- No custom properties — You can’t pass arbitrary metadata with goals. Revenue (cents) is the only parameter.
- SPA tracking — Fathom auto-detects pushState route changes since v3.4. Older versions need manual
fathom.trackPageview(). - EU isolation perf — EU-routing adds ~30ms TTFB on the script. Acceptable, document for stakeholders.
Frequently asked
Fathom vs Plausible — which is simpler?
Fathom is more minimal — single dashboard, flat fee. Plausible has more goals, custom properties, dashboards per site. If you need either of those, Plausible. If you don’t, Fathom.
Can I self-host Fathom?
No. Fathom is SaaS-only. If self-host is required, Umami or Plausible self-host are the options.
What about historical data?
Fathom has no import. Archive your GA4 BigQuery export for historical access. DuckDB queries on Parquet handle the lookup.
Does Fathom integrate with ad platforms?
No native integrations. Run Google Ads / Meta CAPI separately, server-side, decoupled from Fathom.
Pricing predictability vs Plausible?
Fathom is per-site flat fee. Plausible scales with pageviews. For bursty traffic Fathom is more predictable.