← Back to Self-host Airtable

Migrate from Airtable to NocoDB

Spreadsheet / lightweight database · full migration guide

Airtable → NocoDB is one of the few SaaS-to-OSS migrations that can be done entirely through a UI: NocoDB ships a first-party Airtable importer that pulls bases, tables, fields, views, and rows over the Airtable API given a Personal Access Token and a base ID. The migration is live (no flag-day required), so you can dual-write for a week while you compare. The friction is field-level: Airtable's formulas, lookups, and rollups translate but complex rollups need a manual rebuild. Plan for the import to be ~95% automatic and the last 5% (formulas + automations) to be manual.

Prerequisites

  • Airtable account with read access to the bases you want to migrate.
  • A self-hosted NocoDB instance — see /airtable/ for the 10-minute docker-compose recipe and ~$5/mo VPS sizing.
  • An Airtable Personal Access Token (PAT) with `data.records:read` and `schema.bases:read` scopes — generated at airtable.com/create/tokens.
  • The base IDs of each Airtable base you want to migrate (visible in the URL: `airtable.com/app<baseId>/...`).
  • If you have many bases or > 100k rows total: a Postgres-backed NocoDB (not the default SQLite) — set the `NC_DB` env var on the NocoDB container.

Step 1 — Export from Airtable

  1. Generate an Airtable Personal Access Token

    Go to airtable.com/create/tokens, click Create new token. Name it `nocodb-import`. Add scopes: `data.records:read`, `data.recordComments:read`, `schema.bases:read`. Add access: select the workspaces / bases you want to migrate (or All workspaces). Save the token — you only see the value once.

  2. Collect base IDs

    For each base you want to migrate, open it in Airtable. The URL is `airtable.com/app<baseId>/tbl<tableId>/...` — the part starting `app` is the base ID. Save these alongside the friendly base name.

  3. (Optional) Audit complex formulas before import

    In Airtable, list the fields with formulas, lookups, and rollups. For each, copy the formula text into a sidecar doc. NocoDB will translate the simple ones (CONCATENATE, IF, dates) and either fail or approximate the complex ones (DATETIME_DIFF chains, multi-level rollups). Knowing the list ahead saves backtracking.

Step 2 — Import into NocoDB

  1. Open NocoDB's Airtable importer

    In NocoDB, click + Create project → Import from Airtable. The dialog asks for a Personal Access Token and a base ID.

  2. Paste the token and base ID

    Token first, then base ID. NocoDB validates by hitting Airtable's API; if either is wrong you see a 401/404 immediately.

  3. Choose what to import

    The importer offers checkboxes for: schema only, schema + records, include views, include attachments. Pick all four for a full migration. For a 100k-row base, the import takes 5-15 minutes; NocoDB streams record batches via the Airtable API (5 records/sec rate limit applies).

  4. Verify and rebuild formulas

    After import, walk the field list per table. Formula fields that translated successfully render with their result. Fields that failed render as plain text with a `[formula error]` note. Rebuild these in NocoDB's formula editor (Field type → Formula → enter the NocoDB-flavored expression).

  5. Re-implement automations as NocoDB hooks or n8n workflows

    Airtable Automations do not migrate. NocoDB has webhook + workflow hooks (Edit table → Webhooks). For complex multi-step automations, point a NocoDB hook at an n8n workflow (n8n has a NocoDB node). Document each Airtable Automation, then port one by one.

Field / concept mapping

Airtable NocoDB Notes
Airtable base NocoDB project Each Airtable base becomes a top-level NocoDB project. Re-importing the same base creates a duplicate project — delete the old one if re-running.
Airtable table NocoDB table Direct 1:1. Field order, primary field, table name preserve.
Airtable Single line text / Long text NocoDB SingleLineText / LongText Direct mapping. Markdown rendering in long text is preserved.
Airtable Single select / Multi-select NocoDB SingleSelect / MultiSelect Options and colors transfer.
Airtable Number / Currency / Percent NocoDB Number / Currency / Percent Precision preserved; locale-specific formatting (Euro vs USD) transfers.
Airtable Date / Datetime NocoDB Date / DateTime Timezone-aware fields transfer cleanly.
Airtable Linked record NocoDB LinkToAnotherRecord Importer preserves both directions of the link. If the linked table is in a different base, manually relink after both bases are imported.
Airtable Lookup NocoDB Lookup Single-hop lookups translate; multi-hop lookups (lookup of a lookup) sometimes need manual rebuild.
Airtable Rollup NocoDB Rollup Sum, count, max, min translate. Custom rollup formulas (CONCATENATE, AVERAGE on filtered) need rebuild.
Airtable Formula NocoDB Formula Most simple formulas translate. Complex formulas using regex, deep date math, or REGEX_EXTRACT may render as plain text with an error note.
Airtable Attachment NocoDB Attachment Files are downloaded from Airtable's CDN and re-hosted on NocoDB's storage backend (local filesystem or S3). For >1GB total attachments, configure S3 ahead of time.
Airtable View (Grid, Kanban, Calendar) NocoDB View Grid views transfer with column hide/show and sort. Kanban view recreates from the appropriate single-select field. Calendar view recreates from a date field.
Airtable Automation NocoDB Webhook + workflow tool Manual rebuild. NocoDB exposes webhooks on row events; chain them through n8n or Activepieces for multi-step.
Airtable Form NocoDB Form view Form views are recreated by hand: in NocoDB, add a Form view, drag fields. Embed code differs but URL pattern is similar.

Downtime estimate

Effectively zero downtime if you dual-write for a week — Airtable stays live for users while NocoDB ingests; the cutover is just changing the bookmark. For a hard cutover with no dual-write: 30 minutes of write-freeze on Airtable while the importer runs (5-15 min per 100k rows) and a final spot-check on critical tables.

Common gotchas

  • Airtable's API has a hard rate limit of 5 requests/sec per base. For very large bases (>500k rows) the import can take 30-60 minutes — start it early.
  • Personal Access Tokens require explicit scope on each base. If you add a new base after creating the token, you have to edit the token's access list.
  • Linked records across bases (Airtable's cross-base sync) do not auto-link in NocoDB — you have to import both bases first, then manually re-link.
  • Attachment URLs in Airtable expire after a few hours of being unused. Run the import end-to-end in a single session; if it pauses, attachments may fail to download.
  • Airtable's `Created time` and `Last modified time` system fields are emitted as values at import time, then frozen. They do not continue to track NocoDB's actual create/modify events. Use NocoDB's own system fields for that going forward.

Rollback plan

Airtable is read-only-affected during the import — no rollback action is needed there since nothing changes on Airtable's side. If you've already pointed users at NocoDB and need to revert: NocoDB has a CSV export per table that round-trips to an Airtable CSV import. The data flows both ways; the formulas and automations are what would have to be rebuilt either direction.

Looking for setup time, monthly cost, and other alternatives? See Self-host Airtable.