Airtable forms: send responses to a base
Every response becomes a row in your base, as it arrives. Setup is a token and two IDs — no OAuth, and no Zapier in between.
Airtable delivery needs Basic or Advanced
How do I connect a form to Airtable?
- Create a personal access token at airtable.com/create/tokens. Give it the
data.records:writescope, and addschema.bases:readas well — the second one is what lets the connection check read your column names back. Addschema.bases:writetoo if you want Create missing columns to build the table for you; creating a column needs a scope that writing a record does not. - Under Access, add the base you want to write to. A token with the right scopes and no base is still refused.
- Copy the base and table IDs from the base’s API URL:
airtable.com/appXXXX/tblYYYY. The base startsapp, the table startstbl. - In the form editor, open Settings → Storage, choose Airtable, paste all three, and press Check connection.
Let the button build the table
A table that does not fit the form delivers nothing at all, and matching a dozen column names by hand is where that goes wrong. Create missing columns, next to Check connection in the destination settings, adds a column for every question that has none — named after the question and typed to match it:
- An email, phone or URL question becomes an Email, Phone or URL column.
- A number, rating or slider becomes a Number column. Date becomes Date.
- A dropdown or radio group becomes a Single select with its options already filled in; checkboxes become Multiple selects.
- Everything else becomes a text column, which never rejects a value.
It changes your base, so it only runs when you press it — delivery never alters a schema on its own. Two things about Airtable make this worth knowing before you press it: the token needs the schema.bases:write scope, and Airtable’s API adds one column per request with no way to delete one afterwards. If a column fails part-way, the ones already added stay, and the message says exactly which landed.
Once linked, names stop mattering
Matching by name is only the starting point. When you press Create missing columns, each question is bound to its column’s field ID — the one handle an Airtable column has that never changes. After that you can rename the question here, or rename the column in Airtable, and answers keep arriving in the right place.
Save the form afterwards. The link is stored on the form, and closing the settings without saving loses it.
Question labels must match your column names
This is the one thing to get right, and it is the failure a correct token still hits. Airtable addresses columns by name, and it refuses an entire record when a single field name is unknown — so a form asking “Full name” against a table with a “Name” column would lose every answer in the row, not just that one.
Rather than let that happen, an answer whose label matches no column is left out and named in the delivery log; the rest of the row lands as normal. Check connection lists the table’s real column names so the mismatch is visible before a respondent ever fills the form in. Capitalisation, punctuation and trailing spaces all count.
Two things that never arrive
- Uploaded files. They exist in a response as base64 data, and an Airtable attachment needs a public URL. The file stays on the response and in the CSV export.
- Multi-select values, as an array. A checkbox question arrives as one comma-separated string, because a real array is rejected by a text column and a rejection costs the whole row.
What gets written, and when
One row per submission, written the moment it arrives, with each answer in the column named after its question. Delivery is attempted once with a five-second timeout and there are no retries — Airtable is a destination, not the record. Every response is stored in your dashboard first, so a base that is unreachable, rate-limited or misconfigured cannot cost you an answer.
Values are sent with Airtable’s typecast option on, which lets it match a single-select option or parse a date from the text we send instead of refusing it for being the wrong type.
Why is my Airtable row not appearing?
| What you see | What to do |
|---|---|
| A row arrives, but a column is empty | That question’s label does not match the column name. Press Check connection to list the real names. |
| Unknown field name (422) | A column was renamed or deleted after setup. Re-check the connection; the column list is cached for five minutes. |
| Invalid token (401) | Create a new personal access token — Airtable shows one only at creation — and paste it again. |
| Not authorised (403) | The token is real but lacks data.records:write, or this base was never added to its Access list. |
| Not found (404) | Wrong base or table ID, or the two are the wrong way round. The base starts app, the table tbl. |
| Rate limited (429) | Airtable allows five requests a second per base and the row was not delivered. A busy form may need its own base. |
| Nothing at all | Check the form is on a paid plan — connected apps are skipped on free, while everything else about the submission carries on as normal. |
Common questions
- Why is one of my columns always empty?
- The question label and the column name do not match exactly. Airtable addresses columns by name, and it rejects an entire record if one field name is unknown — so an answer with no column of its name is skipped rather than sent, and the rest of the row still lands. Press Check connection in the destination settings: it lists the table’s real column names so you can see which one differs. Capitalisation and trailing spaces count.
- What token do I need, and what can it do?
- A personal access token with data.records:write on the base you are writing to. Add schema.bases:read as well and the Check connection button can read your column names back, which is the difference between a useful test and one that only says "connected". Add schema.bases:write and the Create missing columns button can build the table to fit the form. The token is created at airtable.com/create/tokens and shown once.
- Where do I find the base ID and table ID?
- Both are in the base’s API URL: the base starts with app and the table with tbl. Open your base, then Help → API documentation, and the URL reads airtable.com/appXXXX/tblYYYY. Pasting them the wrong way round is common enough that the connection check tells you when an ID does not start with the prefix it should.
- Do I have to create the Airtable columns by hand?
- No. Press Create missing columns in the destination settings and every question with no column gets one, named after the question and typed to match — Email for an email question, Number for a number, rating or slider, Single select for a dropdown or radio group with its options already filled in, Multiple selects for checkboxes, Date for a date, and text for everything else. The token needs the schema.bases:write scope, which is not one of the delivery scopes. It only runs when you press it: delivery never alters your base on its own, because a respondent submitting a form should not be able to change your schema.
- Can I rename a question, or an Airtable column, without breaking delivery?
- Yes, once you have pressed Create missing columns. That records each question against its column’s Airtable field ID, which is the one handle a column has that survives a rename — so you can rename the question in Seagit, or the column in Airtable, and answers keep landing in the same place. Before that link exists, matching is on the name alone, and renaming either side breaks it: the answer is dropped rather than sent, because Airtable rejects the whole record over one unknown field name. Save the form after pressing the button, or the link is lost when the modal closes.
- Two of my questions have the same name. What happens?
- They get two separate columns — the second is numbered, so "Short Text" and "Short Text 2" — and each question stays bound to its own. The form editor names a new field after its type, so a form with two short-text questions really does start with two questions called "Short Text"; sharing one column would mean the second answer overwrote the first on every submission.
- Do file uploads arrive in Airtable?
- No. A file lives inside a Seagit response as a base64 data URI, and an Airtable attachment column needs a publicly fetchable URL, so there is nothing to hand it. File answers are skipped and named in the delivery log rather than written as a 200 KB string into a text cell. The file is still on the response in your dashboard and in the CSV export.
- What happens to a checkbox question with several answers?
- It arrives as one comma-separated value — "Ham, Egg" — rather than as separate options. A real array is valid for a multiple-select column and rejected by a text one, and being rejected loses the whole row, so the safe shape wins. If you need true multi-select values, a webhook gives you the raw array to post yourself.
- Can I send to Airtable and somewhere else at once?
- Yes. Destinations are independent and delivered in parallel, and one failing never affects another or the submission itself. Every response is stored in your dashboard regardless.