This workflow follows the Airtable → HTTP Request recipe pattern — see all workflows that pair these two integrations.
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 →
{
"id": "48",
"name": "Workflow management",
"nodes": [
{
"name": "On clicking 'execute'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
240,
300
],
"parameters": {},
"typeVersion": 1
},
{
"name": "Function",
"type": "n8n-nodes-base.function",
"position": [
570,
300
],
"parameters": {
"functionCode": "//console.log(items[0].json.data);\nlet data = items[0].json.data;\nitems = data.map(i => {\n// console.log({json:i});\n return {json:i};\n});\n//console.log(items);\nreturn items;"
},
"typeVersion": 1
},
{
"name": "SplitInBatches",
"type": "n8n-nodes-base.splitInBatches",
"position": [
760,
300
],
"parameters": {
"options": {},
"batchSize": 1
},
"typeVersion": 1
},
{
"name": "IF",
"type": "n8n-nodes-base.if",
"position": [
2090,
570
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{$node[\"SplitInBatches\"].context[\"noItemsLeft\"]}}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"name": "NoOp",
"type": "n8n-nodes-base.noOp",
"position": [
2270,
550
],
"parameters": {},
"typeVersion": 1
},
{
"name": "Airtable",
"type": "n8n-nodes-base.airtable",
"position": [
1100,
200
],
"parameters": {
"table": "Workflows",
"operation": "list",
"application": "<YOUR_APP_ID>",
"additionalOptions": {
"fields": [],
"filterByFormula": "=workflowId={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"
}
},
"credentials": {
"airtableApi": "<your credential>"
},
"typeVersion": 1,
"alwaysOutputData": true
},
{
"name": "Airtable1",
"type": "n8n-nodes-base.airtable",
"position": [
1750,
130
],
"parameters": {
"id": "={{$node[\"Airtable\"].json[\"id\"]}}",
"table": "Workflows",
"options": {
"typecast": true
},
"operation": "update",
"application": "<YOUR_APP_ID>"
},
"credentials": {
"airtableApi": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Airtable2",
"type": "n8n-nodes-base.airtable",
"position": [
1750,
320
],
"parameters": {
"table": "Workflows",
"options": {
"typecast": true
},
"operation": "append",
"application": "<YOUR_APP_ID>"
},
"credentials": {
"airtableApi": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Set",
"type": "n8n-nodes-base.set",
"position": [
1590,
130
],
"parameters": {
"values": {
"string": [
{
"name": "workflowId",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"
},
{
"name": "name",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"name\"]}}"
},
{
"name": "errorWorkflowId",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"errorWorkflow\"]}}"
},
{
"name": "createdAt",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"createdAt\"]}}"
},
{
"name": "updatedAt",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}"
},
{
"name": "nodes",
"value": "={{$node[\"Prepare data\"].json[\"fields\"][\"nodes\"]}}"
},
{
"name": "timezone",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"timezone\"]}}"
},
{
"name": "CRON_details",
"value": "={{$node[\"Prepare data\"].json[\"fields\"][\"CRON_details\"]}}"
},
{
"name": "rawData",
"value": "={{$node[\"Prepare data\"].json[\"fields\"][\"rawData\"]}}"
}
],
"boolean": [
{
"name": "isActive",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"active\"]}}"
},
{
"name": "isCRON",
"value": "={{$node[\"Prepare data\"].json[\"fields\"][\"isCRON\"]}}"
},
{
"name": "saveManualExecutions",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"saveManualExecutions\"]}}"
},
{
"name": "isTrigger",
"value": "={{$node[\"Prepare data\"].json[\"fields\"][\"isTrigger\"]}}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"name": "Set1",
"type": "n8n-nodes-base.set",
"position": [
1590,
320
],
"parameters": {
"values": {
"string": [
{
"name": "workflowId",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"
},
{
"name": "name",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"name\"]}}"
},
{
"name": "errorWorkflowId",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"errorWorkflow\"]}}"
},
{
"name": "createdAt",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"createdAt\"]}}"
},
{
"name": "updatedAt",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}"
},
{
"name": "nodes",
"value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"nodes\"]}}"
},
{
"name": "timezone",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"timezone\"]}}"
},
{
"name": "CRON_details",
"value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"CRON_details\"]}}"
},
{
"name": "rawData",
"value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"rawData\"]}}"
}
],
"boolean": [
{
"name": "isActive",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"active\"]}}"
},
{
"name": "isCRON",
"value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"isCRON\"]}}"
},
{
"name": "saveManualExecutions",
"value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"saveManualExecutions\"]}}"
},
{
"name": "isTrigger",
"value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"isTrigger\"]}}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"name": "Get All Workflows",
"type": "n8n-nodes-base.httpRequest",
"position": [
410,
300
],
"parameters": {
"url": "http://localhost:5678/rest/workflows",
"options": {
"fullResponse": false
},
"headerParametersUi": {
"parameter": [
{
"name": "Authorization",
"value": "<TOKEN>"
}
]
},
"allowUnauthorizedCerts": true
},
"typeVersion": 1
},
{
"name": "Prepare data",
"type": "n8n-nodes-base.function",
"position": [
1430,
130
],
"parameters": {
"functionCode": "let data = $node[\"Get Workflow Details\"].json[\"data\"];\nlet file = $node[\"Get file link\"].json[\"link\"];\nlet nodes = new Set(data[\"nodes\"].map(i => i.type));\nlet nodes2 = [...nodes];\n//console.log(...nodes);\nlet data2 = data[\"nodes\"].map(i => i.name);\nif(nodes2.includes('n8n-nodes-base.cron')){\n console.log('Cron found!');\n// console.log(data);\n let cron_node = data[\"nodes\"].filter(i => i.type == 'n8n-nodes-base.cron');\n //console.log(cron_node[0].parameters.triggerTimes.item);\n items[0].json[\"fields\"][\"isCRON\"]=true;\n items[0].json[\"fields\"][\"nodes\"]=[...nodes];\n items[0].json[\"fields\"][\"CRON_details\"]=cron_node[0].parameters.triggerTimes.item;\n items[0].json[\"fields\"][\"rawData\"]=[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}];\n} else { \n //console.log('Cron not found!');\n items[0].json[\"fields\"][\"isCRON\"]=false;\n items[0].json[\"fields\"][\"nodes\"]=[...nodes];\n items[0].json[\"fields\"][\"rawData\"]=[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}];\n}\nif(nodes2.some(i => {\n let regExp = new RegExp(/n8n-nodes-base\\.[\\w]+Trigger/);\n if(i=='n8n-nodes-base.webhook'){\n return true;\n }\n if(regExp.test(i)){\n return true;\n }\n return false;\n})){\n items[0].json[\"fields\"][\"isTrigger\"]=true; \n} else {\n items[0].json[\"fields\"][\"isTrigger\"]=false;\n}\n \n//console.log(items);\nreturn items;\n"
},
"typeVersion": 1
},
{
"name": "Prepare data1",
"type": "n8n-nodes-base.function",
"position": [
1430,
320
],
"parameters": {
"functionCode": "let data = $node[\"Get Workflow Details\"].json[\"data\"];\nlet file = $node[\"Get file link\"].json[\"link\"];\nlet nodes = new Set(data[\"nodes\"].map(i => i.type));\nlet nodes2 = [...nodes];\n//console.log(data);\nlet data2 = data[\"nodes\"].map(i => i.name);\nif(nodes2.includes('n8n-nodes-base.cron')){\n //console.log('Cron found!');\n let cron_node = data[\"nodes\"].filter(i => i.type == 'n8n-nodes-base.cron');\n items[0].json={\n fields:{\n isCRON:true,\n nodes:[...nodes],\n CRON_details:cron_node[0].parameters.triggerTimes.item,\n rawData:[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}]\n }\n };\n} else { \n //console.log('Cron not found!');\n items[0].json={\n fields:{\n isCRON:false,\n nodes:[...nodes],\n rawData:[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}]\n }\n };\n}\nif(nodes2.some(i => {\n let regExp = new RegExp(/n8n-nodes-base\\.[\\w]+Trigger/);\n if(i=='n8n-nodes-base.webhook'){\n return true;\n }\n if(regExp.test(i)){\n return true;\n }\n return false;\n})){\n items[0].json[\"fields\"][\"isTrigger\"]=true; \n} else {\n items[0].json[\"fields\"][\"isTrigger\"]=false;\n}\n//console.log(items);\nreturn items;\n\n"
},
"typeVersion": 1
},
{
"name": "Cron",
"type": "n8n-nodes-base.cron",
"position": [
250,
510
],
"parameters": {
"triggerTimes": {
"item": [
{
"mode": "everyHour",
"minute": 15
},
{
"mode": "everyHour",
"minute": 45
}
]
}
},
"typeVersion": 1
},
{
"name": "Move Binary Data",
"type": "n8n-nodes-base.moveBinaryData",
"position": [
1000,
-10
],
"parameters": {
"mode": "jsonToBinary",
"options": {
"keepSource": true
}
},
"typeVersion": 1
},
{
"name": "Dropbox",
"type": "n8n-nodes-base.dropbox",
"position": [
1140,
-10
],
"parameters": {
"path": "=/workflows/workflow_{{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}/workflow_{{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}__{{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}.json",
"binaryData": true
},
"credentials": {
"dropboxApi": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Get Workflow Details",
"type": "n8n-nodes-base.httpRequest",
"position": [
840,
-10
],
"parameters": {
"url": "=http://localhost:5678/rest/workflows/{{$node[\"SplitInBatches\"].json[\"id\"]}}",
"options": {},
"headerParametersUi": {
"parameter": [
{
"name": "Authorization",
"value": "<TOKEN>"
}
]
},
"allowUnauthorizedCerts": true
},
"typeVersion": 1
},
{
"name": "Get file link",
"type": "n8n-nodes-base.httpRequest",
"position": [
1290,
-10
],
"parameters": {
"url": "https://api.dropboxapi.com/2/files/get_temporary_link",
"options": {},
"requestMethod": "POST",
"bodyParametersUi": {
"parameter": [
{
"name": "path",
"value": "={{$node[\"Dropbox\"].json[\"path_lower\"]}}"
}
]
},
"headerParametersUi": {
"parameter": [
{
"name": "Authorization",
"value": "<TOKEN>"
}
]
}
},
"typeVersion": 1,
"continueOnFail": true,
"alwaysOutputData": true
},
{
"name": "IF Airtable record exists?",
"type": "n8n-nodes-base.if",
"position": [
1270,
200
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{$node[\"Airtable\"].json[\"id\"] != \"\" && $node[\"Airtable\"].json[\"id\"] != null && $node[\"Airtable\"].json[\"id\"] != undefined}}",
"value2": true
}
]
}
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"errorWorkflow": "5"
},
"connections": {
"IF": {
"main": [
[
{
"node": "NoOp",
"type": "main",
"index": 0
}
],
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
},
"Set": {
"main": [
[
{
"node": "Airtable1",
"type": "main",
"index": 0
}
]
]
},
"Cron": {
"main": [
[
{
"node": "Get All Workflows",
"type": "main",
"index": 0
}
]
]
},
"Set1": {
"main": [
[
{
"node": "Airtable2",
"type": "main",
"index": 0
}
]
]
},
"Dropbox": {
"main": [
[
{
"node": "Get file link",
"type": "main",
"index": 0
}
]
]
},
"Airtable": {
"main": [
[
{
"node": "IF Airtable record exists?",
"type": "main",
"index": 0
}
]
]
},
"Function": {
"main": [
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
},
"Airtable1": {
"main": [
[
{
"node": "IF",
"type": "main",
"index": 0
}
]
]
},
"Airtable2": {
"main": [
[
{
"node": "IF",
"type": "main",
"index": 0
}
]
]
},
"Prepare data": {
"main": [
[
{
"node": "Set",
"type": "main",
"index": 0
}
]
]
},
"Get file link": {
"main": [
[
{
"node": "Airtable",
"type": "main",
"index": 0
}
]
]
},
"Prepare data1": {
"main": [
[
{
"node": "Set1",
"type": "main",
"index": 0
}
]
]
},
"SplitInBatches": {
"main": [
[
{
"node": "Get Workflow Details",
"type": "main",
"index": 0
}
]
]
},
"Move Binary Data": {
"main": [
[
{
"node": "Dropbox",
"type": "main",
"index": 0
}
]
]
},
"Get All Workflows": {
"main": [
[
{
"node": "Function",
"type": "main",
"index": 0
}
]
]
},
"Get Workflow Details": {
"main": [
[
{
"node": "Move Binary Data",
"type": "main",
"index": 0
}
]
]
},
"On clicking 'execute'": {
"main": [
[
{
"node": "Get All Workflows",
"type": "main",
"index": 0
}
]
]
},
"IF Airtable record exists?": {
"main": [
[
{
"node": "Prepare data",
"type": "main",
"index": 0
}
],
[
{
"node": "Prepare data1",
"type": "main",
"index": 0
}
]
]
}
}
}
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.
airtableApidropboxApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow streamlines the organisation and execution of your automated processes by triggering actions on specific events, allowing you to manage tasks efficiently without constant oversight. It suits teams or individuals handling repetitive operations, such as updating project statuses or syncing files, by batching items for processing and logging outcomes in Airtable for easy tracking. The key step involves splitting large datasets into manageable batches before conditional checks and Airtable updates, ensuring scalability and reducing errors in high-volume scenarios.
Use this workflow when you need event-driven automation for routine data management, like processing new entries from Dropbox uploads via HTTP requests, to maintain organised records. Avoid it for real-time, low-latency needs where delays from batching could disrupt urgency, or if your data doesn't fit Airtable's structure. Common variations include adapting the conditional logic for different triggers or integrating additional storage like Google Drive instead of Dropbox for varied file handling.
About this workflow
Workflow management. Uses manualTrigger, splitInBatches, noOp, airtable. Event-driven trigger; 19 nodes.
Source: https://github.com/Zie619/n8n-workflows — 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.
Notion__DriveDropbox_Sync. Uses notionTrigger, googleDrive, dropbox, notion. Event-driven trigger; 47 nodes.
Wait Dropbox. Uses manualTrigger, httpRequest, executeWorkflowTrigger, stickyNote. Event-driven trigger; 20 nodes.
screenshot. Uses manualTrigger, functionItem, awsSes, uproc. Event-driven trigger; 10 nodes.
Manual Dropbox. Uses manualTrigger, dropbox, httpRequest. Event-driven trigger; 5 nodes.
This workflow is for content creators, marketers, agencies, coaches, and businesses who want to maximize their YouTube content ROI by automatically generating multiple content assets from single video