when <condition> -> value rules plus a fallback. The flow checks the rules in order and uses the first one that matches. If none match, it uses the fallback.
Conditional and dynamic values are an Advanced mode feature. Simple mode keeps any that exist (they render the same on device) but shows them as read-only and does not let you author new ones. The one curated exception is the Required toggle, which compiles to a conditional
disabled value for you. Switch to Advanced to bind properties to variables and conditions.Static, interpolated, or conditional
A property value is one of three things:- Static. One fixed value. This is the default.
- Interpolated (text only). A string with
{{key}}tokens that are replaced with variable values. Interpolation does substitution only. See Variables. - Conditional. An ordered set of rules, each with a condition and a result value, plus a fallback. This is what “dynamic value” means on this page.
Make a property dynamic
Many fields in the properties panel can become dynamic. The button’s Disabled toggle, text Color, a label, and similar properties show a control to switch from a single value to a rule-based value. When you open the dynamic value editor you get:- Driving variable. Pick the variable most of your rules compare against. New rules start pre-pointed at it, which saves repeating the choice.
- Value stack. The ordered list of rules. Each rule has a Result value and a When this condition is true section. Drag rules to reorder them; order is priority, top to bottom.
- Fallback value. The value used when no rule matches. This is the
elseof the conditional. - Add rule, a preset picker for common patterns, and Paste rule if you copied one from another property.
The condition builder
Each rule has one condition: a variable, an operator, and (for most operators) a value to compare against. The operators offered depend on the variable’s type.| Variable type | Operators offered |
|---|---|
| String | equals, does not equal, contains, does not contain, starts with, ends with, is empty, is not empty |
| Number | equals, does not equal, greater than, less than, at least (>=), at most (<=) |
| Boolean | is ON, is OFF |
| List | contains, does not contain, is empty, is not empty |
is empty and is not empty need no value. Boolean conditions are just is ON / is OFF, with no value to type.
For anything more complex, open Advanced conditions. It lets you group rules with AND (“all conditions must match”) and OR (“any condition must match”). Most flows never need this.
First match wins
Rules are evaluated top to bottom and the first match wins. Put the most specific rule first and broader rules below it. Anything that matches no rule falls through to the fallback. A conditional value is stored like this:You cannot use a ternary in interpolation
Swapping a value based on a condition is exactly what a conditional value is for:{{ }} only ever substitutes a variable’s value. There is no logic inside the braces.
Example
A Continue button that disables until a plan is chosen. Make the button’s Disabled property dynamic, driven byselected_plan (a String variable that starts empty):
- when
selected_planis empty ->true - else ->
false
selected_plan, then it enables.
A score readout that changes color at a threshold. Make a text’s Color dynamic, driven by a score Number variable:
- when
scoreat least80-> green - when
scoreat least50-> amber - else -> red
80 rule must come before the 50 rule. If you put 50 first, a score of 90 would still match 50 and never reach green.
Common mistakes
- Reaching for a ternary. There is no
? :inside{{ }}. Use a conditional value with two cases. - Case order bugs. A broad rule above a specific one shadows it. Order rules from most specific to least specific.
- Comparing a String with a number operator. Operators are filtered by the variable’s type, so a String variable never offers
greater than. If you need numeric comparison, make the variable a Number. - Forgetting the fallback. If nothing matches and there is no fallback, the property has no value. Always set a sensible fallback.