Connect Google Search Console to Airtable
Import Search Analytics — clicks, impressions, CTR and average position — broken down by query, page, country or device, for your verified sites.
Coming soon — join the list to get early access
What you can pull from Google Search Console
Google Search Console 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.
Top queries
Search queries by day. The most common SEO report.
| Column | Type | Notes |
|---|---|---|
| date | dimension | — |
| query | dimension | — |
| clicks | metric | Always returned |
| impressions | metric | Always returned |
| ctr | metric | A fraction, not a percentage |
| position | metric | Average position |
Top pages
Landing pages by day, with the same four metrics.
By country
Search performance split by country.
By device
Desktop, mobile and tablet split.
Daily totals
One row per day, no breakdown.
Options you can set
- site_url
- A DNS-verified property uses the sc-domain: form, not the https:// URL
- date_range
- yesterday, last_7_days, last_28_days, last_90_days or custom
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 Search Console 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 Search Console is asked for
- webmasters.readonly non-sensitive
- Read search performance. Read-only
- userinfo.email non-sensitive
- Label the connection
Keeping runs incremental
Yes. Pull a rolling date window and append, building history past the 16 months Search Console retains.
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.
A worked example
A striking-distance worklist
Pull top queries daily, upsert on query plus date, and filter the view to positions 8 to 20. What you get is not a report but a queue - the pages one improvement away from real traffic, with an owner against each.
Schedule: 0 9 * * 1 — read it back in plain English
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.
| Limit | Value | Applies to |
|---|---|---|
| Data retention Google deletes beyond this. There is no upgrade that recovers it. | 16 months | Google Search Console |
| Reporting lag The most recent days are incomplete until Google finishes processing. | 2-3 days | Google Search Console |
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.
Clicks, impressions, CTR and position are always returned
Search Console has no selectable metrics - the four come back on every report and cannot be chosen.
Every preset includes the date dimension
Without it the API collapses the whole window into a single aggregated row, which is meaningless appended to a sheet on a daily schedule.
Search Console keeps 16 months
Older data is gone permanently - there is no upgrade that recovers it. Appending to a destination on a schedule is how you keep a longer history.
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.
Set it up in four steps
- 1
Connect Google Search Console
Connect your Google account, then choose a verified property.
- 2
Connect Airtable
Connect your Airtable account once, then pick a base and table.
- 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
Schedule it
Run once, or on a cron. Every run refreshes Airtable with the latest Google Search Console 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 Search Console.
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.
Can I get more than the 1,000 rows the UI exports?
Yes. The export limit is a property of the Search Console interface, not the API. A scheduled job pages through the full result set and writes all of it.
Why does my property URL not work?
A DNS-verified property is a Domain property, and the API addresses it as sc-domain:example.com rather than https://example.com/. Passing the URL form returns 403 even with correct permissions.
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 Search Console be available?
Google Search Console is built and waiting on verification. Join the early-access list and we will let you know the moment it opens.
Other sources into Airtable
Related reading
Airtable upsert: stop creating duplicate records
Appending on every run turns a tidy base into six copies of every row. Here is how upsert works in Airtable, and how to choose a merge key that holds up.
Export Stripe data to Google Sheets
Stripe's dashboard exports are manual and stale the moment you download them. Here is how to keep customers, invoices and charges fresh in a sheet instead.
Import a CSV from a URL into Airtable
Point a job at a CSV link and it re-reads it on your schedule — no download, no manual import. Here is the setup, and the field-type trap to avoid first.