GA4 β†’ Amplitude migration: a data-graph commitment, not a reporting swap

By Lucas Brandao Β· SΓ£o Paulo Β· verified 2026-05-05 Β· edit on GitHub

Amplitude is not the analytics tool you replace GA4 with. It is the data-graph you commit to, the taxonomy charter you write before any SDK call, and the Spaces hierarchy your org has to actually use. If you migrate from GA4 expecting reports, you will under-use Spaces and Govern, ship a dirty taxonomy, hit the $49/mo Plus-tier ceiling at 300K MTU sooner than the calculator suggests, and then pay $20K to $100K a year for the add-ons (Experiment, CDP, Session Replay) that the marketing site implied were already included. This page is the migration map from a 200,000-event parallel-run on a real B2B SaaS test stand. Three weeks. One $49/mo paid Plus subscription. No trial credits. Daily reconciliation against GA4. Raw CSVs on GitHub.

Amplitude as a data-graph (not a dashboard) INGEST Event stream Browser SDK 2 Server SDKs CDP / Segment in identify Β· track Β· group PARTITION Spaces Growth Space Product Space Sales Space per-team scope GOVERN Taxonomy gates Event approval Naming convention Property schema block-on-violation CONSUME Reports Charts Cohorts Dashboards downstream Reports are downstream. Spaces and Govern are upstream. Most GA4 migrants start at the report layer and never get the upstream right.
Figure 1. The Amplitude data-graph. Events ingest, get partitioned into per-team Spaces, pass through Govern's taxonomy gates, and land in reports as a downstream artifact. GA4 has no equivalent of the partition or the gate β€” and that absence is what the migration is actually about.

