Skip to main content

Flows

Flows are automation workflows that run when something happens to a record — or when you trigger them manually. Think of them as lightweight pipelines: an event fires, steps execute in order, data flows through.

Trigger types​

TriggerWhen it fires
record.createdA new record is created in the target entity
record.updatedA record is updated
record.deletedA record is deleted
manualYou trigger it explicitly

Each flow watches one entity. Set the entity in triggerConfig.

Step types​

Steps run in sequence. Each step receives the record data and can pass transformed data to the next.

Step typeWhat it does
http_requestSend an HTTP request (method, url, headers, body)
send_emailSend an email (to, subject, body)
create_recordCreate a record in any entity
update_recordUpdate a record
conditionBranch logic — if the condition fails, remaining steps are skipped
transformModify data between steps

Interpolation​

Use {{field}} to reference record data in any step config. The field name matches the record's field key.

{
"type": "send_email",
"config": {
"to": "{{customer_email}}",
"subject": "Order {{order_number}} confirmed",
"body": "Hi {{customer_name}}, your order is confirmed."
}
}

For sensitive values, use {{secret:name}} to reference encrypted secrets. See Secrets.

Creating a flow​

MCP Tool: create_flow (Profile: advanced)

create_flow({
name: "notify-critical-tickets",
description: "Slack alert when a critical ticket comes in",
triggerType: "record.created",
triggerConfig: { entity: "tickets" },
steps: [
{
type: "condition",
config: { field: "priority", operator: "=", value: "critical" }
},
{
type: "http_request",
config: {
method: "POST",
url: "https://hooks.slack.com/services/...",
headers: { "Content-Type": "application/json" },
body: { "text": "Critical ticket: {{title}} from {{customer_email}}" }
}
}
],
isActive: true
})

This flow watches the tickets entity. When a record is created with priority = critical, it sends a POST to Slack with the ticket title and customer email.

Listing flows​

MCP Tool: list_flows (Profile: advanced)

list_flows()

Returns all flows for the tenant with their status, trigger config, and step count.

Updating a flow​

MCP Tool: update_flow (Profile: advanced)

update_flow({
flowId: "flow_01HXYZ...",
name: "notify-critical-tickets-v2",
steps: [...]
})

Pass only the fields you want to change.

Deleting a flow​

MCP Tool: delete_flow (Profile: advanced)

delete_flow({ flowId: "flow_01HXYZ..." })

Deletion is immediate and irreversible.

Toggling a flow​

MCP Tool: toggle_flow (Profile: advanced)

toggle_flow({ flowId: "flow_01HXYZ...", isActive: false })

Disable a flow without deleting it. Disabled flows don't fire on events.

Secrets in flows​

Reference encrypted secrets with {{secret:name}} anywhere in step configs. Useful for API keys, tokens, and credentials you don't want hardcoded.

{
"type": "http_request",
"config": {
"method": "POST",
"url": "https://api.example.com/notify",
"headers": {
"Authorization": "Bearer {{secret:external_api_key}}"
},
"body": { "message": "New record: {{title}}" }
}
}

Set secrets using the set_secret MCP tool. Secrets are encrypted at rest and never returned in API responses. See Secrets for details.

Example: email on new signup​

A flow that sends a welcome email when a user signs up:

create_flow({
name: "welcome-email",
triggerType: "record.created",
triggerConfig: { entity: "users" },
steps: [
{
type: "send_email",
config: {
to: "{{email}}",
subject: "Welcome to the platform",
body: "Hi {{name}}, thanks for signing up."
}
}
],
isActive: true
})