GA4 Integration
Connect a GA4 property so you can use existing GA4 events as goals. OAuth flow, property selection, sync schedule, and limits.
Browse docs
Connect a Google Analytics 4 web stream so your existing GA4 events can drive privacy-safe A/B test goals — no conversion reinstrumentation required.
If your team already tracks purchases, leads, or signups in GA4, you can plug Otter into that data instead of reinstrumenting the conversion. Once a project is connected to a GA4 web stream, you can add a GA4 Event goal to any test and pick from the events GA4 is already collecting.
The connection is project-scoped — one GA4 web stream per Otter project. If you run tests across multiple websites or stores, create one project per site and connect each one to the matching GA4 property.
Connecting GA4
- 1
Open the project’s integrations tab
In Otter, open the project you want to connect and head to Settings → Integrations → Google Analytics 4. Click Connect GA4. - 2
Authorize with Google
You'll be sent to Google's OAuth consent screen. Otter requests read-only access to your GA4 properties (analytics.readonly) and nothing else — no ads, no write access, no other Google services. - 3
Pick a web stream
Otter fetches the accessible GA4 properties and their web data streams. Pick the stream whose domain and Measurement ID match the website running the experiment. The server validates the choice against Google rather than trusting browser labels. - 4
Register the experiment dimensions in GA4
This step happens in GA4, not Otter, and results cannot sync without it. In GA4 go to Admin → Data display → Custom definitions → Create custom dimension and register two event-scoped custom dimensions: one with event parameterexperiment_id, one with event parametervariant_id(any display names). Otter's SDK sends both parameters on everyexperiment_impression, but GA4 only lets reports filter on parameters that are registered in your property — and because Otter's access is read-only, we can't create them for you. GA4 applies custom dimensions to data collected from registration onward and can take up to 48 hours to surface them, so register these before launching your first GA4-backed test. - 5
Add a GA4 goal to a test
On the Goals step of the test wizard, choose GA4 Event and enter the event name exactly as it appears in GA4 (e.g.purchase,generate_lead,sign_up). Names are case-sensitive.
How sync works
A background job runs every five minutes for projects with a running, paused, or recently completed GA4-backed test. For each goal and variant, Otter asks GA4 for a closed funnel: an experiment_impression with the matching experiment and variant parameters, followed by the selected conversion event for the same GA4 user.
If the connection is ready but no test with a GA4 goal is running, the project shows Waiting for a GA4 test and nothing syncs. Launch a test that uses a GA4 event goal and the first sync runs within about five minutes.
Matching happens inside the connected GA4 property. Otter never exports visitor IDs or customer identity data, and no high-cardinality visitor-level dimension is ever needed — only the two low-cardinality event-scoped custom dimensions (experiment_id and variant_id) described in the setup steps. If they're missing, every refresh fails with a setup message naming them until they're registered. Every refresh rechecks the complete experiment window, so delayed GA4 data is reconciled instead of being lost behind a short watermark.
Completed tests continue refreshing for seven days and keep their end time fixed. Otter stores hourly aggregate snapshots plus refresh health, sampling warnings, report count, total converters, and the last error. A failed refresh never partially publishes new totals; the previous successful totals remain visible.
GA4 goals return all-user aggregate totals. Otter's local audience segments and event-time trend charts are unavailable for those goals because GA4 does not return the underlying visitor events. If Google samples a funnel report, the UI labels the totals as estimates.
Connection states
pending_property_selectionYou've authorized with Google but haven't picked a web stream yet. The connection exists; refreshes haven't started. Pick a stream to move to active.
activeA web stream is selected and funnel refreshes run every 5 minutes while a GA4-backed test is active or finalizing. This is the healthy state.
expiredGoogle revoked the OAuth token — usually because the user disconnected our app from their Google account permissions, or because the token couldn't be refreshed. Reconnect to resume syncing.
revokedYou disconnected via the Otter UI. No syncs run. Reconnect at any time.
Mid-test rules
Stream changes are blocked while data is reconciling. Otter refuses to switch streams while a GA4 test is running, paused, or within its seven-day finalization period because switching would mix incompatible attribution data.
Disconnect is blocked on the same schedule. Complete the test and allow its seven-day finalization period to finish first. Existing result snapshots remain available after a later disconnect.
Pick the right stream the first time. Verify the domain and Measurement ID on the selection screen so a staging stream is not used for production traffic. If a test is paused or resumed, Otter excludes the paused interval while GA4 still deduplicates users across the active run windows.
Frequently asked questions
Quick answers to the questions teams ask most about this part of Otter.