Step types
Every action and control-flow step a workflow can use, and how to configure it.
A workflow's steps fall into two groups: action steps, which do something, and control-flow steps, which shape the path through the other steps.
Action steps
| Step | What it does |
|---|---|
| Tool | Calls a tool exposed by one of your installed Wapps |
| API call | Calls an external URL — method, headers, query params, body, auth, and a timeout |
| Integration action | Calls a specific action on a connected integration (e.g. inserting a calendar event) |
| Code | Runs sandboxed JavaScript |
| CLI | Runs a shell command in your sandboxed workspace |
| AI Agent | Generates text, structured data, images, or videos from a prompt, optionally with live browser control for text runs |
| Notification | Sends an in-app, email, or push notification to chosen recipients |
| Send email | Sends (or threads a reply) from one of your Mailhook addresses |
| RSS read | Fetches items from an RSS feed URL |
| Call MCP Tool | Runs one tool from a connected MCP server, deterministically — no model in the loop |
API call
Configure the URL, HTTP method, query parameters, headers, and body. Auth supports bearer tokens, basic auth, or an API key, sourced from a saved credential. Set a timeout, and turn on continue on error if a failed call shouldn't stop the run.
Code and CLI
Code steps run sandboxed JavaScript; CLI steps run a shell command in your workspace's sandbox. Both support a timeout and continue on error, and both can require human approval before running:
- Set approval to manual (always requires sign-off) or auto (runs immediately unless a condition you define requires review).
- Choose approvers — specific workspace members who can approve — and optionally an escalation: if no approver responds within a set time, it escalates to a different set of members.
- A declined approval stops that step without throwing an unhandled error — the run records it as a normal decline.
AI Agent
Model selection defaults to Auto (Cheqq's managed default) or can be pinned to a specific model, including one from your own connected provider key. Configure a prompt/system prompt, a temperature, and a max output token limit. An AI step can optionally return structured output matching a schema you define, or drive a live browser session through the Companion extension for that run. Image-generating AI steps are a separate output mode and can't combine with structured output, browser control, temperature, or token limits.
Choose Video as the output mode to generate a private workspace video. Configure its supported duration, resolution, orientation, and audio setting. The model picker is filtered to admin-approved video models. Previous-step image paths can be used as image-to-video references, and the step returns the active video path plus file metadata for downstream steps. Like Image mode, Video mode cannot combine with structured output, browser control, temperature, or token limits.
MCP tools
Every tool on a connected MCP server appears in the step picker under its provider's group, with a form generated from the tool's own schema — pick the tool, fill the arguments (with {{...}} templating), done. Providers you haven't connected yet show as Available to connect, linking to the integrations catalog.
The generic Call MCP Tool step is the escape hatch: choose any server and tool by hand and pass arguments as JSON. Either way the call is deterministic — the tool runs with exactly the arguments configured, no model involved. A connection that needs re-authorization fails the step with a reconnect hint rather than running with stale access.
Notification
Choose a channel (in-app, email, or push), a category, and recipients. The body can reference other steps' output, and is rendered as Markdown — links in it are clickable.
Link sets where the notification opens when it is selected. Leave it empty and the notification is read-only; point it at a Wapp, a workflow run, or any URL to give it a destination. It accepts {{...}} expressions, so a step can send someone to the exact thing the run just touched:
/workflows/{{trigger.workflowId}}/runs/{{trigger.workflowRunId}}Recipients are chosen as workflow members or roles, so one step can notify the person who triggered the run, the workflow's author, or everyone with a given role in the Wapp.
See Notifications for how they are read and acted on.
Send email
Sends from one of your Mailhook addresses, as a new message or threaded as a reply to a specific prior message.
Control-flow steps
| Step | What it does |
|---|---|
| Branch | Evaluates a list of conditions in order and runs the steps under the first one that matches, with an optional else path |
| For Each | Runs its steps once per item in a collection or a fixed count, sequentially |
| Do While | Repeats its steps while a condition stays true, checked after each iteration |
| Do Until | Repeats its steps until a condition becomes true, checked after each iteration |
| Parallel | Runs two or more branches of steps at the same time |
| Wait | Pauses the run until a condition is met — see below |
For Each runs sequentially
Despite iterating over a list, For Each processes one item at a time, not concurrently. Use Parallel if you specifically need concurrent branches.
For Each and the two Do loops cap out at a maximum iteration count (100 by default) to prevent runaway loops. Branch and loop conditions are written as JavaScript expressions evaluated in a sandbox — see Expressions for the syntax, which is different from the {{...}} templating used elsewhere.
Wait
A Wait step pauses the run until one of five conditions is met:
- Delay — a fixed duration (up to 30 days).
- Datetime — an absolute date and time.
- Expression — a datetime computed from a prior step's output.
- Event — an external event: a collection change or an incoming webhook.
- Manual — pauses until someone explicitly resumes it, with the same approvers/escalation options as Code and CLI approval routing.
Not yet available
A Browser action step type exists for driving a browser session as a standalone step, but isn't runnable yet — use an AI step's browser mode, or an API call/code step, in the meantime.
Continue with Triggers for what starts a run, or Error handling for retries, atomic mode, and dry runs.