DEV Community

Pirate Prentice
Pirate Prentice

Posted on

n8n Wait Node: Pause, Delay, and Schedule Workflow Execution (Free Workflow JSON)

n8n Wait Node: Pause, Delay, and Schedule Workflow Execution (Free Workflow JSON)

Most n8n workflows rush from node to node without pausing. That's fine until you hit an API rate limit, need a human to approve something, or need to schedule a follow-up for exactly 24 hours later.

The Wait node solves all three. It pauses workflow execution, releases the worker, and resumes later --- on a timer, on a webhook call, or on a form submission. Your server isn't idle while it waits.


What the Wait Node Does

The Wait node suspends execution of the current workflow item and stores its state. The n8n worker is freed immediately (no memory held, no thread parked). When the resume condition is met, n8n restarts execution from the next node.

This makes it perfectly safe for very long waits (hours, days) without consuming resources.


Wait Modes

1. Time Interval

Wait for a fixed duration after the node is reached.

Setting Example
Amount 1
Unit Seconds, Minutes, Hours, Days

Use case: Sleep 1s between API calls to respect rate limits.

2. At Specific Time

Resume at an exact date-time, either hardcoded or from an expression.

DateTime: <{ $json.send_at }>
Enter fullscreen mode Exit fullscreen mode

Use case: Send a follow-up email at exactly 9am on the next business day.

3. On Webhook Call (Human-in-the-loop)

Wait indefinitely until an external system calls a URL n8n generates automatically.

Webhook URL: https://<your-n8n>/webhook-waiting/<uuid>
Enter fullscreen mode Exit fullscreen mode

Use case: Send an approval email with an "Approve" link. When the manager clicks it, the workflow resumes.

4. On Form Submission

Same as webhook but n8n renders a hosted form --- no external form tool needed.

Use case: Collect additional information mid-workflow (e.g., ask the user for a reason before processing).


Pattern 1: Rate-Limit-Safe API Poller

Problem: You need to call an API for 50 items but the API allows 10/min.

Solution: Split In Batches (batchSize=1) + Wait 6s between calls.

[Webhook] -> [Split In Batches batchSize=1] -> [HTTP Request] -> [Wait 6s] -> (loop back)
Enter fullscreen mode Exit fullscreen mode

The Wait node is placed after the HTTP Request and before the Split In Batches loop-back connection. This guarantees 6s between each call regardless of how fast the request resolves.

Pattern 2: Human Approval Gate

The most powerful Wait pattern. Include the webhook resume URL in an approval email.

[Trigger] -> [Wait: On Webhook] -> [Set resumeURL=$webhookUrl] -> [Send Email with "Approve" link]
              -> (on click: resume with {"approved":true}) -> [IF approved] -> [Process]
Enter fullscreen mode Exit fullscreen mode

Key: use {{ $execution.resumeUrl }} in the Wait node expression to get the generated webhook URL.

Pattern 3: Scheduled Follow-Up

Send a welcome email immediately, wait 3 days, then send an onboarding checkin.

[New Signup] -> [Send Welcome Email] -> [Wait 3 days] -> [Send Check-in Email]
Enter fullscreen mode Exit fullscreen mode

No cron job needed. No separate scheduler. The execution simply resumes after 72 hours.

Pattern 4: Polling Loop (Repeat Until Done)

Check a job status every 30s until it completes.

[Trigger] -> [HTTP GET job/status] -> [IF status==="done"] -> [Process Result]
                                                   _-> [Wait 30s] -> (loop back)
Enter fullscreen mode Exit fullscreen mode

Connect the Wait node's output back to the HTTP Request node. N8n supports backward connections for this pattern.


Gotchas Table

Gotcha Detail
Execution timeout vs wait duration The Wait node suspends execution (doesn't count toward the timeout). But if your n!n execution timeout is lower than the wait duration, the workflow will be killed before resuming.
Webhook URL expires The resume webhook URL is only active while the execution is paused. Calling it after a workflow completes or fails returns 404.
Cloud vs self-hosted n8n Cloud has a max wait time of 30 days on higher plans. Self-hosted no hard limit but your DB must retain execution state.
Resume URL not accessible If your n8n is behind a firewall/localhost, the resume URL is not reachable from external systems. Use a tunnel (ngrok, cloudflared) or n8n Cloud.
Not for cron-style recurrence The Wait node does not loop on its own. For periodic recurrence, use the Schedule Trigger instead.
Wait node in item loops Each item in a batch waits independently. If you have 100 items, all 100 waits are active simultaneously. Use Split In Batches (batchSize=1) to serialize.

Free Workflow JSON: Rate-Limit-Safe API Poller

This workflow fetches a list of IDs from a trigger, then queries an API for each one with a 1s delay between calls.

Copy the JSON below and import it into n8n (Menu > Import Workflow):

{
  "name": "Rate-Limit-Safe API Poller",
  "nodes": [
    {
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [-500, 300],
      "parameters": {
        "path": "api-poller",
        "responseMode": "lastNode"
      }
    },
    {
      "name": "Split In Batches",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [-300, 300],
      "parameters": {
        "batchSize": 1
      }
    },
    {
      "name": "Call API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [-100, 300],
      "parameters": {
        "method": "GET",
        "url": "https://api.example.com/items/{{ $json.id }}",
        "responseFormat": "json"
      }
    },
    {
      "name": "Wait 1s",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1,
      "position": [100, 300],
      "parameters": {
        "resume": "timeInterval",
        "amount": 1,
        "unit": "seconds"
      }
    },
    {
      "name": "Collect Results",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [300, 300],
      "parameters": {}
    }
  ],
  "connections": {
    "Webhook Trigger": {"main": [[{"node": "Split In Batches", "type": "main", "index": 0}]]},
    "Split In Batches": {"main": [[{"node": "Call API", "type": "main", "index": 0}], [{"node": "Collect Results", "type": "main", "index": 0}]]},
    "Call API": {"main": [[{"node": "Wait 1s", "type": "main", "index": 0}]]},
    "Wait 1s": {"main": [[{"node": "Split In Batches", "type": "main", "index": 0}]]}
  }
}
Enter fullscreen mode Exit fullscreen mode

Get the Complete Automation Starter Pack

Want 15 pre-built, documented n8n workflows covering lead capture, Stripe fulfillment, AI enrichment, and more?

→ Get the n8n Workflow Starter Pack($29)

Top comments (2)

Collapse
 
pirateprentice profile image
Pirate Prentice

Which resume mode do you reach for most in production — Time Interval for rate limiting, or Webhook resume for human-approval gates? I keep coming back to the Webhook resume mode whenever I need a manager to sign off before the workflow continues. Curious what real-world patterns others are building with this node.

Collapse
 
pirateprentice profile image
Pirate Prentice

What's your use case for the Wait node? I've been using it most for human-approval gates before irreversible actions — the webhook resume mode is underrated.