Feature image

Introduction to the Data Transfer for Google Analytics 4

Explore the new Google Analytics 4 Data Transfer to BigQuery – a free feature that gives you ready-made tables with your Google Analytics 4 data. It makes reporting faster, analysis easier, and data more accessible.

Google recently announced a new Data Transfer in BigQuery to get ready-made tables with data from Google Analytics 4. It’s a free service, and you only pay for storage in BigQuery and any subsequent SQL queries you run on the data.

Benefits of working with Google Analytics 4 data in BigQuery

Working with digital analytics data in BigQuery offers several benefits over using the Google Analytics 4 (GA4) user interface:

  • Custom Reporting: BigQuery allows you to create custom reports and queries, whereas GA4 offers limited predefined reports.
  • Flexibility: With BigQuery, you can access raw, unprocessed data, giving you more control over your analysis. GA4 only provides processed data.
  • Scalability: BigQuery can handle large volumes of data more efficiently, making it easier to work with big datasets. GA4 can be slower and less flexible when dealing with large amounts of data.
  • Advanced Analysis: BigQuery supports advanced analysis using SQL, enabling deeper insights. GA4 has fewer analysis tools compared to BigQuery.
  • Data Integration: BigQuery allows you to integrate data from various sources, providing a more complete view of your analytics. GA4 is limited to the data within its system.

Let’s look at how to set up the new Data Transfer from Google Analytics 4, what tables are created, and what analysis you can do with the data in BigQuery.

Set up the Data Transfer for GA4

To start the transfer, go to the Data Transfers section in BigQuery Studio from the left menu. Then, click on “Create New Transfer” and select Google Analytics 4 from the dropdown menu.


Creating a new Data Transfer for Google Analytics 4 in BigQuery


There are seven simple steps to complete before you begin your Google Analytics 4 Data Transfer.


  1. Data source details
    Enter the PropertyID for the Google Analytics 4 property you want to export. You can find the PropertyID under Property Details in the Admin section, or in the property selector at the top of the Google Analytics 4 interface. You can leave the Refresh window blank; it will default to 4 days.

  2. Destination settings
    Choose or create a new dataset where the tables will be created. You can name it something like “ga4_data_transfer.” If you plan to load data from several properties into the same BigQuery project, it might be helpful to include the PropertyID in the dataset name for easy identification.

  3. Transfer config name
    Give this transfer a descriptive name, such as “ga4_data_transfer.” If you plan to load multiple properties into the same BigQuery project, it’s useful to include the PropertyID in the name for easier identification.

  4. Schedule options
    Here you can set up the update schedule. You can leave it as is, but it’s best to set the Repeat Frequency to “Days.” This lets you decide at what time the data should be updated each day (preferably in the morning). Make sure you check the timezone.

  5. Service account
    If you leave this blank, it will use your personal account in BigQuery. Make sure your account has access to the Google Analytics 4 property. It’s safer to set up a service account in Google Cloud Platform (GCP) with proper access for this transfer, as relying on your personal account is risky. If you lose access to either the property or the BigQuery project, the transfer will fail.

  6. Notification options
    You can enable notifications when the transfer finishes. While email notifications might not be common, using Pub/Sub lets you trigger other actions, like running queries on the new data after it’s transferred.

  7. Advanced options
    Leave the Encryption key as Google-managed encryption unless your organization uses a Custom Key Management Service (CKMS).

Start the Data Transfer

Once you’ve filled out all seven options, click Save, and an initial backfill will begin for a few dates.

In the top-right corner, you can edit and manage the transfer. The first thing you should do is trigger a backfill to import more dates. Click on “Schedule Backfill” and select the dates you want to import from your property. The transfer will start and process them one by one.


The Data Transfer for Google Analytics 4 and the jobs history

The Data Transfer for Google Analytics 4 and the jobs history.

The Google Analytics 4 Data Transfer creates two versions of each table. The first one, prefixed with p_, contains the raw data, while the second one, prefixed with ga4_, is a view that extracts the date from _PARTITIONTIME


An example of the table and view created for the Audience report

An example of the table and view created for the Audience report for the Google Analytics 4 property with ID 252722903. 

For your queries, always use the ga4_ views.

The table names are the same as the reports in the GA4 interface they replicate. For example, the ga4_pageandscreens table corresponds to the Pages and Screens report in the Google Analytics 4 reporting interface.

The tables are ready to query!

