Airtable to PostgreSQL: How to Sync Your Data

Sync Airtable to PostgreSQL with Airbyte. Handling a schema edited by users, base ID stream naming, concurrency and rate limits, and linked records as JSON.

Summarize with AI:

Syncing Airtable to PostgreSQL moves records out of a collaborative base and into a real database, so they can be joined against production data, queried with SQL, and read by tools that will never speak the Airtable API. Airbyte handles it without code. The thing that makes this pipeline different from a database-to-database one is not technical difficulty, though: it is that your source schema is edited by people, continuously, without warning.

Someone renames a field on a Tuesday because it reads better, and a downstream column disappears. Designing for that is most of the work.

CapabilitySupportedWhat it means for this pipeline
AuthenticationOAuth2 or tokenOAuth is recommended on Cloud; a personal access token also works
Rate limit5 requests/second/baseRespected automatically, so concurrency will not trigger errors
Concurrent threads2 to 40Defaults to 5. Raising it helps across multiple bases
Base ID in stream nameOptionalPrevents collisions when bases share a table name
Postgres destinationAirbyte tierHigh reported sync success rate, available on all plans

Why does the schema keep changing underneath you?

Airtable's appeal is that non-engineers can restructure a base whenever they need to. That is also its risk as a pipeline source. A field rename, a type change from single-line text to single select, or a deleted column all arrive without a migration, a review, or a warning to whoever owns the downstream table.

Two habits make this manageable. First, never point dashboards or applications directly at the raw synced tables. Put a view or a dbt model in between, so a rename in Airtable breaks one clearly-owned definition rather than every downstream consumer at once.

Second, agree with the people who own the base that field names are an interface. They do not need to understand the pipeline; they need to know that renaming a column has consequences elsewhere. That conversation is more effective than any technical mitigation.

Why do stream names collide?

Airtable table names are only unique within a base, and the same organisation will happily run three bases each containing a table called Tasks or Projects. Sync more than one base through a single connection and those streams compete for the same destination table name.

The Airtable source has a setting for exactly this: Add Base ID to Stream Name includes the base ID in stream names to guarantee uniqueness. Turn it on before the first sync if there is any chance you will add a second base later. Enabling it afterwards renames your streams, which means new destination tables and downstream models pointing at the old ones.

The resulting names are less readable, which is a fair trade against silently merging two unrelated tables. Handle the readability in your downstream models, where renaming is cheap.

Authentication, concurrency, and rate limits

You can authenticate with OAuth2.0 or a personal access token. OAuth is recommended for Airbyte Cloud, where you sign in, select the workspaces you want to sync, and authorise. On Open Source, a personal access token is the simpler path.

One known issue is worth knowing before you diagnose it as your own mistake. When using OAuth, the documentation notes you may see a 400 or 401 error causing a failed sync, and that re-authenticating the connector resolves it temporarily. If a previously healthy OAuth connection fails on authentication, re-authenticate first rather than rebuilding the source. A personal access token avoids this failure mode, at the cost of a credential to rotate.

On throughput, the connector exposes a Number of Concurrent Threads setting, defaulting to 5 with a minimum of 2 and a maximum of 40. Higher values improve performance when syncing several bases or where there is I/O wait. Importantly, the connector automatically respects Airtable's rate limit of five requests per second per base, so raising concurrency will not cause rate limit errors. That removes the usual reason for caution: if your sync is slow across many bases, raise the thread count.

Note that the limit is per base, so concurrency buys you the most when the work is spread across bases rather than concentrated in one very large table.

How does Airtable data land in Postgres?

The Postgres destination writes each stream to a table in your target schema, with fields as typed columns plus Airbyte's metadata columns. It is an Airbyte-supported connector with a high reported sync success rate, so the destination half is well-trodden.

The Airtable field types to plan for are the ones with no flat equivalent. Linked records point at rows in another table and arrive as arrays of record IDs, not as resolved values. Attachments arrive as structured objects describing files rather than the files themselves. Multiple-select fields arrive as arrays. All of these land as JSON columns, which Postgres queries perfectly well with its JSON operators, but which will not behave like flat columns in a BI tool.

Linked records deserve particular thought. If a base uses them heavily, you are effectively replicating a graph into a relational database, and the joins your analysts expect will need building. Sync the linked tables as well, then resolve the relationships in a downstream model where the record IDs become real foreign keys.

Frequently asked questions

A column vanished from my Postgres table. What happened?

Almost certainly someone renamed or deleted the field in Airtable. Put a view or dbt model between the synced tables and your consumers so a rename breaks one definition rather than everything downstream.

Two of my bases have a table with the same name. How do I keep them separate?

Enable Add Base ID to Stream Name, ideally before the first sync. Turning it on later renames streams and creates new destination tables.

My OAuth connection started failing with a 401. Is my token wrong?

This is a documented issue. Re-authenticate the connector, which resolves it temporarily. A personal access token avoids the problem if it recurs often.

Will raising the thread count cause rate limit errors?

No. The connector automatically respects Airtable's limit of five requests per second per base, so increasing concurrency up to the maximum of 40 will not trigger them.

Get your Airtable data into PostgreSQL

Enable base IDs in stream names from the start, model over the raw tables rather than under them, and plan for linked records and attachments arriving as JSON. For a relational source into the same database, see our guide to MySQL to PostgreSQL. For loading from an API more generally, see API to database.

Start syncing now →

Integrate with 600+ apps using Airbyte

Move data from 600+ sources into warehouses, lakes, and beyond. Set up pipelines in minutes with pre-built connectors and the Connector Builder.