TurboFlowTurboFlow Triggers and Actions

TurboFlow Triggers and Actions

Reference for every TurboFlow trigger, action, and logic node, including field types, options, outputs, and expression usage.

{
  "email": "{{trigger.body.email}}",
  "contactId": "{{talkturo_upsert_contact.contact_id}}",
  "httpStatus": "{{http_request.status}}",
  "responseBody": "{{http_request.body}}",
  "matched": "{{condition.result}}"
}

Build workflows with triggers, actions, and logic nodes

TurboFlow workflows start with a trigger, move through one or more actions, and branch with logic nodes. This reference documents every available node type, the exact configuration fields each node accepts, and the output each node exposes to downstream nodes.

Use expressions in any configurable field to read values from earlier nodes. Wrap references in {{ }} syntax, such as {{trigger.body.email}} or {{talkturo_upsert_contact.contact_id}}.

How node outputs flow through a workflow

Each node adds its result to the workflow context under that node's ID. Downstream nodes can reference those values with expressions, which lets you pass trigger payloads into actions, reuse action results, and branch on logic outcomes.

Expression syntax

Expressions use double curly braces around a path. The path usually starts with a node ID, followed by the output field you want to read.

The expression picker shows values that are available from upstream nodes. If a value does not appear there, the current node cannot access it yet.

Common expression examples

ExpressionReads
{{trigger.body.email}}An incoming webhook field named email
{{trigger.body.context.call_id}}Voice context attached to a tool call
{{http_request.body.status}}A nested field inside an HTTP response body
{{talkturo_upsert_contact.contact_id}}The CRM contact ID returned by the upsert action
{{condition.result}}The boolean result of a condition node

Trigger nodes

Triggers start a workflow. Every flow uses a trigger as its entry point, and some triggers also verify incoming events from external integrations.

webhook_trigger

webhook_trigger is the universal entry point for every flow. It supports direct external webhooks and optional voice tool exposure for AI assistants.

What this trigger does

  • External webhook receiver — any external system can send a POST request to the flow's trigger URL.
  • Voice tool — when voice_tool.exposed is enabled, the same trigger is registered as a callable tool for voice assistants.

Configuration fields

voice_tool.exposedboolean
Required

Whether the trigger is visible to voice assistants as a callable tool.

voice_tool.tool_namestring

Tool name the LLM calls. Use snake case and keep the name at 64 characters or fewer, such as book_calendly_meeting.

voice_tool.tool_descriptionstring

Natural-language description shown to the LLM. Length must be between 10 and 1024 characters.

voice_tool.parametersParameterDef[]

Typed input parameters exposed to the LLM when the trigger acts as a voice tool.

ParameterDef fields

Use one ParameterDef object for each tool parameter.

namestring
Required

Parameter name in snake case.

typestring
Required

Parameter type. Supported values are string, number, boolean, array, and object.

Allowed values:stringnumberbooleanarrayobject
descriptionstring

Hint shown to the LLM. Maximum length is 500 characters.

sourcestring
Required

Where the parameter value comes from. Use ai when the LLM should generate the value, or static when the parameter always uses a fixed static_value.

Allowed values:aistatic
requiredboolean

Whether the LLM must provide this parameter. Use this field only when source is ai.

static_valueunknown

Hardcoded value used when source is static.

itemsobject

JSON Schema hint for array item structure. Use this when type is array.

propertiesobject

JSON Schema hint for object shape. Use this when type is object.

Output fields

Downstream nodes can read incoming trigger data from trigger.body.

bodyobject
Required

The parsed incoming request body.

body.contextobject

Voice-call context when the trigger runs as a voice tool. Common fields include call_id, contact_id, and assistant_id.

body.<param_name>unknown

One field for each incoming webhook field or tool parameter.

When you expose a webhook trigger as a voice tool, the tool inputs still arrive through trigger.body. Read them with expressions such as {{trigger.body.meeting_type}}.

Example voice tool configuration

{
  "voice_tool": {
    "exposed": true,
    "tool_name": "book_calendly_meeting",
    "tool_description": "Books a meeting for the caller and returns the booking result",
    "parameters": [
      {
        "name": "full_name",
        "type": "string",
        "description": "Caller full name",
        "source": "ai",
        "required": true
      },
      {
        "name": "email",
        "type": "string",
        "description": "Best email address for the meeting invite",
        "source": "ai",
        "required": true
      },
      {
        "name": "meeting_type",
        "type": "string",
        "description": "Meeting type to book",
        "source": "static",
        "static_value": "demo_call"
      }
    ]
  }
}

Integration triggers

Integration triggers start a workflow from verified events sent by external systems.

Supported integration triggers

IntegrationTrigger IDEventsVerification
Cal.combooking_eventsBOOKING_CREATED, BOOKING_RESCHEDULED, BOOKING_CANCELLED, BOOKING_REJECTED, BOOKING_REQUESTEDHMAC-SHA256 via X-Cal-Signature-256
Calendlyinvitee_eventsinvitee.created, invitee.canceledHMAC-SHA256 via Calendly-Webhook-Signature
Slackevent_receivedmessage, app_mention, reaction_added, reaction_removed, channel_created, member_joined_channel, member_left_channel, file_sharedSlack signing secret
Metalead_receivedleadgenHMAC via X-Hub-Signature-256 using META_APP_SECRET

Meta trigger configuration

Use these fields when configuring the Meta lead trigger.

page_idstring
Required

Meta page ID that owns the lead form webhook.

form_idstring

Optional form filter. When set, the trigger only accepts events for the specified form.

Action nodes