The tables created by Google Analytics 4 Data Transfer

These are the tables and views that are loaded into BgiQuery. Further down in the article we will have an in-depth look at each and one of them.


The tables created by the Data Transfer for Google Analytics 4

Example querys for the tables created by the Google Analytics 4 Data Transfer

With the tables loaded into BigQuery, let´s look at two different query´s we can run using these tables.

Traffic Acquisition report

In our first query, we want to generate a simple Traffic Acquisition report and see which Channel Group drives sessions and conversions.

SELECT
  _DATA_DATE AS date,
  session_default_channel_group as channel,
  sessions,
  conversions
FROM
  `<project>.<dataset>.ga4_userAcquisition_<propertyID>`
ORDER BY 
    _DATA_DATE DESC 

The result is a table that shows sessions and conversions per Channel Group and date

The result is a table that shows sessions and conversions per Channel Group and date.

Device category report

In our next query, we want to generate a simple Traffic Acquisition report and see which Channel Group drives sessions and conversions.

SELECT
  _DATA_DATE AS date,
  device_category,
  engaged_sessions
FROM
  `<project>.<dataset>.ga4_techDetails_<propertyID>`
ORDER BY 
  _DATA_DATE desc

The result is a table that shows engaged session per device category and date

The result is a table that shows engaged session per device category and date.

Schema of the tables created by Google Analytics 4 Data Transfer

Lets have a look at all the different tables that are create by the Google Analytics 4 Data Transfer.

Audiences table

FieldDescriptions
audience_nameThe name of the audience users belong to (e.g., “Returning Users” or “High-Value Customers”).
average_session_durationThe average length of a session in seconds.
new_usersThe number of users who visited your site or app for the first time.
sessionsThe number of sessions started by users.
total_revenueThe total revenue generated from purchases or conversions.

This table contains aggregated data by audience group from Google Analytics 4. It shows how different user segments perform in terms of traffic, engagement, and revenue. You can use this data to compare audience behavior, evaluate marketing strategies, and find high-performing or underperforming user segments.

Conversions table

FieldDescriptions
event_nameThe name of the event tracked in GA4 (e.g., purchase, add_to_cart, page_view).
conversionsThe number of times the event counted as a key event.
total_revenueThe total revenue linked to the event, typically from purchases.  Its displayed in millions, divide by 1000000.
total_usersThe number of unique users who triggered the event.

This table shows event-level performance in GA4. It connects user actions (events) to key outcomes like conversions and revenue. If the event was marked as a key event it will count as a conversion. 

Demographic details table

FieldDescriptions
branding_interestA category of user interest related to branding or affinity (based on Google signals).
cityThe city from which the user accessed your site or app.
countryThe country of the user’s location.
languageThe language setting of the user’s device or browser.
regionThe region or state the user is located in.
user_age_bracketThe age range of the user (e.g., 18-24, 25-34).
user_genderThe gender of the user (e.g., male, female, or unknown).
conversionsThe number of conversions from users in this demographic or location group.
engaged_sessionsSessions that lasted longer than 10 seconds, had a conversion, or included at least 2 pageviews.
engagement_rateThe percentage of engaged sessions out of total sessions.
event_countThe total number of events triggered.
new_usersThe number of first-time visitors in this group. (Based on first_open or first_visit)
total_revenueThe revenue generated by this segment of users.
user_engagement_durationTotal time users were actively engaging (in seconds).

This table combines user demographics, location, and behavior data. It helps you analyze how different audience groups (by age, gender, interest, location) engage with your site or app. You can use this to tailor content, identify high-value segments, and improve targeting in marketing campaigns.

Ecommerce purchases table

FieldDescriptions
item_brandThe brand name of the item.
item_categoryThe top-level category assigned to the item.
item_category2Second-level category of the item (more specific than item_category).
item_category3Third-level category for deeper categorization.
item_category4Fourth-level category.
item_category5Fifth-level category (most detailed level).
item_idA unique identifier for the item (SKU or product ID).
item_nameThe display name of the item.
item_variantA variation of the item (e.g., size, color).
item_revenueRevenue generated from this item.
items_added_to_cartThe number of times this item was added to a cart.
items_purchasedThe number of times this item was purchased.

This table contains product-level data from GA4 e-commerce events. It shows how individual items perform across categories and variants. You can use it to track product performance, understand customer preferences, and guide inventory or marketing decisions based on what sells or gets added to carts.

