Skip to content

Return Step

The return step terminates workflow execution immediately and optionally sends a response back to the caller. All remaining steps after the return are skipped. The step editor changes its form fields based on the trigger type.

When a workflow is triggered by a webhook, the return step controls what the webhook caller receives back as the HTTP response.

Return step configured with webhook response fields including status code and body

Basic response fields:

FieldValue
Status Code201
Body{ "success": true, "userId": "{{ create-user.id }}" }

Advanced webhook response fields — for file downloads or non-JSON responses:

FieldDescriptionExample
Status CodeHTTP status code to return200
BodyResponse body content{{ generate-report.csv }}
Body Encodingjson, text, or base64text
Content TypeMIME type for the responsetext/csv
FilenameIf set, triggers a file download in the caller’s browserreport.csv

When triggered by a form, the return step controls what the submitter sees after submission.

Return step configured with form response fields including message and type
FieldDescriptionExample
MessageMain heading shown to the userThanks for submitting!
DescriptionOptional subtitleYour request has been received.
Typesuccess, error, warning, or infosuccess
Redirect URLIf set, redirects instead of showing a messagehttps://example.com/thank-you

When used inside a sub-workflow, the return step defines what the parent workflow receives as the step output. Add key-value pairs for each value to return:

KeyValue
userId{{ user-check.id }}
statuscompleted

The parent workflow accesses these via the sub-workflow step ID:

{{ run-sub-workflow.userId }}
{{ run-sub-workflow.status }}

Each step has a Skip If condition in its settings. You can use this to make a return step conditional — for example, returning a 404 early if a lookup fails, while letting the workflow continue if it succeeds.

QuickFlo workflows can execute synchronously (wait for completion and return the result) or asynchronously (queue in the background and return immediately). The return step is what determines which mode is used.

The default mode is auto, which decides based on the trigger type and whether a return step exists:

TriggerHas Return Step with Response?Mode
WebhookYes (status code / body defined)Sync — caller waits, gets return step output
WebhookNoAsync — caller gets 202 Accepted with executionId
FormYes (form response defined)Sync — submitter sees the response
FormNoAsync — submitter sees a default success message
ScheduleN/AAsync always
Manual/APIN/AAsync by default

You can force sync or async execution regardless of auto-detection:

  • Query parameter: ?mode=sync or ?mode=async on the webhook/execution URL
  • Workflow settings: Set the execution mode to sync or async in the workflow settings dialog

Synchronous — The caller gets exactly what the return step defines, with the status code you set (default 200).

Asynchronous — The caller gets a 202 Accepted response with an executionId that can be used to check status later.