AutomationFlowsGeneral › Asynchronous n8n Workflow with Wait Nodes POC

Asynchronous n8n Workflow with Wait Nodes POC

Original n8n title: N8n Asynchronous Workflow with Wait Node Poc

n8n Asynchronous Workflow with Wait Node POC. Uses manualTrigger, executeWorkflowTrigger, executeWorkflow, httpRequest. Event-driven trigger; 12 nodes.

Event trigger★★★★☆ complexity12 nodesExecute Workflow TriggerHTTP Request
General Trigger: Event Nodes: 12 Complexity: ★★★★☆ Added:

This workflow follows the Execute Workflow Trigger → 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 →

Download .json
{
  "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": []
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow enables asynchronous processing in n8n by initiating a separate workflow and pausing execution until it completes or a webhook responds, ensuring reliable handling of long-running tasks without blocking your main automation. It's ideal for developers or teams managing complex event-driven systems who need to coordinate multiple workflows seamlessly. The key step involves the Wait node, which suspends the chain after triggering an executeWorkflow, resuming only upon receiving confirmation via httpRequest to a webhook, allowing for efficient, non-synchronous operations.

Use this workflow when building event-driven automations that require splitting heavy computations into background processes, such as processing large datasets or integrating with external APIs that take time to respond. Avoid it for simple, linear tasks where immediate execution suffices, as the added waits introduce unnecessary complexity. Common variations include adding error handling nodes after waits or chaining multiple executeWorkflow calls for modular, scalable setups.

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 →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Product - Google Search Console API Examples. Uses httpRequest. Event-driven trigger; 36 nodes.

HTTP Request
General

Multi-Service Screenshot Scraping: ScraperAPI, Scrapingdog, & ScreenshotOne. Uses manualTrigger, httpRequest, stickyNote, dateTime. Event-driven trigger; 13 nodes.

HTTP Request
General

Nested Loops with Sub-workflows. Uses manualTrigger, splitInBatches, executeWorkflowTrigger, stickyNote. Event-driven trigger; 9 nodes.

Execute Workflow Trigger
General

Media Sync (Local HDD → Google Drive). Uses localFileTrigger, readWriteFile, googleDrive, httpRequest. Event-driven trigger; 9 nodes.

Local File Trigger, Read Write File, Google Drive +1
General

No-Code: Convert Multiple Binary Files to Base64. Uses manualTrigger, compression, httpRequest, splitOut. Event-driven trigger; 8 nodes.

Compression, HTTP Request