# How to see A/B test results in Google Analytics 4

> GA4 doesn't run A/B tests itself, but it can show their results if your testing tool sends an experience\_impression event with an exp\_variant\_string per variant. Register that parameter as a custom dimension, then compare variants in a funnel exploration or with one audience per variant. Duelpilot sends these events automatically and, when GA4 is connected, registers the dimensions and shows GA4's numbers per variant next to its own counts.

Last reviewed: 2026-10-29 · HTML version: https://duelpilot.com/guides/ga4-ab-test-results

## How experiment data gets into GA4

Since Google Optimize was discontinued in 2023 ([Google](https://support.google.com/optimize/answer/12979939)), testing happens in a separate tool and GA4 receives what that tool sends. Google's recommended pattern for testing tools is the experience\_impression event, sent when a user is added to a variant, with a parameter exp\_variant\_string in the format TOOL\_ID-EXPERIENCE\_ID-VARIANT\_ID ([Google for Developers](https://developers.google.com/analytics/devguides/collection/ga4/integration)). It should be sent for the original too, or there is nothing to compare against. Conversions are your usual GA4 events (purchase, generate\_lead, a key event) or an event your testing tool sends for its goals.

## The generic method, for any testing tool

1. Check that experience\_impression arrives: open Reports → Realtime, visit a page with a live test, and look for the event in the event count.
2. Register exp\_variant\_string as an event-scoped custom dimension (Admin → Custom definitions → Create custom dimension, scope Event). Google says reporting on a new custom dimension starts after 24–48 hours, and a standard property has 50 event-scoped custom dimensions ([Analytics Help](https://support.google.com/analytics/answer/14240153)). Create it before or at launch.
3. Build a funnel exploration (Explore → Funnel exploration) over the test period: step 1, experience\_impression where exp\_variant\_string exactly matches one variant; step 2, the conversion event. Repeat per variant, or break the funnel down by the custom dimension.
4. Or create one audience per variant with exp\_variant\_string as the membership condition, and compare the audiences in standard reports. Google calls this more accurate than explorations, which also include events from before and after the test; reports compare up to four audiences at once, and you archive the audiences when the test ends ([Google for Developers](https://developers.google.com/analytics/devguides/collection/ga4/integration)).

> **Read GA4 with care:** A GA4 exploration shows counts, not a verdict. Don't stop a test because one variant looks ahead in GA4: use your testing tool's statistics, ideally sequential ones that are safe to look at daily ([sequential testing](https://duelpilot.com/guides/sequential-testing)).

## How Duelpilot does it

### What it sends

Sent once per exposure for counted visitors (consent given, not a bot, not a preview), from the browser script.

| Event | Parameters | Example |
|---|---|---|
| experience\_impression | exp\_variant\_string = DP-{experiment}-{arm}, dp\_experiment, dp\_variant | DP-e12-v1 (experiment e12, variant v1); the original is arm c |
| dp\_conversion | dp\_experiment, dp\_variant, dp\_goal, value (if the goal has one) | A Duelpilot click, page, form or custom goal for an exposed visitor |

If GA4 is configured with gtag.js on the page, Duelpilot sends through gtag. If GA4 lives inside Google Tag Manager, it pushes the same events to the dataLayer, and GA4 only receives them through a GA4 event tag in your container that forwards them; that is the first thing to check when GA4 shows no experience\_impression. Goals defined on your own GA4 events, such as purchase, are not duplicated: report revenue per variant from your own purchase event.

### When GA4 is connected

With GA4 connected in Duelpilot (Settings → Analytics), Duelpilot registers four event-scoped custom dimensions in the property (exp\_variant\_string, dp\_experiment, dp\_variant, dp\_goal), pulls a funnel per variant for every live and recently concluded test (users with the impression, then users who converted) for complete days only, and shows GA4's numbers next to its own on the results page. Your agent can read the same through Duelpilot's MCP server and check the setup: whether the dimensions exist and the events arrive.

Without a connection, the events still reach GA4; register the dimensions yourself as in the generic method above, and Duelpilot's results page shows its own counts.

### Which number decides

Duelpilot counts every test itself with a small first-party counter (at most two pings per visitor, daily totals only), so the results page works with or without GA4. Each site has one decision source: Duelpilot's counter by default, or GA4 if the owner chooses it in Settings → General. The other source is context. Pick it before a test starts; switching after seeing data is the same as changing the metric afterwards.

## Why GA4 and your testing tool never match exactly

- Ad and tracking blockers stop GA4 more often than a first-party counter.
- Consent: a tool that only counts consenting visitors and GA4 with Consent Mode treat the rest differently.
- Different visitor definitions and deduplication (a stored visitor id versus GA4's client id and signals).
- Tag timing, goal definitions that differ slightly, bot filtering and GA4's processing delay.

A gap of up to about 5% per variant is normal. What matters is that the gap is similar in every variant. If GA4 sees 4% fewer users than the counter in the original but 15% fewer in the variant, something in the variant affects measurement, for example a moved element that a GTM trigger depended on. Investigate that before you decide anything.

## Try Duelpilot with your own agent

Give your agent one line: [set up Duelpilot for my site using /agents.md](https://duelpilot.com/agents.md). It opens a workspace, installs and verifies the script, and drafts the first test; you approve it, then switch on autopilot if you like. Or [see pricing](https://duelpilot.com/#pricing).

**[Start for €0](https://duelpilot.com/login) · [Give it to your agent](https://duelpilot.com/#start)** (€0 until you launch your first test)

## FAQ

### What is experience_impression in GA4?

Google's recommended event for third-party A/B testing tools. The tool sends it when a visitor is added to a variant, with exp\_variant\_string naming the tool, the experiment and the variant, so GA4 can segment results by variant.

### Why don't I see my variants in GA4 reports?

Usually the exp\_variant\_string parameter isn't registered as a custom dimension yet, it was registered less than 24–48 hours ago, or the events go to Google Tag Manager without a GA4 event tag that forwards them.

### Can GA4 tell me which variant won?

Not by itself: explorations show counts per variant without a significance test that is safe to check daily. Use your testing tool's verdict and treat GA4 as a cross-check.

### What does Duelpilot put in exp_variant_string?

DP-{experiment}-{arm}, for example DP-e12-v1 for variant v1 of experiment e12, with dp\_experiment and dp\_variant as separate parameters.

## Sources

- [Create an experiment integration with Google Analytics | Google for Developers](https://developers.google.com/analytics/devguides/collection/ga4/integration) (checked 2026-10-29)
- [\[GA4\] About custom dimensions and metrics | Analytics Help](https://support.google.com/analytics/answer/14240153) (checked 2026-10-29)
- [\[Sunset September 2023\] Google Optimize](https://support.google.com/optimize/answer/12979939) (checked 2026-10-17)

## Related

- [Sequential testing](https://duelpilot.com/guides/sequential-testing)
- [Sample ratio mismatch](https://duelpilot.com/guides/sample-ratio-mismatch)
- [GDPR and A/B testing](https://duelpilot.com/guides/gdpr-ab-testing)
- [Agentic A/B testing explained](https://duelpilot.com/agentic-ab-testing)
