{"nodes":[{"id":"0d911b91-bb9a-4177-8cd5-12ddddf1bc61","name":"When clicking ‘Test workflow’","type":"n8n-nodes-base.manualTrigger","position":[580,405],"parameters":{},"typeVersion":1,"notes":"This manualTrigger node performs automated tasks as part of the workflow."},{"id":"d13f78f7-4093-435f-8b38-722f4a5c7a1f","name":"Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[1020,405],"parameters":{"options":{}},"typeVersion":3,"notes":"This splitInBatches node performs automated tasks as part of the workflow."},{"id":"97d26220-a85f-4c40-b97c-b36f2d235776","name":"Webhook Callback Wait","type":"n8n-nodes-base.wait","position":[1720,445],"webhookId":"5cd058b4-48c8-449a-9c09-959a5b8a2b48","parameters":{"resume":"webhook","options":{},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":1.1,"notes":"This wait node performs automated tasks as part of the workflow."},{"id":"ee02d5cb-8151-4b24-a630-77a677b1434a","name":"Update finishedSet","type":"n8n-nodes-base.code","position":[1940,445],"parameters":{"jsCode":"let json = $('If All Finished').first().json;\nif (!json.finishedSet) json.finishedSet = [];\nlet finishedItemId = $('Webhook Callback Wait').item.json.body.finishedItemId;\nif (!json.finishedSet[finishedItemId]) json.finishedSet.push(finishedItemId);\nreturn [json];"},"typeVersion":2,"notes":"This code node performs automated tasks as part of the workflow."},{"id":"09f1cf3f-9e32-43f2-9e57-d7a33970dac4","name":"Initialize finishedSet","type":"n8n-nodes-base.set","position":[1240,285],"parameters":{"options":{},"assignments":{"assignments":[{"id":"193ab8f1-0e23-491c-914e-b8b26b0160f7","name":"finishedSet","type":"array","value":"[]"}]}},"executeOnce":true,"typeVersion":3.4,"notes":"This set node performs automated tasks as part of the workflow."},{"id":"105d8f64-8ade-4e02-8722-587a35f2b046","name":"Simulate Multi-Item for Parallel Processing","type":"n8n-nodes-base.code","position":[780,405],"parameters":{"jsCode":"return [\n  {requestId: 'req4567'},\n  {requestId: 'req8765'},\n  {requestId: 'req1234'}\n];"},"typeVersion":2,"notes":"This code node performs automated tasks as part of the workflow."},{"id":"c5f72fa0-693e-4134-910f-8fd0767861d1","name":"If All Finished","type":"n8n-nodes-base.if","position":[1460,285],"parameters":{"options":{},"conditions":{"options":{"version":1,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"385c3149-3623-4dd2-9022-770c32f82421","operator":{"type":"number","operation":"gte"},"leftValue":"={{ $json.finishedSet.length }}","rightValue":"={{ $('Simulate Multi-Item for Parallel Processing').all().length }}"}]}},"typeVersion":2,"notes":"This if node performs automated tasks as part of the workflow."},{"id":"20d16393-8573-4cc1-adc0-034f0f1def70","name":"Start Sub-Workflow via Webhook","type":"n8n-nodes-base.httpRequest","position":[1180,645],"parameters":{"url":"{{ $env.BASE_URL }}","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"requestItemId","value":"={{ $json.requestId }}"}]},"headerParameters":{"parameters":[{"name":"callbackurl","value":"={{ $execution.resumeUrl }}"}]}},"typeVersion":4.2,"notes":"This httpRequest node performs automated tasks as part of the workflow."},{"id":"4ad48520-39b3-4016-a6a9-dd789c079e08","name":"Acknowledge Finished","type":"n8n-nodes-base.respondToWebhook","position":[1780,665],"parameters":{"options":{}},"typeVersion":1.1,"notes":"This respondToWebhook node performs automated tasks as part of the workflow."},{"id":"ad1018a1-3b9d-4613-b23f-136763a514ba","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[720,605],"parameters":{"color":3,"width":390,"height":109,"content":"### Start Multiple Sub-Workflows Asynchronously\n* Note: Callback/Webhook \"internal\" Base-URL should be configured in the n8n instance to reference the k8s service name and internal port."},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"f4171d39-8bfe-4e3a-9b94-87d969abda2d","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[1740,365],"parameters":{"color":3,"width":283,"height":80,"content":"### Pseudo-Synchronously Wait for All Sub-Workflows to finish"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"98657cd3-968c-4d66-aea0-4e3180f8508f","name":"Continue Workflow (noop)","type":"n8n-nodes-base.noOp","position":[1780,205],"parameters":{},"typeVersion":1,"notes":"This noOp node performs automated tasks as part of the workflow."},{"id":"5a9518ea-456e-4975-bf6f-71bf9ed0a6e1","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[540,180],"parameters":{"width":1577.931818181817,"height":684.1818181818179,"content":"## Main/Parent Workflow\n* This starts multiple executions of the sub-workflow in parallel and then loops until they all report back."},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"13ad3423-c3bf-4144-b76d-03daa8877bed","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[560,900],"parameters":{"width":1477.331211260329,"height":189.2194473140495,"content":"### Sub-Workflow\n**Cut/Paste this into a separate workflow, and activate it!!!**"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"e92865b0-b3e9-4195-ae16-5c199875a04b","name":"Wait","type":"n8n-nodes-base.wait","position":[1440,940],"webhookId":"2d62e5c2-ad4a-4e90-a075-7ca5212e015a","parameters":{},"typeVersion":1.1,"notes":"This wait node performs automated tasks as part of the workflow."},{"id":"710456c8-394d-4c45-8d8e-16e0a4095dc3","name":"Call Resume on Parent Workflow","type":"n8n-nodes-base.httpRequest","notes":"The callback resumes the parent workflow and reports which item finished.  There could be a race condition if the parent workflow was just resumed by a different sub-workflow but hasn't entered a webhook-wait again yet.  The delay and retry mitigates for the possibility that multiple subtasks complete and call back at once.","position":[1660,940],"parameters":{"url":"{{ $env.BASE_URL }}","method":"POST","options":{},"sendBody":true,"bodyParameters":{"parameters":[{"name":"finishedItemId","value":"={{ $('Webhook').item.json.body.requestItemId }}"}]}},"retryOnFail":true,"typeVersion":4.2,"waitBetweenTries":3000},{"id":"2ee41b1a-89f0-4d2f-b2ff-74aef5baaa70","name":"Respond to Webhook","type":"n8n-nodes-base.respondToWebhook","position":[1220,940],"parameters":{"options":{},"respondWith":"json","responseBody":"={{ \n{\n  \"finishedItemId\": $json.body.requestItemId\n}\n}}"},"typeVersion":1.1,"notes":"This respondToWebhook node performs automated tasks as part of the workflow."},{"id":"04445a9a-61f9-468e-8589-3eeb403f2553","name":"Webhook","type":"n8n-nodes-base.webhook","position":[1000,940],"webhookId":"14776b45-77d7-4220-808f-2d0a38bec4de","parameters":{"path":"parallel-subworkflow-target","options":{},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2,"notes":"This webhook node performs automated tasks as part of the workflow."}],"connections":{"Start Sub-Workflow via Webhook":{"main":[[],[],[],[],[]]},"Acknowledge Finished":{"main":[[],[],[],[],[]]},"Call Resume on Parent Workflow":{"main":[[],[],[],[],[]]},"Respond to Webhook":{"main":[[],[],[],[],[]]},"Webhook":{"main":[[],[],[],[],[]]}},"name":"Manualtrigger Workflow","settings":{"executionOrder":"v1","saveManualExecutions":true,"callerPolicy":"workflowsFromSameOwner","errorWorkflow":null,"timezone":"UTC","executionTimeout":3600,"maxExecutions":1000,"retryOnFail":true,"retryCount":3,"retryDelay":1000},"description":"Automated workflow: Manualtrigger Workflow. This workflow integrates 12 different services: webhook, stickyNote, httpRequest, wait, code. It contains 28 nodes and follows best practices for error handling and security.","meta":{"instanceId":"workflow-2bdbb829","versionId":"1.0.0","createdAt":"2025-09-29T07:07:58.730960","updatedAt":"2025-09-29T07:07:58.730977","owner":"n8n-user","license":"MIT","category":"automation","status":"active","priority":"high","environment":"production"},"notes":"Excellent quality workflow: Manualtrigger Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}