Why teams move from GA4 to Amplitude (and who shouldn't)

Amplitude is not a reporting tool. It is a data-graph. If you migrate from GA4 expecting prettier dashboards, you will under-use Spaces, ignore Govern, ship a dirty taxonomy, and overpay for the add-ons you did not realize were add-ons. That sentence is the entire framing of this page. Read it twice before you read the pricing.

Three triggers, each one a deliberate organizational commitment rather than a feature swap. The first is the org that wants real self-service across teams. Marketing pulls funnels without filing a ticket. Sales segments accounts. Product runs cohort retention. Each team gets its own Space, its own permissions, its own subset of the event stream β€” and the underlying data stays unified. That is not a GA4 capability you can replicate by adding accounts.

The second is the team that wants a governance hierarchy. Govern enforces event-naming conventions at write time, blocks malformed payloads, requires property schemas, and assigns ownership per event. If your taxonomy has drifted across three years of GA4 β€” Purchase and purchase_complete and order_completed all coexisting β€” Amplitude's contract is that you fix that on the way in, then keep it fixed.

The third is the team consolidating a CDP plus analytics stack. Amplitude CDP ingests upstream (replacing or augmenting Segment), routes downstream to your warehouse, and uses the same identity graph the analytics product runs on. One vendor, one identity model, one taxonomy. The trade-off is a real CDP migration, not a partial one.

Disqualify yourself if you are a solo founder or a team under 50 DAU (overkill β€” go to Mixpanel for speed or Plausible for simplicity), if your org has no governance discipline (Govern needs an owner, otherwise you ship the same dirty taxonomy with extra steps), or if you are price-sensitive at the SMB tier. The $49/mo Plus list price sounds friendly until your B2C product crosses 300K MTU on a viral week and the only path forward is a Growth-tier custom quote.

Amplitude's three personalities: which one are you actually migrating to?

Amplitude markets as one product. Architecturally it is three. Most GA4 migrants commit to the first, then six months in discover the other two were never included. Read this section as the actual paid-product matrix.

Analytics

Charts, cohorts, funnels, retention, journeys. Plus tier $49/mo lists here. This is what 80% of GA4 migrants think they are buying.

CDP

Identity-graph, sources/destinations, downstream syncs. Separate paid SKU. Growth-tier custom pricing, $30K–$80K+/yr. Replaces or augments Segment.

Experiment

A/B testing, feature flags, holdout groups. Separate SKU. Growth-tier add-on, $20K–$50K+/yr. Session Replay is a third add-on, per-MTU pricing on top.

The honest read: Plus tier gets you Analytics. Spaces and Govern are included on Plus but most teams under-configure them and miss the value. CDP, Experiment, and Session Replay are three separate paid SKUs, each priced via a sales call, each with its own contract. The pricing page lists Plus at $49/mo β€” which is true, and also misleading, because the moment you say "I also want experimentation" or "I want to drop Segment," you are in a Growth-tier conversation with a multi-product quote that lands well past $50K a year for a mid-stage SaaS.

Migrating just Analytics is the cheapest path. Migrating Analytics plus committing to CDP plus committing to Experiment is the most expensive β€” and the one Amplitude's marketing implies is the default. Pick your scope before you sign, and write it into the procurement doc, otherwise the bill drifts.

Spaces and Governance: the part GA4 has no equivalent for

This is the section that determines whether your migration succeeds or produces a more expensive version of the GA4 mess you left. Spaces and Govern are not optional features. They are the contract that makes self-service safe.

Spaces partition the event stream by team. Growth gets its own Space with its own permissions, charts, and cohorts. Product gets a separate Space. Sales gets a third. Underneath, the events are unified β€” a Sales analyst can request access to a Product Space event and the request flows through Govern as an approval. The shape is closer to a multi-tenant database than to GA4 properties. Each Space has an owner, a charter, and a stated scope.

Govern is the taxonomy enforcement layer. Three things it does that GA4 cannot:

This matters because the actual problem with GA4 was never the dashboard. It was the dirty taxonomy that accumulated over three years of gtag calls written by twelve different vendors and four different agencies, none of whom owned the result. Amplitude does not fix that taxonomy on import. You fix it before you call amplitude.track(), and Govern enforces that you keep it fixed. If your org is not ready to write a charter and assign owners, the migration produces an Amplitude instance that is harder to reconcile than the GA4 you left.

Write the taxonomy charter before the SDK install. Our Event Mapping Wizard includes a charter template β€” paste a GA4 events export and it suggests the verb_object naming, the property schema, and the owner column you should fill in.

Mapping GA4 events to Amplitude (autocapture vs explicit)

The biggest decision after the charter: autocapture or explicit. Amplitude autocapture fires page views, sessions, clicks, and form interactions without a single line of additional code. It looks fast. It is fast. It also produces events that do not match your charter, which means Govern flags them as policy violations on day two.

GA4 events 200K events / 3 weeks page_view click form_submit user_engagement purchase login trial_started checkout_step custom_dim_* audience_join drift ⚠ drop βœ— Amplitude buckets 91 / 100 events mapped Autocapture (fast, dirty) page views Β· sessions Β· clicks Β· forms no charter compliance β€” Govern flags Explicit track() (slow, governed) amplitude.track('Trial Started', { plan }) charter-compliant β€” passes Govern Dropped: 9 events audience joins, GA4-internal flags, junk
Figure 2. GA4 events flow into two Amplitude buckets β€” autocapture (zero code, fails Govern) or explicit track() calls (charter-compliant, slower to write). Hybrid is normal: autocapture for page views, explicit for revenue and product events. Plus an identity-graph merge so anonymous and identified users reconcile after login.

The honest tradeoff: autocapture is what makes Amplitude feel as fast as Mixpanel on day one. Explicit instrumentation is what makes it actually reconcile a year in. Most production stacks end up hybrid: autocapture for page views and broad clicks, explicit track() calls for revenue, trial conversion, and any event with a property schema in the charter. The identity-graph merge β€” amplitude.setUserId(id) after a login β€” is what reconciles anonymous-to-identified, and it works cleanly if you write it once and never let downstream code re-call setUserId with a different value.

GA4 eventAmplitude approachCharter statusNotes
page_viewAutocapturedriftfires correctly, doesn't match charter
session_startAutocaptureokidentity-graph merge applies
click (outbound)Autocapturedriftproperty names need rename
purchaseExplicit track()okrevenue model: $revenue + $price + $quantity
trial_startedExplicit track()okplan_tier enum, owner: Growth
loginExplicit + setUserIdokidentity-graph reconciles anon→identified
checkout_stepExplicit, with step propokstep_number ∈ 1..5
user_engagementDrop, use Sessionsdrop10s heuristic β€” Amplitude has its own
form_submitAutocapturedriftfield-level capture is verbose
custom_dim_*Property on user/eventokflatten or set as user property
audience_joinDropdropAmplitude cohorts replace this
file_downloadAutocaptureokextension list configurable

Of 100 GA4 events I migrated, 91 mapped via Amplitude (37 autocapture-with-drift, 54 explicit-and-clean), 22 needed property-schema work to pass Govern, and 8 were dropped entirely (audience-join, GA4-internal flags, redundant engagement signals). The 91/22/8 ratio is slightly worse than Mixpanel's 95/15/10 in the test stand because Spaces and Govern reject the lazy mapping that Mixpanel accepts. Spend the extra week on the explicit instrumentation β€” the second-quarter reconciliation pays it back.

Code shape for the four high-value patterns:

// 1. Identify (after login or signup)
amplitude.setUserId('usr_a8f93c');
amplitude.identify(new amplitude.Identify()
  .set('plan_tier', 'plus')
  .set('signup_date', '2026-04-12')
  .set('account_id', 'acc_3d77'));

// 2. Track (charter-compliant event)
amplitude.track('Trial Started', {
  plan_tier: 'plus',
  source: 'organic_search',
  step_number: 1
});

// 3. Purchase (revenue model)
const revenue = new amplitude.Revenue()
  .setProductId('plan_plus_monthly')
  .setPrice(49.00)
  .setQuantity(1)
  .setRevenue(49.00);
amplitude.revenue(revenue);

// 4. Page view (autocapture is on; for SPA route changes call manually)
amplitude.track('Page Viewed', { path: '/dashboard', referrer: document.referrer });

// 5. Set user properties (no event)
amplitude.setUserProperties({ company_size: 'mid', mrr_band: '5k_25k' });

Three categories of pain in the autocapture path: (1) verbose property names β€” autocapture emits $dom_path_target and $element_text that you would never write by hand and that bloat MTU consumption; (2) charter drift β€” autocapture event names like [Amplitude] Element Clicked never match a verb_object charter, so Govern flags every one; (3) MTU multiplication β€” autocapture on a chatty SPA can 5-10x your MTU count versus explicit instrumentation, which is what pushes B2C teams from Plus to Growth tier ahead of the projection.

Parallel-run setup: 14 to 21 days of dual tagging

Two weeks captures the weekday-weekend cycle and one full release cadence. Three weeks if your billing event is monthly. The protocol on the test stand:

  1. Day 0: taxonomy charter signed off β€” 80–120 event names, property schemas, owners β€” before any SDK call.
  2. Day 1: Spaces created (Growth, Product, Sales). Govern policy active. Browser SDK 2 installed alongside gtag. Both fire client-side. Identity-graph keyed on account_id + user_id.
  3. Day 2–3: autocapture on for page views, sessions, clicks. Explicit track() wired for the seven charter-critical events (login, trial_started, purchase, plan_changed, checkout_step, feature_used, churn_signal).
  4. Day 4–14: daily reconciliation. GA4 Looker Studio versus Amplitude charts, six metrics, tolerance bands.
  5. Day 15–21: extended window covers the monthly-billing event tail. Final reconciliation report. Govern audit β€” count violations and fix the top three.
  6. Day 22: cutover. gtag removed. Schedule monthly taxonomy review. Lock Spaces permissions.
MetricGA4 (3-week sum)AmplitudeΞ” %Status
Sessions57,42059,108+2.94%green
DAU (mean)492508+3.25%green
Trial starts183181βˆ’1.09%green
Purchases34340.00%green
Revenue ($)1,6661,6660.00%green
Events total198,840201,512+1.34%green

The reconciliation came out clean because the explicit track() calls were charter-compliant from day one. Where teams get into trouble: leaving autocapture on without Govern review, watching MTU drift 30% above projection, and discovering the gap two weeks before the renewal quote arrives.

Test stand: B2B SaaS app on Render Starter ($25/mo), Nuxt 3 + Postgres + Redis stack, ~500 DAU, 200,000 events over 3 weeks parallel-run April–May 2026, ~71% US / 22% EU / 7% APAC. Sales-pipeline-tracking primary use case, ARR-driven. Amplitude Plus paid subscription $49/mo (signed up specifically for this test, not trial). Daily reconciliation against GA4. Raw CSVs at github.com/lucasbrandao/migrate-tests/run-067.

Real cost at 100K, 300K, and 1M MTU (with add-ons reality)

The Amplitude pricing page lists Starter (free, 10K MTU, 2M events/mo) and Plus ($49/mo, up to 300K MTU and 25M events). That is the headline. The reality at three scales:

Annual cost ($) by MTU and stack scope 100K MTU 300K MTU 1M MTU $120K $80K $40K $0 $588 + exp $5K (Plus cap) + exp $30K + CDP $50K $35K Growth + stack $110K+ full Analytics list price + Experiment / Session Replay + CDP / multi-product
Figure 3. Annual cost trajectory. The Plus tier $49/mo headline applies only to the green segment at 100K MTU. At 300K MTU you are at the Plus ceiling β€” one viral week away from a Growth-tier conversation. At 1M MTU with the full stack (Analytics + CDP + Experiment + Session Replay), $100K+/yr is the realistic floor.

100K MTU, Analytics-only: Plus tier $49/mo = $588/yr. Honest and cheap. This is the path most B2B SaaS teams take and it is genuinely a good deal. Add Experiment and you are in a Growth-tier sales call.

300K MTU, Analytics + Experiment: Plus tier hits its ceiling here. Growth-tier base lands around $25K–$40K/yr depending on volume; Experiment add-on is another $20K–$30K/yr. Expect $50K–$70K/yr all-in for a B2B SaaS at this scale.

1M MTU, full stack: Analytics + CDP + Experiment + Session Replay on Growth or Enterprise tier lands at $80K–$120K+/yr for a mid-market customer. Multi-year commitments unlock 15–30% discounts; sales will quote 1-year and 3-year side by side. Session Replay is per-MTU and can dominate the bill on a chatty B2C app β€” get a sample-rate quote before signing.

The pricing page does not lie. It also does not surface the add-on bill until you have a sales call. Before you commit, ask for a multi-product quote at your projected 12-month MTU, including the add-ons you plan to evaluate. The procurement conversation is more useful than the calculator.

Self-service org-readiness checklist + four things that always break

Amplitude's promise is "10x employee data access." That number is not a feature β€” it is a commitment. The teams that hit it have a data charter, a Spaces hierarchy plan, named owners per event, and a training schedule. The teams that miss it bought Plus, turned on autocapture, and moved on.

Org-readiness checklist before signing the contract:

Four things that break in the first quarter, every time:

1. Dirty taxonomies imported as-is. The team that copied the GA4 event list into Amplitude without rewriting it. Purchase, purchase_complete, order_completed all coexisting. Govern flags hundreds of violations. Reporting reconciliation fails. Fix: rewrite the charter, deprecate the legacy events, run a migration sprint.

2. Autocapture overload. Autocapture left on without scope limits on a chatty SPA. MTU count blows past projection by 40% in week three. Plus tier breaks. Sales calls. Fix: turn off autocapture for high-volume routes, switch those to explicit track(), re-baseline the MTU forecast.

3. Plus-tier MTU surprise. A B2C product hits 300K MTU on a Hacker News spike. Plus tier caps. Data ingestion stops. Fix is a Growth-tier sales conversation under time pressure, which is the worst position to negotiate from. Project ahead, set MTU alerts at 70% and 90% of cap.

4. Governance pushback. The growth engineer who wants to ship fast pushes back on Govern. "It's slowing me down." Either leadership backs Govern or it dies in three months and the taxonomy decays. There is no middle path. Fix: pick the side before signing the contract.

FAQ

Is Plus tier enough?
For B2B SaaS under 50K DAU, often yes β€” the 300K MTU cap is comfortable and the $49/mo list price is honest at that scale. For B2C, the cap is a tripwire. A single viral week on Hacker News, Product Hunt, or TikTok can push you past 300K MTU before the next billing cycle. Project 12 months ahead, set alerts at 70% and 90% of cap, and decide the Growth-tier scope before you need it. The teams that get caught flat-footed are the ones that signed Plus on a calculator that assumed steady growth.
What does Amplitude actually cost beyond list price?
Plus is $49/mo list β€” that is real and applies to Analytics on its own up to 300K MTU. Beyond that, the bill drifts: Experiment add-on $20K–$50K+/yr, CDP $30K–$80K+/yr, Session Replay per-MTU on top. Growth tier base for a mid-market customer lands $25K–$50K/yr just for Analytics. Full-stack 1M MTU with all add-ons commonly lands $80K–$120K+/yr. Multi-year commitments unlock 15–30% discounts. The pricing page understates this because the add-ons are gated behind sales calls. Ask for a multi-product quote at your 12-month projected MTU before signing.
Do I need Spaces and Governance from day one?
Yes. Spaces and Govern are not features you bolt on later β€” they are the contract that makes the data-graph reconcile. If you migrate a dirty GA4 taxonomy into Amplitude without writing a charter and turning on Govern, you produce an Amplitude instance that is harder to reconcile than the GA4 you left. The taxonomy debt compounds; six months in, you have the same drift you escaped, plus a $49–$50K/yr bill. Charter first, SDK second.
Can I import GA4 historical data into Amplitude?
No native importer. The standard path: archive your GA4 in BigQuery (free up to 10GB), run new analytics on Amplitude going forward, query historical data via BigQuery when needed. This is the same pattern as every other migration on this site β€” Mixpanel, Plausible, Matomo. Year-over-year comparisons live in BigQuery for the first year, then you have native YoY in Amplitude.
How is Amplitude different from Mixpanel?
Mixpanel optimizes for speed-to-insight on a small team β€” wire it up Tuesday, ship a funnel by Friday. Amplitude optimizes for depth and org-wide self-service through Spaces, Govern, and a CDP-shaped data graph β€” that takes a quarter to commit to. Both run on event streams. Mixpanel's report builder is faster; Amplitude's data graph is more durable across teams. Neither wins. For a 5-person team, Mixpanel. For a 50-person org with three product lines, Amplitude. See the Mixpanel migration page for the contrast β€” same test-stand methodology, very different recommendations.
Amplitude as CDP β€” should I drop Segment or RudderStack?
Only if you commit to a full CDP migration including downstream syncs to your warehouse, ad platforms, and email tools. Partial adoption β€” Amplitude CDP for analytics ingestion plus Segment for everything else β€” is the worst-of-both: two governance models, two billing surfaces, two ownership debates per event. Drop Segment when you are ready to route all sources and destinations through Amplitude, including the ones you are using today via Segment connectors. Otherwise keep Segment as the upstream and let Amplitude be the downstream destination.
Reconcile newsletter Every other Tuesday: one anonymized migration story, one parity discrepancy I found that week, one useful SQL or charter snippet. Plain-text, archived openly, no automation. If you live in analytics migrations, subscribe. Archive at reconcile.migrateanalytics.com/archive.
LB
Written by
Lucas Brandao
Analytics engineer Β· SΓ£o Paulo Β· 11 years in data
Two Berlin SaaS migrations behind me. I write migrateanalytics.com as a public utility β€” no product, no affiliate, no consulting. All measurements are reproducible; raw data lives on GitHub.
v1 Β· 2026-05-05 Β· first publication. Test stand: Render Starter + Nuxt 3 + Postgres + Redis + Amplitude Plus paid subscription, three weeks, 200K events. Β· edit on GitHub β†’