Reference
All blocks, placeholders, comparisons, conditional text rules and the reasons for the “not ready” label.
Blocks
| Block | What it does |
|---|---|
| Start | Starts the first-message branch |
| Incoming | Starts the branch that runs on every reply from the person |
| Scheduled | Starts the branch that runs once an hour — for follow-ups |
| Send message | A ready-made text or a text written by AI |
| Set variable | Saves a value — by hand or with AI |
| Condition | Splits by rules: a “met” output and a “not met” output |
| Set conversion | Marks that the dialog has reached a stage |
| A/B test | Randomly splits into variants in set shares |
| Send notification | A message to your team in the bot and the bell |
| Finish dialog | Stops processing this person’s replies |
Placeholders
Written in square brackets: [user.name]. Inside [if …] and in the Condition block, without brackets.
| Placeholder | What gets inserted |
|---|---|
| Recipient | |
[user.name] [user.username] [user.about] | Name, username, bio (“About”) |
[user.phone] [user.telegram_id] | Phone number, Telegram ID |
[user.premium] [user.verified] [user.scam] [user.fake] [user.restricted] | Profile badges: true or false |
[user.last_seen_at] | When the person was last online |
[user.channel.title] [user.channel.about] [user.channel.pinned_post] [user.channel.recent_posts_list] | Personal channel: title, description, pinned post, latest posts |
[user.source.messages_list] | The person’s messages from parsed chats |
| Sender — your account | |
[account.name] [account.username] [account.about] | Name, username, description |
| Conversation | |
[message.incoming.last] [message.outgoing.last] | The person’s last message and yours |
[message.count] [message.incoming.count] [message.outgoing.count] | How many messages in total, from the person, from you |
[message.iteration.count] | How many of the person’s replies have been processed |
[message.history] | The whole conversation — for AI tasks |
| Only in the Condition block | |
message.downtime.hours | Hours since the last message |
message.last.is_outgoing | The last message is yours |
user.offline.hours | Hours the person has been offline |
| Variables | |
[variable.name] | A script variable or an audience list variable |
No data means an empty string. A placeholder with a typo stays in the text as is, brackets included.
Comparisons in a Condition
| Value type | Comparisons |
|---|---|
| Text | equal, not equal, contains, not contains, contains word, not contains word |
| Number | equal, not equal, greater than, less than |
| Yes/No | equal, not equal |
“All” means every rule must hold; “Any” means one is enough.
Conditional text
| Syntax | Meaning |
|---|---|
[if user.name]…[/if] | Show if filled in |
[if not user.name]…[/if] | Show if not filled in |
[if variable.city = London]…[else]…[/if] | Show one thing or the other |
= != contains !contains word !word > < | Equal, not equal, contains a fragment, contains a whole word, greater than, less than |
and or | Both conditions must hold / one is enough |
You can’t nest [if] tags or mix and and or in one tag. The editor underlines tag errors in red.
Text variants
{variant 1|variant 2|variant 3} — the person gets one variant at random. To write a literal curly brace, escape it with a backslash: \{.
Why “not ready”
| Reason | What to do |
|---|---|
| The Start branch doesn’t send any message | Add a Send message block to it |
A message, notification or variable text has an [if], [else] or [/if] tag underlined in red | Close the tag or fix the comparison — how to write conditions |
Variable and conversion names
They start with a letter, followed by letters, digits and _. A name must be unique within the script. A script variable and an audience list variable with the same name are one and the same variable — see whose value is used.