Every workflow is a graph of nodes. Understanding the node types is most of what you need to build anything.
Triggers
A trigger is the single entry point that starts a workflow:
- Discord — member joins, messages, reactions.
- Twitch — stream live, new follower, chat.
- Webhook — each workflow can expose a unique URL that any service can POST to.
- Schedule — run on a cron expression (daily digests, hourly syncs).
Actions
Actions do the work, and you can chain as many as you need:
- Discord — send message, send DM, manage roles.
- Email — send via SMTP with templates.
- HTTP request — call any REST API, with a built-in Authentication picker (Bearer Token, Basic Auth, or API Key Header) so you don't have to hand-type the header.
- Code — run a sandboxed snippet for custom logic.
When you add a Discord or Twitch action, it targets the right place automatically: leave the server, member, or channel fields empty and it reuses the one from the trigger. So "Member Join → Add Role" needs no IDs at all. Use the Auto / Pick a specific… toggle on the field when you want to point somewhere else.
Working with data
Beyond triggers and actions, a set of data nodes lets you reshape values without writing code — find them under Data in the Add-a-node panel:
- List — Map, Filter, Find, Sort, Unique, Group by, Reduce, Aggregate (sum / average / min / max / count), Slice, and Join a list. Per-item expressions use
itemandindex(andaccin Reduce). - Compute — evaluate one or more named expressions to build objects, arrays, or values for the next node.
- Pick a value from data — pull one or more named fields out of an object (a webhook body, an API response) by dot path.
- Regex — Extract one or more named values with capture groups, Replace text, or Match against a pattern.
- Date — get "now", add or subtract a duration, measure the gap between two dates, format, or compare.
See working with data for a full walkthrough.
Passing data with variables
Nodes expose their output to later nodes through template variables:
{{trigger_1.username}}
{{__trigger__.body.email}}
{{action_2.response.id}}
Inside {{ }} you can write a full expression, not just a single variable — do maths, compare values, pick between two outcomes, and call functions:
{{ price * qty }}
{{ score > 5 ? "win" : "lose" }}
{{ "mod" in roles }}
{{ round(action_2.response.total) }}
The expression field autocompletes available paths and flags typos before you ship. The working with data guide covers the full expression syntax.
Every node also has a Custom Fields section in its Config panel — attach any name/value pairs of your own, and each one becomes its own {{name}} variable for later nodes. Handy for carrying one extra value without adding a whole Set Data node.
Logic and control flow
Add conditions (if/else), filters, and switches to branch your workflow. Failed nodes retry automatically with sensible per-type defaults.
Next: make sure it all works with testing and debugging.