Choosing a step
The step reference index: all 29 primitives by what they do in a workflow — start it, understand data, transform it, decide, check, act.
Every workflow is built from the same ~29 primitives. This section documents each one on the same skeleton — what it does, its config, its exact output shape, patterns, and gotchas. Pick by what you need to happen:
Start — how workflows begin
Every workflow has exactly one way in.
| step | fires when |
|---|---|
| Manual | you (or the API) click run |
| Webhook | an external system POSTs to your URL — or a connected app (Slack) sends an event |
| Schedule | a cron expression says so |
| Watch | a poll finds a NEW item (once per item) |
| Sub-workflow | another workflow calls this one |
| File upload | someone drops a file on your upload page |
| Form | someone submits your hosted form |
| Email trigger | mail arrives at your workflow address |
| Text trigger | a verified phone texts your number |
Understand — the AI step
One tile, four tasks — see the AI Agent overview for choosing between them.
| task | use when |
|---|---|
| Custom prompt | you're writing the instruction yourself — tools, memory, knowledge live here |
| Extract | you want declared fields out of text or an uploaded document |
| Classify | the AI picks one of YOUR labels (then a switch routes on it) |
| Summarize | you want a condensed digest, usually right before a send |
Transform — reshape data between steps
| step | use when |
|---|---|
| Set fields | rename / pluck / stamp fields declaratively — try this first |
| Reshape | it's a LIST: filter, sort, dedupe, limit, split out, aggregate |
| Run code | the declarative steps can't express it — sandboxed JavaScript |
| Merge | parallel branches need to reconverge into one payload |
| Extract HTML | scraping values out of a fetched page with CSS selectors |
Decide — routing and repetition
| step | use when |
|---|---|
| If / else | one yes/no condition, two paths |
| Switch | N cases plus a default — the natural partner of a classify |
| Loop | run a body once per list item, collect the results |
| Loop until | repeat until a condition is true — retry / poll / refine |
Check with you — humans in the loop
| step | use when |
|---|---|
| Wait | pause for a fixed duration (durable, survives deploys) |
| Approval | pause for a human decision — in-app or one-click email links |
Act — do the thing
| step | use when |
|---|---|
| Web request | call any HTTP API |
| Respond to webhook | answer the webhook caller with a custom response |
| Send email | zero-setup email through the platform sender |
| Send text | SMS to workspace-verified numbers |
| Call workflow | run another workflow and use its result |
| Get from store | read a row (or a still-needs-work batch) from a data store |
| Save to store | write a schema-validated keyed row to a data store |
Connected-app steps (Slack, GitHub, Google Sheets, …) get their own gallery after launch.
The reference skeleton
Every step page answers the same five questions, in order: what it does · when it runs · config (with the Inspector screenshot) · output (the exact downstream payload shape) · patterns & gotchas. The output sections are the same truths MadMax's own build-time linter enforces — written for humans.