What does GA4's BigQuery export cost?

Linking GA4 to BigQuery gives you every event, one row each. For most small and medium sites it costs very little, often nothing, if you know the two things you pay for and avoid one habit.

Kosmas Botsis, Founder of Glancely · 4 October 2026 · 4 min read

In short

  • The link and the daily export are free; the streaming export is not.
  • You pay BigQuery for storage (cheap) and for the data queries read (where bills come from), each with a free monthly amount.
  • For most small and medium sites the total is close to nothing.
  • Limit dates with _TABLE_SUFFIX, name your columns, check the estimate, and set a ceiling.

Linking Google Analytics 4 to BigQuery gives you every event your site records, one row each, to query however you like. It is the only way to answer some questions at all — the order people did things in, your own custom events in detail, anything older than GA4's own retention. The worry that stops most people is the bill.

For most small and medium sites the honest answer is: very little, often nothing, as long as you know which two things you pay for and avoid one habit. Here is how it works.

The export itself is free

Turning on the link in GA4 costs nothing, and so does the daily export: once a day, GA4 writes the previous day's events into a new table in your BigQuery project. You need a Google Cloud project, and to go beyond the free sandbox (more on that below) a billing account on it.

Two limits are worth knowing before you start:

  • The daily export has a ceiling on standard GA4 properties: about one million events a day. A site that regularly sends more can have its daily export paused. Most small and medium sites are far below it; GA4 360 properties have a much higher limit.
  • The streaming export is optional and is not free. It sends events within minutes instead of once a day, and Google charges for the data streamed in. Unless you need today's events in BigQuery today, the daily export is enough.

What you actually pay for

BigQuery charges for two things: keeping the data, and reading it. At the time of writing, Google's list prices on the on-demand plan are:

Free every monthAfter that
Storage (keeping the tables)10 GiBabout $0.02 per GiB a month, halving for tables untouched for 90 days
Queries (reading the tables)1 TiB scannedabout $6.25 per TiB scanned

Prices vary by region and change from time to time, so check Google's BigQuery pricing page for yours. The structure is what matters: storage is cheap and grows slowly; queries are where a bill can come from.

A worked example

Google estimates roughly 600,000 GA4 events to a gigabyte. Take a site recording 50,000 events a day:

  • Storage: about 1.5 million events a month, or roughly 2.5 GB. A year of history is around 30 GB — well under a dollar a month once past the free 10 GiB.
  • Queries: a query reading every column of a whole month scans about 2.5 GB. The free terabyte covers around 400 of those every month, and most real queries read far fewer columns, so far less.

That is an estimate, not a quote — your events may be larger or smaller depending on how many parameters you send — but it shows the scale. For a site like this the export costs nothing or close to it.

The one habit that makes it expensive

BigQuery charges for the columns a query reads, across the dates it reads, not for the rows it returns. SELECT * over all your history with LIMIT 10 still bills you for reading everything.

GA4's export is one table per day, with every event's details nested inside it. The biggest column by far is usually event_params, which carries every parameter of every event. A query that unpacks it costs several times one that sticks to plain columns like event_name, event_date or device.category. So:

  1. Always limit the dates. Filter on _TABLE_SUFFIX so the query reads only the daily tables it needs:
    SELECT event_name, COUNT(*) AS events
    FROM `your-project.analytics_123456789.events_*`
    WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260930'
    GROUP BY event_name
  2. Name the columns you need instead of SELECT *, and only unpack event_params when the question needs a parameter.
  3. Read the estimate before you run. The BigQuery console shows how much a query will process before you press Run. Use the table's Preview tab to look at rows, which costs nothing.
  4. Set a ceiling. A query can carry a maximum number of bytes billed, and BigQuery refuses it before running if it would read more. Projects can also have a daily query quota, and Cloud Billing can email you when spending passes an amount you choose.

The free sandbox, and its catch

BigQuery has a sandbox that needs no billing account at all, and GA4 can export into it. The catch: tables in the sandbox expire after 60 days, and the streaming export is not available. It is a good way to try the export and learn the data, not a place to keep history.

How Glancely handles it

When you connect a GA4 export to Glancely, you give one Glancely identity read access to that dataset alone, nothing else in your Google Cloud. Glancely's queries then run in our Google Cloud project and are billed to us, not to you; your project pays only for storing the export. Every query is limited to the dates it needs, carries a maximum-bytes ceiling, and its answer is kept for six hours so opening the same page again does not read the tables again. Each plan includes a monthly allowance of raw-event reading, shown on the pricing page.

Kosmas Botsis

Kosmas Botsis · Founder of Glancely

Kosmas Botsis is the founder and lead data engineer of KB Analytics, an analytics engineering practice in Athens working with clients across Europe and the US: more than 250 projects for over 194 clients, and in Toptal's top 3% of talent. Glancely is what came out of that work.

More from the blog

  • Why your return on ad spend counts sales your ads didn't make

    Divide all of your revenue by your ad spend and the ads take credit for every organic, direct and email sale. Here is how to work out the return on the channels you actually pay for, and why it can be five times lower.

  • Why your Google Ads campaigns don't line up with GA4's

    Put Google Ads spend beside GA4 revenue by campaign and half the rows often come back empty, because the join is on a name and the names don't agree. Here is where GA4's campaign name comes from, and how to match them without hiding your best campaign.

  • Where Performance Max shows up in GA4

    GA4 files Performance Max visits under a channel called Cross-network, not Paid Search or Paid Shopping. Put its spend anywhere else and every channel's return is wrong; here is where it belongs and how to read it.