Skip to content

← Atlas

Migrate from Universal Analytics to Plausible: Late-Mover’s Guide

UA is read-only since July 2024. Skip GA4 entirely — install Plausible cleanly, archive UA before deletion, recreate goals.

Why this guide is short

Universal Analytics has been read-only for over 18 months. There is no live UA→Plausible pipe — UA isn’t collecting anything to mirror. What you actually need to do is install Plausible cleanly, accept that no historical data crosses the boundary, and archive UA before Google deletes it.

If you skipped GA4 deliberately, this is your reward: you avoid the GA4→Plausible event-mapping work entirely.

Pre-migration checklist

  1. Export UA archive NOW. Use the Reporting API or csv exports. Google has hinted at “early 2026” full UA deletion. Once it’s gone, it’s gone.
  2. Inventory UA goals. Each becomes a Plausible goal with the same trigger logic.
  3. Decide hosting. Plausible Cloud (~$9–$190/mo, EU-hosted) or self-host (Docker, single binary).
  4. Decide proxying. If your audience uses Brave/uBlock/corporate firewalls, the proxied build (`/stats/script.js` on your domain) is mandatory for accuracy.

Step-by-step

1. Archive UA (Days 1–3)

bash Export UA via Reporting API
<br />
ga-export \<br />
  –property=UA-XXXXX-X \<br />
  –start=2014-01-01 \<br />
  –end=2024-07-01 \<br />
  –output=/archive/ua-export.parquet \<br />
  –dimensions=date,source,medium,landingPage \<br />
  –metrics=sessions,users,pageviews,goalCompletions<br />

Store the archive in cold storage. DuckDB can query Parquet directly when you need historical lookups.

2. Install Plausible (Day 3)

html Plausible script tag (proxied)
<br />
<script defer data-domain="example.com" src="/stats/script.js"></script><br />

The proxied build defeats ad-blockers. Without it, expect 30–50% under-counting on tech-savvy audiences.

3. Recreate UA goals (Day 4)

Each UA destination/event/duration goal → Plausible custom event:

js UA goal → Plausible event
<br />
// UA: Goal triggered when /thank-you reached<br />
// Plausible equivalent<br />
plausible(‘Sign up’, { props: { method: ’email’ } });<br />

Configure the goal in Plausible dashboard before firing the event.

4. Validate (Days 4–14)

There’s no parallel run possible (UA isn’t collecting). Validate against your server logs and ad-platform conversion data instead. Parallel-Run Validator can compare your Plausible export to historical UA archive — useful for trend-line sanity checks but expect 30%+ deltas.

5. Cutover (Day 14)

Remove the UA snippet from your templates. UA itself stops collecting on July 1, 2024 — you’re just removing dead code.

Common gotchas

  • “My historical reports are gone” — They’re in the UA archive. DuckDB queries on Parquet are how you access them now.
  • “Plausible numbers are way lower than UA was” — UA inflated. Plausible filters bots more aggressively, defines sessions tighter, and Google’s referrer stripping artificially inflated UA’s “direct” traffic.
  • “Where’s bounce rate?” — Plausible has none. Time-on-site and pages-per-visit are the equivalents.
  • SPA route changes — Plausible doesn’t auto-track these. Add `plausible(‘pageview’)` on every history.pushState.

Frequently asked

Why are my Plausible numbers different from old UA reports?

Different definitions, different bot filtering, different referrer handling. UA’s session was loose (30-min inactivity OR day boundary OR campaign change). Plausible’s is tighter. Don’t try to back-port — document the structural differences and move on.

Should I migrate to GA4 first, then Plausible?

No. That’s a double migration. Skip GA4 entirely if you can. The only reason to touch GA4 is if your ad-platform integrations (Google Ads remarketing) require it for audience export — and even then, that’s a CAPI / server-side concern, not an analytics-tool concern.

Can I import UA archive data into Plausible?

No. Plausible has no import API. Your UA archive lives in cold storage and is queried separately when you need historical analysis.

What about Google Ads remarketing audiences?

Build them server-side via Google Ads Customer Match or rebuild them in GA4 (yes, you’d run GA4 + Plausible in parallel for the audience export only — many teams do this).

My UA had goals tied to AdWords conversions. What now?

Set up Google Ads conversion tracking directly (gtag.js for conversions only, no analytics) or migrate to Google Ads server-side via Stape/Cloudflare. Plausible doesn’t bridge to ad-platform conversion APIs.