Events table

FieldDescriptions
event_nameThe name of the event tracked in GA4 (e.g., purchase, scroll, sign_up).
event_countTotal number of times this event occurred.
event_count_per_userAverage number of times each user triggered this event.
total_revenueTotal revenue attributed to this event.
total_usersNumber of unique users who triggered this event.

Very similar to the Conversion table. This table summarizes how each event statistics, both count, per user, eventual revenue and total users per event. 

In-app purchases table

FieldDescriptions
item_idThe unique ID for the item
item_revenueRevenue from this item only, excluding tax and shipping. Calculated as item price × quantity. Its displayed in millions, divide by 1000000.
items_purchasedNumber of units of this item that were purchased.

This table focuses on individual item performance in purchase events. It helps you track which products generate the most revenue and how many units are sold. Useful for analyzing product sales, inventory planning, and evaluating item-level performance.

Landing page table

FieldDescriptions
session_campaign_nameThe name of the marketing campaign that brought the user (from UTM campaign).
session_default_channel_groupThe standard channel grouping GA4 assigns to the session (e.g., Organic Search, Direct).
session_mediumThe medium that describes how traffic arrived (e.g., organic, cpc, referral).
session_primary_channel_groupThe customizable channel group applied to the session, if defined.
session_sourceThe source that referred the user (e.g., google, newsletter).
session_source_mediumCombined source and medium (e.g., google/organic).
session_source_platformHow the traffic source was acquired. Manual means UTM-tags, Google Ads means the information was fetched from Google Ads using gclid, (not set) means neither. 
conversionsThe number of conversions from users in these sessions.
new_usersNumber of users who visited for the first time through this source.
sessionsNumber of sessions started from this traffic source.
total_revenueTotal revenue from users who came through this source.  Its displayed in millions, divide by 1000000. 

This table shows where your session came from, grouped by source, medium, campaign, and channel. It helps you understand the performance of marketing efforts, track which sources drive revenue and conversions, and compare acquisition strategies. It’s useful for traffic analysis, campaign tracking, and marketing ROI. But one thing, to note, even do it is named Landing Page report, it lacks any information about the landing page, making it more of a traffic acquisition report. 

Pages and screens table

FieldDescriptions
content_groupA group of related pages or screens defined in GA4 to organize content (e.g., “Product Pages”).
unified_page_path_screenThe full path of the webpage or screen the user viewed.
unified_screen_classThe app screen class name (mainly for app tracking).
unified_screen_nameThe title or name of the screen or page.
conversionsThe number of conversions that happened on this page or screen.
event_countTotal number of events triggered on this page or screen.
screen_page_viewsNumber of times the page or screen was viewed (event count).
screen_page_views_per_userAverage number of views per user.
total_revenueTotal revenue generated from this page or screen.  Its displayed in millions, divide by 1000000.
user_engagement_durationTotal time users actively engaged with the page or screen (in seconds).

This table gives insights into how users interact with different pages (URLs) or screens. It includes views, events, revenue, and engagement data. 

Tech details table

FieldDescriptions
app_versionThe version of the app installed (e.g., 1.5.0 for Android or iOS).
device_categoryType of device: Desktop, Tablet, or Mobile.
device_modelModel of the user’s mobile device (e.g., iPhone 10,6).
operating_systemThe OS used by the user (e.g., Android, iOS, Windows).
operating_system_versionThe version number of the OS (e.g., 13.5.1).
operating_system_with_versionCombined name and version of the OS (e.g., Android 10).
platformPlatform used: web, iOS, or Android.
platform_device_categoryCombined platform and device type (e.g., Android / mobile).
screen_resolutionScreen resolution of the user’s device (e.g., 1920x1080).
conversionsNumber of conversions from users on this device/platform setup.
engaged_sessionsNumber of sessions that were considered engaged (over 10s, had 2+ pageviews, or a conversion).
engagement_rateShare of sessions that were engaged (as a decimal, e.g., 0.72).
event_countTotal number of events triggered on this device/platform.
new_usersNumber of first-time users on this platform/device.
total_revenueTotal revenue from users on this setup, minus refunds. Its displayed in millions, divide by 1000000.
user_engagement_durationTime spent actively engaging with the site or app (in seconds).

This table gives insights into how users on different platforms and devices interact with your site or app. It includes device details, operating systems, screen info, and engagement metrics. 

