The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Update table",
"nodes": [
{
"parameters": {
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"authentication": "airtableTokenApi",
"baseId": {
"__rl": true,
"value": "appew9jlYGrM5OYtv",
"mode": "id"
},
"tableId": {
"__rl": true,
"value": "tblEfvAEJnuRjzKSR",
"mode": "id"
},
"triggerField": "updatedTime",
"additionalFields": {
"fields": ""
}
},
"type": "n8n-nodes-base.airtableTrigger",
"typeVersion": 1,
"position": [
-360,
140
],
"id": "fccbec4e-0112-4abc-ac5d-9e79e894b30b",
"name": "Airtable Trigger",
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "9db895c8-c5a4-4d3d-9ade-b57d06af7d14",
"name": "startTime",
"value": "={{ $json.fields.Time }}",
"type": "string"
},
{
"id": "161dbc05-afae-40fe-a111-1241e453f560",
"name": "tableId",
"value": "={{ $json.fields['Table ID'] }}",
"type": "string"
},
{
"id": "1161c6b8-a588-495a-bc8d-f2b27f5cf0f0",
"name": "date",
"value": "={{ $json.fields.Date }}",
"type": "string"
},
{
"id": "dd7c2494-a16f-4978-941e-34035e25831d",
"name": "resId",
"value": "={{ $json.fields[\"Res ID\"] }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-140,
140
],
"id": "1b6644b1-5754-4592-98ce-a4e4e433a39b",
"name": "Edit Fields"
},
{
"parameters": {
"jsCode": "const reservation = $input.first().json;\nconst startTime = reservation.startTime; \nconst tableId = reservation.tableId;\nconst date = reservation.date;\nconst resId = reservation.resId\n\n// Generate the 4 time slots that need to be updated\nfunction getNextSlot(time) {\n const [hours, minutes] = time.split(':').map(Number);\n const date = new Date();\n date.setHours(hours, minutes + 30);\n return `${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`;\n}\n\nlet timesToUpdate = [startTime];\nlet currentTime = startTime;\nfor(let i = 0; i < 3; i++) {\n currentTime = getNextSlot(currentTime);\n timesToUpdate.push(currentTime);\n}\n\n// Format records for Airtable update\nlet records = timesToUpdate.map(timeSlot => ({\n \"Date\": date,\n \"Time Slot\": timeSlot,\n \"Table ID\": tableId,\n \"Status\": \"Unavailable\",\n \"Reservation ID\": resId \n}));\n\n\n\n\nreturn records\n\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
80,
140
],
"id": "c4d4cdd0-84b8-4ce6-8420-29bd1958e07a",
"name": "generateRecords"
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
320,
140
],
"id": "ee997336-ce74-4c61-88e3-ae7f38454597",
"name": "Loop Over Items"
},
{
"parameters": {
"operation": "upsert",
"base": {
"__rl": true,
"value": "appew9jlYGrM5OYtv",
"mode": "list",
"cachedResultName": "Restaurant_Management",
"cachedResultUrl": "https://airtable.com/appew9jlYGrM5OYtv"
},
"table": {
"__rl": true,
"value": "tblAxvB06ZIIZMnUA",
"mode": "list",
"cachedResultName": "Table_Availability",
"cachedResultUrl": "https://airtable.com/appew9jlYGrM5OYtv/tblAxvB06ZIIZMnUA"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Date": "={{ $json.Date }}",
"Table ID": "={{ $json['Table ID'] }}",
"Time Slot": "={{ $json['Time Slot'] }}",
"Status": "={{ $json.Status }}",
"Reservation ID": "={{ $json['Reservation ID'] }}"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "string",
"readOnly": true
},
{
"id": "Date",
"displayName": "Date",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "Table ID",
"displayName": "Table ID",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "options",
"options": [
{
"name": "T1",
"value": "T1"
},
{
"name": "T3",
"value": "T3"
},
{
"name": "T5",
"value": "T5"
},
{
"name": "T2",
"value": "T2"
},
{
"name": "T4",
"value": "T4"
}
],
"readOnly": false,
"removed": false
},
{
"id": "Time Slot",
"displayName": "Time Slot",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "options",
"options": [
{
"name": "11:00",
"value": "11:00"
},
{
"name": "11:30",
"value": "11:30"
},
{
"name": "12:00",
"value": "12:00"
},
{
"name": "12:30",
"value": "12:30"
},
{
"name": "13:00",
"value": "13:00"
},
{
"name": "13:30",
"value": "13:30"
},
{
"name": "14:00",
"value": "14:00"
},
{
"name": "14:30",
"value": "14:30"
},
{
"name": "19:00",
"value": "19:00"
},
{
"name": "19:30",
"value": "19:30"
},
{
"name": "20:00",
"value": "20:00"
},
{
"name": "20:30",
"value": "20:30"
},
{
"name": "18:30",
"value": "18:30"
},
{
"name": "21:00",
"value": "21:00"
},
{
"name": "18:00",
"value": "18:00"
},
{
"name": "21:30",
"value": "21:30"
}
],
"readOnly": false,
"removed": false
},
{
"id": "Status",
"displayName": "Status",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "options",
"options": [
{
"name": "Unavailable",
"value": "Unavailable"
},
{
"name": "Available",
"value": "Available"
}
],
"readOnly": false,
"removed": false
},
{
"id": "Reservation ID",
"displayName": "Reservation ID",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "reservation",
"displayName": "reservation",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "array",
"readOnly": false,
"removed": false
},
{
"id": "table",
"displayName": "table",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "array",
"readOnly": false,
"removed": false
},
{
"id": "Table ID (from table)",
"displayName": "Table ID (from table)",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": true
},
{
"id": "Date (from reservation)",
"displayName": "Date (from reservation)",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": true
},
{
"id": "Time (from reservation)",
"displayName": "Time (from reservation)",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": true
},
{
"id": "Guests (from reservation)",
"displayName": "Guests (from reservation)",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": true
},
{
"id": "Reservations",
"displayName": "Reservations",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "array",
"readOnly": false,
"removed": false
},
{
"id": "Tables",
"displayName": "Tables",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "array",
"readOnly": false,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.airtable",
"typeVersion": 2.1,
"position": [
560,
160
],
"id": "83ac3c27-7a6a-47ad-825b-37d26cdccfe1",
"name": "Airtable1",
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Airtable Trigger": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "generateRecords",
"type": "main",
"index": 0
}
]
]
},
"generateRecords": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Airtable1",
"type": "main",
"index": 0
}
]
]
},
"Airtable1": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "f4e9d381-570e-480a-a643-2ed8e0c9ca29",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "uAxTPE3CPKCOprZs",
"tags": [
{
"createdAt": "2025-02-26T09:17:48.643Z",
"updatedAt": "2025-02-26T09:17:48.643Z",
"id": "2JZs1TZAuBnwITKy",
"name": "restaurant agent"
},
{
"createdAt": "2025-02-26T09:36:53.009Z",
"updatedAt": "2025-02-26T09:36:53.009Z",
"id": "3BEoUihyAzJ3cKsJ",
"name": "airtable"
}
]
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
airtableTokenApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Update table. Uses airtableTrigger, airtable. Event-driven trigger; 5 nodes.
Source: https://github.com/Ayushsinha2004/new_agent/blob/4f0adc05e2deeaabac2dcbe82940ddf4ca6a573c/n8n/Update_table.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
ContentCalendar. Uses airtableTrigger, lmChatOpenRouter, airtable, outputParserStructured. Event-driven trigger; 41 nodes.
This n8n workflow automates sales processes using AI agents integrated with Airtable as a CRM and Gmail for email handling. It consists of two main workflows: one for handling Airtable status changes
Instead of staring at a blank page, this workflow scrapes top-performing content, breaks down the psychological hooks, rewrites it for your specific audience, and drafts a custom text graphic. Once yo
CompetitorAnalysis. Uses perplexityTool, agent, lmChatOpenRouter, airtableTrigger. Event-driven trigger; 33 nodes.
This workflow automatically analyzes hotel guest reviews using OpenAI and updates the sentiment, summary, and confidence score directly in Airtable. It helps hospitality teams monitor guest satisfacti