Core Concepts
Flows
A flow is an automation pipeline. It starts with an event and contains a sequence of actions and functions that execute in order.
Events
An event is what triggers a flow. Examples:
- Telegram Bot Update — someone sends a message to your bot
- Telegram Update — a message arrives on your personal Telegram account
- API Trigger — an external service sends an HTTP request to your webhook URL
- Helper Flow — another flow calls this one via Call Flow or ForEach
Each event produces outputs (message text, user ID, date, etc.) that you can use in subsequent blocks.
Actions
Actions interact with external services:
- Send a Telegram message
- Call OpenAI with a prompt
- Make an HTTP request
Actions have inputs (what to send) and outputs (what came back).
Functions
To add a function, click Add function in the editor. You'll see the function picker:
Functions
Choose a category
Functions transform data without calling external services:
- Text: concatenate, replace, split, find
- Number: add, multiply, round, formula
- Object: get, set, merge, construct
- List: filter, sort, forEach, map
- Logic: if/else, continue if, lookup
Connections
A connection links Fainflow to an external service. It stores credentials (bot token, API key, etc.) securely. One connection can be used by multiple flows.
Drag & Drop
Outputs from any block can be dragged into inputs of subsequent blocks. This is how data flows between steps. The colored badges show which block each value comes from.
Helper Flows
A helper flow is a reusable sub-flow triggered by:
- Call Flow — run once and get the result
- ForEach — run once per item in a list
- Repeat — run N times
Helper flows have a special event type "Helper Flow" with custom outputs that you define.
Branching
Use Continue If to filter messages, or If/Else for conditional logic:
Conditional Logic
Check if message is a command, then respond differently

Telegram Bot
Bot Update
Branching
Continue If

Telegram Bot
Send Message
Vault
The vault stores sensitive values (API keys, tokens, passwords) encrypted with AES-256. Reference them in any field with {{vault.KEY_NAME}}. Values are masked in execution history.