n8n community node that triggers workflows instantly when Airtable records change — using real Airtable webhooks, not polling.
Originally forked from @vwork-digital/n8n-nodes-instant-airtable-trigger, fully rewritten by D1DX.
- Activate a workflow with this trigger — registers an Airtable webhook on your base
- Airtable sends a notification ping to n8n on every matching change
- The node fetches the webhook payloads with cursor-based pagination
- Payloads are parsed into flat per-record items with field names resolved
- Deactivate the workflow — webhook is automatically deleted
Important: Airtable webhooks expire every 7 days. Use a separate scheduled workflow to refresh them.
- Go to Settings > Community Nodes in your n8n instance
- Click Install a community node
- Enter
@d1dx/n8n-nodes-airtable - Click Install
Or via CLI:
cd ~/.n8n
npm install @d1dx/n8n-nodes-airtable
# Restart n8nAll field names map directly to the Airtable Webhooks API specification.
| Field | Airtable API | Description |
|---|---|---|
| Base | — | Dropdown of all bases (via meta API) |
| Table | — | Dropdown of tables in selected base |
| View | recordChangeScope |
Scope to a specific view. "Add" = entered view, "Remove" = left view. Form/List views not supported. Leave empty for entire table. |
| Change Types | changeTypes |
Add / Update / Remove. Leave empty = all. Sent server-side to Airtable. |
| Field | Airtable API | Description |
|---|---|---|
| Fields to Watch | watchDataInFieldIds |
Only trigger on changes to these fields. Leave empty = all fields. Warning: webhook permanently stops if a listed field is deleted. |
| Include Previous Values | includePreviousCellValues |
Include the previous value alongside current for changed fields. |
| Field | Airtable API | Description |
|---|---|---|
| Fields to Include in Output | includeCellValuesInFieldIds |
Always include these field values, even if unchanged. Select "All fields" to send "all" to API. Safe if a listed field is deleted. |
| Use Field Names | — | Resolve field IDs (e.g. fldABC123) to human names (e.g. Status) in output. |
| Field | Airtable API | Description |
|---|---|---|
| Data Types | dataTypes |
tableData (default), tableFields, tableMetadata. Can combine multiple. |
| From Sources | fromSources |
Filter by source: client, publicApi, automation, formSubmission, formPageSubmission, sync, system, anonymousUser, unknown. Empty = all. |
| Form Submission View ID | sourceOptions.formSubmission.viewId |
Filter form submissions to a specific form view. Only relevant when "Form Submission" is in From Sources. |
| Form Page Submission Page ID | sourceOptions.formPageSubmission.pageId |
Filter interface page submissions to a specific page. Only relevant when "Form Page Submission" is in From Sources. |
| Watch Field Schema Changes | watchSchemasOfFieldIds |
Only trigger on schema changes for these fields. Requires tableFields data type. Warning: webhook stops if field is deleted. |
| Include Previous Field Definitions | includePreviousFieldDefinitions |
Include previous field name/type in field change payloads. Requires tableFields data type. |
You need an Airtable Personal Access Token (PAT):
- Go to airtable.com/create/tokens
- Create a token with these scopes:
webhook:manage— register and delete webhooksdata.records:read— read webhook payloadsschema.bases:read— populate base/table/view/field dropdowns
- Grant access to the bases you want to watch
- In n8n, create an "Airtable API" credential and paste the token
One item per event. All items include eventType, recordId, tableId, source, changedBy, timestamp.
Created:
{
"eventType": "created",
"recordId": "recXXXXXXXXXXXXXX",
"tableId": "tblXXXXXXXXXXXXXX",
"viewId": "viwXXXXXXXXXXXXXX",
"createdTime": "2026-04-05T12:00:00.000Z",
"fields": { "Status": "New", "Name": "Example" },
"source": "client",
"changedBy": { "userId": "usrXXXX", "userName": "John", "userEmail": "john@example.com" },
"timestamp": "2026-04-05T12:00:00.000Z"
}Updated:
{
"eventType": "updated",
"recordId": "recXXXXXXXXXXXXXX",
"tableId": "tblXXXXXXXXXXXXXX",
"changedFields": ["Status"],
"current": { "Status": "Done" },
"previous": { "Status": "Active" },
"unchanged": { "Name": "Example" },
"source": "client",
"changedBy": { "userId": "usrXXXX", "userName": "John", "userEmail": "john@example.com" },
"timestamp": "2026-04-05T12:00:00.000Z"
}Deleted:
{
"eventType": "deleted",
"recordId": "recXXXXXXXXXXXXXX",
"tableId": "tblXXXXXXXXXXXXXX",
"source": "client",
"timestamp": "2026-04-05T12:00:00.000Z"
}| eventType | Key fields |
|---|---|
fieldCreated |
fieldId, name, type |
fieldChanged |
fieldId, current, previous |
fieldDeleted |
fieldId |
| eventType | Key fields |
|---|---|
metadataChanged |
current (name, description), previous |
| eventType | Key fields |
|---|---|
error |
code: INVALID_FILTERS, INVALID_HOOK, or INTERNAL_ERROR |
- View-scoped payloads have different structure. When
recordChangeScopeis a view, Airtable nests records insidechangedViewsByIdinstead of directly on the table. The node handles this transparently. - 10 webhooks per base. Each active workflow uses one webhook. Plan accordingly.
- Webhooks expire in 7 days. Refresh them or they stop silently.
- Field deletion kills the webhook. If a field in
watchDataInFieldIdsorwatchSchemasOfFieldIdsis deleted, the webhook enters a permanent error state. Must deactivate and reactivate. Exception:includeCellValuesInFieldIdsis safe — deleted fields are silently ignored. - Creator permissions required. The PAT owner must have Creator access to register webhooks.
- Community node updates require n8n restart. n8n loads node code at startup, not dynamically.
Originally created by Jacob Vendramin at vwork Digital as @vwork-digital/n8n-nodes-instant-airtable-trigger (MIT license). Forked and rewritten by D1DX.
MIT — see LICENSE.md