Workflows: workflow automation, triggers, variables and every workflow node # Pick a node A node is a step after the trigger. [Workflow Triggers](/workflows/) is *when* the graph starts. This section is *what* it does. From a trigger edge, open **What happens next? Pick a node to add to your workflow**. Search under **Node**. Categories in production include **AI**, **Communication**, **Core**, **Flow control**, and **Phone actions**. ![What happens next node palette AI Communication Core](/_derived/thumb/workflow-nodes/palette.webp) wf-paletteExpand ![Flow control and Phone actions nodes](/_derived/thumb/workflow-nodes/palette-flow.webp) wf-palette-flowExpand The palette is long. Most graphs need one lookup, one branch, and one way to talk back or notify. HubSpot / Shopify / Galaxy sit behind a connected [integration](/integrations/) - connect first, then add the node. ## Why setup matters [Section titled “Why setup matters”](#why-setup-matters) A card that says **Needs setup** will not **Save & go live**. A saved graph still does nothing on a live call until it is **on** for that agent under **Business Workflows**. Builder tests walk the graph; they are not a caller. ## Which node [Section titled “Which node”](#which-node) Look something up or write to my system TURN ONConnect To External ServiceNEEDS[API](/workflow-nodes/api/). Mid-call, keep it under about a second. Speak the result to the person on the line TURN ONAI Response to CallerNEEDSOnly under a live-audio trigger. [AI Response](/workflow-nodes/ai-response/). Send a confirmation they can keep TURN ONSend Email / Send Text MessageNEEDS[Email](/workflow-nodes/email/) (**Send Email Node**) or [SMS](/workflow-nodes/sms/) (**Send Text Message**). Two outcomes (in stock / not) TURN ONIf/then DecisionNEEDS[If/then](/workflow-nodes/if-then-decision/) (**If/then Decision Node**). Several named paths plus a default TURN ONMultiple Choice DecisionNEEDS[Multiple Choice](/workflow-nodes/multiple-choice/). Hand the live call to a person or another agent TURN ONTransferNEEDSStart, Connect, or During only. [Transfer](/workflow-nodes/transfer-call/). Dial someone later from this graph TURN ONMake Outbound CallNEEDSNeeds outbound. [Make Outbound Call](/workflow-nodes/make-outbound-call/). Run custom logic TURN ONRun Custom CodeNEEDS[Run Custom Code](/workflow-nodes/code/) - JavaScript or Python. [AI Response](/workflow-nodes/ai-response/) speak on a live call [API](/workflow-nodes/api/) HTTP in or out [Email](/workflow-nodes/email/) Tosubjectbody [SMS](/workflow-nodes/sms/) credits + sender ID [If/then](/workflow-nodes/if-then-decision/) true / false [Multiple Choice](/workflow-nodes/multiple-choice/) named cases [Transfer](/workflow-nodes/transfer-call/) live handoff [Outbound call](/workflow-nodes/make-outbound-call/) the graph dials Also in the catalog: [Calendar](/workflow-nodes/create-calendar-event/), [Google Doc](/workflow-nodes/google-document/), [AFM Search](/workflow-nodes/afm-search/), [Filter Data](/workflow-nodes/filter/), [Repeat Actions](/workflow-nodes/loop/), [Data Table](/workflow-nodes/data-table/), [AI Response Generation](/workflow-nodes/ai-generation/), [Managed AI Agent](/workflow-nodes/managed-agent/). HubSpot resource nodes after you [connect HubSpot](/integrations/hubspot/). **AI Response to Caller** is not [AI Response Generation](/workflow-nodes/ai-generation/). Generation writes text for later nodes. It does not speak. ## First setup - lookup, then speak [Section titled “First setup - lookup, then speak”](#first-setup---lookup-then-speak) Do this after [Get a workflow running](/workflows/). 1. Prefer a live-audio trigger such as **During Call Trigger** when the caller must supply a code. 2. From **Work Flow Triggered**, pick **Connect To External Service**. 3. On the success path, add **AI Response to Caller** when the person is still on the line. 4. **Save & go live**, attach under **Business Workflows**, call and ask for a real code. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [AI Response to Caller - speak on the line.→](/workflow-nodes/ai-response/)[Connect To External Service - the usual lookup.→](/workflow-nodes/api/)[Get a workflow running - Save + attach.→](/workflows/) # AFM Search **AFM Search** looks up a Greek company by VAT number (ΑΦΜ). Name, legal form, address, activity, status go to later nodes. ## Why this node [Section titled “Why this node”](#why-this-node) Verify the business on the line before you file a CRM row. It is not a general company search — only Greek ΑΦΜ. ## What you configure [Section titled “What you configure”](#what-you-configure) AFM (ΑΦΜ)REQUIRED Usually a During Call parameter or an earlier node. Insert variable (dates, call, schedule, nodes). Ports: **Company found**, **Not found**, **No wait**. ## First setup — collect ΑΦΜ, confirm the name [Section titled “First setup — collect ΑΦΜ, confirm the name”](#first-setup--collect-αφμ-confirm-the-name) 1. [During Call](/workflows/during-call/) — required parameter for the ΑΦΜ. Ask them to say digits or use [On Key Pressed](/workflows/keyword-pressed/). 2. **AFM Search**. Insert that parameter. 3. **Company found** → [AI Response](/workflow-nodes/ai-response/) that reads back the company name. **Not found** → ask them to repeat. 4. **Save & go live**, attach, try a number you know is valid and one that is not. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — empty AFM. * Always **Not found** — extra spaces, missing leading zero, or a spoken digit error. Prefer keypad. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [During Call.→](/workflows/during-call/)[On Key Pressed.→](/workflows/keyword-pressed/)[HubSpot nodes — write the company after you found it.→](/workflow-nodes/hubspot/) # AI Response Generation **AI Response Generation** runs a model and returns text (and optional structured fields) to later nodes. It does not speak. Speech is [AI Response to Caller](/workflow-nodes/ai-response/). ## Why this node [Section titled “Why this node”](#why-this-node) Summarize the call for an email. Classify intent before [Multiple Choice](/workflow-nodes/multiple-choice/). Draft a note for HubSpot. Put it on [On Call End](/workflows/on-call-end/) or [On API Call](/workflows/on-api-call/), not on a live During graph unless you accept the wait. ## What you configure [Section titled “What you configure”](#what-you-configure) Tabs: **Prompt**, **Model**, **Variables**. PromptREQUIRED At least two characters. Insert dates, call, schedule, and node tokens. Model Same model picker as the agent editor. Seeded. Variables Structured values the model should fill — downstream `{{node_X.name}}`. Ports: **Response generated**, **Generation failed**, **No wait**. ## First setup — summary into email [Section titled “First setup — summary into email”](#first-setup--summary-into-email) 1. [On Call End](/workflows/on-call-end/) → **AI Response Generation**. Prompt: write a short summary from **Call Parameters**. 2. [Send Email](/workflow-nodes/email/) on **Response generated**. Body inserts that node’s output. 3. **Save & go live**, attach, hang up. Read the mail — if it is empty, the prompt was too thin or you inserted the wrong node. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — empty prompt (or shorter than two characters). * Caller hears a pause — this node is on During Call. * They expected the agent to *say* the text — use AI Response to Caller. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Send Email.→](/workflow-nodes/email/)[Managed AI Agent — a tool loop, not one completion.→](/workflow-nodes/managed-agent/)[On Call End.→](/workflows/on-call-end/) # AI Response to Caller **AI Response to Caller** speaks on a *live* call. It only appears under live-audio triggers (Start, Connect, During, Keyword, Key Pressed) - not End, Missed, or On API Call alone. This is not [AI Response Generation](/workflow-nodes/ai-generation/) (that writes text for later nodes). ![AI Response to Caller Background Information](/_derived/thumb/workflow-nodes/ai-response.webp) wn-aiExpand ## What you configure [Section titled “What you configure”](#what-you-configure) Fields shift with the upstream trigger. On **Call Start**, background info is required before the agent has spoken: Background Information for AIREQUIRED Context the AI should know before handling the call. **Insert variable** from previous nodes. Do Not Respond to Call When on, the AI does not automatically answer. Forward Call To Agent ID or phone number to forward to instead. Add Delay Before Picking Up (seconds) Delay before pickup. On During Call / Keyword paths you typically enable message creation and tell the model what to say from API fields. ## First setup [Section titled “First setup”](#first-setup) 1. Use a live-audio trigger, then add **AI Response to Caller** on the success path. 2. Fill required background / message fields. 3. **Save & go live**, attach, call. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Connect To External Service - feed facts first.→](/workflow-nodes/api/)[On Call Start - pre-answer path.→](/workflows/on-call-start/) # Connect To External Service **Connect To External Service** is the HTTP lookup / write node. Mid-call, keep the request under about a second. ![Connect To External Service URL method headers](/_derived/thumb/workflow-nodes/api.webp) wn-apiExpand ## What you configure [Section titled “What you configure”](#what-you-configure) UrlREQUIRED Target URL. Use **Insert variable** for values from earlier nodes. Query Params **+ Add Param** — appended as ?key=value. Headers **+ Add Header** — HTTP headers; variables allowed in values. Content-Type e.g. application/json. Accept e.g. */*. Method GET, POST, and other verbs the control offers. Send Notification on Failure Optional notify if the call fails. Describe the JSON you get back (response schema / sample) when the UI offers it so later nodes can read fields. ## First setup [Section titled “First setup”](#first-setup) 1. From **Work Flow Triggered**, add **Connect To External Service**. 2. Set **Url** and **Method**. Add params/headers as needed. 3. Wire the success transition to **AI Response to Caller** or another node. 4. **Save & go live**, attach if this is a phone trigger, then prove. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [AI Response to Caller - speak the result.→](/workflow-nodes/ai-response/)[Pick a node - palette map.→](/workflow-nodes/) # Run Custom Code **Run Custom Code** runs JavaScript or Python in the graph. Prefer a short transform - not a long HTTP client when **Connect To External Service** exists. ![Run Custom Code Language Code Parameters](/_derived/thumb/workflow-nodes/code.webp) wn-codeExpand ## What you configure [Section titled “What you configure”](#what-you-configure) LanguageREQUIRED JavaScript or Python. CodeREQUIRED Use **Insert variable** (or `{{`) for previous outputs. The returned object is stored in `result` by default. Variables are written into the code before it runs: put text in quotes (`"{{node_1.customer_name}}"`) and numbers or objects without them (`{{node_3.api_response}}`). There is no `args` object. Parameters **+ Add Parameter** - declare keys from the returned object for `{{node_X.name}}` downstream. ## First setup [Section titled “First setup”](#first-setup) 1. Add **Run Custom Code** after a node that produces data. 2. Pick language, write the function, declare parameters you need later. 3. **Save & go live**. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Connect To External Service - HTTP without custom code.→](/workflow-nodes/api/)[Pick a node - palette map.→](/workflow-nodes/) # Create Calendar Event **Create Calendar Event** writes one event to the company Google Calendar. Slot-picking with availability is the agent **Schedule Appointment** tool, not this node. ## Why this node [Section titled “Why this node”](#why-this-node) They already agreed a time (a During Call parameter, an API slot). The graph books it. **Book meetings** must be on at [Google authorizations](/integrations/google/). The settings panel warns if it is missing; **Save** still works — the runtime does not. ## What you configure [Section titled “What you configure”](#what-you-configure) TitleREQUIRED What appears on the calendar. Starts AtREQUIRED `2026-08-12T15:00:00` or `2026-08-12 15:00`, usually a variable. Duration (minutes) Used when **Ends At** is empty. Default 30. Ends At Only if you need an explicit end. Description Call notes, their number. Location Address or place. Attendees Comma-separated emails — they get the invite. Not chips. Calendar Google calendar id. Empty = company primary. Timezone IANA (`Europe/Athens`). Empty = company timezone. Add Google Meet Link Attach Meet. Ports: **Event created**, **Could not create event**, **No wait**. ## First setup — book the slot they just said [Section titled “First setup — book the slot they just said”](#first-setup--book-the-slot-they-just-said) 1. Calendar scope on. [During Call](/workflows/during-call/) collects `preferred_datetime` (and an email only if you already have it from a lookup — do not take email by voice). 2. **Create Calendar Event**. Title + **Starts At** `{{preferred_datetime}}`. Duration 30. Meet on if it is a video consult. 3. [AI Response](/workflow-nodes/ai-response/) on **Event created**. 4. **Save & go live**, attach, prove one slot you can delete. Campaign **Book appointments** still wants Google Calendar + Schedule Appointment on the *agent*. This node does not replace that campaign goal. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * Warning on the node, create fails — Calendar scope off. * Event at the wrong hour — empty Timezone vs the slot string. * Invite missing — Attendees empty or a spoken address. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [During Call.→](/workflows/during-call/)[Send Email — confirmation.→](/workflow-nodes/email/)[Google authorizations.→](/integrations/google/) # Data Table **Data Table** is a static grid on the canvas. You define columns (each needs a **key**) and optional rows. Downstream reads `{{node_X.rows}}`. A table with no usable column blocks **Save**. Zero rows is valid (empty set). ## Why this node [Section titled “Why this node”](#why-this-node) A short SKU list, office locations, canned replies — data that is not worth an API. Live inventory still belongs in [Connect To External Service](/workflow-nodes/api/). The editor’s lookup mode is not shipped. Treat it as a producer: columns + rows out. ## First setup — three SKUs the agent can read [Section titled “First setup — three SKUs the agent can read”](#first-setup--three-skus-the-agent-can-read) 1. Any trigger. **Data Table**. Columns: `sku`, `name`, `in_stock` (boolean). Three rows you can say on a call. 2. [Filter](/workflow-nodes/filter/) or [If/then](/workflow-nodes/if-then-decision/) on a During Call parameter vs `sku`. 3. [AI Response](/workflow-nodes/ai-response/) with `name` / `in_stock`. 4. **Save & go live**, attach, ask for one of those SKUs. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — no column key. * `{{node_X.rows}}` is empty objects — keys missing or you pointed at the wrong node. * Stale stock — you edited the live warehouse in a static table. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Filter Data.→](/workflow-nodes/filter/)[Connect To External Service — when the list is live.→](/workflow-nodes/api/)[AI Response to Caller.→](/workflow-nodes/ai-response/) # Send Email **Send Email Node** sends mail from the graph. Prefer after hang-up, or use a no-wait path if it must start during a live call. ![Send Email Node To Subject CC BCC](/_derived/thumb/workflow-nodes/email.webp) wn-emailExpand ## What you configure [Section titled “What you configure”](#what-you-configure) TypeREQUIRED e.g. **Send Email**. ToREQUIRED Press Enter after each address. Insert workflow variables. CC Optional CC addresses. BCC Optional BCC addresses. SubjectREQUIRED Subject line; **Insert variable** for personalization. Body / from-system options appear further down the panel when present. ## First setup [Section titled “First setup”](#first-setup) 1. Add **Send Email Node** after the trigger (often **Call Ends**). 2. Fill **To**, **Subject**, and the body. 3. **Save & go live** and prove with a real address you control. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Send Text Message - SMS instead.→](/workflow-nodes/sms/)[On Call End - typical trigger.→](/workflows/on-call-end/) # Filter Data **Filter Data** keeps rows that match a condition (same builder as [If/then](/workflow-nodes/if-then-decision/)). **Passed filter** vs **Did not pass**. ## Why this node [Section titled “Why this node”](#why-this-node) An API or [Data Table](/workflow-nodes/data-table/) returned many rows. You want open orders only, then [Repeat Actions](/workflow-nodes/loop/) or one [AI Response](/workflow-nodes/ai-response/). **Needs setup** until the builder has a field and an operator. ## First setup — keep matching rows [Section titled “First setup — keep matching rows”](#first-setup--keep-matching-rows) 1. API or Data Table that emits a list. 2. **Filter Data**. Condition on a status / flag field from that node. 3. **Passed filter** → Loop or AI Response. **Did not pass** → a different line (“no open orders”). 4. **Save & go live**. **Run test** with a payload that has both kinds of row. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — empty builder. * Everything fails the filter — field name does not match the payload. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Repeat Actions.→](/workflow-nodes/loop/)[Data Table.→](/workflow-nodes/data-table/)[If/then Decision.→](/workflow-nodes/if-then-decision/) # Create Google Document **Create Google Document** writes a new Doc in Drive. A sheet of rows is [Manage Google Sheet](/workflow-nodes/manage-google-sheet/). ## Why this node [Section titled “Why this node”](#why-this-node) A call write-up after hang-up. Authorize Drive write on [Google authorizations](/integrations/google/) (**Save recordings to Drive** / Drive files) or create fails. ## What you configure [Section titled “What you configure”](#what-you-configure) Document NameREQUIRED Title in Drive. `{{variables}}` including dates. Document ContentREQUIRED The body. Call summary tokens, node fields. Is Public On: anyone with the link. Off: Drive ACLs only. Ports: **Document created**, **Could not create**, **No wait**. ## First setup — one summary Doc after the call [Section titled “First setup — one summary Doc after the call”](#first-setup--one-summary-doc-after-the-call) 1. Google Scopes: Drive Files on. 2. [On Call End](/workflows/on-call-end/) → **Create Google Document**. Name includes the caller number. Body uses **Call Parameters** (summary, duration). 3. Leave **Is Public** off. **Save & go live**, attach, hang up. Open Drive. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — empty name or body. * Could not create — Drive Files not granted. * Doc is world-readable — **Is Public** is on. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Send Email — send the link.→](/workflow-nodes/email/)[On Call End.→](/workflows/on-call-end/)[Manage Google Sheet.→](/workflow-nodes/manage-google-sheet/) # HubSpot nodes HubSpot in the palette is one node per object. Each card stays **Setup required** until HubSpot is connected on [Integrations](/integrations/hubspot/). The agent **HubSpot** tool (caller ID, live property updates) is that page — this page is the *graph*. ## Why these nodes [Section titled “Why these nodes”](#why-these-nodes) A deterministic write after you already know the phone or email. Triggers **HubSpot Contact Created** / **Property Changed** are [Workflow Triggers](/workflows/) plus the same connection. ## Which node [Section titled “Which node”](#which-node) Catalog titles: Find or upsert the person TURN ONManage Contact in HubSpotNEEDSGet / Get or create / Create or update / List / Search / Delete. Phone from **Call Parameters**. The company TURN ONManage Company in HubSpotNEEDSName + domain on create. A deal or a ticket TURN ONManage Deal / Manage TicketNEEDSPipeline + stage on create. A follow-up for a human TURN ONManage Task in HubSpotNEEDSTitle required. Owner + due date. A note on the record TURN ONCreate Note in HubSpotNEEDSBody required. **Associations** link it. Log the activity TURN ONLog Call / Log Email / Schedule MeetingNEEDSOn a phone trigger, call metadata (direction, duration) is filled from the call — do not set it by hand. **Operation** is required on every card. Lookup fields use **Get by** / **Value** (`{{call.phone_number}}`). Create fields flip with the operation. Ports follow the object (Contact: **Contact saved** / **HubSpot error** / **No wait**). Galaxy, Shopify, Soft1, WooCommerce, Salesforce, Guesty are the same rule: connect on [Integrations](/integrations/), then add that provider’s node. They do not get their own pages here. ## First setup — upsert the caller after hang-up [Section titled “First setup — upsert the caller after hang-up”](#first-setup--upsert-the-caller-after-hang-up) 1. [Connect HubSpot](/integrations/hubspot/). 2. [On Call End](/workflows/on-call-end/) → **Manage Contact in HubSpot**. Operation **Create or update**. Phone = caller number. 3. **Save & go live**, attach, hang up. Open the contact in HubSpot. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Setup required** — Integrations → HubSpot is not connected. * Empty contact — Value did not match (missing `+`, wrong **Get by**). * Call log fields you typed are ignored — a phone trigger already owns them. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Connect HubSpot.→](/integrations/hubspot/)[On Call End.→](/workflows/on-call-end/)[Pick a node.→](/workflow-nodes/) # If/then Decision **If/then Decision Node** branches the graph. Success runs when the rules match; otherwise the failure branch. ![If then Decision Node All Any conditions](/_derived/thumb/workflow-nodes/if-then.webp) wn-ifExpand ## What you configure [Section titled “What you configure”](#what-you-configure) All / Any Combine multiple conditions with **All** or **Any**. Check this fieldREQUIRED Pick a field or **Type manually**. Field Type e.g. Text. When it... (operator)REQUIRED Comparison operator. Use **+ Add Condition** for more rules. Empty field/operator blocks save (**Condition is required**). ## First setup [Section titled “First setup”](#first-setup) 1. Add **If/then Decision Node** after a lookup that produces fields. 2. Set field + operator (+ value when shown). 3. Wire success and failure to different nodes. 4. **Save & go live**. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Multiple Choice - more than two named paths.→](/workflow-nodes/multiple-choice/)[Filter Data - filter/sort instead of branch.→](/workflow-nodes/filter/) # Repeat Actions **Repeat Actions** runs the loop body once per item. Ports: **For each item** (body) and **After loop**. ## Why this node [Section titled “Why this node”](#why-this-node) Each open order gets a line. Each match from [Filter Data](/workflow-nodes/filter/) is written to a sheet. Mid-call, a long loop is a long pause — prefer End, or cap what you iterate. ## What you configure [Section titled “What you configure”](#what-you-configure) ArrayREQUIRED The collection. Insert a node token typed as an array (`{{orders}}`, `{{node_3.rows}}`). Wire the body on **For each item**. Wire what happens when the list is done on **After loop**. ## First setup — one SMS per row (after hang-up) [Section titled “First setup — one SMS per row (after hang-up)”](#first-setup--one-sms-per-row-after-hang-up) 1. [On Call End](/workflows/on-call-end/) → API or table that returns a list. 2. Optional [Filter](/workflow-nodes/filter/). Then **Repeat Actions**. **Array** = that list. 3. Body: [Send Text Message](/workflow-nodes/sms/) or [Manage Google Sheet](/workflow-nodes/manage-google-sheet/) using the current item fields. 4. **After loop** → done. **Save**. **Run test** with two items. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — empty Array. * Body never runs — you wired only **After loop**, or Array is not a list. * Caller waits — this loop is on During Call. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Filter Data.→](/workflow-nodes/filter/)[On Call End.→](/workflows/on-call-end/)[Data Table.→](/workflow-nodes/data-table/) # Make Outbound Call **Make Outbound Call** dials a number from the graph. Needs outbound on the plan and a trunk/caller ID. This is not [initiate-call](/outbound-calls/api/) from your backend (though both place outbound AI calls). ![Make Outbound Call Phone Number Agent SIP Trunk](/_derived/thumb/workflow-nodes/make-outbound-call.webp) wn-obExpand ## What you configure [Section titled “What you configure”](#what-you-configure) Phone NumberREQUIRED E.164 including country code. Supports variables (e.g. `{{call.phone_number}}`). AgentREQUIRED Which AI agent places the call. SIP Trunk Which trunk / caller ID carries the call. Context Info Background for the agent on that call; supports variables. ## First setup [Section titled “First setup”](#first-setup) 1. Add **Make Outbound Call** (often after **On API Call** or **Call Ends**). 2. Set number + agent (+ trunk). 3. **Save & go live**. Confirm **Allow Outbound Calls** and credits. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Get outbound working - plan + trunk.→](/outbound-calls/)[On API Call - start the graph from your system.→](/workflows/on-api-call/) # Manage Google Sheet **Manage Google Sheet** reads or writes a tab in Drive. Authorize Google first or the picker is empty and the runtime fails. ## Why this node [Section titled “Why this node”](#why-this-node) A leads tab, a simple store of SKUs, append a row after the call. A real CRM is still [HubSpot](/workflow-nodes/hubspot/) or [Connect To External Service](/workflow-nodes/api/). Grant **Use spreadsheets** (and Drive to browse) on [Google authorizations](/integrations/google/). Calendar / Gmail send are different scopes. ## What you configure [Section titled “What you configure”](#what-you-configure) OperationREQUIRED **Get Data**, **Get Row**, **Get Rows**, **Update Row**, **Append Row**, **Delete Row**. Seed is Get Data (no filter). Spreadsheet IDREQUIRED From the picker, or the id in the sheet URL. Sheet / Tab NameREQUIRED The tab, not the file name. Filter By On Get/Update/Delete Row: **Row Index** or **Column Name** + **Match Value** (`{{call.phone_number}}`). Values Column → value on Update / Append. Ports: **Sheet updated**, **Sheet error**, **No wait**. Downstream fields come from the row you fetched. ## First setup — append the caller after hang-up [Section titled “First setup — append the caller after hang-up”](#first-setup--append-the-caller-after-hang-up) 1. A sheet with a `phone` column. Google Scopes granted. 2. [On Call End](/workflows/on-call-end/) → **Manage Google Sheet**. **Append Row**. Pick the file and tab. `phone` = **Call Parameters**. 3. **Save & go live**, attach, hang up a test call. Refresh the sheet. Get Row + [AI Response](/workflow-nodes/ai-response/) is the mid-call path (order status by phone). Keep that GET fast. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — no file, no tab, or no operation. * Picker empty / 403 — scopes not granted on *this* company. * Update hits the wrong row — **Match Value** does not equal the cell (spaces, missing `+`). ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Create Google Document.→](/workflow-nodes/google-document/)[On Call End.→](/workflows/on-call-end/)[Google authorizations.→](/integrations/google/) # Managed AI Agent **Managed AI Agent** is an autonomous loop *after* the work is known — usually [On Call End](/workflows/on-call-end/). It is not [AI Response to Caller](/workflow-nodes/ai-response/). It will not talk on the line. ## Why this node [Section titled “Why this node”](#why-this-node) File the ticket, update the CRM, write the follow-up — a short tool loop with a cost cap. One HTTP call is still [Connect To External Service](/workflow-nodes/api/). One completion is [AI Response Generation](/workflow-nodes/ai-generation/). ## What you configure [Section titled “What you configure”](#what-you-configure) TaskREQUIRED What the loop must finish. Seeded so a fresh card is not empty. Built-in tools / API tools / MCP What it may call. Runtime expects at least one tool. Models Primary (seeded). Optional escalation on the same provider. Limits Max iterations (default 15, 0 = no iteration cap) and max cost (USD, max 0.5). **Stuck detection** bails if the same tool+args fire twice. Knowledge Optional files + rerank. Same idea as the agent knowledge attach. **Dry run** is on the node — use it while you test. Ports: **Task completed**, **Task failed**. ## First setup — after hang-up, create a ticket [Section titled “First setup — after hang-up, create a ticket”](#first-setup--after-hang-up-create-a-ticket) 1. Connect the CRM on [Integrations](/integrations/) if the loop will write there. 2. [On Call End](/workflows/on-call-end/) → **Managed AI Agent**. Task: open a ticket from the call summary. Add the HubSpot (or API) tool it needs. 3. Leave limits at the seed. **Save & go live**, attach, hang up one call. Check the CRM — if nothing landed, no tool was added, HubSpot is disconnected, or dry run is on. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — empty Task. * Loop stops early — cost / iteration cap, or stuck detection. * Mid-call silence — this node is on During Call. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [On Call End.→](/workflows/on-call-end/)[HubSpot nodes — a single deterministic write.→](/workflow-nodes/hubspot/)[AI Response Generation.→](/workflow-nodes/ai-generation/) # Multiple Choice **Multiple Choice Decision** is one exit per case, plus **Default Case**. Cases run top to bottom. The first match wins. ## Why this node [Section titled “Why this node”](#why-this-node) Billing vs support vs sales. [If/then](/workflow-nodes/if-then-decision/) is only two ports. **Add Case**. Each non-default case needs a complete condition (same builder as If/then) or **Save** stays blocked. Default needs no condition — it is the catch-all. Wire a node on Default or **Run test** ends with nothing matched. ## First setup — three inquiry types [Section titled “First setup — three inquiry types”](#first-setup--three-inquiry-types) 1. [During Call](/workflows/during-call/) parameter `inquiry_type` (or an API field). 2. **Multiple Choice Decision**. Cases: Billing, Support, Sales — each equals the value the model actually writes. Leave **Default Case**. 3. Each port: a lookup, a [transfer](/workflow-nodes/transfer-call/), or [AI Response](/workflow-nodes/ai-response/). Default: ask them to say it again. 4. **Save & go live**. **Run test** should name the matched case. Then a live call. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * **Needs setup** — a named case has an incomplete condition. * Always Default — the value is `bill` and the case tests `billing`. * **Run test**: no case matched — Default is unwired. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [If/then Decision — only two outcomes.→](/workflow-nodes/if-then-decision/)[Transfer to Another Number.→](/workflow-nodes/transfer-call/)[During Call.→](/workflows/during-call/) # Send Text Message **Send Text Message** sends SMS from the graph. Uses VoIP / SMS credits and a sender ID from Telephony settings. ![Send Text Message From To Message](/_derived/thumb/workflow-nodes/sms.webp) wn-smsExpand ## What you configure [Section titled “What you configure”](#what-you-configure) From Sender ID recipients see (e.g. Voicelogica). Manage sender IDs in Telephony settings. ToREQUIRED Press Enter after each number. Insert variables such as `{{call.phone_number}}`. MessageREQUIRED Keep it concise — SMS has character limits. Insert variables to personalize. ## First setup [Section titled “First setup”](#first-setup) 1. Add **Send Text Message** (often after **Missed Call** or **Keyword Detected**). 2. Set **To** and **Message**. 3. **Save & go live**, attach if needed, prove to your own mobile. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Missed Call - common SMS use.→](/workflows/missed-call/)[Send Email - longer follow-up.→](/workflow-nodes/email/) # Transfer Call **Transfer to Another Number** hands the *live* call to an AI agent, external number, or system user. Only under Start, Connect, or During - not the same as [Call handling - Transfer](/telephony/transfer/), where the agent decides during the conversation. ![Transfer to Another Number Type of Transfer](/_derived/thumb/workflow-nodes/transfer-call.webp) wn-xferExpand ## What you configure [Section titled “What you configure”](#what-you-configure) Type of TransferREQUIRED AI agent, external phone number, or system user. Transfer Call Reason Why the call is transferred; supports variables. Agent When type is AI Agent - which agent handles it. Transfer Mode Blind vs Warm (and related options when shown). ## First setup [Section titled “First setup”](#first-setup) 1. On Start / Connect / During, add **Transfer to Another Number**. 2. Pick type and destination. 3. **Save & go live**, attach, prove with a real handoff. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Call handling Transfer - conversational transfer tab.→](/telephony/transfer/)[Make Outbound Call - dial later from the graph.→](/workflow-nodes/make-outbound-call/) # Get a workflow running A workflow is a graph: one **trigger**, then nodes. Building it under **Work Flows** is not enough. A phone trigger does nothing until the workflow is **on** for that agent under **Skills - Tools & Workflows**. An unsaved canvas does not run. The node catalog (API, email, SMS, HubSpot, branches) is [Workflow Nodes](/workflow-nodes/). This section is *when* the graph starts. ## Why setup matters [Section titled “Why setup matters”](#why-setup-matters) Three things have to be true or the graph is decoration: 1. A **trigger** sits on the canvas. 2. You clicked **Save & go live** (or saved a version). 3. For a phone trigger - the workflow toggle is **on** for *this* agent under **Business Workflows**. **Run test** in the builder proves the graph. It does not prove a live caller will hit it. ## Open Work Flows [Section titled “Open Work Flows”](#open-work-flows) Sidebar - **Work Flows**. Page line: *Automations that connect systems, fetch live data, send messages and run logic — triggered by calls, schedules or events.* Empty state: **Build your first workflow**. Button: **+ Workflow**. ![Work Flows empty state Build your first workflow](/_derived/thumb/workflows/list.webp) wf-listExpand **+ Workflow** opens **Create new workflow** (*Name it now — configure capabilities in the builder.*). Beta note: limited to **5 workflows during beta**. Enter **Workflow name**, then **+ Create workflow** (or Cancel). ![Create new workflow dialog with beta limit](/_derived/thumb/workflows/create-workflow.webp) wf-createExpand You can also **+ Add workflow** from the agent’s **Skills - Tools & Workflows** - that creates *and* lists it under **Business Workflows**. ## Which trigger [Section titled “Which trigger”](#which-trigger) In the builder, **+ Add Trigger** opens **Phone Triggers** (and more as you scroll): Know who is calling before the AI speaks TURN ONCall Start TriggerNEEDSStart the workflow when a call is received. [On Call Start](/workflows/on-call-start/). Act only after someone actually answers TURN ONWhen Call ConnectsNEEDSStart when a call is connected. [When Call Connects](/workflows/when-call-connects/). The caller asked for something you must look up live TURN ONDuring Call TriggerNEEDSThe model decides when. Adds latency. [During Call](/workflows/during-call/). They said a phrase (emergency, cancel) TURN ONKeyword DetectedNEEDSStart when caller says specific words. [Keyword Detected](/workflows/keyword-detected/). They typed digits (# / timeout) TURN ONOn Key PressedNEEDSStart when caller presses a key. Needs keypad settings on the agent. [On Key Pressed](/workflows/keyword-pressed/). After hang-up: CRM, email, webhook TURN ONCall Ends TriggerNEEDSStart when a call is ended. [On Call End](/workflows/on-call-end/). Nobody picked up TURN ONMissed Call TriggerNEEDSStart when a call is missed. [Missed Call](/workflows/missed-call/). My system starts the graph TURN ONOn API CallNEEDS[On API Call](/workflows/on-api-call/). Does not need an agent attach. ![Add a Trigger Phone Triggers catalog](/_derived/thumb/workflows/add-trigger.webp) wf-triggersExpand [Call Start](/workflows/on-call-start/) before pickup [When Call Connects](/workflows/when-call-connects/) after answer [During Call](/workflows/during-call/) the model invokes it [Call Ends](/workflows/on-call-end/) after hang-up [Keyword Detected](/workflows/keyword-detected/) spoken phrase [On Key Pressed](/workflows/keyword-pressed/) DTMF [Missed Call](/workflows/missed-call/) unanswered inbound [On API Call](/workflows/on-api-call/) POST run-workflow HubSpot created / property-changed, WooCommerce, and similar event triggers appear in the same catalog when those [integrations](/integrations/) are connected. **AI Response to Caller** only exists under a live-audio trigger (Start, Connect, During, Keyword, Key Pressed) - not End or Missed. **Transfer Call** only under Start, Connect, or During. ## First setup - one Call Start, attach, prove it [Section titled “First setup - one Call Start, attach, prove it”](#first-setup---one-call-start-attach-prove-it) 1. **Sidebar - Work Flows - + Workflow** Name it after the job (for example Caller lookup). **+ Create workflow**. 2. **+ Add Trigger - Call Start Trigger** Phone Triggers. Leave it empty - this trigger has no required fields. 3. **Save & go live** (top right) Use **Save as version** when you want a named checkpoint. Run a builder test if available - dry-run keeps Email / SMS from sending. 4. **My Agents - this agent - Skills - Tools & Workflows** Under **Business Workflows** (`N/M active`), turn the row **on**. Or use **+ Add workflow** if you created it from here. ![Business Workflows with workflow toggle off](/_derived/thumb/workflows/index-attach.webp) index-attachExpand 5. **A real inbound call** (or **Try this agent**) Open **Calls**. If nothing ran, the toggle is off, you tested a different agent, or you never saved. Workspaces are on a beta workflow cap (**Limited to 5 workflows during beta**). If **Create workflow** is blocked, delete an unused graph or wait for the cap to lift. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [On Call Start - first useful graph (lookup before pickup).→](/workflows/on-call-start/)[During Call - only when the ask is not known in advance.→](/workflows/during-call/)[Workflow Nodes - API, email, SMS, branches.→](/workflow-nodes/)[Tools & Workflows - attach + built-in tools.→](/agent-configuration/built-in-tools/) # During Call **During Call Trigger** is a tool the model may call *while talking* (**Runs when: Run actions during an active call**). You name the function and write when to use it. The agent collects parameters from the caller, the graph runs, then (usually) **AI Response to Caller** speaks the result. Every During Call graph adds latency. Keep the API under about a second. If you already know the fact from the caller ID, use [On Call Start](/workflows/on-call-start/) instead. ![During Call Trigger on the canvas](/_derived/thumb/workflows/during-call.webp) wf-duringExpand ## What you configure [Section titled “What you configure”](#what-you-configure) Function NameREQUIRED Only lowercase letters, numbers and underscores (max 64). Example: `get_user_info`. ConditionREQUIRED When the AI should trigger this workflow. The model evaluates it during the call. Enable Message Creation When on, the AI speaks a message to the caller before the workflow executes. Play wait music Play keyboard typing music while the tool runs, then stop when the result is ready. Parameters **+ Add Parameter** - what to collect first (name, type, required, AI-generated when shown). ![During Call Trigger settings Function Name and Condition](/_derived/thumb/workflows/during-call-form.webp) during-call-formExpand ## First setup - one lookup the caller asks for [Section titled “First setup - one lookup the caller asks for”](#first-setup---one-lookup-the-caller-asks-for) 1. **+ Add Trigger - During Call Trigger**. Fill **Function Name** and **Condition**. 2. **+ Add Parameter** for anything the caller must say (for example a product code). 3. **Connect To External Service** using those parameters. 4. **AI Response to Caller** on the successful path. 5. **Save & go live**, attach, call, ask for the lookup. Time the pause. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [On Call Start - known-in-advance lookups.→](/workflows/on-call-start/)[Keyword Detected - a phrase, not a tool the model chooses.→](/workflows/keyword-detected/)[On Key Pressed - digits, not speech.→](/workflows/keyword-pressed/) # Keyword Detected **Keyword Detected** fires when the caller *says* one of the phrases you listed (**Runs when: When caller says specific words**). It is not a tool the model chooses - [During Call](/workflows/during-call/) is. Use it for a short list of words you must not miss. ![Keyword Detected trigger on the canvas](/_derived/thumb/workflows/keyword-detected.webp) wf-kwExpand ## What you configure [Section titled “What you configure”](#what-you-configure) Keywords Press Enter to add each keyword the caller might say. ![Keyword Detected Keywords field](/_derived/thumb/workflows/keyword-detected-form.webp) keyword-detected-formExpand **AI Response to Caller** is allowed. Prefer During or Start/Connect when you need a transfer graph. ## First setup - phrase, then notify [Section titled “First setup - phrase, then notify”](#first-setup---phrase-then-notify) 1. **+ Add Trigger - Keyword Detected**. Add the phrases people actually say. 2. **Send Text Message** or another node from **Work Flow Triggered**. 3. Optionally **AI Response to Caller** with a fixed line when wording must be exact. 4. **Save & go live**, attach, say the phrase on a test call. Keep the list short. A dozen everyday words will fire on normal talk. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [On Key Pressed - digits.→](/workflows/keyword-pressed/)[During Call - the model decides, with parameters.→](/workflows/during-call/)[Send Text Message - the SMS node.→](/workflow-nodes/sms/) # On Key Pressed **On Key Pressed** fires when the caller finishes a keypad run (**Runs when: When caller presses a key**) - usually after the end key on [Call handling - Advanced](/agent-configuration/advanced-config/) or when the wait expires. Digits are available to later nodes as the key-pressed / DTMF input variable. The agent’s **Phone keypad input** settings decide when a run is complete. The trigger panel itself is light: Enable Message Creation When enabled, the AI speaks a message to the caller before executing this workflow. ![On Key Pressed trigger on the canvas](/_derived/thumb/workflows/keyword-pressed.webp) wf-dtmfExpand ![On Key Pressed Enable Message Creation](/_derived/thumb/workflows/keyword-pressed-form.webp) keyword-pressed-formExpand ## Why this trigger [Section titled “Why this trigger”](#why-this-trigger) Order ids, account numbers, menu digits. Speech is sloppy for long numbers - [Skip Turn](/agent-configuration/built-in-tools/) plus this trigger is the usual pair. ## First setup - digits in, status out [Section titled “First setup - digits in, status out”](#first-setup---digits-in-status-out) 1. On the agent, **Call handling - Advanced - Phone keypad input** - wait long enough for the id, end key **#** unless your IVR already uses another key. 2. **+ Add Trigger - On Key Pressed**. 3. **Connect To External Service** - pass the DTMF input into the URL or body. 4. **AI Response to Caller** on success (and a failure path if useful). 5. **Save & go live**, attach. Prompt the agent to ask them to type the id then **#**. Call, type, listen. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Advanced - keypad wait and end key.→](/agent-configuration/advanced-config/)[Skip Turn - do not talk over digits.→](/agent-configuration/built-in-tools/)[Keyword Detected - spoken phrases.→](/workflows/keyword-detected/) # Missed Call **Missed Call Trigger** fires when an inbound call is missed (**Runs when: When a call is missed**). No required settings. There is no live audio - **AI Response to Caller** and **Transfer Call** are not offered. An outbound campaign that nobody answers does **not** fire this. This is the company’s inbound miss, not your own unanswered dial. ![Missed Call Trigger on the canvas](/_derived/thumb/workflows/missed-call.webp) wf-missedExpand ## Why this trigger [Section titled “Why this trigger”](#why-this-trigger) SMS or email the team, open a ticket, offer a callback. [On Call End](/workflows/on-call-end/) is for calls that *happened*. [On Call Start](/workflows/on-call-start/) also ran on the ring - do not put “they missed” logic there. ## First setup [Section titled “First setup”](#first-setup) 1. **+ Add Trigger - Missed Call Trigger**. 2. **Send Text Message** or **Connect To External Service** - include the caller number from call parameters when available. 3. **Save & go live**, attach. Ring the DID and do not answer. Confirm the SMS / webhook. Answer a second call - this graph should not run. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [On Call End - after a real conversation.→](/workflows/on-call-end/)[On Call Start - the ring that may still miss.→](/workflows/on-call-start/)[Outbound Campaigns - unanswered leads.→](/outbound-calls/campaigns/) # On API Call **On API Call** starts the graph from *your* system - CRM, form, button (**Runs when: When an API call is made**). It does **not** need an agent attach. Phone triggers do. ![On API Call trigger on the canvas](/_derived/thumb/workflows/on-api-call.webp) wf-apiExpand ## Why this trigger [Section titled “Why this trigger”](#why-this-trigger) A list on a schedule is [Campaigns](/outbound-calls/campaigns/). A single AI outbound call is [initiate-call](/outbound-calls/api/). This is “run this automation now” with a JSON body - send email, update a sheet, fan out nodes. Put **Make Outbound Call** on the graph only if the next step is actually a call. ## First setup [Section titled “First setup”](#first-setup) 1. **+ Add Trigger - On API Call** **Payload Schema** is the JSON schema of the body POSTed to the run-workflow endpoint (with your API key). Validated live. Default empty object with no required fields accepts any object. Sample schemas and a cURL helper appear in the panel; create an [API key](/getting-started/api-keys/) if you need one. ![On API Call Payload Schema settings](/_derived/thumb/workflows/on-api-call-form.webp) on-api-call-formExpand 2. From **Work Flow Triggered**, add nodes that read those keys. 3. **Save & go live**. Copy the workflow id from the URL or the list. 4. POST with an API key that can run workflows: ```plaintext POST https://api.voicelogica.ai/api/v1/agentic/work-flows/run-workflow/YOUR_WORKFLOW_ID ``` ```http x-api-key: YOUR_API_KEY Content-Type: application/json ``` ```json { "order_id": "ORD123", "email": "ada@example.com" } ``` 5. Confirm the nodes ran (email, sheet, or a builder dry-run first). ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Get a workflow running - Save, then this POST.→](/workflows/)[Workflow Nodes - what to put after the trigger.→](/workflow-nodes/)[API keys - key with workflow run scope.→](/getting-started/api-keys/) # On Call End **Call Ends Trigger** fires after hang-up (**Runs when: When a call is ended**). The transcript, duration, and [Call results](/agent-configuration/call-results/) fields are available. There is no live caller - **AI Response to Caller** is not offered. Use this instead of a one-line [Alert](/agent-configuration/alerts/) when you need a graph: POST to your backend, branch on extract fields, write a sheet. ![Call Ends Trigger on the canvas](/_derived/thumb/workflows/on-call-end.webp) wf-endExpand ## Why this trigger [Section titled “Why this trigger”](#why-this-trigger) The conversation is over. You have the extract. CRM update, follow-up email, “create a task if they said yes” belong here. Mid-call speech belongs on [During Call](/workflows/during-call/). ## First setup - POST the extract [Section titled “First setup - POST the extract”](#first-setup---post-the-extract) 1. On the agent, **After the call - Call results** - add only the fields you will send. 2. **+ Add Trigger - Call Ends Trigger**. 3. **Connect To External Service** - POST your URL. Map call parameters and extract names in the body. 4. **Save & go live**, attach, finish a call that fills those fields. Check your backend. Unanswered / no-extract calls can still fire the trigger - tokens may be empty. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [Call results - what End can send.→](/agent-configuration/call-results/)[Missed Call - they never answered.→](/workflows/missed-call/)[On API Call - your system starts the graph.→](/workflows/on-api-call/) # On Call Start **Call Start Trigger** fires when a call is *received* - before the AI speaks. On the canvas the node says **Runs when: When a call is received**, and the outbound edge is **Work Flow Triggered**. Use it to look someone up so the greeting already has a name. The same API mid-call adds a pause the caller hears. This trigger has no required settings. The work is the nodes after it. ![Call Start Trigger on the canvas](/_derived/thumb/workflows/on-call-start.webp) wf-startExpand ## Why this trigger [Section titled “Why this trigger”](#why-this-trigger) Anything you already know from the caller ID belongs here: CRM record, open ticket, last order. [During Call](/workflows/during-call/) is for facts the person has not said yet. [When Call Connects](/workflows/when-call-connects/) is later - after someone actually answers. Start still runs on a ring that will become a miss. ## First setup - lookup, then feed the agent [Section titled “First setup - lookup, then feed the agent”](#first-setup---lookup-then-feed-the-agent) Do this after [Get a workflow running](/workflows/). 1. **+ Add Trigger - Call Start Trigger** (Phone Triggers). 2. From **Work Flow Triggered**, add **Connect To External Service** (or the lookup node your plan shows). Your lookup URL. Call parameters insert the caller number when available. Describe the JSON you get back so later nodes can use the fields. 3. **AI Response to Caller** on the successful path Background Information for AI What the agent should know before it speaks. Pull fields from the API node. Do Not Respond to Call The AI never answers. The line keeps ringing. Forward Call To Another agent id or a number - instead of this agent answering. Add Delay Before Picking Up (seconds) Time for a human to grab the line first. 4. **Save & go live**, then attach on **Skills - Tools & Workflows - Business Workflows**, and call the production DID (or **Try this agent**). ![Business Workflows attach toggle](/_derived/thumb/workflows/on-call-start-attach.webp) on-call-start-attachExpand 5. Listen. If the greeting is generic, the API failed, the field names do not match, or this agent does not have the workflow on. Put mapped variables in the agent greeting only after a test call actually filled them. ## What “broken” looks like [Section titled “What “broken” looks like”](#what-broken-looks-like) * Workflow on, greeting still generic - Start ran but background information is empty, or the API failed. * Caller hears a long ring then the AI - delay is set, or Do Not Respond is on. * Graph never runs - not saved with **Save & go live**, or not attached. [Get a workflow running](/workflows/). ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [When Call Connects - after answer.→](/workflows/when-call-connects/)[During Call - lookups that depend on what they say.→](/workflows/during-call/)[Connect To External Service - the API node.→](/workflow-nodes/api/) # Ready-made workflows > Four common workflows you can create in one step, from the app or from Claude and ChatGPT: text the caller a link, look something up in your system, send every call to your CRM, email a summary after each call. Four workflows most businesses need come ready-made. You fill in a few fields and get a finished workflow, already wired and attached to your agent. It is an ordinary workflow afterwards: open it on the canvas to change anything. ## The four templates [Section titled “The four templates”](#the-four-templates) | Template | When it runs | What it does | | ------------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Text the caller a link** | During the call, when the caller asks for it or agrees | Sends an SMS with your link (booking page, form, menu) to the number the caller is calling from, then tells them it is on its way. If the SMS fails, the agent reads the link out. | | **Look something up in your system** | During the call, when the caller needs information that depends on a value they give | Asks for the value (for example an order number), calls your API and answers only from what it returns. If the API fails, the agent apologises and offers to take a message. | | **Send every call to your CRM** | After every call the agent answers | POSTs the call as JSON to your webhook (your CRM, Zapier or Make): call id, number, status, duration, summary and the link to the recording. | | **Email a summary after each call** | After every call the agent answers | Emails the caller’s number, status, duration, summary and the recording link to the addresses you choose. | ## In the app [Section titled “In the app”](#in-the-app) 1. Go to **Workflows** and click **New from template**. 2. Pick a template and fill in its fields: the link, your API address, your webhook, or the email addresses. Choose the agent that uses it. 3. Click create. The workflow opens on the canvas, already connected to your agent. ## From Claude or ChatGPT [Section titled “From Claude or ChatGPT”](#from-claude-or-chatgpt) With the [Voice Logica connector](/integrations/claude-chatgpt/), say what you want: * *“During calls, text the caller our booking link .”* * *“Let the agent look up an order in [https://shop.example.com/api/orders/{order](https://shop.example.com/api/orders/%7Border) number} while the caller waits.”* * *“Send every finished call to our Zapier webhook.”* * *“Email me a summary after every call.”* The assistant creates the same workflow and attaches it to your agent. ## The fields [Section titled “The fields”](#the-fields) * **Look something up:** put the value the caller gives inside the address as `{{order_number}}` (use your own name, lowercase with underscores), for example `https://shop.example.com/api/orders/{{order_number}}`. Add headers such as `Authorization` if your API needs a key. Test it with a real value before relying on it: see [During Call](/workflows/during-call/). * **Send every call to your CRM:** the body is JSON. To add answers from your call analysis, open the workflow and add them to the body as `{{field_name}}`. See [On Call End](/workflows/on-call-end/). * **Text the caller a link:** the SMS goes out from your company’s SMS sender. Keep the text short: Greek characters use more of each SMS. ## Questions [Section titled “Questions”](#questions) # When Call Connects **When Call Connects** fires when the call is *answered* - a person (or the AI) is on the line. On the canvas: **Runs when: When a call is connected**, transition **Work Flow Triggered**. No required settings. Use it when the work is pointless on a ring that will miss: start a timer, notify a supervisor that someone picked up, write “in progress” to a ticket. ![When Call Connects trigger on the canvas](/_derived/thumb/workflows/when-call-connects.webp) wf-connectExpand ## Why this trigger [Section titled “Why this trigger”](#why-this-trigger) [On Call Start](/workflows/on-call-start/) runs on inbound ring, including calls that never answer. Connect does not. If the greeting must already know the caller, that lookup still belongs on Start - Connect is too late for the first sentence. **AI Response to Caller** and **Transfer Call** are allowed here. ## First setup [Section titled “First setup”](#first-setup) 1. **+ Add Trigger - When Call Connects**. 2. From **Work Flow Triggered**, add the node that should run only after answer (ticket update, API, **Send Text Message**). 3. **Save & go live**, attach on the agent, place a call, pick up. Open **Calls**. 4. Hang up without answering once - this graph should *not* have run. That is the proof you picked Connect instead of Start. ## Troubleshooting [Section titled “Troubleshooting”](#troubleshooting) ## Next Steps [Section titled “Next Steps”](#next-steps) [On Call Start - before pickup.→](/workflows/on-call-start/)[On Call End - after hang-up.→](/workflows/on-call-end/)[Missed Call - they never answered.→](/workflows/missed-call/)