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
-
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.
-
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.
-
(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
-
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.
-
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.
-
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).
-
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).
-
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.