GA4 reports in Google Sheets: two ways to automate them

There are two ways to get Google Analytics 4 data into Google Sheets so that it refreshes without copy and paste. Google’s own add-on, GA4 Reports Builder, pulls report data from GA4 into a sheet. The second way reads the GA4 BigQuery export through a published Data Mart and delivers it to the sheet on a schedule.
The first is quick and fits a small, fixed report. The second takes setup and fits a team whose weekly report mixes GA4 with ad spend and orders, and has to show the same numbers every time. This guide covers both, with what each can and cannot do.
What an automated GA4 report in Sheets has to do
What an automated GA4 report in Sheets has to do
Most marketers who search for this are doing the same thing every Monday: open GA4, set the date range, export a CSV, paste it into the reporting sheet, fix the columns, repeat for the next report. An automated report removes those steps. To be worth setting up it needs to:
- refresh on a schedule, without anyone opening GA4
- return the same number when two people ask the same question
- survive a long date range without sampling
- sit next to the other numbers of the report, such as spend and orders
Keep that list in mind. The two methods differ on the last three points.
Method 1. GA4 Reports Builder, Google’s add-on for Sheets
Method 1. GA4 Reports Builder, Google’s add-on for Sheets
Google publishes an add-on for this: GA4 Reports Builder for Google Analytics. Its Marketplace listing describes it in one sentence: Google Analytics users can use it “to create and run reports for GA4 properties using Google Sheets” (checked October 2026).
To set it up:
- Open a Google Sheet, go to Extensions, Add-ons, Get add-ons, find GA4 Reports Builder for Google Analytics and install it.
- Grant it access to your Google Analytics account when asked.
- Open Extensions, GA4 Reports Builder for Google Analytics, Create new report, and choose the GA4 property, the dimensions, the metrics and the date range.
- Choose Run reports from the same menu. The data is written to a tab of the sheet.
- Choose Schedule reports and set a frequency, so the report runs again by itself.
Use GA4’s own names for the fields: dimensions such as date, sessionDefaultChannelGroup and sessionSourceMedium, metrics such as sessions, totalUsers and keyEvents. Guides that tell you to enter ga:sessions describe the Universal Analytics add-on, which does not work with GA4 properties.
What the add-on does well, and where it stops
It is free, it is Google’s, and a first report takes ten minutes. For one property and a handful of standard metrics, it is enough.
Its limits come from where it reads. The add-on requests report data from GA4, so the rules of GA4 reporting come with it:
- Quotas. A standard property gets 200,000 tokens per day and 40,000 per hour for report requests. Several scheduled reports with long date ranges and page-level dimensions use them up. The numbers are in the guide to GA4 Data API limits.
- Sampling, thresholds and the (other) row apply as they do in the interface, as described in data sampling in GA4.
- Only GA4 data. Ad spend from Meta or Microsoft Ads, and orders from the shop system, have to reach the sheet some other way and be matched by formulas.
- Every sheet has its own definitions. Two people who build “sessions by channel” with different dimensions get two answers, and nothing tells them.
OWOX Data Marts
See your first report built in real time. 15 minutes.
- Connect your data warehouse
- Pick your metrics
- Get a live Google Sheets report
In the time it takes to write a ticket. Then imagine never writing that ticket again.
Book a DemoWe'll use your actual use case
Method 2. The GA4 BigQuery export, delivered to Sheets through a Data Mart
Method 2. The GA4 BigQuery export, delivered to Sheets through a Data Mart
The second method changes the source. Instead of asking GA4 for report rows, it uses the raw events GA4 exports to BigQuery, and an analyst decides once, in SQL, what the report means.
It has three parts.
Part 1. Link GA4 to BigQuery
GA4 has a native BigQuery export, available to standard properties. You turn it on in GA4 Admin; from that day every event lands in your BigQuery project. The steps and the limits are in connecting GA4 to BigQuery.
Part 2. The analyst writes the report as SQL
This is the step that makes the numbers stable. The query below runs as written on Google’s public GA4 sample and returns a daily table of sessions, users, purchases and revenue by medium:
SELECT
PARSE_DATE('%Y%m%d', event_date) AS date,
traffic_source.medium AS first_user_medium,
COUNT(DISTINCT CONCAT(
user_pseudo_id, '-',
CAST((SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id') AS STRING)
)) AS sessions,
COUNT(DISTINCT user_pseudo_id) AS users,
COUNTIF(event_name = 'purchase') AS purchases,
ROUND(IFNULL(
SUM(ecommerce.purchase_revenue), 0), 2)
AS revenue
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20210101' AND '20210107'
GROUP BY date, first_user_medium
ORDER BY date, sessions DESC
The first rows for 1 January 2021 on the sample:
| date | first_user_medium | sessions | users | purchases | revenue |
|---|---|---|---|---|---|
| 2021-01-01 | organic | 815 | 803 | 3 | 203 |
| 2021-01-01 | (none) | 571 | 564 | 5 | 510 |
| 2021-01-01 | referral | 351 | 342 | 1 | 19 |
Counted from every event, with no quota and no sampling. The same query can join the ad spend and orders tables if they are in the warehouse.
Part 3. Publish it and read it in Sheets
OWOX Data Marts takes it from here. The analyst saves the SQL as a Data Mart, gives the fields names and descriptions a marketer understands, and publishes it. In Google Sheets, the OWOX Data Marts extension opens as a side panel. The person building the report picks a Data Mart, ticks the columns they want, and clicks Save & Run. The rows are written to the sheet, and a scheduled refresh keeps them current.

Three things in that screenshot are the point of the method:
- The marketer chooses columns, not logic. What “sessions” or “spend” means was decided in the Data Mart. Two people who tick the same column get the same number.
- The cell note says where the data came from: which Data Mart, and when it was imported. A number in a sheet that can name its source is easier to defend in a meeting.
- The tabs are different Data Marts in one spreadsheet. Ad spend, orders and sessions sit side by side, each from its governed source.
The same Data Mart can also feed a Data Studio (the former Looker Studio) report, so the dashboard and the sheet agree.
What this method does not do
OWOX Data Marts does not connect to GA4 and does not pull GA4 reports. It reads tables in your warehouse, and for GA4 those tables come from Google’s own BigQuery export. That has consequences worth knowing before you start:
- History starts on the day you link the export. Earlier data stays in GA4.
- A standard property exports up to 1 million events per day in the daily export.
- Numbers differ from the GA4 interface, because the export holds raw events without GA4’s modeling. Google documents this.
- Someone has to write the SQL. The product publishes and schedules the analyst’s query. It does not write it.
Which method to choose
| GA4 Reports Builder add-on | BigQuery export and a Data Mart | |
|---|---|---|
| Setup time | Minutes | Hours, plus a day for the first export |
| Who can set it up | Anyone with GA4 access | An analyst, once. Then anyone |
| Source | GA4 report data | Raw GA4 events in your warehouse |
| Quotas and sampling | Apply | Do not apply |
| Other data in the same report | No | Yes: ad spend, orders, CRM |
| One definition for everyone | No | Yes, in the Data Mart |
| History | What GA4 retains | From the day of linking |
Choose the add-on for one property and a small standing report that only needs GA4 metrics. Choose the export and a Data Mart when the report goes to several people, mixes sources, or has been questioned once too often.
Many teams start with the first and move to the second the week two versions of the same report disagree.
Turn your data into decisions.
Governed data marts give you the clean foundation ML needs to actually work.
- No AI hallucinations
- Analyst-governed definitions
- Every number traces to SQL



