Node types
Every workflow is built from nodes. Each node has a
type that defines how Flowker processes it at runtime.
trigger
A trigger node is an execution entry point. Draft workflows can be incomplete, but activation requires at least one trigger node. When an execution starts through a trigger, the engine enters at that node and routes from it. The examples on this page show node topology only. A real trigger node also carries atriggerType and that trigger’s configuration in its data — see Configuring a webhook trigger or Running a workflow on a schedule.
executor
Calls an external service through a provider configuration. This is the core building block for integrating with fraud engines, payment providers, notification services, and other external systems. The examples on this page show node topology only. A real executor node also carries aproviderConfigId in its data, plus an executorId naming the catalog executor it invokes. A node that calls an operation of an uploaded OpenAPI document omits the executorId and carries operation_path and operation_method instead. See the Integration guide.
conditional
Evaluates a condition against the execution context and routes to different branches based on the result. Use conditional nodes to implement branching logic, for example, routing to an approval path when risk is high, or continuing directly when it is low. The condition lives in the node’sdata.condition. A free-text expression evaluates to a boolean and produces the output handle true or false; each outgoing edge declares which handle it follows via sourceHandle. Conditional nodes built in the Console use a structured, case-based condition where each case routes to its own output handle — see the Canvas editor.
action
Represents a synchronous internalset_output operation. It can write an interpolated output value and, optionally, override the synchronous HTTP response status. It does not provide a built-in pause, generic event emission, or a generic state-change operation.
Edges
Edges connect nodes and define execution paths. Each edge includes the following fields:
Example edge
data.condition and follows the single outgoing edge whose sourceHandle matches the branch outcome; if no edge matches, that branch ends. Every other node type follows all of its outgoing edges when it completes successfully.
Status transitions
Workflows follow a well-defined lifecycle. Understanding these transitions is key to safely deploying and evolving workflows.
- draft — The initial state. All modifications (adding nodes, editing edges, changing configuration) are only allowed in
draftstatus. - active — A workflow that has been activated. It can be executed. No modifications are permitted while active.
- inactive — A workflow that has been deactivated. It can no longer be executed, but it can be moved back to
draftfor editing.
Rules
- Only a
draftworkflow can be activated (transition:draft → active). - Only an
activeworkflow can be deactivated (transition:active → inactive). - Only an
inactiveworkflow can be moved back to draft (transition:inactive → draft). - Attempting an invalid transition returns error
FLK-0102. - Attempting to modify a workflow that is not in
draftreturns errorFLK-0103.
Moving an inactive workflow back to draft
If you deactivated a workflow and want to edit it again, move it back todraft by calling POST /v1/workflows/{id}/draft. This makes the workflow editable without needing to clone it.
This is useful when you deactivated a workflow by mistake or when you want to iterate on an existing workflow instead of creating a copy.
Only inactive workflows can be moved to draft. If you need to modify an active workflow without taking it offline, use the clone approach described below.
Iterating safely with clone
To modify an active workflow, clone it first. Cloning creates a newdraft from any status, copying all nodes and edges. You can then update, test, and activate it without impacting the current version.
This is the recommended approach for production versioning.
Technical limits
Keep these limits in mind when designing complex flows. Workflows with more than ~50 nodes usually indicate that the flow should be split into smaller, composable workflows.
Common patterns
Sequential
The simplest pattern. Nodes execute in a linear sequence. Use this when each step depends on the previous one and no branching is required.Conditional branching
Aconditional node evaluates its condition and routes execution accordingly. The branch outcome selects which outgoing edge is followed, matched by sourceHandle.
Real-world examples
Anti-fraud check
A transaction arrives, a fraud score is retrieved, and execution is routed to approval or rejection.Payment orchestration
A linear flow that validates incoming payment data, routes it to the appropriate provider, and sends a confirmation.KYC onboarding
Use a workflow to submit a document check to an external approval system. Flowker does not have a built-in pause: for asynchronous human review, start a later, separate workflow execution after your approval system publishes its decision.Manual approval flow
A submission is sent for review. An executor retrieves the review decision from the external system. A conditional node then routes to either the approved or rejected path. Flowker executions run straight through — there is no built-in pause step, so a human decision must come from an external system the workflow queries.Best practices
Node naming conventions
Use descriptive, action-oriented names that communicate what the node does, not what type it is.- correct:
Validate Payment Data,Get Fraud Score,Notify Customer,Get Approval Decision - wrong:
executor1,conditional node,node3
Condition expressions
Free-text conditions on conditional nodes are evaluated against the execution context at runtime. Keep them simple and explicit:- Use direct field comparisons:
<nodeId>.status == 'approved' - Use numeric comparisons:
<nodeId>.riskScore < 70 - Use boolean fields:
<nodeId>.reviewRequired == true - Combine with
AND/ORwhen needed:<nodeId>.score < 70 AND <nodeId>.verified == true
conditional node a clear name that encapsulates the decision.
A condition that is missing or fails to evaluate at runtime fails the execution (FLK-0105 identifies an invalid conditional expression). Always test conditions before activating a workflow.
Error handling strategies
Design workflows to handle failure explicitly:- Add rejection paths from
conditionalnodes for every decision point that can fail. - Use separate
executornodes for retry logic or fallback providers. - Name error paths clearly (e.g.,
Reject and Notify,Fallback to Manual Review) so execution records are self-explanatory.
Avoiding cycles
Flowker uses a DFS-based cycle guard at runtime. If a cycle is detected during execution, the workflow fails withFLK-0508. Cycles are not caught at design time, so validate your edge structure before activating.
Rules to prevent cycles:
- Edges must always point forward in the flow — never back to a previously executed node.
- Review the graph visually before activating any workflow with branching or merging paths.
- If a retry or loop is needed, model it as a separate workflow invocation, not a back-edge in the current graph.
Versioning via clone
Never edit an active workflow directly. Instead:1
Clone the workflow (creates a new
draft with all nodes and edges copied).2
Make your changes in the draft.
3
Validate or preview the draft. Activate it before running execution tests.
4
Activate the new version.
5
Deactivate the old version if it is no longer needed.
Error reference
The following error codes are relevant to workflow design and execution:

