What you’ll learn
By the end of this tutorial, you’ll learn how to:- Define if-conditions in your workflows
- Define any / all conditions in your workflows
- Run actions in a loop
If-conditions
Every action can be turned into a conditional action. Under theIf condition / Loops tab, you can specify a condition that determines whether the action should be executed.
For example, to run the Get result action only if the URL submission was successful, go to the If condition / Loops tab and specify the following in the Run if input:

Conditional expressions are one of the most powerful features in Tracecat.
Combine binary operators and in-line functions to express complex conditions with ease.
&& and || operators:
Combined Conditions
Any / All Conditions
Consider the case where you have multiple upstream actions that connect to one downstream joining node. You can control whether the joining node should run ifall or any of the upstream actions succeed or fail.
Configure this by going to the If condition / Loops tab of the joining node and setting the join_strategy option to all or any.

Loops
Every action can be turned into a looped action. Under theIf condition / Loops tab, you can specify loop expressions to iterate over a list of items and run the action for each item.
Example
Define the loop
Define a loop expression using the 
${{ for var.some_variable_name in some_list }} syntax.
The variable name can be anything you want, but we recommend using a name that makes sense for the items in the list.In this example, we iterate through a list of numbers send via webhook in TRIGGER.
Use the loop variable
Go back to the action’s 
Inputs tab.
You can now use the loop variable in the action’s inputs using the ${{ var.some_variable_name }} syntax.
During the workflow run, each var.some_variable_name in the loop expression is replaced with the current item in the list.In this example, we use the loop variable in core.transform.reshape action to iterate through a list of numbers and add one to each number.
Do-while loops (core.loop.start + core.loop.end)
Tracecat also supports explicit do-while control flow with core.loop.start and
core.loop.end.
core.loop.startopens the loop region and seeds the current iteration.core.loop.endcloses the loop region and decides whether to continue.
- Iteration is 0-based.
- Access it via
${{ ACTIONS.<loop_start_ref>.result.iteration }}.
core.loop.endevaluatesconditiononly when reached in normal execution.- If
core.loop.endis reached in skip propagation mode, condition is not evaluated and the loop exits (continue = false).
core.loop.end.conditioncan only reference actions in the loop scope that thecore.loop.endcloses.- Referencing sibling or nested per-item scatter actions is invalid.
- If condition logic depends on scatter work inside the loop, reference the
synchronized
gatheroutput (in loop scope), not the per-item action.
- Skip reaches
loop_startfrom outside the loop region:- The loop unit (
loop_start -> ... -> loop_end) is treated as skipped. - Skip propagation continues downstream from
loop_end.
- The loop unit (
- Skip starts inside the loop region, but another dependency still reaches
loop_end:loop_endexecutes normally.conditionis evaluated as usual.
- Skip starts inside the loop region and all paths into
loop_endare skipped:loop_endacts as a skip boundary (break-like behavior).- Condition is not evaluated.
- Execution continues to downstream nodes after
loop_end.
- Results in the loop body are overwritten when an action runs again.
- If an action is skipped in an iteration, its previous result is retained.
max_iterationsprotects against unbounded loops and fails the run when the limit is exceeded (platform hard cap:2048).
