Wait Node
Pause a workflow for a fixed duration, until a specific datetime, or until an external HTTP call resumes it. Powered by Inngest durable execution — the workflow state is preserved across the wait period.
How It Works
When a Wait node is reached, the workflow is suspended and its state is saved. No compute resources are used during the wait. Execution resumes automatically when the wait condition is met.
Modes
Duration
Pause for a fixed amount of time.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
amount | number | Yes | — | Number of time units to wait |
unit | string | Yes | — | seconds · minutes · hours · days · weeks |
textExample — send a follow-up SMS 24 hours later
Razorpay Trigger (payment.captured)
→ MSG91 — Send SMS "Thank you for your order!"
→ Wait — Duration: 24 hours
→ MSG91 — Send SMS "How was your experience? Reply with your rating."Until
Pause until a specific datetime.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
datetime | string | Yes | — | ISO 8601 datetime string, e.g. 2026-04-01T09:00:00+05:30 |
timezone | string | Yes | Asia/Kolkata | IANA timezone name |
textExample — send flash sale notification at 9 AM IST
Schedule Trigger (daily at 8:50 AM IST)
→ Wait — Until: 2026-04-01T09:00:00+05:30
→ MSG91 — Send Bulk SMS "Flash sale starts NOW! 50% off for next 2 hours."Webhook Resume
Pause the workflow and generate a unique URL. Resume execution by making a POST request to that URL with any payload. Use this for human approval flows, payment confirmation, or external system callbacks.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
timeout | number | No | — | Maximum time to wait in seconds before timing out |
onTimeout | string | No | continue | "continue" — proceed after timeout | "fail" — throw error on timeout |
jsonOutput (webhook resume mode)
{
"wait": {
"resumeUrl": "https://app.nodebase.in/api/resume/wf_abc123",
"waitedMs": 42000,
"resumedBy": "webhook",
"resumedAt": "2026-04-01T10:30:00.000Z",
"webhookData": { "approved": true, "approvedBy": "priya@example.com" }
}
}textExample — human approval flow
Webhook Trigger (new refund request)
→ Slack — Send Message
channel: #approvals
text: "Refund request from {{body.email}} — ₹{{body.amount}}
Approve: POST {{wait.resumeUrl}} with {"approved": true}
Reject: POST {{wait.resumeUrl}} with {"approved": false}"
→ Wait — Webhook Resume (timeout: 86400, onTimeout: continue)
→ If / Else: {{wait.webhookData.approved}} is_true
TRUE → Razorpay — Create Refund
→ Gmail "Your refund has been approved"
FALSE → Gmail "Your refund request was not approved"Durable execution: The Wait node uses Inngest under the hood. Even if the server restarts, your workflow will resume exactly where it left off.
Output Variables
| Variable | Type | Description | Example |
|---|---|---|---|
{{wait.waitedMs}} | number | Actual milliseconds waited | 86400000 |
{{wait.resumedBy}} | string | "duration" | "until" | "webhook" | "timeout" | "webhook" |
{{wait.resumedAt}} | string | ISO timestamp when execution resumed | "2026-04-01T10:30:00.000Z" |
{{wait.resumeUrl}} | string | URL to POST to resume (webhook mode only) | "https://app.nodebase.in/api/resume/..." |
{{wait.webhookData}} | object | Body of the POST request that resumed the workflow | { "approved": true } |
Common Issues & Solutions
| Issue | Cause | Solution |
|---|---|---|
| Workflow never resumes after webhook | Resume URL called with GET instead of POST | The resume URL only accepts HTTP POST requests |
| webhookData is empty | Resume POST request had no body | Send a JSON body in the POST request to the resume URL |
| Workflow timed out unexpectedly | onTimeout is set to fail | Change onTimeout to "continue" to proceed after timeout instead of erroring |