Engineering

Migrating 50,000 Airtable records to Postgres in 15 minutes

5 min read

Discuss this article with AI

Opens your AI tool with a prompt about this article. It can read the live page and answer your questions.

A base with 50,000 records used to be an all-day migration if those records carried attachments. It is not anymore. We rebuilt how AT Migrator runs a migration: the row data now lands in PostgreSQL in about 15 minutes, and attachment files copy to your storage afterward in a separate pass. Here is what changed and why.

50,000

Records migrated

~15 min

To row data in Postgres

Separate

Attachment phase

0

Rows lost

How it used to work

Every migration ran as a single pass. For each record, AT Migrator would download that record's attachments from Airtable's CDN, upload them to your bucket, and only then write the row to Postgres. Rows waited on files.

That is fine for a 500-row base. On a base with tens of thousands of rows and an attachment on most of them, it fell over. Files were copied roughly two at a time for the entire run, and Airtable's signed file URLs expire after about two hours, so a long migration would start racing its own links.

We had an internal test base of around 25,000 records with a file on nearly every row. It was on track to take the better part of a day, and the row data was stuck behind the files the whole time.

What we changed

We split the migration into two phases.

First, the row data. All of it goes in before any file is touched: larger insert batches, more records transformed in parallel, and the schema, linked records, and formulas rebuilt as it runs. For the 50k base this phase finished in about 15 minutes.

Then, attachments. A dedicated phase walks the rows that are already in Postgres, re-reads Airtable for fresh file links so nothing has expired, and copies files into your storage many at a time, with retries. It updates each row's file references in place as it goes. Large files stream instead of buffering, so memory stays flat.

The practical result: your Postgres database is usable within minutes of starting, and the files fill in behind it. You can watch that second phase run, with a rough time remaining.

The 50,000-record test

We ran a real base end to end: 50,000 records with attachments, migrating to PostgreSQL.

  • Row data: about 15 to 16 minutes. Every table live and queryable in Postgres at that point.
  • Attachments: copied afterward, in the background, into the customer's own storage, with progress and an estimate shown the whole time.
  • Data loss: none. If a file fails to copy after retries it keeps a working reference and gets flagged, so you can retry just those files without re-running the migration.

Try it on your base

If you have a large Airtable base, especially one with a lot of attachments, that you have been putting off moving, now is a good time. Start with a migration plan or book a discovery call and we will scope records, attachments, and formula risk first. There is also a live estimator on the home page that will size the migration window for your record and attachment counts.

Ready to migrate your Airtable base?

Get started free — connect your base and see your data land in PostgreSQL in minutes — or scope your migration first if your setup is large, multi-base, or formula-heavy.

Keep reading

FAQ

Frequently asked questions

Quick answers to the questions teams ask most about this topic.

Row data for most bases is ready in a few minutes to about 20 minutes. A recent real test of a 50,000-record base finished its rows in around 15 minutes. Attachments are copied to your storage afterward in a separate background phase.

Copying files inline made every row wait on its attachments, which is why attachment-heavy bases used to take hours. Now the row data goes in first and is queryable within minutes; a dedicated phase then copies files to your storage at high concurrency, with retries and fresh Airtable links.

No. The wizard is the same. Your Postgres database is usable as soon as the row phase finishes; the attachment phase runs on its own and shows progress. If a few files fail to copy, a Resume run retries only those.

The pipeline is built for bases up to and past 100,000 records. Larger or more complex migrations are handled as Done-for-you engagements. Book a discovery call to scope yours.