Variables
Text in actions is a template: plain text with variables in double braces. Templates are pure: no code runs, only lookups and a fixed set of filters.
🔥 New buy: {{trigger.amount_formatted}} {{trigger.token.symbol | default: "?"}}
From {{trigger.from | short}} · balance now {{steps.read.result}}
{{trigger.explorer_url}} · {{now_wib}}What you can use
| trigger.* | The trigger's data: every path listed under each trigger in Triggers, including nested ones like token.symbol or body.order.id. |
| steps.<step_id>.* | The output of an earlier step, e.g. a contract read's result or a webhook's response body. Only earlier steps: no forward references. |
| flow.id | the flow's id |
| flow.name | the flow's name |
| flow.version | the flow version that ran |
| run.id | the run's id |
| run.idempotency_key | the run's unique key: use it to deduplicate downstream |
| run.test | true for TEST runs |
| now_utc | when the step runs, ISO-8601 UTC |
| now_wib | when the step runs, in WIB |
Unknown variables are rejected when you save the flow, checked against the trigger's data and the earlier steps' outputs. At run time, a variable that exists but is null renders as empty text; one that does not exist fails the step (unless it has a default), so a typo never sends a half-empty message.
Filters
| default: "…" | a fallback when the value is missing, null or empty | {{trigger.token.symbol | default: "?"}} |
| short | shortens hex: 0x5fc5…d168 | {{trigger.from | short}} |
| upper / lower | changes case | {{trigger.token.symbol | lower}} |
| truncate: N | cuts to N characters with … | {{trigger.body.message | truncate: 80}} |
| json | the value as JSON | {{trigger.args | json}} |
| url | URL-encodes the value | https://x.example/?q={{trigger.to | url}} |
Filters chain left to right: {{trigger.body.title | default: "Untitled" | upper}}. Write a literal {{ as \{{.
Escaping
Substituted values are escaped for where they land; the text you write yourself is never touched.
- Telegram (HTML): values are HTML-escaped, so a token named
<b>EVIL</b>prints as text. - HTTP JSON bodies: values are JSON-escaped (quotes, newlines). Write strings in quotes:
"to": "{{trigger.to}}"; numbers without:"amount": {{trigger.amount_decimal}}. - Google Sheets: a value that would start a formula (=, +, -, @) is written as text; plain numbers stay numbers.
Limits
A template has at most 10,000 characters and 200 variables; a rendered result at most 20,000 characters.