{ "id": "48", "name": "Workflow management", "nodes": [ { "name": "On clicking 'execute'", "type": "n8n-nodes-base.manualTrigger", "position": [ 240, 300 ], "parameters": {}, "typeVersion": 1, "id": "node-1e39f4b1" }, { "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, "id": "node-417ecd6b" }, { "name": "SplitInBatches", "type": "n8n-nodes-base.splitInBatches", "position": [ 760, 300 ], "parameters": { "options": {}, "batchSize": 1 }, "typeVersion": 1, "id": "node-c96bfac7" }, { "name": "IF", "type": "n8n-nodes-base.if", "position": [ 2090, 570 ], "parameters": { "conditions": { "boolean": [ { "value1": "={{$node[\"SplitInBatches\"].context[\"noItemsLeft\"]}}", "value2": true } ] } }, "typeVersion": 1, "id": "node-29788593" }, { "name": "NoOp", "type": "n8n-nodes-base.noOp", "position": [ 2270, 550 ], "parameters": {}, "typeVersion": 1, "id": "node-44b2d6e0" }, { "name": "Airtable", "type": "n8n-nodes-base.airtable", "position": [ 1100, 200 ], "parameters": { "table": "Workflows", "operation": "list", "application": "", "additionalOptions": { "fields": [], "filterByFormula": "=workflowId={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}" } }, "credentials": { "airtableApi": "n8n management demo" }, "typeVersion": 1, "alwaysOutputData": true, "id": "node-46b15162" }, { "name": "Airtable1", "type": "n8n-nodes-base.airtable", "position": [ 1750, 130 ], "parameters": { "id": "={{$node[\"Airtable\"].json[\"id\"]}}", "table": "Workflows", "options": { "typecast": true }, "operation": "update", "application": "" }, "credentials": { "airtableApi": "n8n management demo" }, "typeVersion": 1, "id": "node-96251166" }, { "name": "Airtable2", "type": "n8n-nodes-base.airtable", "position": [ 1750, 320 ], "parameters": { "table": "Workflows", "options": { "typecast": true }, "operation": "append", "application": "" }, "credentials": { "airtableApi": "n8n management demo" }, "typeVersion": 1, "id": "node-61b6ce15" }, { "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, "id": "node-1ab7ec7d" }, { "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, "id": "node-a989fc39" }, { "name": "Get All Workflows", "type": "n8n-nodes-base.httpRequest", "position": [ 410, 300 ], "parameters": { "url": "{{ $env.BASE_URL }}", "options": { "fullResponse": false }, "headerParametersUi": { "parameter": [ { "name": "Authorization", "value": "" } ] }, "allowUnauthorizedCerts": true }, "typeVersion": 1, "id": "node-0d024bf6" }, { "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, "id": "node-4bfb64cd" }, { "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, "id": "node-d1945cb6" }, { "name": "Cron", "type": "n8n-nodes-base.cron", "position": [ 250, 510 ], "parameters": { "triggerTimes": { "item": [ { "mode": "everyHour", "minute": 15 }, { "mode": "everyHour", "minute": 45 } ] } }, "typeVersion": 1, "id": "node-f99f4930" }, { "name": "Move Binary Data", "type": "n8n-nodes-base.moveBinaryData", "position": [ 1000, -10 ], "parameters": { "mode": "jsonToBinary", "options": { "keepSource": true } }, "typeVersion": 1, "id": "node-8221fcc4" }, { "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": "My n8n backups" }, "typeVersion": 1, "id": "node-369d07de" }, { "name": "Get Workflow Details", "type": "n8n-nodes-base.httpRequest", "position": [ 840, -10 ], "parameters": { "url": "{{ $env.BASE_URL }}", "options": {}, "headerParametersUi": { "parameter": [ { "name": "Authorization", "value": "" } ] }, "allowUnauthorizedCerts": true }, "typeVersion": 1, "id": "node-05299dcd" }, { "name": "Get file link", "type": "n8n-nodes-base.httpRequest", "position": [ 1290, -10 ], "parameters": { "url": "{{ $env.BASE_URL }}", "options": {}, "requestMethod": "POST", "bodyParametersUi": { "parameter": [ { "name": "path", "value": "={{$node[\"Dropbox\"].json[\"path_lower\"]}}" } ] }, "headerParametersUi": { "parameter": [ { "name": "Authorization", "value": "" } ] } }, "typeVersion": 1, "continueOnFail": true, "alwaysOutputData": true, "id": "node-c0e50932" }, { "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, "id": "node-d119b76a" }, { "id": "error-b2edf571", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ 1000, 400 ], "parameters": { "message": "Workflow execution error", "options": {} } } ], "active": true, "settings": { "errorWorkflow": null, "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3 }, "connections": {}, "meta": { "instanceId": "workflow-cdbb3bdc", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:44.287530", "updatedAt": "2025-09-29T07:07:44.287569", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "description": "Production-ready workflow: Workflow management. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }