Step-by-step guide to connecting GA4 to BigQuery

This article shows you how to connect your Google Analytics 4 (GA4) property to BigQuery, so you can work with raw, unsampled event data and perform more complex analysis and detailed reports.

Table of contents
  1. What you need before you start
  2. Implementation process
  3. Understand the structure of GA4 export tables
  4. Understand the BigQuery cost model
  5. Common issues and how to fix them
  6. Final thoughts

Linking GA4 to BigQuery is a significant upgrade to your analytics process, and it’s surprisingly fast – it only takes a few minutes. Once they’re connected, BigQuery will store all your GA4 data without any data sampling, retention limits, or restrictions on how you can analyze it.

This guide will walk you through the entire process, helping you use your data accurately and quickly in any way you choose.

What you need before you start

There are basic requirements you must fulfill before connecting GA4 to BigQuery:

  • Having a GA4 property (if you need help with this, check out our Google Analytics 4 setup checklist for new adopters).
  • Having a Google Cloud account (we’ll show how to set this up in a moment).
  • Having at least Editor permissions in GA4, and Editor, Owner, or BigQuery Admin permissions in the Cloud project.

Implementation process

If you have everything you need, let’s go through all the steps of connecting GA4 to BigQuery.

1) Create a Google Cloud project

This is the “container” where your datasets, tables, and configurations will live. Proceed like this:

  1. Go to the Google Cloud Console (here) and make sure you’re logged into the same Google account that has access to your GA4 property.

  2. At the top left, click Select a project.

Google Cloud Console showing the Select a project dropdown at the top left

  1. A window will pop-up. Click on New project.

Google Cloud project selector window with the New project button highlighted

  1. Enter the Project name and, under Location, either choose the organization you work for or leave “No organization”. Click Create.

Google Cloud new project form with Project name and Location fields

  1. Now switch to your new project. To do that, either click the notification or use the project selector again.

Google Cloud notification and project selector to switch to the new project

  1. Go to Billing, in the left menu, and connect to an existing billing account or create a new one. You can ignore this step if you want to use BigQuery Sandbox, which is free and works without a billing setup.

Google Cloud left menu with Billing highlighted

2) Make sure BigQuery is properly set up

After creating your Google Cloud project, you need to make sure BigQuery is active and ready to receive your GA4 exports.

  1. In the Google Cloud Console menu, click on BigQuery > Studio. Make sure your Cloud project (the one you created in the previous step) is selected.

Google Cloud Console menu with BigQuery Studio highlighted and the correct project selected

  1. When you open Studio for the first time, you’ll see:
    • A welcome tab (“Check out what’s new in Studio”).
    • A left sidebar called Explorer (with repositories, queries, notebooks, data canvases, data preparations, pipelines and connections).
    • Options to create new resources (below the welcome tab) like SQL query, Notebook, Data canvas, Pipeline, etc.

BigQuery Studio interface showing the welcome tab, Explorer sidebar and resource creation options

  1. At this stage, there are no tables or datasets yet, but GA4 will soon automatically create those for you, once the link is established.

3) Connect GA4 to BigQuery

This is where you actually connect GA4 to your Google Cloud project so that your data starts flowing into BigQuery:

  1. Go to your GA4 account and select your GA4 property.

  2. Click Admin > Product links > BigQuery links.

GA4 Admin panel showing Product links and BigQuery links option

  1. Click the blue Link button to create a new link. GA4 will open a wizard that guides you through the next steps.

GA4 BigQuery links page with the blue Link button highlighted

  1. First, choose a BigQuery project (the Google Cloud project you recently created).

GA4 BigQuery link wizard showing the project selection step

  1. GA4 then asks you to choose the data location (region) applicable to your dataset. Click Next.

GA4 BigQuery link wizard showing the data location selection step

  1. Choose the export frequency: daily export (recommended, since it sends complete datasets once per day) and/or streaming (optional and only available for Cloud Projects with billing enabled; it sends event data throughout the day in near real-time). Click Next.

GA4 BigQuery link wizard showing the export frequency selection with daily and streaming options

  1. Review your configurations and click Submit.

4) Verify that data is flowing into BigQuery

Once the link is created, ensure that GA4 is actually sending data into your BigQuery project. Here’s how:

  1. Go to BigQuery Studio (here) and make sure your Cloud project (the one you linked to GA4) is selected.

BigQuery Studio with the correct Cloud project selected in the project dropdown

  1. Look for your GA4 dataset – it will appear on the left sidebar – and check for the exported tables. If you chose daily export, inside the dataset, you’ll eventually see tables (one per day) with this kind of label “events_YYYYMMDD”. If you chose the “streaming” export frequency, you’ll see something like “events_intraday_YYYYMMDD”.

BigQuery Studio left sidebar showing the GA4 dataset with exported event tables

  1. To confirm data is arriving, click on the most recent table and then Preview. You should see rows of GA4 event data, including event name, event parameters, device, traffic source, etc.

BigQuery table Preview showing rows of GA4 event data with columns for event name, parameters, device and traffic source

Keep in mind: daily export tables only appear after GA4 completes its first full 24-hour cycle after linking.

Understand the structure of GA4 export tables

By now, your GA4 data is already flowing into BigQuery. It’s now time to understand how the tables in your dataset are organized so you can interpret them correctly.

The main thing to remember is that GA4 exports event-level data, meaning each row represents a single event performed by a user. If you chose the daily export option, you’ll receive one table per day containing all events for that 24-hour period.

Each table includes dozens of columns, but the ones you’ll likely work with most are:

