How execution flow works
Flovello pipelines are made up of nodes connected by two distinct types of connections. Understanding the difference is the key to building pipelines that do exactly what you intend.
The two kinds of pins
Every node in Flovello has one or more pins on its sides. There are two categories:
Execution pins (white triangles)
Execution pins look like small white triangles pointing in the direction execution flows. They define the order in which nodes run. An execution connection from node A to node B means "run node B after node A finishes". Most side-effecting nodes — nodes that write to a log, send an email, or make an HTTP request — have execution pins. These are called action nodes.
The Log message node, for example, has one execution input and one execution output. The execution input fires the node; after the log is written, the execution output fires to continue the pipeline.
The Branch node has one execution input and two execution outputs: true and false. Exactly one output fires per execution, depending on the value of the condition input.
Argument pins (colored circles)
Argument pins look like colored circles. Their color indicates the data type: pink for strings, green for integers, red for booleans, and so on. Argument connections pass data values from one node's output to another's input. They have no effect on execution order by themselves.
Pure nodes
A pure node is a node that has no side effects and no execution pins. It is simply a function that takes inputs and returns outputs. The Equals node is a good example — it takes two values and returns a boolean. It has no white triangles because it does not need to participate in execution order.
Pure nodes are evaluated lazily: Flovello only runs a pure node when a downstream action node actually needs its output. If nothing ever reads the result of an equals node, it is never run.
How lazy evaluation works
Consider this example pipeline:
- A Receive HTTP trigger fires.
- The
methodoutput is wired into anequalsnode that checks whether it equals"POST". - The
resultofequalsis wired into theconditioninput of a Branch node. - The
truepin of branch leads to a "Log message" node; thefalsepin leads to a "Fail" node.
Here is what happens at runtime:
- Flovello starts executing from the trigger's execution pin.
- It reaches the
branchnode and needs to evaluatecondition. conditionis connected toequals.result, so Flovello evaluatesequalsnow — readingreceiveHTTP.methodas a side effect.equalsreturnstrueorfalse.branchfires either thetrueorfalseexecution pin.
Notice that equals itself is never explicitly scheduled — it runs only because branch needed its output. This is lazy evaluation.
Why this design?
Separating execution order from data flow lets you express complex logic clearly:
- Use argument connections freely to wire data wherever it is needed, without worrying about whether that computation "runs at the right time". Pure nodes run exactly when their output is first consumed.
- Use execution connections only where the side effect order matters — writing logs, sending requests, looping over items.
This mirrors how functional programming languages separate pure functions from impure (side-effecting) ones, and it is what makes Flovello pipelines both easy to read and easy to reason about.
Example: checking request method before logging
Equals is pure — no execution pins. It reads method from Receive HTTP and feeds result into Branch's condition, but Flovello only evaluates it lazily, the moment Branch actually reads that input.
The equals node has no execution pins. It is evaluated lazily when branch reads its condition input. The branch node has one execution input (from the trigger) and two execution outputs. Only one output fires.
Summary
Execution pin
A white triangle that controls when a node runs. Wire one to enforce execution order.
Argument pin
A colored circle that passes data between nodes. Color indicates the data type.
Action node
Has side effects. Execution pins wire it into the flow and control when it runs, and it can also have argument pins for data.
Pure node
No side effects — it only uses argument pins, never execution pins. Evaluated lazily when its output is needed.
For more detail on individual nodes, visit the Node reference.