GrowthBook and Google Analytics (GA4)
Google Analytics (GA4) is a popular Data Source among GrowthBook users. This article helps troubleshoot common issues encountered when integrating GA4 with GrowthBook, and can be used in combination with our guide on A/B Testing with Google Analytics 4 (GA4) and GrowthBook.
Please watch the How GrowthBook Works with Your Data (4 minutes) overview video to better understand the issues and solutions in this troubleshooting guide.
If you are using Google Tag Manager (GTM) in combination with GA4, please review our Google Tag Manager Setup Guide and accompanying Google Tag Manager (GTM) Troubleshooting Guide.
Special note for the HTML and JavaScript SDKs
GA4 and GrowthBook's HTML Script Tag SDK
GrowthBook's HTML Script Tag SDK provides automatic experiment tracking if it detects Google Tag Manager (GTM) and/or Google Analytics (GA4) on the webpage.
For each experiment view, the HTML SDK sends an event with the experiment_id
and any variation_id
s to these analytics tools if they are present on the webpage.
No additional configuration is needed for these integrations; simply include the HTML script tag as shown in the documentation and the experiment_viewed
events will be sent automatically.
If you need to define a custom trackingCallback
you can do so with the window.growthbook_config.trackingCallback
object. This must be set before loading the script tag.
GA4 and GrowthBook's JavaScript SDK
Similar to the details above regarding the HTML SDK, the JavaScript SDK can accommodate an optional plugin that will automatically send experiment_viewed
events to GTM and/or GA4 if configured. The plugin is not enabled by default and must be imported and then added to the plugins
array when constructing the growthbook
instance.
Common issues when integrating GA4 with GrowthBook
The issues described below are commonly reported and can lead to missing or incomplete experiment data in GA4.
Data propagation delays
There is a known 24-48 hour delay between when events are sent to GA4 and when they appear in your BigQuery instance, which can cause temporary gaps in reporting. Read more about this initial sync delay in our Google BigQuery (BQ) Troubleshooting Guide.
User counts and data discrepancies
GrowthBook and GA4 may count users differently due to factors like bot filtering, data processing differences, or sampling in GA4. This can lead to mismatched user or event counts between the two platforms.
Experiment Assignment Query (EAQ) issues
The default SQL generated by GrowthBook doesn't match the schema in BigQuery
The default Experiment Assignment Queries in GrowthBook may not match the connected BigQuery dataset or schema, requiring manual adjustment. If these queries are not set up correctly, GrowthBook will not be able to retrieve experiment data from GA4’s BigQuery export.
Access the Experiment Assignment Query for each Data Source by going to:
- The Left navigation menu
- Metrics and Data
- Data Sources
- Select the data source in question
- Scroll down to the Experiment Assignment Queries section
- Click the right-facing arrow on the right side of each Experiment Assignment Query to view the SQL for the query
Only GrowthBook users with a user role of Analyst, Experimenter, or Admin can modify the Experiment Assignment Queries. Read more about this in our User & Team Permissions documentation.
Testing the experiment's flow of data
After implementing the trackingCallback
, check GA4 and the data warehouse (usually BigQuery if GA4 is also being used) to confirm that the experiment_viewed
events are being recorded as expected.
Since the flow of data is from the experiment to GA4 to BigQuery to the results tab in GrowthBook, if no experiment_viewed
events are present in GA4, they will not be present in BigQuery or in GrowthBook.
You can also test the Experiment Assignment Queries for each Data Source to ensure that they return the expected results. Locate the "Test Query" button for each Experiment Assignment Query and click it. If nothing is returned, try commenting out the lines with experiment_id
and variation_id
(one at a time) to see if anything gets returned. This can help narrow down whether the experiment_viewed
event is making it into GA4.
While testing the Experiment Assignment Queries, If you see a message that says No data yet. Make sure your experiment is tracking properly.
it often means the trackingCallback
is not firing or the data is not reaching GA4. It can also mean that you are within the 24-48 hour known sync delay between GA4 and BigQuery.
Please view these resources for more information:
The trackingCallback
doesn't fire or is misconfigured
If the GrowthBook SDK’s trackingCallback
is not implemented correctly, or if it does not send the experiment_viewed
event to GA4, experiment exposures will not be tracked, resulting in missing or incomplete data in GrowthBook.
The HTML Script Tag SDK handles this automatically and no adjustment should be necessary. Usage of other SDKs requires manually configuring the trackingCallback
to send experiment_viewed
events to GA4. Read on for more information.
Format for trackingCallback
for pure GA4 integrations (no GTM)
Use gtag
in the trackingCallback
if Google Analytics 4 (GA4) is loaded directly on your page and the window.gtag
function is available on the web page:
trackingCallback: (experiment, result) => {
if (window.gtag) {
window.gtag("event", "experiment_viewed", {
event_category: "experiment",
experiment_id: experiment.key,
variation_id: result.variationId // or result.key depending on SDK version
});
}
Format for trackingCallback
for combined GA4 and GTM integrations
Use dataLayer
in the trackingCallback
if you are using Google Tag Manager (GTM) to manage your analytics setup, or if gtag
for GA4 is not available on the web page.
This approach is recommended when GA4 is loaded via GTM because:
- Sometimes
gtag
may not be defined in this type of setup. - If GA4 is not properly loaded on the page, the
window.gtag
function will not exist, and attempts to send events togtag
via GrowthBook'strackingCallback
will fail silently. - When GA4 is loaded through GTM, there can be timing issues because GTM loads asynchronously. This creates a potential race condition where GrowthBook might initialize before GA4 is fully loaded, which can affect experiment tracking.
// JavaScript
trackingCallback: (experiment, result) => {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: "experiment_viewed",
experiment_id: experiment.key,
variation_id: result.variationId // or result.key depending on SDK version
});
}
See the Tracking via dataLayer
and GTM documentation for more information.
Date range mismatches
If the date ranges selected in GA4 and GrowthBook are not identical, reported metrics and user counts will differ.
It's important to note that in some cases, even if the date ranges match, it is still possible for there to be a data discrepancy due to some of the other causes outlined in this troubleshooting guide.
Consent and cookie banner blocking
If a cookie consent banner blocks analytics until consent is given, the experiment_viewed
event may be sent before consent, causing it to be dropped.
Delay initializing the GrowthBook SDK and firing the trackingCallback
(which will send the experiment_viewed
event) until after the user has granted consent. This ensures that analytics and experiment exposure events are only sent when it is legally and technically permitted.
Special instructions if using the HTML Script Tag SDK or the Edge SDK
Read more about cookies and GDPR compliance in the docs for the HTML Script Tag SDK and Edge SDK.
Prerequisite Configurations
There are a few things that need to be set up properly in GrowthBook in order to troubleshoot GA4 issues, regardless of whether you are using Google Tag Manager (GTM) with GA4 or not.
Ensure the GA4 Measurement ID is correct
The GA4 Measurement ID is a unique identifier for your GA4 property that's used to send data from your website or app to the correct GA4 account. It looks like "G-XXXXXXXXXX" and is required when configuring GA4 tags in Google Tag Manager or when sending events directly to GA4.
You can see how the Measurement ID is used in the GrowthBook and GTM integration documentation, where it is entered as a configuration value for sending experiment events to GA4.
Ensure the GrowthBook SDK is properly configured
Make sure you have created an SDK Connection in the GrowthBook app under Left navigation menu > SDK Configuration > SDK Connections, and that you are using the correct apiHost
and clientKey
values in your SDK initialization code. View the example initialization code (JavaScript) for more information.
Verify SDK connection using GrowthBook's DevTools Extension
The SDK connection can be further validated by using GrowthBook's DevTools Browser Extension (available for Chrome and Firefox), which allows you to inspect experiments and confirm that DOM mutations are being applied as expected.
If your site is public, the extension should detect the SDK and display active experiments. If you encounter issues, double-check that your SDK code is correctly implemented and that the site is accessible (not behind authentication or firewalls that could block the SDK).
For advanced setups, such as using a proxy or remote evaluation, ensure that the relevant options are enabled both in your SDK Connection and in your SDK initialization (include remoteEval: true
in the GrowthBook initialization code).
Ensure the SDK is properly initialized in the application
To properly initialize the GrowthBook SDK in your application, you first need to install the appropriate SDK package for your language or framework (e.g., npm install @growthbook/growthbook-react
for React, or the relevant package for Java, PHP, etc.).
Follow the SDK-specific docs and ensure the initialization code being used contains the correct api_host
, client_key
, and that any relevant user attributes are present.
If GrowthBook is initialized on a specific page (not globally)
To initialize the GrowthBook SDK on a specific page, instead of globally, you can create and configure a GrowthBook instance directly within that page’s component or script, rather than at the global application level.
For example, in a React or Next.js app, ensure that the GrowthBook SDK has been imported and instantiated inside a page component or within a useEffect
hook.
Of course, make sure that the experiment in question is located on the page that is initializing GrowthBook.
Ensure the trackingCallback
is called unconditionally
Try not to bury the trackingCallback
within conditional application logic. Conditionally calling the trackingCallback
can cause fewer users to be assigned to the experiment than you are expecting. Refer to this section in our Knowledge Base for more information.
Experiment Rule Precedence
Rules associated with a feature in GrowthBook are evaluated from top to bottom as they appear in the GrowthBook UI. When a user matches a rule higher up in the list, they will not be evaluated for any subsequent rules. To ensure that the trackingCallback
fires for users in an experiment, make sure that the Experiment Rule is the first rule that those users match.
Read more about Experiment Rules in our documentation.
Ensure GA4 is properly configured as the Data Source in GrowthBook
Double-check that our GA4 Setup Guide was followed exactly.
Make sure the BigQuery service account used by GrowthBook has the necessary permissions on your BigQuery project (at least BigQuery Data Viewer, Metadata Viewer, and Job User). This allows GrowthBook to read the data in GA4.
Test the Expeirment Assignment Query as outlined in the Experiment Assignment Query (EAQ) issues section above.
Ensure the experiment is properly scoped
Environments
The environment(s) allowed for the experiment must match the environment(s) allowed for the SDK.
Projects
The project(s) allowed for the experiment must match the project(s) allowed for the SDK.
The project(s) allowed for the experiment must also match the project(s) allowed for the Data Source.
GA4 troubleshooting if not using Google Tag Manager (GTM)
If you are using GTM with GA4 and GrowthBook, please review our Google Tag Manager Setup Guide and accompanying Google Tag Manager (GTM) Troubleshooting Guide for this section instead.
Why are there no experiment_viewed
events showing in GA4?
Possible Answer #1: GA4 is not loaded or window.gtag
is unavailable
If GA4 is not properly loaded on the page the window.gtag
function will not exist, and any attempt to send events to it will silently fail.
You can check this by opening your browser's developer console and typing window.gtag
. If the response is undefined
, you'll need to make some changes to where or how GA4 is loaded in your application to ensure it's available before GrowthBook tries to send events to it.
Possible Answer #2: No users are being bucketed into the experiment
If the GrowthBook SDK is not assigning users to variations (for example, due to missing or incorrect user attributes), the trackingCallback
will not fire, and no events will be sent.
Why are there fewer experiment_viewed
events showing in GA4 than I expect?
Possible Answer #1: Experiment assignment issues
If users are not being assigned to the experiment due to targeting rules, missing attributes, or other logic the trackingCallback
will not fire, and no events will be sent.
Possible Answer #2: Conversion windows and data sync
GrowthBook may exclude some conversions if they fall outside the metric conversion window, or there may be delays or issues with data synchronization between GA4 and GrowthBook.
If you have checked your implementation and still see fewer events, we recommended logging the execution of the trackingCallback
and verifying that window.gtag
is indeed available and being called as expected. Also, check for any consent or ad blocker issues that might prevent events from reaching GA4.
Use GA4's built-in debugging tools
Check the Real-Time reports in GA4 for event validation.
Use GrowthBook's Developer Tools extension to debug GA4 issues
GrowthBook's DevTools Browser Extension (available for Chrome and Firefox) is very helpful for debugging issues with GA4 by:
- Inspecting whether the GrowthBook SDK is properly loaded on the web site
- Checking which feature flags and experiments are active
- Verifying that user attributes are set as expected
The extension allows you to see real-time information about feature flags and experiments, which helps to confirm if the SDK is initialized correctly and if experiments are being evaluated as intended. This is especially useful when troubleshooting why experiment exposure events (like experiment_viewed
) might not be appearing in GA4.
Initial debugging steps
- Check if the SDK is detected (look for a green dot on the extension icon).
- Inspect which experiments and feature flags are active and their current values.
- Verify that user attributes (such as IDs used for bucketing) are set correctly.
- If you’re not seeing expected experiments or flags, this may indicate issues with SDK initialization, attribute configuration, or experiment targeting, which could explain missing events in GA4.
Use your browser's Developer Tools Console to debug GTM/GA4 issues
If you've confirmed that the trackingCallback
is implemented and firing, GA4 is loaded, and you are still not seeing experiment_viewed
events, we recommend:
- Check for JavaScript errors in the browser's Console that are related to your feature flags.
- Add logging statements throughout the GrowthBook-related code in your application, particularly in and around the SDK's
trackingCallback
, then check in your browser's Developer Tools Console to further debug the issue. - Monitor the
dataLayer
object in the browser console by typing indataLayer
and pressing Enter. Verify the feature flag names match what is shown in the GrowthBook dashboard.