Traffic Acquisition table

Note: There is two tables acquisition, Traffic and User. But it appears that the “User” table is session-scoped and the “Traffic” table is user-scoped. 


FieldDescriptions
first_user_campaign_nameName of the campaign that first brought the user (e.g., a Google Ads or manual UTM campaign).
first_user_default_channel_groupThe default channel group for the user’s first session (e.g., Organic Search, Direct, Email).
first_user_google_ads_ad_group_nameThe Google Ads ad group name that first acquired the user.
first_user_google_ads_ad_network_typeThe type of Google ad network used to acquire the user (e.g., Search, Display, YouTube).
first_user_mediumThe traffic medium that first brought the user (e.g., organic, cpc, referral).
first_user_primary_channel_groupThe custom or updated primary channel group for the first user session.
first_user_sourceThe source that first brought the user (e.g., google, newsletter).
first_user_source_mediumCombined source and medium for the user’s first session (e.g., google/organic).
first_user_source_platformPlatform that first acquired the user (e.g., Google Ads, Facebook).
conversionsNumber of conversions from users based on their acquisition source.
engaged_sessionsNumber of engaged sessions from those users.
engagement_rateShare of engaged sessions among total sessions (as a decimal).
event_countTotal number of events triggered by these users.
new_usersUsers who interacted with the site/app for the first time.
sessions_per_userAverage number of sessions per user.
total_revenueRevenue (Purchase revenue plus Subscription revenue plus Ad revenue) generated from users based on their original acquisition. Its displayed in millions, divide by 1000000.
user_engagement_durationTime users actively engaged with the site/app (in seconds).

This table shows how users were first acquired, including campaign, channel, and ad details. It links acquisition data to behavior and outcomes like conversions and revenue. 

User Acquisition table

FieldDescriptions
session_campaign_nameThe campaign name linked to the session (e.g., Google Ads or UTM campaign).
session_default_channel_groupGA4’s standard channel group for the session (e.g., Organic Search, Direct, Email).
session_mediumThe medium that led to the session (e.g., organic, cpc, referral).
session_primary_channel_groupThe primary channel group used in reporting, based on your property’s channel setup.
session_sourceThe source of the session (e.g., google, facebook.com).
session_source_mediumCombined source and medium (e.g., google/organic).
session_source_platformHow the traffic source was acquired. Manual means UTM-tags, Google Ads means the information was fetched from Google Ads using gclid, (not set) means neither. 
conversionsNumber of conversions during the session.
engaged_sessionsNumber of sessions that were considered engaged (10+ seconds, a conversion, or 2+ pageviews).
engagement_ratePercentage of sessions that were engaged (e.g., 0.72 = 72%).
event_countTotal number of events triggered in the session.
events_per_sessionAverage number of events per session.
sessionsTotal sessions, based on session_start events.
sessions_per_userAverage sessions per user.
total_revenueRevenue (Purchase revenue plus Subscription revenue plus Ad revenue) during the session, minus refunds. Its displayed in millions, divide by 1000000.

This table provides a breakdown of traffic sources at the session level. It links acquisition details like campaign, source, and medium with user behavior and business outcomes such as events, conversions, and revenue.

The differences between this data transfer and the “old” GA4 event export to BigQuery.

The big difference compared to the old event-based export to BigQuery is that this new data transfer is aggregated and not as granular. This means we don’t have the same ability to combine and calculate data as we would like.

Therefore, there will likely be a benefit in using both exports for different needs and analyses within a business.

Summary 

The easy ways to load data between different systems are always helpful, whether you’re loading data into BigQuery or out. As of now, there are still some bugs, but hopefully, they will be fixed soon. After that, this will be a great addition to your toolbox for digital analytics.

One big advantage is that the tables follow the same definitions as the graphs and tables in the Google Analytics 4 interface, which makes things easier. Since they are pre-calculated and aggregated around the right dimensions with familiar terminology, it’s easy for even beginners to start their first queries and analyses in BigQuery.

If you want to explore hosting your own GA4 backfill pipeline solution, Ctrl Digital has developed its own open source transfer solution that lets you configure and run a similar export yourself. This Python script fetches data from Google Analytics 4 using the Google Analytics Data API and inserts it into Google BigQuery. You can also backfill data for any date range.

Check it out at https://github.com/ctrl-digital/ga4-bigquery-backfill.

Happy data backfilling!