Skip to content

Wait and timer patterns

Wait for a fixed delay

Introduce a delay between workflow steps — useful for rate limiting, cool-down periods, or retry backoff.

{
  "name": "delayed_notification",
  "version": 1,
  "schemaVersion": 2,
  "tasks": [
    {
      "name": "process_event",
      "taskReferenceName": "process",
      "type": "SIMPLE"
    },
    {
      "name": "wait_before_retry",
      "taskReferenceName": "cooldown",
      "type": "WAIT",
      "inputParameters": {
        "duration": "5 minutes"
      }
    },
    {
      "name": "send_notification",
      "taskReferenceName": "notify",
      "type": "HTTP",
      "inputParameters": {
        "uri": "https://api.example.com/notify",
        "method": "POST",
        "body": {"eventId": "${process.output.eventId}"}
      }
    }
  ]
}

The duration field supports human-readable formats: 30 seconds, 5 minutes, 2 hours, 1 days, or short forms like 30s, 5m, 2h, 1d. You can also combine them: 2 hours 30 minutes.


Wait until a specific time

Schedule workflow continuation for a specific date/time — useful for scheduled releases, SLA deadlines, or business-hours processing.

{
  "name": "scheduled_report",
  "version": 1,
  "schemaVersion": 2,
  "inputParameters": ["reportDate"],
  "tasks": [
    {
      "name": "prepare_report",
      "taskReferenceName": "prepare",
      "type": "SIMPLE"
    },
    {
      "name": "wait_until_publish_time",
      "taskReferenceName": "schedule_wait",
      "type": "WAIT",
      "inputParameters": {
        "until": "${workflow.input.reportDate}"
      }
    },
    {
      "name": "publish_report",
      "taskReferenceName": "publish",
      "type": "HTTP",
      "inputParameters": {
        "uri": "https://api.example.com/reports/publish",
        "method": "POST",
        "body": {"reportId": "${prepare.output.reportId}"}
      }
    }
  ]
}

The until field supports formats: yyyy-MM-dd HH:mm z (e.g., 2025-06-15 09:00 GMT+00:00), yyyy-MM-dd HH:mm, or yyyy-MM-dd.

Register and run:

curl -X POST 'http://localhost:8080/api/metadata/workflow' \
  -H 'Content-Type: application/json' \
  -d @scheduled_report.json

curl -X POST 'http://localhost:8080/api/workflow/scheduled_report' \
  -H 'Content-Type: application/json' \
  -d '{"reportDate": "2025-06-15 09:00 GMT+00:00"}'

Wait for an external signal

Pause a workflow until an external system (or human) completes the task via API — useful for approvals, manual QA, or third-party callbacks.

{
  "name": "order_with_manual_approval",
  "version": 1,
  "schemaVersion": 2,
  "inputParameters": ["orderId", "amount"],
  "tasks": [
    {
      "name": "validate_order",
      "taskReferenceName": "validate",
      "type": "HTTP",
      "inputParameters": {
        "uri": "https://api.example.com/orders/${workflow.input.orderId}/validate",
        "method": "GET"
      }
    },
    {
      "name": "wait_for_approval",
      "taskReferenceName": "approval",
      "type": "WAIT"
    },
    {
      "name": "fulfill_order",
      "taskReferenceName": "fulfill",
      "type": "HTTP",
      "inputParameters": {
        "uri": "https://api.example.com/orders/${workflow.input.orderId}/fulfill",
        "method": "POST",
        "body": {
          "approvedBy": "${approval.output.approvedBy}"
        }
      }
    }
  ]
}

Complete the WAIT task externally (e.g., from a UI or webhook):

# Complete the wait task and resume the workflow
curl -X POST 'http://localhost:8080/api/tasks/{workflowId}/approval/COMPLETED/sync' \
  -H 'Content-Type: application/json' \
  -d '{"approvedBy": "manager@example.com"}'

The output data you pass when completing the task is available in subsequent tasks via ${approval.output.approvedBy}.