I've been running side projects for years, and Google Analytics was always the default. Drop in the snippet, forget about it, occasionally squint at a dashboard nobody asked for. Then GDPR happened, then a client's legal team handed me a 12-page questionnaire about data processors, and I finally started looking at alternatives seriously.
After migrating three projects off GA in the last six months, I've got opinions. Here's an honest comparison of the privacy-focused options I actually tested — Umami, Plausible, and Fathom — and what the migration looked like.
Why migrate off Google Analytics at all
Let me be fair to GA first. It's free, it's powerful, and the new GA4 event model is genuinely flexible once you stop fighting it. If you need funnel analysis with 47 dimensions, you probably want to stay.
But for most of us building product sites, marketing pages, or blogs, GA is wildly over-spec'd. You don't need session-scoped custom dimensions to know which blog post is doing well. And the cookie banner tax is real — every visitor has to click through a consent popup that hurts conversion and looks like junk mail.
The privacy-focused alternatives share a few traits:
- No cookies (or optional/anonymous cookies only)
- No personal data collection, so usually no consent banner required under GDPR
- Dashboards you can actually understand without a certification
- Lightweight tracking scripts (often under 2KB vs GA's ~45KB)
Side-by-side comparison
I'll skip the marketing chart and just tell you what mattered when I was choosing.
Umami
Umami is the one I ended up using on two of my three projects. It's open source, self-hostable, and the dashboard is genuinely pleasant. You can also use their cloud offering if you don't want to run it yourself.The tracker is tiny. The setup is just a script tag with a data attribute pointing at your site ID:
Self-hosting is straightforward with Docker. I run mine on a $6 VPS alongside a few other small services:
# docker-compose.yml (simplified)
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
environment:
DATABASE_URL: postgresql://umami:password@db:5432/umami
DATABASE_TYPE: postgresql
# Generate this with: openssl rand -base64 32
APP_SECRET: replace-me-with-a-real-secret
ports:
- "3000:3000"
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: password
Tradeoffs: you're on the hook for backups and updates if you self-host. The cloud version removes that headache for a monthly fee. Event tracking exists but is less polished than Plausible's — fine for basic conversion tracking, less great if you want elaborate funnels.
Plausible
Plausible is the most popular of the bunch and probably the most polished out of the box. It's also open source and self-hostable, though the community edition lags a bit behind the cloud version on features.The script setup looks nearly identical to Umami:
Where Plausible shines is the dashboard polish and the goal/funnel features. Their docs are genuinely good, and the cloud pricing is fair. The self-hosted version uses ClickHouse though, which is a heavier dependency than Umami's Postgres-only setup. I ran it once on a small server and the ClickHouse memory usage was uncomfortable.
Fathom
Fathom is cloud-only — no self-hosting option, which was a dealbreaker for me on one project but might be a feature for you (no servers to maintain).The pitch is similar: simple dashboard, privacy-friendly, no cookie banner. Their EU isolation feature for European visitors is genuinely thoughtful from a compliance angle.
Tradeoff: you pay from day one. There's no free tier, and pricing scales with pageviews. For a hobby blog, that's a hard sell. For a business site where you don't want to think about infrastructure, it's reasonable.
Migrating from GA: what actually breaks
The migration itself is shockingly easy on the implementation side. Replace the GA snippet with the new tracker and you're done. The pain is everywhere else.
Here's the before/after for a typical Next.js setup. Before, in _document.tsx:
// Google Analytics — the part you're ripping out
src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"
strategy="afterInteractive"
/>
After, with Umami:
That's the easy part. The harder parts:
- Custom events: if you tracked button clicks or form submissions in GA, you'll need to rewrite them. Umami's API uses
umami.track('event-name', { data }), Plausible usesplausible('event-name'). Not a huge lift but tedious if you have many. - Historical data: there's no clean way to migrate years of GA data into these tools. Export what you need to BigQuery or a CSV, archive it, and start fresh. I won't pretend this isn't annoying.
- Stakeholder education: marketing folks who learned GA over a decade will need a tour of the new dashboard. The simpler interface is usually a net positive once they get over the initial "where's the bounce rate" shock.
A small example of a custom event in Umami:
// After a successful signup
if (typeof window !== 'undefined' && window.umami) {
// Second argument is optional event data
window.umami.track('signup-completed', { plan: 'free' });
}
Recommendation by use case
Not every tool fits every project. Here's how I'd actually pick:
- Hobby project or blog, want zero ongoing cost: Self-hosted Umami on a cheap VPS. The Postgres-only setup is easy to babysit.
- Small business, don't want to manage servers: Plausible cloud or Fathom. Plausible is cheaper at low volumes; Fathom's EU isolation is nice if you're dealing with strict European compliance.
- You have a real ops team and need scale: Self-hosted Plausible with ClickHouse, or Umami cloud if you'd rather not run analytics infra.
- You genuinely need GA's depth: stay on GA4 and stop reading comparison articles. Use the right tool.
I haven't tested PostHog's analytics-only mode thoroughly yet, so I left it out — but it's worth looking at if you also want product analytics and feature flags in one place.
The migration takes an afternoon. The cookie banner you get to delete is worth it on its own.
