Building flows
A flow is a trigger followed by a sequence of steps. This page covers the building blocks you combine to automate anything.
Triggers
Every flow starts with exactly one trigger. The common types are:
- Schedule — run on a cron-like interval (every hour, weekdays at 9am, and so on).
- Webhook — start the flow when an external system sends an HTTP request to your flow’s unique URL.
- App event — react to events in a connected app, such as a new email, a new form submission, or an updated record.
Actions
Actions do the work. Each action belongs to a piece (an integration) and performs one operation — create a record, send a message, fetch data, and so on. You configure an action by filling in its fields, usually mapping values from earlier steps.
Data mapping
Steps pass data forward. Use the data picker to insert an output from any previous step into a field. References look like the step name plus the property you want, and update automatically as data flows through.
Branching with routers
A Router step splits your flow into paths based on conditions. Each branch has its own set of rules (equals, contains, greater than, and more). The first branch whose conditions match runs; you can also add a fallback branch.
Loops
The Loop on items step runs the steps inside it once for every item in a list — for example, iterating over rows returned from a query and sending one message per row.
Code steps
When you need custom logic, add a Code step and write TypeScript. Inputs are passed in as typed values, and whatever you return becomes the step’s output.
export const code = async (inputs) => {
const total = inputs.items.reduce((sum, item) => sum + item.amount, 0);
return { total };
};Error handling & retries
- Steps can be set to continue on failure so one bad item does not stop the whole run.
- Failed runs appear in the Runs view with the exact error, and can be retried once you fix the cause.
- Add a notification action on a failure path to alert your team in real time.
Versioning
Editing a published flow creates a new draft version. Your live version keeps running until you publish the draft, so you can safely iterate without interrupting production automations.