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.

NameTypeRequiredDefaultDescription
amountnumberYesNumber of time units to wait
unitstringYesseconds · 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.

NameTypeRequiredDefaultDescription
datetimestringYesISO 8601 datetime string, e.g. 2026-04-01T09:00:00+05:30
timezonestringYesAsia/KolkataIANA 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.

NameTypeRequiredDefaultDescription
timeoutnumberNoMaximum time to wait in seconds before timing out
onTimeoutstringNocontinue"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

VariableTypeDescriptionExample
{{wait.waitedMs}}numberActual milliseconds waited86400000
{{wait.resumedBy}}string"duration" | "until" | "webhook" | "timeout""webhook"
{{wait.resumedAt}}stringISO timestamp when execution resumed"2026-04-01T10:30:00.000Z"
{{wait.resumeUrl}}stringURL to POST to resume (webhook mode only)"https://app.nodebase.in/api/resume/..."
{{wait.webhookData}}objectBody of the POST request that resumed the workflow{ "approved": true }

Common Issues & Solutions

IssueCauseSolution
Workflow never resumes after webhookResume URL called with GET instead of POSTThe resume URL only accepts HTTP POST requests
webhookData is emptyResume POST request had no bodySend a JSON body in the POST request to the resume URL
Workflow timed out unexpectedlyonTimeout is set to failChange onTimeout to "continue" to proceed after timeout instead of erroring
  • If / Else — branch on {{wait.webhookData}} after webhook resume
  • Slack — send the resume URL to a Slack approver
  • Gmail — email the resume URL for async approval