Skip to content

← Atlas

Migrate from Google Analytics 4 to Plausible: Step-by-Step Guide

A 3000-word playbook for teams switching from GA4 to Plausible: pre-flight audit, event mapping, dual-tagging, cutover, and post-migration reconciliation.

Why migrate

You’re considering Plausible because GA4 keeps a lot of data Plausible never collects: device fingerprints, persistent client IDs, cross-property cookies, and the inferential machinery that turns those into “audiences”. Plausible drops all of that. The benefit is GDPR-clean by default and a UI you can actually read in 30 seconds.

The cost: you lose audiences for ad platforms (CAPI is your fallback), you lose the GA4 demo-graphics layer, and your numbers will not match GA4. They are not supposed to.

Pre-migration checklist

  1. Inventory custom events. Pull a 90-day event report from GA4. Group by event name + parameter shape.
  2. Inventory custom dimensions. Plausible calls these “custom properties”. Each goal can carry up to 30. If you need more, you have a structural problem you should fix anyway.
  3. Inventory audiences. Plausible has none. Audiences live in your ad platform now. Plan a CAPI or Conversions API path per ad surface.
  4. Decide hosting. Plausible Cloud (~$9–$190/mo) or self-host (Docker, single binary). Self-host costs more in dev hours, less in monthly fees.
  5. Decide proxying. Plausible’s plausible.io/js is blocked by Brave, uBlock, and many corporate firewalls. A proxy on your domain (/stats/script.js) is mandatory for accuracy.

Step-by-step

1. Audit (Days 1–3)

Export GA4 events and parameters. Document the ones with non-zero traffic. Anything below 1% can be dropped — Plausible isn’t your archive.

2. Map (Days 3–5)

Translate each GA4 event to a Plausible goal + custom properties. The Event Mapping Wizard handles the common ones. For e-commerce, model purchase with props:

js GA4 → Plausible: purchase event
<br />
gtag(‘event’, ‘purchase’, {<br />
  transaction_id: ‘T_12345’,<br />
  value: 99.00,<br />
  currency: ‘EUR’,<br />
  items: [{ id: ‘sku_1’, price: 99 }]<br />
});</p>
<p>// Plausible equivalent<br />
plausible(‘Purchase’, {<br />
  props: {<br />
    transaction_id: ‘T_12345’,<br />
    value: 99,<br />
    currency: ‘EUR’<br />
  }<br />
});<br />

3. Install Plausible (Day 5)

Add the script tag with the data-domain set to your apex (no www). Use the proxy build if you have ad-blocker exposure:

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

4. Dual-tag (Days 6–35)

Run both tracking scripts in parallel for at least 30 days. Daily diff with the Parallel-Run Validator. Expect 15–30% session count delta — that’s normal, not a bug. Investigate only deltas above your tolerance threshold.

5. Cutover (Day 36)

Remove the GA4 snippet. Keep BigQuery export running for one more billing cycle as a hedge. Document the final delta numbers in a “what changed” memo for stakeholders.

6. Verify (Days 37–60)

Compare Plausible’s first month vs GA4’s last month at the metric level — pageviews, sessions, top pages, top referrers. Note the structural deltas (referrer stripping, bot filtering) so the team stops asking.

Common gotchas

  • Single-page apps: Plausible doesn’t auto-track route changes. You need plausible('pageview') on every history.pushState.
  • Cross-domain: Plausible has no built-in session stitching across domains. If you need that, model it yourself with a shared visitor_id property.
  • Ad-blocker exposure: Without a proxy, expect 30–50% under-counting on tech-savvy audiences.
  • Goal limits: 100 goals per site on Cloud. If you need more, group goals by category and use props.

Frequently asked

Will my GA4 numbers match Plausible's?

No, and they shouldn’t. Plausible filters bots more aggressively (-15-30% sessions), defines sessions differently (30-min inactivity vs GA4’s 30-min + day boundary), and Google strips referrers from organic search to inflate “direct” traffic in GA4. Document the deltas, don’t chase parity.

Can I keep GA4 running alongside Plausible permanently?

Yes — many teams do this for the first 6 months, then drop GA4. The cost is two tags loading, slightly higher LCP, and ongoing GA4 compliance exposure (you still owe Schrems II analysis if EU traffic touches GA4).

What about audiences and remarketing?

Plausible has no audiences. If you depend on Google Ads / Meta remarketing, run server-side conversion APIs (CAPI / Google Ads sGTM) directly from your backend. Plausible doesn’t replace audience exports — accept this before migrating.

Does Plausible support enhanced e-commerce?

Partially. Plausible can track purchases as goals with revenue properties, but it doesn’t model carts, items, or funnels the way GA4 does. For deep e-commerce analytics, evaluate Matomo or PostHog instead.

How do I migrate historical data?

You don’t, in the strict sense — Plausible has no import API. You keep GA4 BigQuery exports for the historical tail. Most teams archive GA4 data as Parquet in cold storage and query it with DuckDB when they need it.