Why migrate
UA stopped collecting data on July 1, 2024. As of 2026, your UA property is read-only and Google has scheduled it for deletion. If you haven’t migrated, you’re operating without analytics — and your historical UA data is on borrowed time.
This guide is the late-mover’s playbook: archive UA, deploy a clean GA4, accept that historical comparisons are gone, and consider whether GA4 is what you actually want — or whether you should skip GA4 entirely and go to Plausible / Matomo / PostHog.
Pre-migration checklist
- Export UA data NOW. Google has hinted at full UA deletion. Export everything via the Reporting API or csv exports before that day.
- Decide: GA4 or alternative? If you’re migrating from UA, you have an opportunity to skip GA4 entirely. Run our effort estimator for both paths.
- Plan the property structure. GA4’s data model is event-based, not session+pageview-based. Existing UA goals don’t translate 1:1.
- Plan custom dimensions. GA4 has 50 user-scoped + 50 event-scoped custom dimensions per property (Free tier).
Step-by-step
1. Archive UA (Days 1–3)
<br />
# Use Google’s GA Universal Analytics export tool<br />
# https://github.com/google/analytics-reporting-export</p>
<p>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,campaign,landingPage \<br />
–metrics=sessions,users,pageviews,bounceRate,goalCompletions<br />
Store the archive in cold storage (S3 Glacier, Backblaze B2, or BigQuery’s long-term archive tier). DuckDB can query Parquet directly when you need historical lookups.
2. Deploy GA4 (Days 3–5)
Create a new GA4 property. Install via gtag or GTM. The standard install is well-documented in Google’s reference.
<br />
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX"></script><br />
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXX', {
anonymize_ip: true,
allow_google_signals: false
});
</script><br />
3. Map UA goals to GA4 events (Days 5–7)
UA goals (destination, duration, pages/session, event-based) all become GA4 events with a parameter. The mapping is mechanical:
<br />
// UA: Goal triggered when user reaches /thank-you<br />
// GA4 equivalent<br />
gtag(‘event’, ‘sign_up’, {<br />
method: ’email’,<br />
page_path: ‘/thank-you’<br />
});</p>
<p>// Mark as conversion in GA4 admin: Configure > Events > Mark as conversion<br />
4. Configure conversions (Day 7)
In GA4 Admin → Events → toggle “Mark as conversion” for the events you care about. Conversions are GA4’s name for what UA called goals.
5. Set up BigQuery export (Day 8)
GA4’s killer feature is free BigQuery export (no GA360 required). Enable in Admin → BigQuery Links. From day one — you can’t backfill.
6. Validate (Days 8–14)
GA4’s UI lags behind data — it can take 24-48 hours for events to appear. Use the Realtime report and DebugView to validate as you ship. Compare GA4 daily totals to your server logs as a sanity check.
Common gotchas
- Don’t expect parity. GA4’s session and conversion definitions differ from UA. Numbers will look “wrong” — they’re just different.
- Sampling. GA4 samples reports above 10M events/property/month (Free tier). For exact numbers, query BigQuery directly.
- Bounce rate is gone. GA4 reports “engagement rate” (sessions ≥10s, OR ≥1 conversion, OR ≥2 pageviews). Don’t try to back out UA’s bounce rate.
- Custom reports collapsed. UA’s flexible Custom Reports → GA4’s “Explore”. Most teams need help rebuilding their key reports.
Frequently asked
Should I just skip GA4 and go to a privacy alternative?
If you’ve made it this far without GA4, seriously consider it. Plausible / Matomo / PostHog are GDPR-clean, simpler to read, and avoid the whole Schrems II compliance treadmill. Run the effort estimator for both paths before committing.
Can I import UA historical data into GA4?
No. Google removed the UA→GA4 import path in 2023. UA data lives in a UA-only archive (Parquet/CSV) and gets queried separately when needed.
What about UA's e-commerce data — is it lost?
Lost in GA4. Archive the UA e-commerce reports as CSV/Parquet before Google deletes UA. Historical revenue analysis becomes a DuckDB-on-Parquet query, not a UI feature.
Will my Google Ads remarketing audiences keep working?
The audiences themselves keep working in Google Ads, but they stop refreshing. Rebuild equivalent audiences in GA4 (Admin → Audiences) or move to server-side via Google Ads Customer Match.
When will Google actually delete UA properties?
Google has hinted at “early 2026” for full deletion in their official roadmap. Treat any UA property as on borrowed time and prioritize export.