n8n Wait node: pause and resume workflows
Updated 2026-10-21 · 5 min read
The n8n Wait node pauses a workflow and resumes it later with the same data. It covers four cases: wait a fixed time, wait until a date, wait until someone calls a URL, and wait until someone submits a form. The last two turn n8n into an approval and human-in-the-loop tool without extra infrastructure.
Resume options
| Resume | Waits for | Typical use |
|---|---|---|
| After Time Interval | An amount of seconds, minutes, hours or days | Rate limiting, follow-up after 3 days |
| At Specified Time | A date and time | Send at a scheduled moment computed from data |
| On Webhook Call | An HTTP request to $execution.resumeUrl |
Callbacks from external jobs, approval links |
| On Form Submitted | A form submission | Human approval with input fields |
How waiting works
From the Wait node docs:
- When the workflow pauses, n8n offloads the execution data to the database, and reloads it when the resume condition is met. A wait of three days doesn't hold memory or a worker for three days.
- Exception: for time-based waits shorter than 65 seconds, n8n doesn't offload. The process keeps running and continues after the interval.
- Time-based waits always use the n8n server time. The workflow's timezone setting doesn't affect them. If your server runs in UTC and you want "9:00 Berlin", compute the UTC moment yourself.
The 65-second rule matters for rate limiting: a 1-second Wait between batches inside a loop is cheap and stays in process, which is what you want.
After Time Interval
Set Wait Amount and Wait Unit (Seconds, Minutes, Hours, Days). Both accept expressions, so the delay can come from data:
Wait Amount: {{ $json.retryAfter ?? 30 }}
Wait Unit: Seconds
A common use is honoring an API's Retry-After header: an HTTP Request node with Never Error and Include Response Headers and Status, an If node on status 429, then a Wait node that reads the header, and a connection back to the request.
At Specified Time
Pick a Date and Time, or use an expression:
{{ $json.trialEndsAt }}
{{ $now.plus({ days: 3 }).set({ hour: 9, minute: 0 }) }}
Remember that the result is interpreted in server time.
On Webhook Call
The node creates a resume URL at runtime, unique to each execution, available as $execution.resumeUrl (metadata docs). Put that URL somewhere before the Wait node: in an email, a Slack message, or the callback field of an external API.
Webhook → Create export job (HTTP Request, callbackUrl = {{ $execution.resumeUrl }})
→ Wait (On Webhook Call)
→ Download result → Notify
Settings for the resume request:
| Setting | Options |
|---|---|
| Authentication | Basic Auth, Header Auth, JWT Auth, None |
| HTTP Method | Same list as the Webhook node |
| Response Code | Any status code |
| Respond | Immediately, When Last Node Finishes, Using 'Respond to Webhook' Node |
| Limit Wait Time | Resume automatically after an interval or at a maximum date |
Options include Binary Property, Ignore Bots, IP(s) Whitelist, No Response Body, Raw Body, Response Data, Response Headers and Webhook Suffix. The suffix helps when one workflow has several Wait nodes: append it to the resume URL yourself, because the generated URL doesn't include it automatically.
The docs note one limitation: partial executions change the resume URL. The node that sends the URL must run in the same execution as the Wait node, so don't test the "send link" node separately and then the Wait.
The resume request's data is available to the next nodes, so an external job can post its results straight into the workflow.
On Form Submitted
The Wait node can also show a form and resume when it is submitted. Set Form Title, Form Description and Form Fields (Date, Dropdown List, Number, Password, Text, Textarea, each optionally required). Respond When decides when the person sees the confirmation: when the form is submitted, when the workflow finishes, or via a Respond to Webhook node. Form Response shows a text or redirects to a URL.
An approval flow:
- Webhook receives a refund request.
- Slack message to a manager with the form link. For On Form Submitted the link is the form's waiting URL, not the plain
$execution.resumeUrl; check which variable your n8n version offers in the expression editor. - Wait, On Form Submitted, fields: Decision (dropdown: approve, reject), Comment (textarea). Limit Wait Time: 2 days.
- Switch node on the decision, with the timeout case going to a fallback.
Always set Limit Wait Time for human steps. Without it, an ignored request waits forever and the execution stays open.
Wait inside loops
In a Loop Over Items loop, a short Wait between batches is the standard way to stay under an API's rate limit. For a single HTTP Request node, its built-in Batching option is simpler. Use Wait when a group of nodes must pause together.
Wait vs Schedule Trigger
A Wait node of "7 days" inside a workflow and a separate scheduled workflow that runs daily and picks up due items solve the same problem differently.
| Wait node | Scheduled workflow | |
|---|---|---|
| State | Kept in the paused execution | Must be stored (for example in Data tables) |
| Change the logic after start | Check how paused executions behave after you republish before relying on it | Next run uses the new version |
| Visibility | One waiting execution per item | One list of due items |
| Best for | Hours to a few days, low volume | Weeks, high volume, logic that changes |
From Pipedream delays and suspend
Pipedream offered a Delay operator and $.flow.delay(ms) in code, from 1 ms up to one year, which returned cancel_url and resume_url (Pipedream delay docs). $.flow.suspend() paused until its resume_url was called (rerun docs).
| Pipedream | n8n |
|---|---|
Delay operator / $.flow.delay(ms) |
Wait, After Time Interval |
resume_url from $.flow.suspend() |
Wait, On Webhook Call + $execution.resumeUrl |
cancel_url |
No direct equivalent; resume with a payload that a following If node treats as "cancel" |
$.flow.rerun(delay, …) for polling |
Wait + If + loop back, or Retry On Fail |
A delay call sits inside a code step in Pipedream, and the Wait has to sit between nodes in n8n, so a step that delays in the middle must be split in two. Our converter turns Pipedream's Delay action into a Wait node. A $.flow.delay() call inside code is listed in the report as a step to split, and the wrapped step throws a clear error instead of silently skipping the pause; $.flow.rerun() is flagged as having no direct equivalent. More on the related $.flow.* calls in $.flow.exit and $.respond in n8n.
Paste a step into the code step checker to see what it uses, or run your export through the converter. The report and 1 workflow are free. Full export: $3 per workflow, $19 minimum — coming soon.
Not affiliated with Pipedream or n8n.
FAQ
- How do I add a delay in n8n?
- Add a Wait node with Resume set to After Time Interval and choose the amount and unit (seconds, minutes, hours or days).
- What is $execution.resumeUrl in n8n?
- A URL generated for each execution that resumes a Wait node set to On Webhook Call. Send it to a person or a service; when it's called, the workflow continues.
- Does a long wait keep the n8n server busy?
- No. For waits of 65 seconds or more, n8n offloads the execution data to the database and reloads it when the wait ends. Shorter waits keep the process running.
- Which timezone does the Wait node use?
- The n8n server time, always. Workflow timezone settings don't affect the Wait node's interval or specified time.
- Can a Wait node time out?
- Yes. For On Webhook Call and On Form Submitted, turn on Limit Wait Time and set an interval or a maximum date; the workflow then resumes on its own.
Related
Sources
- https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait
- https://docs.n8n.io/build/flow-logic/wait
- https://docs.n8n.io/build/code-in-n8n/use-built-in-shortcuts/n8n-metadata
- https://pipedream.com/docs/workflows/building-workflows/code/nodejs/delay
- https://pipedream.com/docs/workflows/building-workflows/code/nodejs/rerun