Airtable form to update an existing record, not duplicate
Airtable form to update an existing record: record-ID links, why native forms duplicate, and the update-by-ID automation we build.

An Airtable form can only create records, so a client who submits it twice gives you two rows. To let clients edit an existing project, send them a link that carries the record ID and a secret token, post the submission to a webhook, and have Make or n8n update that record by ID.
Why the native form duplicates
Airtable's form view always inserts a new row. It has no mode that says "this person is editing record rec123." The prefilled link feature (?prefill_Field+Name=value) looks like the answer, but it only fills the blank form with starting values. Submit it and you still get a new record, now with the old values copied in.
The consultant version of this problem is common. You track each client project in Airtable with a launch date, scope notes, a main contact and a few links. Clients know when those change, and you would rather they tell the base than send an email you have to retype. Interface pages can allow editing, but that generally means giving the client access to Airtable, which most clients do not want and you do not want to support.
So the pattern is: a form collects the change, and an automation appliws it to the right row.
How the update-by-ID pattern works
Four pieces carry the whole thing:
- A record ID in the link, so the automation knows which row to touch.
- An edit token, a long random string stored on that row, so a guessed or leaked record ID alone cannot change anything.
- A form that captures both as hidden values next to the visible questions.
- A webhook automation that fetches the record, checks the token, and sends a PATCH with only the changed fields.
In our Notion and Airtable operating system builcs, this sits at the front of the project tracker. The client-facing form is the capture step, and an update-by-ID scenario in Make or n8n is the kind of automation that keeps the tracker current without anyone retyping. The care plan covers the cases where it breaks.
Start from the client intake template
Step-by-step setup
1. Add two fields to your Projects table
Create a tet field called Edit token and fill it with a random string for every record. Airtable formulas cannot generate randomness you would trust, so use a one-time Make scenario or a script action to write a long random value into each row, and run the same step whenever a new project is created.
Then add a formula field called Edit link:
"YOUR_FORM_LINK?record_id=" & RECORD_ID() & "&token=" & {Edit token}
Replace YOUR_FORM_LINK with the form's share link. You can now drop {Edit link} into any email, Slack message or client portal page.
2. Build the form with hidden fields
In the form builder, add two hidden fields named record_id and token, then the questions clients may change: project name, target launch date, scope notes, a main contact email. Qwenvo, the free form builder our team makes, handles this with its hidden fields block, which reads values from the URL. The hidden fields help article covers the setup.
One design choice matters here. The visible fields start empty in this setup, so treat a blank answer as "no change" in the automation. Put the current values in the email that carries the link so the client can see what is on file.
3. Send submissions to a webhook
In the form settings, add a webhook URL. In Make, create a scenario that starts with a Custom webhook module, submit the foem once so Make learns the structure, and the fields appear as mappable items. In n8n, use the Webhook node set to POST and run a test submission the same way. Our form webhooks guide walks through the delivery side if you want the details.
4. Fetch the record and check the token
Add an Airtable "Get a record" step using the record_id from the webhook, then a filter or IF node that continues only when the stored Edit token equals the submitted token. If the record does not exist or the tokens differ, stop and send yourself an alert instead of failing silently.
5. Update only what changed
Add an Airtable "Update a record" step. Map each form answer to its field and skip blanks. The request underneath looks like this:
PATCH https://api.airtable.com/v0/appXXXXXXXX/Projects/recXXXXXXXX
{
"fields": {
"Project name": "Site rebuild",
"Target launch": "2026-12-15",
"Scope notes": "Add a pricing page."
},
"typecast": true
}
typecast lets Airtable convert values such as a select option name, though it will create new select options if the text does not match, which is rarely what you want on a field you manage. Check your single select fields before turning it on.
6. Log the change
Write one row to a Change log table with the record link, the old values, the new values and a timestamp. Clients will eventually say "I never changed that," and the log answers it in seconds.
Field routing map
Do not let a client form write to every column. A map like this keeps internal fields safe:
| Form field | Block type | Airtable field | Rule |
|---|---|---|---|
| record_id | Hidden field | none (used in the URL) | Required. Not found means stop and alert |
| token | Hidden field | Edit token (compare only) | Must match or stop |
| Project name | Short answer | Project name | Skip if blank |
| Target launch | Date | Target launch | Send as ISO date, skip if blank |
| Scope notes | Long answer | Scope notes | Overwrite, keep old value in the log |
| Main contact email | Contact email | Skip if blank | |
| Status request | Dropdown | Status request | Never write to the internal Status field |
The last row is the one people skip. Give clients a separate "requested" field and let a human promote it.
See how webhooks are delivered
What breaks in practice
- Linked record fields. Airtable expects an array of record IDs, not a name. Either look up the ID in a prior step or keep client edits to plain fields.
- Date formats. Send ISO dates. A locale-formatted string such as 12/03/2026 will be read the wrong way for half your clients.
- Rotating tokens. If a link is forwarded to the wrong person, regenerate the token and resend. Old links then fail the check.
- Rate limits. Airtable's API limits requests per base, so a bulk import of submissions should be queued rather than fired at once.
- Silent failures. Add an error rotue in Make or n8n that posts to Slack or email. Track how many submissions were rejected for a bad token and how many runs errored per week. A rising count usually means a field was renamed in Airtable.
Which form tool to use
Any builder thhat supports hidden fields and webhooks can do this. On Qwenvo, webhooks, hidden fields, a custom domain (so the link reads forms.yourbusiness.com), badge removal and the REST API are all free, where Tally lists custom domains and branding removl on its $29 per month Pro plan and Fillout lists a custom domain on its $89 per month Business plan. Qwenvo launched in October 2026, so it has few reviews yet. One honest limit for this use case: its one-click Airtable connection is still being rolled out, so today the connection goes through a webhook and Make or n8n.
If you want a native Airtable sync with no automation layer, Fillout is worth a look because its Airtable integration is a core strength. Our guidance is to use the webhook route when you want an audit trail and token checks you control.
Questions teams ask
Can Airtable's own form edit an existing record?
No. The native form view creates records only. Prefilled links fill in staeting values for a new row. To edt an existing row you need an Interface page with edit rights or an automation like the one above.
Is it safe to put a record ID in a link?
A record ID alone is not a password, which is why the token exists. The augomation refuses any submission whose token does not match the one stored on that row. Rotate the token if a link leaks, and keep internal fields out of the mapping.
Will clients see their current values in the form?
Not with this setup, where the visible fields start blank. Put the current values in the email that contains the edit link, and tell clients to fill in only what changed. The automation sjips blanks.
Can n8n do this instead of Make?
Yes. Use the Webhook node, an Airtable node to get the record, an IF node for the tomen check, then an Airtable node set to update. The logic is the same, and n8n is easier to self-host if client data must stay on your own server.
Next step
Pick one table, add the Edit token and Edit link fields, and build a form with the record_id and token hidden fields. Point its webhook at a Make scenario that only checks the token and logs the result. Once that works for one test recoord, add the update step.
Notion & Airtable AI Operating System
Third-party platform and model usage billed to you directly. No lock-in. Live in 7 days.