Connect Google Analytics 4 to Airtable

Run GA4 reports over any dimensions and metrics — sessions, users, conversions, channels — and land them in a sheet on a schedule. Presets get you started; every field stays editable.

Coming soon — join the list to get early access

What you can pull from Google Analytics 4

Google Analytics 4 exposes 5 objects you can pull, each as its own job. Every run will pull the records into a flat table, so nested fields arrive as ordinary columns that Airtable can sort, filter and total without further work.

Traffic overview

Daily sessions, users and page views.

Columns returned by traffic overview
ColumnTypeNotes
datedimension
sessionsmetric
activeUsersmetric
screenPageViewsmetric

Traffic acquisition

Daily traffic split by default channel group.

Columns returned by traffic acquisition
ColumnTypeNotes
datedimension
sessionDefaultChannelGroupdimension
sessionsmetric
activeUsersmetric
engagedSessionsmetric

Top pages

Most-viewed pages with engagement.

Columns returned by top pages
ColumnTypeNotes
pagePathdimension
screenPageViewsmetric
activeUsersmetric
userEngagementDurationmetricSeconds

Conversions / key events

Event counts by day and event name.

Columns returned by conversions / key events
ColumnTypeNotes
datedimension
eventNamedimension
eventCountmetric
activeUsersmetric

Geography

Users and sessions by country.

Columns returned by geography
ColumnTypeNotes
countrydimension
activeUsersmetric
sessionsmetric

Options you can set

property_id
The numeric GA4 property ID, not the G-XXXXXXX measurement ID
dimensions
Prefilled by the preset, and editable
metrics
Prefilled by the preset, and editable
date_range
yesterday, last_7_days, last_28_days, last_90_days or custom
keep_empty_rows
Include rows whose metrics are all zero — defaults to false

How it lands in Airtable

Airtable accepts append, upsert writes. Upsert is the one that matters on a schedule: it merges on a key you choose, so matching rows are updated in place and only genuinely new records are created. Append instead, and a daily job multiplies your data.

Upsert merges on up to three key fields. Matching records are updated in place; only genuinely new rows are created.

  • At most 3 merge fields - Airtable rejects more.
  • Writes go 10 records per request, at 4 requests per second by default (Airtable’s own ceiling is 5) - roughly 2,400 records a minute.
  • typecast is on by default, letting Airtable coerce strings into select, number and date fields rather than rejecting the write.
  • unknown_fields defaults to error, so a renamed source column fails loudly instead of silently dropping data. Set it to skip if you would rather drop.

Authentication

You connect Google Analytics 4 once through OAuth and the credential is stored server-side, never pasted into a cell or a formula. Only the scopes the connector actually calls are requested — the table below lists each one and what it is for.

What Google Analytics 4 is asked for

analytics.readonly sensitive
Run GA4 reports. Read-only
userinfo.email non-sensitive
Label the connection

Keeping runs incremental

Yes. Each run pulls a rolling date window rather than the whole history, so nothing has to persist a cursor between runs.

Pair a narrowed read with an upsert write and a re-run costs almost nothing: the rows it already knows are updated, and nothing is duplicated. That combination is what makes a frequent schedule affordable.

Limits and pacing

These are the provider-side ceilings that shape a schedule, not ours. Knowing them up front is the difference between a job that runs quietly every morning and one that starts failing the week your data grows.

LimitValueApplies to
Date window Narrowed each run rather than cursored, so there is no state to corrupt.per-run presetGoogle Analytics 4

Common gotchas

Most of what goes wrong with a scheduled sync is not a bug — it is a detail of how one side behaves that nobody wrote down. These are the ones that come up for this pair.

Presets are a starting point, not a cage

Each preset prefills dimensions and metrics that are known to work together; both remain editable.

Not every dimension pairs with every metric

GA4 rejects invalid combinations at query time rather than warning you when you pick them. If a custom pairing 400s, that is why - start from the closest preset and change one thing at a time.

Zero rows are dropped by default

keep_empty_rows is false, so days with no activity simply do not appear. If you are charting a continuous series, that gap is a missing row rather than a zero.

Do not key an upsert on email

People change their email address. When they do, upsert cannot match, so it creates a second record - the exact duplicate you were trying to prevent, plus a stale one. Use a stable ID from the source system.

The key field has to be written

If you restrict which columns get written and the key field is not among them, there is nothing to match on and every row is treated as new.

A row that is a fact per period needs a compound key

For a daily history, one row is one entity per day. Key on the entity alone and each day overwrites the last, leaving no history at all.

Key on the dimension combination, not the date alone

A row here is a metric per dimension per day. Upsert on date alone and each run collapses the whole report into one row.

Set it up in four steps

  1. 1

    Connect Google Analytics 4

    Connect your Google account, then choose a GA4 property.

  2. 2

    Connect Airtable

    Connect your Airtable account once, then pick a base and table.

  3. 3

    Shape the data

    Select the columns you want, filter rows, cast types and add computed fields. Everything else is dropped before it reaches the destination.

  4. 4

    Schedule it

    Run once, or on a cron. Every run refreshes Airtable with the latest Google Analytics 4 data.

Do I need an add-on or extension for this?

No. The job runs server-side and writes into Airtable through its API, so there is nothing installed in the destination itself. It keeps running when nobody has the file open, and a copy of the file does not need anything installed to work.

How often does the data refresh?

On whatever schedule you set with a cron expression — hourly, daily, or a specific time on specific days. Each run pulls the latest from Google Analytics 4.

Do I need to write any code?

No. You connect both sides, map the fields in a wizard and set a schedule. Computed fields accept small expressions — abs, round, min, max, len — but there is nothing to host or maintain.

Which property ID do I use?

The numeric one from Admin → Property details, not the G-XXXXXXX measurement ID. They are different identifiers and the Data API only accepts the numeric form.

Can I choose my own dimensions and metrics?

Yes. The presets prefill combinations known to work together, which saves the round of trial and error GA4 otherwise demands, but both lists stay editable.

How do I stop duplicate records appearing?

Use upsert rather than append, and key it on a stable identifier from the source. Append creates new records every run, so a daily job leaves seven copies of every row by the end of the week.

How fast can it write?

Airtable accepts 10 records per request, and writes are paced at 4 requests a second by default against a ceiling of 5 - roughly 2,400 records a minute. That is comfortable for thousands of rows and worth planning around for hundreds of thousands.

When will Google Analytics 4 be available?

Google Analytics 4 is built and waiting on verification. Join the early-access list and we will let you know the moment it opens.