Columns / CategoriesRows / Values
User identifiersuser_pseudo_id (GA4’s anonymous user identifier)
user_id (only populated if you send a signed-in ID)
Event metadataevent_name (name of the GA4 event)
event_timestamp (when it happened)
event_date (data in YYYYMMDD format)
Session traffic sourcecollected_traffic_source.manual_source
collected_traffic_source.manual_medium
collected_traffic_source.manual_campaign_name
Device and geographydevice.category (mobile, tablet, desktop)
device.operating_system
geo.country
geo.city
Event parameterspage_title
page_location
scroll_percentage
engagement_time_msec
search_term
video_percent
ga_session_id
ga_session_number
session_engaged
any custom parameter you’ve configured
E-commerce items arrayitem_id
item_name
item_category
price
quantity
item_revenue

Why is data structured this way?

GA4 exports data to BigQuery using nested and repeated fields. This means that instead of distributing the same information across multiple columns or rows, GA4 stores related data inside small “containers” within a single row. This structure keeps datasets compact, reduces storage costs, and speeds up queries. However, it also means many fields aren’t flat columns; instead, they are key/value pairs inside nested lists, so you need to extract them with SQL.

Here’s an example of how to extract a nested field: let’s say you want to extract page_title from the event_params list. You need to run this SQL code:

SELECT
  (SELECT value.string_value
  FROM UNNEST(event_params)
  WHERE key = 'page_title') AS page_title
FROM `project.dataset.events_*`

What this does is:

  • UNNEST(event_params) – opens the list of event parameters.
  • WHERE key = ‘page_title’ – finds the parameter you want.
  • value.string_value – retrieves the text inside it.

This process might seem complicated at first, but once you understand it, it’s pretty straightforward, and you just need to apply the same approach to any parameter.

Keep in mind: GA4 does not export historical data. Exports start the moment the link is created.

Understand the BigQuery cost model

It’s also important for marketers to understand how pricing works. The good news is that BigQuery’s cost model is simple, predictable, and easy to manage since there are only two things you can be charged for:

  • Storage

    This is the cost of storing your GA4 export tables. It starts at about $0.023 (~€0.020) per gibibyte (GiB) per month (varies slightly by region), and is considered cheap given that GA4 event-level data is fairly compact. Even high-traffic websites usually stay under a few gigabytes. If you’re using BigQuery Sandbox, you get 10 GiB of free storage, and no billing account is needed.

  • Query processing

    This is where most of the cost comes from, but it’s still easy to manage. BigQuery does not charge per query; instead, it charges based on the amount of data scanned by your query. On-demand pricing is roughly $6.25 (~€5.33) per tebibyte (TiB) scanned, and you won’t be billed for using Preview mode. If you’re using BigQuery Sandbox, you get 1 TiB of query processing each month for free.

This means that for most marketing teams, BigQuery remains highly cost-effective because GA4 exports are compact, storage is affordable, and typical marketing queries examine small data sets.

Common issues and how to fix them

Although setting up GA4 with BigQuery is simple, some challenges may arise during the process, especially related to permissions, regions, or timing. Here are some common issues marketers encounter and how to address each one:

IssueWhat it meansHow to fix it
You don’t see “BigQuery links” in GA4You don’t have the required permissions to access the linking settings.Ask a GA4 Admin to give you Editor (or Admin) access on the GA4 property.
You can’t select your Cloud project during the linking stepYour Google account doesn’t have the right permissions in the Cloud project.In Google Cloud, ask someone to grant you Owner, Editor, or BigQuery Admin on that specific project. Then retry linking.
No tables appear in BigQuery after linkingEither the export hasn’t started yet, or something wasn’t configured correctly.If you chose the “streaming” export frequency (intraday table), wait 5 to 10 minutes. If you chose the daily export frequency, wait until the next day. Double-check that the link is active and not disabled.
Dataset was created in the wrong regionGA4 and BigQuery must use the same region for the export to work.Delete the incorrect dataset, remove the existing GA4 link, and recreate the link using a dataset in the correct region.
Data is missing fields (parameters are not showing up)GA4 applies cardinality limits and thresholding in its interface, but missing fields in BigQuery usually mean a schema expectation issue or user_id not implemented.Check the correct event_params field structure, ensure user_id is included if needed for stitching, and confirm the parameters are actually being sent from your website/app.
Intraday table appears but has zero rowsIt’s normal behavior when the day’s first events haven’t been recorded yet.Wait a few minutes and refresh. If it’s still empty later in the day, ensure GA4 is actually receiving data.
Daily tables aren’t appearing at allGA4 only generates daily tables after its first full day of export.Wait until the next day. If nothing appears after 24 hours, delete and recreate the BigQuery link.
You accidentally linked the wrong GA4 propertyIt’s a common mistake when managing multiple properties.Remove the link in GA4 and repeat the setup with the correct property ID.
Query errors referencing missing columnsGA4 – BigQuery schema uses nested fields, so column names may differ from user interface names.Expand the schema tab inside BigQuery Studio to see exact field names and adjust your SQL accordingly.

Final thoughts

By now, your GA4 property should be fully connected to BigQuery and prepared to stream raw event data into your Cloud project. Your next steps are all about exploration and gaining deeper insights.

Remember to start simple:

  • Run your first queries to check event counts or list event names.
  • Explore the table schema to understand how GA4 structures event parameters, user properties, and items.

Once you’re feeling confident about this, use your new dataset to answer real marketing and business questions that GA4’s interface can’t fully handle.

If you need more inspiration, explore real-world use cases that demonstrate how BigQuery provides deeper insights for digital marketing teams in our article BigQuery for marketers: what is it and how can it help you?.

Ready when you are

Send us the account. We'll tell you what it's costing you.

A POAS Readiness Check ends with a written report + prioritized fix list. €500. Zero obligation.

Book an audit →