Actions perform work after a trigger fires. They can call external APIs, create or update CRM data, start outbound calls, or shape the workflow's final response.

http_request

http_request sends an HTTP request to any reachable URL and exposes the full response to downstream nodes.

Configuration fields

urlurl
Required

Target URL for the request.

methodstring
Required

HTTP method. Default is POST.

Allowed values:GETPOSTPUTPATCHDELETE
headersjson

Additional request headers.

bodyunknown

Request body. TurboFlow automatically JSON-encodes the value.

timeout_secondsnumber

Request timeout in seconds. Allowed range is 1 to 60. Default is 30.

Output fields

statusnumber
Required

HTTP status code returned by the target server.

okboolean
Required

true when the response status is in the 2xx range.

bodyunknown

Parsed JSON response body when the response is JSON, or raw text otherwise.

headersjson

Response headers.

Example configuration

{
  "url": "https://api.acmecrm.com/v1/leads",
  "method": "POST",
  "headers": {
    "Authorization": "Bearer dkai_example_9xmk7q2r",
    "Content-Type": "application/json"
  },
  "body": {
    "email": "{{trigger.body.email}}",
    "name": "{{trigger.body.full_name}}"
  },
  "timeout_seconds": 30
}

talkturo_upsert_contact

talkturo_upsert_contact creates or updates a CRM contact. Matching happens by phone first, then by email.

Configuration fields

first_namestring
Required

Contact first name or full name.

last_namestring

Contact last name.

phonestring

Phone number for the contact. The platform normalizes this value to E.164.

emailstring

Email address for the contact.

sourcestring

Contact source value.

Allowed values:manualimportcampaigninbound_callweb_formreferralother
company_idstring

Talkturo company ID.

tagsstring[]

List of tags to apply to the contact.

Output fields

contact_idstring
Required

Talkturo contact ID.

createdboolean
Required

true when the action created a new contact. false when it updated an existing contact.

Example configuration

{
  "first_name": "{{trigger.body.first_name}}",
  "last_name": "{{trigger.body.last_name}}",
  "phone": "{{trigger.body.phone}}",
  "email": "{{trigger.body.email}}",
  "source": "web_form",
  "tags": [
    "demo-request",
    "priority-lead"
  ]
}

talkturo_call_contact

talkturo_call_contact places an outbound AI call through a campaign.

Configuration fields

contact_idstring
Required

Talkturo contact ID to call.

campaign_idstring
Required

Campaign ID that provides the assistant, caller ID, and retry rules.

timing_modestring

When to place the call. Default is immediate.

Allowed values:immediatedelayschedule
delay_minutesnumber

Minutes to wait before placing the call when timing_mode is delay. Allowed range is 0 to 43200.

scheduled_atstring

Absolute call time in ISO 8601 format when timing_mode is schedule.

Output fields

campaign_contact_idstring
Required

Campaign contact record ID created or used for the outbound call.

call_idstring | null

Call ID when the call is created immediately, or null when no live call record exists yet.

statusstring
Required

Current request status for the outbound call.

Set delay_minutes only for delay mode, and set scheduled_at only for schedule mode. TurboFlow still allows expressions in both fields, which helps when the call time comes from upstream data.

Example configuration

{
  "contact_id": "{{talkturo_upsert_contact.contact_id}}",
  "campaign_id": "cmp_7af42c1d9e",
  "timing_mode": "schedule",
  "scheduled_at": "{{trigger.body.follow_up_time}}"
}

format_output

format_output shapes the JSON object returned by the workflow to the voice assistant.

Configuration fields

modestring

Output mode. Default is fields.

Allowed values:fieldsjson
fieldsarray

List of output rows in fields mode. Each row contains a key and value, and each row becomes one top-level key in the returned object.

templateunknown

Full returned object in json mode.

Output fields

outputobject
Required

User-defined object created from fields mode or returned directly from template in json mode.

Example configuration

{
  "mode": "fields",
  "fields": [
    {
      "key": "contact_id",
      "value": "{{talkturo_upsert_contact.contact_id}}"
    },
    {
      "key": "created",
      "value": "{{talkturo_upsert_contact.created}}"
    },
    {
      "key": "message",
      "value": "Contact saved and ready for follow-up"
    }
  ]
}

Logic nodes

Logic nodes control which path the workflow follows next.

condition

condition evaluates two operands and sends the workflow down the true or false handle.

Configuration fields

leftunknown
Required

Left operand. This can be a literal value or an expression.

operatorstring
Required

Comparison operator. Default is eq.

rightunknown

Right operand. This field is ignored for unary operators. Current supported operators are binary.

Operators

OperatorTypeDescription
eqbinaryLoose equality
neqbinaryNot equal
gtbinary numericGreater than
gtebinary numericGreater than or equal
ltbinary numericLess than
ltebinary numericLess than or equal
containsbinary stringString contains substring
starts_withbinary stringString starts with
ends_withbinary stringString ends with

Output fields

resultboolean
Required

Boolean result of the condition evaluation.

Example configuration

{
  "left": "{{http_request.status}}",
  "operator": "gte",
  "right": 200
}

A condition node usually works best when left and right are already normalized to the same type. For example, compare numbers to numbers and strings to strings.

Node reference by purpose

Use this table to choose the right node quickly.

GoalNode type
Receive any inbound payload or expose a voice toolwebhook_trigger
Start a flow from Cal.com, Calendly, Slack, or MetaIntegration trigger
Call an external APIhttp_request
Create or update a CRM contacttalkturo_upsert_contact
Launch an outbound AI calltalkturo_call_contact
Return a custom JSON payloadformat_output
Branch based on workflow datacondition