Learn GTM & Sales Automation Google Contacts + Airtable
Data syncSync Google Contacts with Airtable: one list, every account
Two Google accounts, one Airtable base, and a Google Sheet feeding new leads in. Here's how to keep all of them agreeing on who each contact is, without duplicates or lost edits.
This request, almost word for word, shows up on freelance boards every few weeks: "Need help syncing two or N Google Contacts accounts with an Airtable list from a Google Sheet. Map the fields, move the contact data accurately, and keep records updated across both platforms."
It reads like a one-afternoon Zapier job. It usually isn't. To sync Google Contacts with Airtable across more than one account, you're really building a small database sync with three sources that each think they're right. The field mapping is the easy part. Keeping it consistent after week two is the actual job.
This guide lays out the approach we'd take: which system is in charge, how the fields map, the loop that runs on a schedule, and the rules that stop duplicates.
Why it breaks
Three traps in every multi-account contact sync
Every account gives the same person a different ID
Jane Smith is people/c812 in the sales inbox and people/c4077 in the founder's account. Google won't tell you they're the same person. Your sync has to remember both IDs, or it can never update her again.
Syncs trigger each other
Airtable updates Google. Google reports a change. The sync sees the change and writes it back to Airtable, which looks like a new edit. Without a guard, two tools can ping-pong the same contact all day.
Two people edit the same contact
Sales fixes a phone number in Google while ops changes the title in Airtable. A naive sync picks one side and quietly throws away the other edit. Nobody notices until a rep calls the wrong number.
Pick one boss: Airtable in the middle
Every reliable contact sync has a hub. Here it should be Airtable. It holds one row per person, it can store the ID from every Google account next to each other, and it's where your team can see and fix problems.
The Google Sheet feeds the hub in one direction. The Google accounts talk only to the hub, never to each other. Adding a third or fourth account then means adding one more column and one more connection, not rewiring everything.
Intake
Google Sheet
New leads land here
Source of truth
Airtable base
One row per person, every Google ID
Google account A
Google account B
Account N
Field mapping
How Airtable fields map to Google Contacts
Google names come from the People API, which is what any sync tool uses under the hood. Most fields are lists, so "[0]" means the first entry.
| Airtable field | Google Contacts field | Watch out for |
|---|---|---|
| Contact ID (your own key) | userDefined → key "sync_id" | The one field that ties every copy together. Written into each Google account so a contact can always find its Airtable row. |
| First name / Last name | names[0].givenName / familyName | Google also stores a displayName it builds itself. Don’t write to it, it gets overwritten. |
emailAddresses[0].value | Lowercase and trim before comparing. This is your fallback match key when the Contact ID is missing. | |
| Phone | phoneNumbers[0].value | Store one format (+14165550100) in Airtable. Google keeps whatever people typed, so normalise on the way in. |
| Company / Job title | organizations[0].name / title | Both live on the same organizations entry. Update them together or one gets dropped. |
| Tags (multi-select) | memberships → contact group | Each tag becomes a label. Labels are per account, so the sync has to create them in every account first. |
| Notes | biographies[0].value | Plain text only. Airtable rich text loses its formatting here. |
| Google IDs (one column per account) | resourceName, e.g. people/c123… | The same person has a different ID in each account. Keep all of them, or you can’t update anything later. |
Map only the fields someone actually uses. Every extra field is one more place for two copies to disagree. You can always add more once the core sync has run clean for a few weeks.
The sync loop, step by step
This runs on a schedule, every 15 minutes to an hour. Each run only touches what changed since the last one, so it stays quick even with thousands of contacts.
- 1
Pull new rows from the Google Sheet
Treat the Sheet as an intake list only. Read new or changed rows, clean the email and phone, and upsert them into Airtable matched on email. Nothing flows back into the Sheet except a status column.
- 2
Ask each Google account what changed
Google's People API gives you a sync token. Next run, you send the token back and get only the contacts that changed or were deleted since. Store one token per account.
- 3
Match every change to an Airtable row
First on the Contact ID stored in the Google contact. Then on the cleaned email. If neither matches, it's a genuinely new person, so create the row and give them an ID.
- 4
Settle conflicts with a written rule
Compare update times, or check which side owns the field. Anything the rule can't decide goes into a Needs review view in Airtable. Don't guess.
- 5
Push the result out to every account
Update or create the contact in each Google account in batches. Save the returned Google ID and etag against the Airtable row, one column per account, along with a fingerprint of what you wrote.
- 6
Log the counts
Rows read, created, updated, skipped and sent to review, per account. Write it to an Airtable log table. If a run creates 400 contacts when you expected 4, you want to see it that day.
Both APIs are well documented if you want to check the details: Google People API and the Airtable Web API. Airtable's upsert, which updates a row if a matching one exists and creates it otherwise, does most of the work in step one.
Keeping it consistent
Five rules that keep the data honest
The loop moves the data. These rules decide whether you can trust it a month later.
Own the ID
Airtable's record ID or your own short ID goes into every Google contact as a custom field. It survives name changes, merged duplicates and people editing emails.
Normalise before you compare
Lowercase and trim emails. Store phones in one international format. Two copies of the same person that differ only by a capital letter are the most common source of duplicates.
Fingerprint what you wrote
After each write, save a hash of the synced fields per account. When Google reports a change whose fields match that hash, it's your own echo. Skip it. That one check kills the ping-pong loop.
Archive, don't delete
A delete in one account marks the Airtable row archived. The next run removes the contact from the other accounts. The row stays, so you can undo it.
Make it safe to run twice
Run the sync, then run it again straight away. The second run should report zero changes. If it doesn't, something is creating or rewriting contacts it shouldn't.
Build or buy
Four ways to run a Google Contacts and Airtable sync
None of these is wrong. The number of Google accounts and how much custom matching you need decide which one fits.
| Approach | Good fit when | The catch |
|---|---|---|
| Zapier or Make | One Google account, new contacts only, a few hundred rows. | Two-way sync across several accounts turns into a pile of zaps that trigger each other. Updates and deletes are where it breaks. |
| Off-the-shelf sync tools | A standard two-way sync between one Airtable base and one Google account. | Most handle one account per connection. Custom match rules and Sheet imports are usually out of reach. |
| Google Apps Script | Small teams already living in Google Workspace, with one person able to maintain code. | A 6-minute limit per run and per-user quotas. Fine for a few thousand contacts, awkward beyond that. |
| n8n or a small custom service | Two or more Google accounts, a Sheet feeding the list, and rules you need to control. | Someone has to own it. You get full control over matching, retries and logging, and the upkeep that comes with it. |
For the request above, two or more accounts plus a Sheet, we'd reach for n8n or a small scheduled service. If you're weighing n8n against the enrichment-first tools, our n8n vs Clay breakdown covers where each one fits. And if you need to inspect a contact export before the first import, the jq guide for GTM exports shows how to count and dedupe it safely.
Before you switch it on
Run the first sync against a copy of the Airtable base and one test Google account. Then tick these off:
- Every Airtable row has a Contact ID, and every Google contact carries it
- One Google ID column per connected account, filled for every synced row
- Emails lowercased and phones in one format across the whole base
- The conflict rule is written down, and the review view exists
- A second run in a row reports zero changes
- Deletes archive the row instead of removing it
- A log table shows counts per run and per account
- A dry-run mode that reports what it would change without writing
Only then point it at the real accounts. And export a backup of every Google account first. Google Contacts lets you download a CSV from the web app in a couple of clicks, and it's the only undo you'll have if the first live run goes wrong.
Common questions
FAQ: syncing Google Contacts and Airtable
Need this sync built for you?
Makeinfo builds contact and CRM syncs across Google Workspace, Airtable and the rest of your GTM stack. Tell us how many accounts you have and where your list lives, and we'll come back with a plan and a quote.
Or keep reading: more GTM & sales automation guides