TL;DR
- You outgrow Airtable when the business needs an application Airtable can no longer support cleanly: custom user experiences, stronger authentication and permissions, more complex server-side behaviour, higher API throughput, or tighter control over deployment and data.
- A messy base does not necessarily mean you need to migrate. Fix your schema first.
- Check Airtable's documented limits against your real numbers rather than against something you half-remember.
- Compare three paths before quoting anyone: improve the base, put a custom interface on it, or move data and logic together.
Ever opened your base and found four versions of the same email field? This base probably came to life as simple "Contacts", "Deals", and "Payments" tables, and now it feels like it is time to switch. Everything is just so messy, and any day now, the workflow that you built to support the initial version of your business might collapse under the weight of lookup columns that you do not really trust anymore.
A note, my dear reader: your base probably has not hit its limit yet, and this switch could very well be unnecessary and expensive.
When do you outgrow Airtable?
You outgrow Airtable when the operating requirements around the data exceed what Airtable can deliver cleanly, and not when the base merely "feels messy".
Messy is not exactly quantifiable, so we like to measure it by the five forcing functions, and one has to actually be present:
- Your users cannot be inside Airtable. The people who need to use this are customers, applicants, or the public, and they will never have Airtable accounts, so what they see has to be a front end you built, and branded to the client.
- You need authentication and row-level permissions. Logins that you own, and rules deciding which records each person can see, wherein one client must never be able to load another client's rows.
- The rules have to move out of formulas and into code. An audit trail, so you can see who changed what and when. Server-side validation, which means a rule that cannot be clicked past no matter who is typing. And transactions, wherein two writes either both succeed or both roll back, so a payment never lands without the deal attached to it.
- You are hitting a documented limit, and you can prove it. Records, attachments, API rate limits, or automation runs, checked against Airtable's own limits rather than against something you half-remember.
- The client needs ownership of the code, the deployment, and the roadmap. Not the data, which is exportable already, but the thing that reads it.
And let's be clear about what is not on that list: relational complexity. Airtable is a relational database with a visual front end, so linked records, junction tables, self-links, and rollups are things it was designed to do.
Which Airtable limits are real?
The limits worth taking seriously fall into categories, and we highly recommend checking your numbers against Airtable's own plans and limits page, because a figure you half-remember from two years ago is not a plan.
Record and attachment capacity is the one almost everybody reaches for first, though it arrives later than expected. What people do not anticipate is API throughput and pagination, and it sure bites the hardest: the REST API hands back records in pages, so anything reading a large table has to page through, and anything writing at volume has to respect the rate ceiling. Automation-run allowances matter once a base is doing real operational work daily. Per-seat economics matter the moment the client's whole team needs access, and that is a cost curve, not a technical wall. And interface and permission constraints are the boundary you feel earliest on a client-facing base.
Make sure to notice that hitting a limit is not the same as needing to leave. Batching writes, caching reads, backing off on retries, archiving cold records, or changing plan resolves most of these, in this case without touching the architecture.
Which problems are actually schema problems?
Say a client comes to you asking what they should be switching to, because they've hit their limit with Airtable and they are done arguing about it. You open the "Master" base, and here is what you actually find.
| Name | Type | Company | Deal Value | Notes | |
|---|---|---|---|---|---|
| John (new, called Tues, DO NOT EMAIL) | Contact | john@dummy.com | Harper Rowe Ltd | called Tues, wants a callback Fri | |
| Harper Rowe Ltd | Company | john@dummy.com | Harper Rowe Ltd | main contact is John, invoices to accounts@ | |
| Website rebuild (Harper Rowe) | Deal | j.harper@dummy.com | Harper Rowe | 12000 | John is decision maker, Priya signs off, 50% up front |
| Priya - FINANCE (do not call before 10) | Contact | priya@dummy.com | Harper Rowe Ltd | approves invoices only, John's colleague | |
| Retainer - Q3 - PAID (part) | Deal | john@dummy.com | harper rowe | 4500 | Priya is billing contact, 2000 paid Jul, rest overdue |
What each row is doing wrong:
- Rows 1, 2, and 4 are a person, a company, and a person again, all in a table that also holds two deals. The Type field is the only thing telling them apart, which means every view, every formula, and every automation has to filter on it before it can do anything.
- John's email appears four times across three spellings, and one of them, j.harper@dummy.com, is wrong. Nobody knows it's wrong, because there is nothing to check it against.
- "John is decision maker, Priya signs off" is a many-to-many relationship with a role attached, sitting in a Notes field where no formula can read it and no filter can find it.
- The company is "Harper Rowe Ltd" in three rows and "Harper Rowe" in two, so grouping by company gives you two companies.
- And the primary field is doing four jobs at once: a name, a status, a call log, and a shouted instruction. Every linked record elsewhere in the base would display "John (new, called Tues, DO NOT EMAIL)" as its label.
That base is genuinely something I would never want to work in, and the client is not wrong to be frustrated. But look at that list again, and notice what is not in it: not one of those is a limit we talked about earlier.
So here's what you would do instead of quoting them for a migration. You split "Master" into three tables, wherein Contacts holds people,
| Name | Job Title | Company | Notes | |
|---|---|---|---|---|
| John Harper | Director | john@dummy.com | Harper Rowe Ltd | Called Tues, wants a callback Fri. Do not email. |
| Priya Nair | Finance Manager | priya@dummy.com | Harper Rowe Ltd | Do not call before 10 |
Deals holds the work,
| Deal Name | Company | Value | Stage |
|---|---|---|---|
| Website rebuild | Harper Rowe Ltd | 12000 | In progress |
| Q3 retainer | Harper Rowe Ltd | 4500 | In progress |
and Payments holds money that has come in.
| Deal | Amount | Date |
|---|---|---|
| Q3 retainer | 2000 | 2026-07-14 |
And then a fourth table, where "Deal Contacts" holds one row for each person working on each deal, and the job they do on it. Here, John decides on the website rebuild, Priya approves it, and Priya is the one you invoice on the retainer. This fact can only be assembled when the two tables are combined together, which is what a junction table is for.
| Deal | Contact | Role |
|---|---|---|
| Website rebuild | John Harper | Decision maker |
| Website rebuild | Priya Nair | Sign-off |
| Q3 retainer | Priya Nair | Billing |
The email lives in Contacts once, and a lookup pulls it through to wherever else you need to read it. And the primary field goes back to being an identity, wherein the notes about John live in a field called Notes, where they always belonged.
And the client stays on Airtable, in this case for the price of an afternoon.
What requirements usually force a custom application?
This is a capability question rather than a size question, and it has three answers.
Airtable interfaces. Make sure to stay with an interface when your client just needs a tidy screen for their own team to work in, over the same base you already built. You choose which fields they can edit and which are read-only, you hide the internal ones completely, and a button on the page can fire off an automation without them ever seeing how it works. If the manager and the staff need different things, build two interfaces rather than one clever one, and share only the interface, so nobody ever lands in the raw table.
A custom webpage on top of Airtable. We've seen that the honest trigger for going custom is because of who the end users are. If the page is for customers or applicants, people who will never have an Airtable login, or it has to sit inside your client's existing website and look like the rest of it, or the layout is more than what Airtable's interface builder will give you, then you build the page yourself and leave Airtable underneath as the place where the data lives. Your page asks Airtable for records over its API, and sends new ones back the same way.
For anything public, the token belongs in a serverless function that proxies the request, never in client-side JavaScript, because the page source is readable by everyone who visits.
A full application. Consider this only when the interface, permissions, logic, and maintenance requirements together no longer fit the Airtable-plus-interface model. Not when one is straining.
Should you repair, build alongside, or migrate?
Three paths, and the middle one is the one that gets skipped.
| Path | Best for | What changes | What the client sees | Who maintains it | Where it breaks |
|---|---|---|---|---|---|
| Repair Airtable | Schema and operating-process problems | Base structure | Airtable | Operator or consultant | Product requirements still remain |
| Airtable plus custom front end | Better user experience while preserving back-office familiarity | Interface and API layer | Branded application | Developer plus Airtable owner | API and two-system complexity |
| Full application migration | Custom product behaviour and control | Data, logic, interface, deployment | Branded application | Software team | Highest migration and maintenance burden |
The middle row deserves better. The client keeps the base they know how to operate, and the customer-facing surface stops looking like a spreadsheet. What you take on in exchange is two systems that have to agree, plus API behaviour you now own: pagination, rate limits, field names that must match your Airtable column names EXACTLY, and a token that has to live somewhere safe. It is the same hybrid trade-off you make when choosing between Make, n8n, and custom code.
And on ownership, which is usually the word doing the arguing: it is not binary. Ask instead whether the data is exportable, who controls the infrastructure, who owns the code, and who answers when it breaks at 2am. A client who says they want to own their system usually means one or two of those.
What does migration actually involve?
Let's be specific about the work a shallow comparison skips, because this is where timelines go wrong.
- Export and field mapping. The fields that do not map cleanly are the ones that eat your week.
- Rebuilding every relationship. Linked records do not survive a CSV export. Your Deals will come out holding the contact's name as plain text, and reconnecting them is manual work.
- Moving the files. Anything sitting in an attachment field has to be pulled out and re-hosted somewhere.
- Keeping a cross-reference of old record IDs to new ones. Every workflow, form, and integration pointing at a record is pointing at an ID, and those all change.
- Authentication. Airtable was quietly handling logins for you, and now you own that.
- Replacing the interface. Whatever your client was clicking on has to be rebuilt before they can do their job.
- Running both systems in parallel on live data, then the cutover itself, and a rollback plan you could actually execute at 9am on a Monday.
- Reworking every workflow pointed at the old base. Every Make scenario, every n8n workflow, every form.
And let's not forget the quiet one: Airtable gave you a usable interface for free. A database, on its own, gives you nothing to look at.
What questions come up most often about outgrowing Airtable?
Is Airtable a database?
Yes. Airtable is a relational database with a visual front end on top of it. Tables link to each other, lookups pull fields across those links, and rollups aggregate down a chain. The spreadsheet look is presentation.
Can Airtable handle many-to-many relationships?
Yes. Linked record fields support one-to-one, one-to-many, and many-to-many relationships, and a table can link to itself. Where the relationship itself carries data, model it as a junction table.
How many records can Airtable hold?
There's a documented per-table limit that varies by plan, so make sure to check Airtable's current plans and limits page rather than a blog post. No universal threshold decides the move, and capacity is rarely the deciding input.
Is Airtable suitable for a client project?
Often, yes. It models most businesses, costs far less than a vertical CRM, and looks familiar enough that adoption is not a fight. The question is who the users are.
Can you put a custom website on top of Airtable?
Yes, through the REST API. Your page reads records with authenticated fetch requests and writes with a POST, routed through a serverless function so the token stays server-side. This is the legitimate middle path.
What should you check before migrating away from Airtable?
Check that the schema is correct, that you're hitting a documented limit rather than fearing one, that an interface or custom front end would not solve it, and that somebody has agreed to maintain the result.