Core concepts
Triggers
What starts a run — webhooks, schedules, forms, polling, and workflows watching each other.
Every workflow begins with exactly one trigger. The trigger's output is available to every step as {{trigger.…}}, and real deliveries always execute the published version — editor tests run the draft as environment=test (the runs page explains the split).
| Trigger | Fires when | Worth knowing |
|---|---|---|
| Webhook | An HTTP request hits the flow's unique URL (minted at publish) | Optional shared-secret auth, recorded with the secret redacted. Any body shape survives — objects arrive parsed, arrays and non-JSON are preserved, never silently dropped. |
| Schedule | Cron fires — human frequency editor, timezone-aware | The panel shows the next five fire times computed by the scheduler's own code. Every Hour/Day skip weekends unless "run on weekends" is on (Activepieces-compatible default — the preview makes it visible). |
| Form | Someone submits the hosted input page GoRunner serves for you | 10 field types; required/email/number/choice validation is server-side, so a hand-crafted POST can't skip it. |
| Email (IMAP) | A new message lands in the polled mailbox | Deduped on UIDVALIDITY+UID; the first poll baselines silently — enabling it on a full inbox does not replay history. |
| Error Trigger | A watched workflow (or all workflows) fails | The payload carries {workflow, run, failedStep} — one alerting flow for the whole workspace. Deduplicated against the failing flow's own error-workflow setting: one failure, one handler run. |
| Run Finished | Any run of a watched workflow ends | Same payload shape; filter by outcome with on_status. |
| MCP Tool | An AI agent calls the workflow by name | Parameters land on {{trigger.body.<parameter>}}. See Workflows as tools. |
| When Called by Another Workflow | A parent flow runs this one via Execute Workflow | The parent's configured input becomes this flow's trigger data. |
Synchronous replies
A webhook flow with the Return Response action makes the caller's HTTP request wait for the flow's real answer — status, headers and body computed by the run. A run that pauses mid-flight answers 202 with status: "paused" honestly rather than a fake success; a caller who never wants to wait appends ?async=true.