Skip to main content
Workflows automate actions across calls, contacts, and integrations. Choose a trigger, then connect nodes for the actions and conditions you need.

Create a workflow

  1. Go to Workflows → Create Workflow. Enter a name and optional description.
  2. Choose and configure a trigger.
  3. Use + on the canvas to add nodes. Select each node to configure it in the side panel.
  4. Click Publish. Open Runs → Run manually to test the published version and inspect the run details. For Call ended, select a completed call; for contact triggers, select a contact. Manual runs execute real actions.
  5. Turn on Enabled to start automatic runs. Keep it off while you build and test.
Edits are saved as a draft. Publish again to use them in new runs. Use Version history to view earlier versions or Discard draft to remove unpublished changes. In Runs, open a run to inspect each node, its result, and any failure.

Triggers

Each workflow starts with one trigger. Select it when you create the workflow, then configure it in the side panel.

Call ended

Select the agent and the call statuses that should start the workflow. The Call ended trigger uses your selected call statuses as an OR filter. An ended call starts the workflow once when it matches any selected status. After selecting the statuses that may enter the workflow, use Status or Has follow-up in an If / else or Switch block to route them to different actions. Unknown and unfinished calls, as well as rejected inbound calls, do not start a call-ended workflow. Failed calls start it only when Failed is selected.

Contact created

Select Contact created to start when a new contact is added through the dashboard, API, CSV import, or CRM integration. No additional trigger settings are required. Later nodes use the new contact’s fields and custom properties.

Contact updated

Use Contact updated for changes from the telli dashboard, API, Charlie, CRM sync, or imports.
  1. Select Contact updated as the trigger. Under Conditions, choose a contact field, Before update or After update, an operator, and a comparison value. Without conditions, every contact update matches.
  2. To require a specific field to change, add Event → Changed fields, choose includes any of, and select that field. Conditions within one group use AND; groups use OR.
For example, to act when a custom Lead status becomes Qualified, use one group: Lead status → After update equals Qualified, and Event → Changed fields contains Lead status. Checking only the after value also matches changes to other fields while the lead remains qualified. To test, open Runs → Run manually, select a contact, and enter Before and After values for the fields to simulate. Click Run workflow. Simulated values are not saved, but matching workflow actions execute for real. Updates from an Update contact block do not start another contact-updated workflow.

Scheduled

Select Scheduled as the trigger to run a workflow at regular intervals or at set times. In Schedule, choose a preset or describe the schedule, such as “Every 20 minutes” or “Weekdays at 9:00 AM”, then select the result. Check the displayed time zone and Next 5 execution times before publishing and enabling the workflow.

Webhook received

Use Webhook received when an external system should start a workflow.
  1. Create a workflow with Webhook received and copy Webhook URL from the trigger panel.
  2. Under Authentication, select a saved Bearer token credential. Create it in Settings → Developer → Create credential, entering the token without the Bearer prefix. Configure the sender to use the same token. None allows anyone with the URL to start a run.
  3. Add your actions, publish, and enable the workflow.
  4. Configure the external system to send a POST request to the copied URL with the header Authorization: Bearer <token>. No request body is needed. Omit the header if you selected None.
  5. Send a test request and check Runs. HTTP 204 means the run was accepted, not that all actions completed. For 401, check the token; for 404, check the URL and that the workflow is published and enabled.
The trigger ignores the request body. Payload fields are not available to later blocks. Use an HTTP request block to fetch data. Each accepted request starts a separate run, including repeated requests.

Nodes

Add nodes after the trigger and connect them in execution order. Available nodes depend on the trigger, enabled features, and connected integrations.

HTTP request

You need the external API’s HTTPS URL, request format, and credentials.
  1. Enter the URL and Method, such as GET to fetch records or POST to send data.
  2. Under Authentication, select a saved Bearer token or HMAC-SHA256 credential as required by the API. Create credentials in Settings → Developer.
  3. Add the API’s Query parameters and Headers. For methods with a Body, add its fields. Select workflow variables for values such as a contact ID or call outcome.
  4. Publish and run the workflow to capture a response. In a later node’s field picker, select the HTTP node and browse its JSON response, including nested fields.
