Automation Builder Guide
Build automated front desk workflows visually with the drag-and-drop Automation Builder.
Overview
The Automation Builder provides a visual canvas where you connect trigger, condition, and action nodes to create workflows. Automations run server-side and execute automatically when their trigger conditions are met.
A typical workflow starts with a trigger node (the event that kicks off the automation), optionally passes through condition nodes (to branch logic), and ends with one or more action nodes (the operations to perform).
Trigger Nodes
Every automation starts with exactly one trigger node. Drag a trigger from the node palette onto the canvas to begin.
| Parameter | Type | Description |
|---|---|---|
call.ended | event | Fires when any call ends. Includes call data, caller info, duration, and summary. |
call.missed | event | Fires when a call is missed or goes unanswered. Includes caller phone and timestamp. |
lead.created | event | Fires when a new lead is added to the system from any source. |
lead.statusChanged | event | Fires when a lead's status changes (e.g. new to contacted). |
appointment.booked | event | Fires when a new appointment is booked. |
appointment.cancelled | event | Fires when an appointment is cancelled. |
appointment.reminder | event | Fires at a configured time before an appointment (e.g. 24 hours). |
schedule | cron | Fires on a cron schedule. Configure the schedule in the node settings. |
{
"id": "trigger_1",
"type": "trigger",
"event": "call.missed",
"conditions": {
"during_hours": true,
"is_new_caller": true
}
}Action Nodes
Action nodes perform operations using FrontDeskOS tools and external services. Connect them to a trigger or condition node to define what happens when the automation runs.
| Parameter | Type | Description |
|---|---|---|
send_email | action | Send an email using a template or custom HTML body. |
send_sms | action | Send an SMS message to a phone number. |
create_lead | action | Create a new lead record with name, phone, source, and notes. |
update_lead | action | Update fields on an existing lead. |
create_callback | action | Create a callback request for the front desk team. |
book_appointment | action | Book an appointment for a contact. |
cancel_appointment | action | Cancel an existing appointment. |
http_request | action | Send an HTTP request to an external URL (webhook). |
delay | action | Pause the workflow for a specified duration (minutes, hours, or days). |
score_lead | action | Run lead scoring and output the score for use in conditions. |
{
"id": "action_1",
"type": "action",
"action": "send_sms",
"config": {
"to": "{{trigger.caller_phone}}",
"message": "Hi {{trigger.caller_name}}, we missed your call! Reply BOOK to schedule an appointment or we'll call you back shortly."
}
}Condition Nodes
Condition nodes branch the workflow into different paths based on data. Each condition has a "true" and "false" output that you connect to different action nodes.
{
"id": "condition_1",
"type": "condition",
"conditionType": "if_else",
"expression": {
"field": "trigger.is_existing_patient",
"operator": "equals",
"value": true
},
"trueBranch": "action_send_welcome_back",
"falseBranch": "action_create_new_lead"
}Building a Workflow
Here is a complete example of a missed-call follow-up workflow that creates a lead, sends an SMS, and schedules a callback:
{
"name": "Missed Call Follow-Up",
"description": "Capture missed calls as leads and send an SMS",
"nodes": [
{
"id": "trigger",
"type": "trigger",
"event": "call.missed",
"conditions": { "during_hours": true }
},
{
"id": "check_existing",
"type": "condition",
"conditionType": "if_else",
"expression": {
"field": "trigger.is_existing_patient",
"operator": "equals",
"value": false
},
"trueBranch": "create_lead",
"falseBranch": "send_sms"
},
{
"id": "create_lead",
"type": "action",
"action": "create_lead",
"config": {
"name": "{{trigger.caller_name}}",
"phone": "{{trigger.caller_phone}}",
"source": "missed_call"
},
"next": "send_sms"
},
{
"id": "send_sms",
"type": "action",
"action": "send_sms",
"config": {
"to": "{{trigger.caller_phone}}",
"message": "We missed your call. Reply BOOK to schedule or we'll call you back soon!"
},
"next": "create_callback"
},
{
"id": "create_callback",
"type": "action",
"action": "create_callback",
"config": {
"phone": "{{trigger.caller_phone}}",
"callerName": "{{trigger.caller_name}}",
"priority": "high",
"reason": "Missed call - return ASAP"
}
}
],
"edges": [
{ "from": "trigger", "to": "check_existing" },
{ "from": "check_existing", "to": "create_lead", "label": "New caller" },
{ "from": "check_existing", "to": "send_sms", "label": "Existing" },
{ "from": "create_lead", "to": "send_sms" },
{ "from": "send_sms", "to": "create_callback" }
]
}Testing Automations
Test your automation before deploying it to production. The builder includes a test mode that simulates trigger events with sample data.
# Trigger a test run with sample data
curl -X POST https://api.frontdeskos.com/v1/automations/auto_abc123/test \
-H "Authorization: Bearer sk_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"sampleData": {
"caller_name": "Test User",
"caller_phone": "+1-555-0000",
"is_existing_patient": false,
"during_hours": true
}
}'The test run executes each node in sequence and returns the result of every step, including any errors. SMS and email actions are sent to a sandbox instead of real recipients during test mode.
Deploying to Production
Once you have tested your automation, deploy it to start processing real events:
# Deploy to production
curl -X POST https://api.frontdeskos.com/v1/automations/auto_abc123/deploy \
-H "Authorization: Bearer sk_live_your_api_key"
# Check deployment status
curl https://api.frontdeskos.com/v1/automations/auto_abc123 \
-H "Authorization: Bearer sk_live_your_api_key"Deployed automations can be paused, resumed, or rolled back at any time. Each deployment creates a version so you can revert to a previous configuration if needed.