I remember the first time I had to migrate an entire event tracking setup from Universal Analytics (GA3) to Google Analytics 4 (GA4): it felt like defusing a bomb while trying to keep the lights on. The key to getting it right is planning, mapping and running both systems in parallel until you're confident the new implementation is capturing everything you need. Below is the step-by-step plan I use with clients to migrate event tracking without data gaps — practical, actionable and tested across ecommerce sites, SaaS apps and editorial experiences.
Audit what you currently track
Start by taking inventory. I create a single spreadsheet that lists every event currently firing in GA3. For each event I capture:
Export Historical Data: pull a 90–180 day export from GA3 for all events and goals (CSV + BigQuery if you have it). This gives you a baseline for volume and key metrics to compare against GA4 after migration.
Map GA3 events to GA4 events and parameters
GA4’s model is event + parameters; there’s no category/action/label trio. Mapping is where most gaps occur. For each GA3 event I decide:
Example mapping table (keeps things unambiguous):
| GA3 Category | GA3 Action | GA3 Label | GA3 Event | GA4 Event Name | GA4 Params |
|---|---|---|---|---|---|
| Video | Play | Homepage Hero | Video Play | video_play | video_title, video_position |
Decide tagging method: gtag.js vs Google Tag Manager (GTM)
I recommend using Google Tag Manager where possible — it gives you modular control, versioning and easier debugging. The migration steps differ a little depending on whether you use raw gtag or GTM:
Whatever you choose, run both GA3 and GA4 tags in parallel (dual tagging) so you can compare data while keeping GA3 as the source of truth until the switch.
Re-use and enhance your Data Layer
The most reliable way to port events is to standardize Data Layer pushes. If you already have a structured dataLayer, great — reuse it. If not, I recommend aligning with ecommerce.js or a lightweight custom schema:
Once the dataLayer is stable, map Data Layer variables in GTM to GA4 Event parameters. This avoids fragile DOM scraping and reduces future maintenance.
Build GA4 event tags and register key parameters
Create GA4 Configuration tag first (with measurement ID). Then for each mapped event, create a GA4 Event tag in GTM and add parameters mapped from the Data Layer.
Tip: Register parameters early. GA4 only surfaces parameters to reports if you register them as custom dimensions/metrics (with 50 event-scoped dimension slots by default).
Run dual tagging and QA carefully
Dual tagging = both GA3 and GA4 capturing the same user actions. This is the safety net. For QA:
Document any systematic differences you expect (e.g., GA4 automatically collects some events like first_open or page_view differently). Don’t chase tiny percentage differences; focus on major mismatches.
Handle goals, conversions and eCommerce
Goals in GA3 become Conversions in GA4. For ecommerce, move to GA4 ecommerce events (add_to_cart, begin_checkout, purchase, etc.). Steps:
If you rely on enhanced ecommerce, consider migrating to GA4’s ecommerce schema or using Google Tag Manager templates or Measurement Protocol to ensure server-side accuracy.
Address historical data and reporting gaps
GA4 won’t import historical UA data. I always keep GA3 accessible for historical reports and create BigQuery exports for both platforms if long-term analysis matters.
If you need to maintain dashboards during transition, create joined datasets that tag which platform the data came from and apply normalization rules.
Consider server-side tracking for resilience
I’ve started recommending server-side tagging for clients that need more accurate purchase and identity tracking (reduces ad-block impact and improves data control). Key benefits:
Start with client-side GA4 and add server-side where it matters (payments, subscription events, identity linkages).
Rollout, monitor and iterate
Once QA passes and volumes are within expected ranges, switch your reporting to GA4 conversions and remove GA3-dependent dashboards gradually.
Set up alerts: use GA4’s custom alerts or your monitoring stack to notify on large drops in event volume or sudden spikes — they’re usually the first sign of a tagging break.
Common pitfalls to avoid
Migration is less about flipping a switch and more about rebuilding your event taxonomy in a more flexible system. Plan, map, test and monitor — and if you get stuck, look for the cheapest guardrail (dual-tagging or server-side receipts) that will protect your revenue data during the transition.