For a Body field that combines text and variables, select Text with variables and type {{ to choose a variable. Select Value when the request must preserve a variable’s number or boolean type, or send braces as literal text.

Fetch multiple pages

Enable Pagination to collect records across pages. The first request uses the URL and parameters configured above; pagination settings apply after each response.
  1. Set Records path to the array of records, such as data.contacts. Use . when the response body is the records array.
  2. Under How to get the next page, choose the API’s pagination method:
  3. Set When to stop to match the API: Records array is empty, Response has a certain status code, or Condition matches. For a cursor API, use a condition that stops when the next cursor is empty. An empty next-page URL also stops fetching.
  4. Set Maximum pages and, if the API requires a pause, Delay between pages (ms). The page limit stops fetching even if more records exist.
For a single-page import, configure the page-number rule and set Maximum pages to 1; no next-page request is sent. Complete the pagination fields before publishing. The items output combines collected records from all pages. responseJson contains the final page’s parsed JSON response. Check the fetched pages in the run details before using the data in later nodes.

Import contacts

Use Scheduled → HTTP request → Import contacts to keep telli contacts in sync with an external system. Start with Webhook received instead when the external system should trigger the import. You need its API URL and credentials, plus a stable, unique external ID for each contact. Create any custom contact properties before mapping them.
  1. Use a workflow with the Scheduled or Webhook received trigger. Import contacts is available only with these triggers.
  2. Add an HTTP request block with the API URL, method, and authentication. Enable Pagination and set Records path to the contact array, such as data.contacts. For a single page, set Maximum pages to 1; complete the next-page settings as described under pagination.
  3. Publish the workflow with just the trigger and HTTP block. Keep it disabled and select Runs → Run manually → Run workflow to capture a response containing at least one contact.
  4. Add Import contacts after the HTTP block. Select that block under Contact source. In Field mappings, select a response field for each required contact field:
  5. Use Add field for optional fields such as email, time zone, or custom properties. All mappings must use the same HTTP block. telli applies the sample mapping to every collected contact across all pages.
  6. Publish again and run manually to test the import. This writes real contact data. In the run details, check the import block’s Created, Updated, and Failed counts. Enable the workflow after checking the result.
Existing contacts are matched by External ID and updated; new IDs create contacts. Every row needs all four required values. Invalid rows and duplicate external IDs are reported as failures while valid rows are imported. A completed run does not mean every row succeeded. If the mapping picker shows No sample yet, run the published HTTP step again with a non-empty response. Only one Import contacts block is allowed on each workflow path.

If / else and Switch

For If / else, select a field, operator, and comparison value under Conditions, then connect actions to the true and false branches. Conditions within a group use AND; groups use OR. For Switch, add and name each option, then configure its conditions. Options are checked in order; only the first match runs. Enable Fallback option for cases where no option matches. Without a match or fallback, that path ends.

Update contact and CRM records

In Update contact, select the contact fields or custom properties to change and map each to a fixed value or workflow data. Connect Salesforce or HubSpot before adding its record nodes. Choose the record type and map its fields. For Update record, also select the record ID. Use Contact → External ID only when it contains the ID of that CRM record.

Delay and Schedule call

For Delay, set a duration of at least 10 seconds. Combined delays on one workflow path must not exceed 30 days. During the pause, run details show the delay as In progress. For Schedule call, choose an agent, set Call delay, and choose whether to respect dialing windows. The node uses the workflow’s contact. Enable the agent’s Auto Dialer; otherwise scheduled calls stay queued.

SMS and WhatsApp

For Send SMS, choose an SMS-capable sender number, set To, and enter the message. Use workflow variables to personalize it. See SMS for setup and delivery status. For Send WhatsApp, choose an active WhatsApp Business number, a recipient, and an approved Meta template. Map its fields to workflow data. See WhatsApp Business for setup.

Use workflow data

Select values from the trigger or earlier nodes with the field picker. Contact triggers provide contact fields and properties; Call ended also provides call metadata, collected data, outcomes, and analysis results. For Call ended, select Call Metadata → Conversation link or use {{call.conversationUrl}} to link to the call. Opening the link requires telli account access. Select Call Metadata → Recording URL to send a recording link. call.transcript contains plain-text Agent: and User: lines and prefers the refined transcript when available. It has no value when transcript storage is disabled. Transcript retention removes it from stored workflow snapshots and traces and stops active runs that depend on it. Data already sent to external systems is unaffected.

Common examples

Fetch CRM data with a custom integration

Use Scheduled → HTTP request → Import contacts to import CRM contacts regularly. Configure the HTTP request, pagination, and field mappings above. For a lookup after a call, use Call ended → HTTP request → If / else → Update contact. Fetch the CRM record using the contact’s external ID, check its lead status, and update the telli contact when the condition matches.

Sync Salesforce or HubSpot

Use Call ended → If / else → Update record with the connected CRM’s node. For example, require a “Qualified Lead” outcome, then map the result to the CRM’s lead-status field. Use Create record when you need a new record instead.

Log Salesforce calls

Use a Salesforce Create record block with type Task to log a completed telli call back into Salesforce as an activity. Set these fields:
Name ID links the Salesforce task to the synced Lead or Contact. Use Contact -> External ID, which stores the Salesforce record ID for contacts synced from Salesforce. For contacts synced from Person Accounts, External ID holds the Account record ID, which Salesforce does not accept as a task Name ID.

Send call data to another system

Use Call ended → HTTP request with POST. Map the call summary, outcomes, contact fields, or recording URL into the request body, using the field names expected by the receiving API.

Send a follow-up message

Use Call ended → If / else → Send SMS or Send WhatsApp. Check an outcome such as “Appointment Booked”, then send the confirmation or booking link.
  • Contact Properties - Define the custom fields workflows can update on telli contacts
  • SMS - Send SMS messages from agents and workflows
  • WhatsApp Business - Send WhatsApp template messages from agents and workflows
  • Outcomes - Learn how telli extracts structured outcomes from completed calls
  • Webhooks - Send completed call data to external systems outside of workflows
  • Salesforce - Connect Salesforce before using Salesforce workflow blocks
  • HubSpot - Connect HubSpot before using HubSpot workflow blocks