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": "n8n Asynchronous Workflow with Wait Node POC",
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
0
],
"id": "5d6a7a8c-4f53-4a4a-8dc7-d4ef6aacc6ec",
"name": "Start"
},
{
"parameters": {
"workflowInputs": {
"values": [
{
"name": "wait",
"type": "number"
},
{
"name": "webhook"
}
]
}
},
"type": "n8n-nodes-base.executeWorkflowTrigger",
"typeVersion": 1.1,
"position": [
0,
256
],
"id": "ffea6870-e3db-45bb-82a8-7df03d8e3d82",
"name": "Call Entry Point"
},
{
"parameters": {
"amount": "={{ $('Call Entry Point').item.json.wait }}"
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
224,
256
],
"id": "886285f8-0f90-4f1d-8b26-837c9181e4a0",
"name": "Wait Seconds"
},
{
"parameters": {
"workflowId": {
"__rl": true,
"value": "B816jIs5yNH8NM34",
"mode": "list",
"cachedResultName": "Async Calls"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"wait": 5,
"webhook": "={{ $execution.resumeUrl }}/call1"
},
"matchingColumns": [],
"schema": [
{
"id": "wait",
"displayName": "wait",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "number"
},
{
"id": "webhook",
"displayName": "webhook",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string"
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"options": {
"waitForSubWorkflow": false
}
},
"type": "n8n-nodes-base.executeWorkflow",
"typeVersion": 1.2,
"position": [
224,
0
],
"id": "8e26a389-1284-4008-a608-14531676db92",
"name": "Call 1"
},
{
"parameters": {
"url": "={{ $('Call Entry Point').item.json.webhook }}",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "result",
"value": "={{ $('Call Entry Point').item.json.wait * 2 }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
448,
256
],
"id": "cad29345-1977-439a-b867-8153fc077c8b",
"name": "Request Webhook",
"retryOnFail": false,
"onError": "continueErrorOutput"
},
{
"parameters": {
"resume": "webhook",
"limitWaitTime": true,
"resumeUnit": "minutes",
"options": {
"webhookSuffix": "call1"
}
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
672,
-96
],
"id": "86342836-185e-4303-bc3d-e7dff689f2bb",
"name": "Wait for Webhook 1"
},
{
"parameters": {
"resume": "webhook",
"limitWaitTime": true,
"resumeUnit": "minutes",
"options": {
"webhookSuffix": "call2"
}
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
672,
96
],
"id": "27ee493d-4ad7-4add-92b7-1931d7349b22",
"name": "Wait for Webhook 2"
},
{
"parameters": {
"amount": 1
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
672,
352
],
"id": "c12a5a75-2bd9-4912-aba6-113c58bc3bde",
"name": "Wait 1 Second"
},
{
"parameters": {
"workflowId": {
"__rl": true,
"value": "B816jIs5yNH8NM34",
"mode": "list",
"cachedResultName": "Async Calls"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"wait": 3,
"webhook": "={{ $execution.resumeUrl }}/call2"
},
"matchingColumns": [],
"schema": [
{
"id": "wait",
"displayName": "wait",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "number"
},
{
"id": "webhook",
"displayName": "webhook",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string"
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"options": {
"waitForSubWorkflow": false
}
},
"type": "n8n-nodes-base.executeWorkflow",
"typeVersion": 1.2,
"position": [
448,
0
],
"id": "9b9d24f4-cbee-43ad-9f08-38369208e8c1",
"name": "Call 2"
},
{
"parameters": {},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
896,
0
],
"id": "1e9947e7-db1e-4efe-8eef-a9e0c78da843",
"name": "Merge"
},
{
"parameters": {
"fieldsToSummarize": {
"values": [
{
"aggregation": "sum",
"field": "body.result"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.summarize",
"typeVersion": 1.1,
"position": [
1104,
0
],
"id": "9b3bc469-fb9d-4642-bd9b-a638a9b47eec",
"name": "Sum"
},
{
"parameters": {
"content": "## n8n Asynchronous Workflow with Wait Node POC\nThis template contains a two-part workflow designed to demonstrate a proof-of-concept for asynchronous and parallel execution of tasks in n8n.\n### Purpose\nThe purpose of this template is to showcase how you can run multiple long-running tasks simultaneously without blocking your main workflow. It utilizes the \"Wait For Sub-workflow Completion\" option and the \"Wait\" node to effectively manage concurrent execution and collect results from sub-workflows via webhooks. This pattern is ideal for use cases involving batch processing or any scenario where a workflow needs to trigger multiple independent tasks and wait for all of them to report back.\n### Setup Instructions\n1. **Import:** Import both the \"Main Orchestrator\" and \"Asynchronous Worker\" workflows into your n8n instance.\n2. **Link Workflows:** In the \"Main Orchestrator\" workflow, ensure the \"Execute Workflow\" node is correctly configured to call the \"Asynchronous Worker\" workflow. You can select it by its name from the dropdown menu.\n3. **Configure:** The template is pre-configured to run two parallel tasks with different `wait` durations to simulate a real-world scenario. You can adjust the parameters on the \"Execute Workflow\" node to test different wait times.\n4. **Execution:** Execute the \"Main Orchestrator\" workflow. You will see the workflow pause at the \"Wait\" nodes while the \"Asynchronous Worker\" workflows run in the background. Once they complete, they will call back via the webhook, allowing the main workflow to resume and summarize the results.\n\n\nFor a detailed walkthrough of how this template works and an explanation of the underlying concepts, please read the [full blog post here](https://n8nplaybook.com/post/2025/09/asynchronous-n8n-workflows-parallel-processing-poc/)",
"height": 624,
"width": 592
},
"type": "n8n-nodes-base.stickyNote",
"position": [
-656,
-96
],
"typeVersion": 1,
"id": "6a8f11f4-8d10-4a82-9f08-a0831618d5a3",
"name": "Sticky Note"
}
],
"connections": {
"Call Entry Point": {
"main": [
[
{
"node": "Wait Seconds",
"type": "main",
"index": 0
}
]
]
},
"Start": {
"main": [
[
{
"node": "Call 1",
"type": "main",
"index": 0
}
]
]
},
"Wait Seconds": {
"main": [
[
{
"node": "Request Webhook",
"type": "main",
"index": 0
}
]
]
},
"Request Webhook": {
"main": [
[],
[
{
"node": "Wait 1 Second",
"type": "main",
"index": 0
}
]
]
},
"Call 1": {
"main": [
[
{
"node": "Call 2",
"type": "main",
"index": 0
}
]
]
},
"Wait 1 Second": {
"main": [
[
{
"node": "Request Webhook",
"type": "main",
"index": 0
}
]
]
},
"Call 2": {
"main": [
[
{
"node": "Wait for Webhook 1",
"type": "main",
"index": 0
},
{
"node": "Wait for Webhook 2",
"type": "main",
"index": 0
}
]
]
},
"Wait for Webhook 1": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Wait for Webhook 2": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Sum",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "078e5c9f-a3d7-4cc8-9696-d2db7d298c1c",
"id": "B816jIs5yNH8NM34",
"tags": []
}
About this workflow
n8n Asynchronous Workflow with Wait Node POC. Uses manualTrigger, executeWorkflowTrigger, executeWorkflow, httpRequest. Event-driven trigger; 12 nodes.
Source: https://github.com/vklepikovskiy/n8nplaybook-public/blob/main/workflows/asynchronous_poc.json — original creator credit. Request a take-down →