Flow Step Types
Calimatic Connect flows support 13 step types. Each step processes data from the trigger or previous steps and passes its output to the next step in the chain.
Core Steps
Action
Execute a named operation on a connected provider. Choose a provider type, select an action (e.g. "send_email", "create_contact"), and map input fields using template expressions.
// Input mapping with template expressions
{
"to": "{{trigger.email}}",
"subject": "Welcome, {{trigger.name}}!",
"body": "Thanks for signing up."
}Filter
Continue the flow only if a condition is true. If the condition is false, the flow stops early (silently, not as an error). Supports ==, !=,>, <, >=, <=.
trigger.email != '' and step_1.success == true
Delay
Pause execution for a specified number of milliseconds (max 30,000ms in serverless mode). Useful for rate limiting between API calls.
Formatter
Transform a value. Operations: identity, uppercase,lowercase, trim, to_number.
Branching & Loops
Branch (N-way Paths)
Route execution down one of multiple paths based on conditions. Define any number of named paths, each with an expression. The first matching path is taken. An elsepath acts as the fallback when no condition matches.
// config.paths — evaluated in order
[
{ "label": "vip", "expr": "trigger.plan == 'enterprise'" },
{ "label": "paid", "expr": "trigger.plan != 'free'" },
{ "label": "else", "expr": "" }
]Child steps are assigned to a path via config.parentStepId andconfig.branchPath (set to the path label).
Loop
Iterate over an array from the context. For each item, the loop's child steps execute. Access the current item via {{step_N_item.value}} and the index via{{step_N_item.index}}.
Plan limits: Free: 10 iterations, Starter: 50, Professional: 200, Team+: 1,000.
// config
{ "arrayPath": "trigger.items" }
// Inside the loop, each iteration has:
// step_N_item.value — the current array element
// step_N_item.index — 0-based index
// step_N_item.total — array lengthSub-Flow
Execute another flow as a step. The sub-flow receives this step's resolved input as its trigger data. The sub-flow's output becomes this step's output.
Data Steps
Table Lookup
Look up a single row in a Table by matching a column value. Output: {{step_N.row.column}} and {{step_N.found}}.
Table Upsert
Insert or update a row by external key. If a row with the same key exists, it's updated; otherwise a new row is created. Output includes {{step_N.created}}.
Table Write
Append a new row unconditionally. Use for event logs, audit trails, and append-only data.
Record to Table
Copy a Record into a user Table via upsert. Useful for materializing ingested webhook data into structured tables.
Advanced Steps
Code
Run custom JavaScript in a sandboxed environment. The sandbox has access to input(the resolved input mapping) and must set output to return data. Console output is captured in _logs.
Security: No access to require, process,fs, net, or any Node.js globals. 5-second timeout.
// Example: transform and validate data
const name = input.name || 'World';
const email = input.email || '';
const isValid = email.includes('@');
output = {
greeting: `Hello, ${name}!`,
isValid,
normalized_email: email.toLowerCase().trim(),
};AI
Call an AI model (Anthropic Claude or OpenAI GPT) with a prompt template. Supports system prompts, configurable temperature, and model selection.
// config
{
"provider": "anthropic",
"model": "claude-sonnet-4-5-20241022",
"systemPrompt": "You are a lead qualification assistant.",
"temperature": "0.3"
}
// input (supports templates)
{
"prompt": "Qualify this lead:\nName: {{trigger.name}}\nCompany: {{trigger.company}}\nScore 1-10."
}
// output
{
"response": "Score: 8/10. Enterprise company...",
"usage": { "input_tokens": 45, "output_tokens": 120 }
}Retry Configuration
Any step (except filter and branch) can be configured with automatic retry on failure. Set via the step's retry config:
- maxRetries (0-5): number of retry attempts after the first failure
- backoffMs: initial delay before first retry (milliseconds)
- backoffMultiplier: multiplier applied to delay after each retry (exponential backoff)
// retry_config on a step
{
"maxRetries": 3,
"backoffMs": 1000,
"backoffMultiplier": 2
}
// Retry 1: 1000ms, Retry 2: 2000ms, Retry 3: 4000msTemplate Expressions
All step inputs support template expressions to reference data from the trigger or previous steps:
{{trigger.field}}— data from the trigger event{{step_1.field}}— output from step 1{{step_2.row.email}}— nested field from step 2{{step_N_item.value}}— current loop iteration item