Flows
Node Types
Actions

Action Nodes

Nodes that perform actions like sending messages, making calls, and responding to requests.

Available Nodes

Respond
Send response to caller
Send Email
Send emails
Send SMS
Send SMS messages
Voice Agent
Make AI phone calls

Respond

Respond

Send a response back to the trigger (webhook or interface event).

Configuration:

FieldTypeDescription
statusCodenumberHTTP status code (default: 200)
contentTypeselectapplication/json, text/plain, or text/html
headerskeyvalueResponse headers
bodyexpressionResponse body

Example - JSON Response:

{
  "id": "respond-1",
  "type": "respond",
  "label": "Return Data",
  "config": {
    "statusCode": 200,
    "contentType": "application/json",
    "body": "{{ { success: true, data: $node.fetch_data-1.data } }}"
  }
}

Example - Return Previous Node Output:

{
  "config": {
    "statusCode": 200,
    "body": "{{ $input }}"
  }
}

Example - Custom Success Message:

{
  "config": {
    "statusCode": 200,
    "body": "{{ { success: true, id: $node.table_insert-1.record.id } }}"
  }
}

Send Email

Send Email

Send an email via your configured email provider (Resend or Gmail).

Configuration:

FieldTypeDescription
emailConfigobjectEmail configuration object

Email Config Fields:

  • to - Recipient email(s)
  • from - Sender email (must be verified domain for Resend)
  • subject - Email subject
  • body - Email body (HTML or plain text)
  • bodyType - html or text
  • replyTo - Reply-to address (optional)

Example:

{
  "id": "send_email-1",
  "type": "send_email",
  "label": "Send Welcome Email",
  "config": {
    "emailConfig": {
      "to": "{{ $input.email }}",
      "from": "notifications@yourcompany.com",
      "subject": "Welcome to {{ $input.companyName }}!",
      "bodyType": "html",
      "body": "<h1>Welcome, {{ $input.name }}!</h1><p>Thanks for signing up.</p>"
    }
  }
}

Output:

  • {{ $node.send_email-1.success }} - Boolean success status
  • {{ $node.send_email-1.messageId }} - Email message ID

Required: Configure email integration in Settings → Integrations.


Send SMS

Send SMS

Send an SMS via Twilio.

Configuration:

FieldTypeDescription
fromstringTwilio phone number (select from your account)
toexpressionRecipient phone number (E.164 format)
messagetextMessage content (max 1600 characters)

Example:

{
  "id": "send_sms-1",
  "type": "send_sms",
  "label": "Send Verification Code",
  "config": {
    "from": "+15551234567",
    "to": "{{ $input.phone }}",
    "message": "Your verification code is: {{ $input.code }}. Valid for 10 minutes."
  }
}

Output:

  • {{ $node.send_sms-1.success }} - Boolean success status
  • {{ $node.send_sms-1.sid }} - Twilio message SID

Required: Configure Twilio credentials in Settings → Credentials.


Voice Agent

Voice Agent

Make an outbound AI voice call using ElevenLabs.

Configuration:

FieldTypeDescription
agentIdstringElevenLabs agent ID
phoneNumberIdstringElevenLabs phone number resource ID
toexpressionPhone number to call
dynamicVariablesjsonContext data for the call

Example:

{
  "id": "voice_agent-1",
  "type": "voice_agent",
  "label": "Appointment Reminder",
  "config": {
    "agentId": "agent_abc123",
    "phoneNumberId": "pn_xyz789",
    "to": "{{ $input.phone }}",
    "dynamicVariables": {
      "customer_name": "{{ $input.name }}",
      "appointment_time": "{{ $input.appointmentTime }}"
    }
  }
}

Output (after call completes):

  • {{ $node.voice_agent-1.call_result.conversation_id }} - Conversation ID
  • {{ $node.voice_agent-1.transcript }} - Full call transcript
  • {{ $node.voice_agent-1.data_collection }} - Collected data
  • {{ $node.voice_agent-1.call_duration_secs }} - Call duration
  • {{ $node.voice_agent-1.status }} - Call status

Getting Agent and Phone IDs:

# List voice agents
node bin/lux-cli/lux.js voice-agents list
 
# List phone numbers
node bin/lux-cli/lux.js voice-agents phones

See Voice Agents for agent configuration.


Logic Nodes

If

If

Branch workflow based on conditions.

Configuration:

FieldTypeDescription
conditionsobjectCondition rules

Conditions Format:

{
  "conditions": {
    "combineWith": "and",
    "rules": [
      { "value": "{{ $input.status }}", "dataType": "string", "operator": "equals", "compareTo": "active" }
    ]
  }
}

Available Operators:

  • String: equals, not_equals, contains, starts_with, ends_with
  • Number: equals, not_equals, gt, gte, lt, lte
  • Boolean: is_true, is_false

Output Ports:

  • true - Condition passes
  • false - Condition fails

Example:

{
  "id": "if-1",
  "type": "if",
  "label": "Check VIP Status",
  "config": {
    "conditions": {
      "combineWith": "and",
      "rules": [
        { "value": "{{ $input.totalOrders }}", "dataType": "number", "operator": "gte", "compareTo": "100" }
      ]
    }
  }
}

Wait

Wait

Pause workflow execution.

Configuration:

FieldTypeDescription
waitTypeselectduration or until
durationValuenumberWait value (for duration)
durationUnitselectseconds, minutes, hours, days
untilTimeexpressionISO timestamp to wait until

Example - Wait 5 Minutes:

{
  "config": {
    "waitType": "duration",
    "durationValue": 5,
    "durationUnit": "minutes"
  }
}

Throw Error

Throw Error

Explicitly fail the workflow with a custom error.

Configuration:

FieldTypeDescription
messageexpressionError message
errorCodestringError code (optional)

Example:

{
  "id": "throw_error-1",
  "type": "throw_error",
  "label": "Validation Failed",
  "config": {
    "message": "Invalid input: {{ $input.field }} is required",
    "errorCode": "VALIDATION_ERROR"
  }
}

Best Practices

Return Meaningful Responses

{
  "body": "{{ { success: true, id: $node.table_insert-1.record.id, message: 'Created successfully' } }}"
}

Handle Errors

Use If nodes to check for failures before responding:

Action → If (success) → Respond Success
                     ↘ Respond Error

Rate Limiting

Use Wait nodes between bulk operations:

Loop → Send Email → Wait 1 second → Next

See Also: