Workflows let you automate what happens when key events occur in telli. You build them visually on a canvas - pick a trigger, drag in action and condition blocks, connect them with lines. No code required.
When your agent completes a call or a new contact is created, workflows can automatically send data to your CRM, update contact records, route hot leads to your team, or trigger any downstream automation you need.
Quick Start
Open Workflows
Click Workflows in the left sidebar of the telli dashboard
Click Create Workflow
Give it a descriptive name like “Send hot leads to Salesforce” (not “Workflow 1”)
Pick the trigger
Choose Call Ended (runs after agent calls finish) or Contact Created (runs when new contacts are added)
Add blocks
Click the + button on the canvas to add action and condition blocks. Connect blocks by dragging lines between them
Configure each block
Click any block to open its settings panel and fill in the required information
Publish the draft
Click Publish to lock in your current draft as the live version
Enable the workflow
Flip the Enabled switch ON (publishing alone does not make it run)
Test it manually
Open the Runs tab → click Run manually → pick a recent call → watch what happens
A workflow only runs automatically if it is BOTH published AND enabled. Always test manually before enabling.
Triggers
Call Ended
Contact Created
Call Ended fires automatically every time a selected agent finishes a phone call.
- Each workflow is tied to ONE specific agent
- Only fires for calls that actually completed (a real human picked up and the conversation finished)
- Does NOT fire for voicemails, busy signals, or calls that errored out
Available Data
Every block can pull from the call that triggered the workflow, plus anything earlier blocks produced.| Data Type | What’s Available |
|---|
| Contact information | Name, phone, email, and any custom contact properties you’ve set up |
| Call metadata | Direction, duration, end reason, who hung up, time of day |
| Call outcomes | The structured outcomes your agent assigned (e.g. “Demo Booked”, “Not Interested”) |
| Collected data | Anything specific the agent gathered during the call (preferred date, budget, address, etc.) |
Contact Created fires automatically whenever a new contact is added to telli.
- Triggers regardless of how the contact was created (manually, via API, through integrations, or imported)
- Runs once per contact at the moment of creation
- Perfect for onboarding workflows, welcome sequences, or automatic CRM syncing
Available Data
Every block can pull from the contact that triggered the workflow, plus anything earlier blocks produced.| Data Type | What’s Available |
|---|
| Contact information | Name, phone, email, and any custom contact properties you’ve set up |
| Creation metadata | How the contact was created (manual, API, integration), timestamp |
Action Blocks
Condition Blocks
| Action | What it does |
|---|
| Call notification email | Sends a call summary email to a specific team member or email address. Includes transcript, recording, outcomes, and collected data. Perfect for notifying sales reps or managers about important calls. |
| Send SMS | Sends a text message to the contact after the call. Use it for follow-ups, appointment confirmations, or sending resources mentioned during the conversation. |
| Schedule call | Automatically schedules a follow-up call with the contact. Sets the time, assigns an agent, and adds it to the dialer queue. |
| Update contact | Changes information about the contact inside telli. Works with standard fields (name, phone, email) and your own custom contact properties. |
| HTTP request | Sends data to any external endpoint as an HTTP request (also called “Webhook”). Use it to push data into Pipedrive, Slack, Zapier, Make, n8n, your data warehouse, or your own internal API. |
Create record | Creates a brand new record in HubSpot (e.g. a Contact, Deal, Ticket, or any custom object). Requires HubSpot integration. |
Update record | Updates an existing HubSpot record. Commonly used to move deals to new pipeline stages or update contact properties based on call outcomes. |
Create record | Creates a brand new record in Salesforce (e.g. a Lead, Contact, Opportunity, or any custom object). Requires Salesforce integration. |
Update record | Updates an existing Salesforce record. Commonly used to move opportunities to new pipeline stages based on call outcomes. |
| Condition | What it does |
|---|
| If / Else | A simple yes-or-no fork. Example: “IF the customer agreed to a demo → take path A. ELSE → take path B.” |
| Switch | A multi-way fork based on a single value. Example: “If outcome is Demo Booked → path 1. If Not Interested → path 2. If Callback Requested → path 3.” |
The CRM Updater (Most Common Pattern)
Push every call result into your CRM:[Call Ended: My Sales Agent]
↓
[HubSpot: Create/Update record with call data]
Use the native HubSpot or Salesforce blocks for easier setup. For other CRMs, use the HTTP request block to send data to their API endpoints.
Hot Lead Routing
Only update Salesforce when the call actually went well:[Call Ended: My Sales Agent]
↓
[If/Else: Did call outcome = "Demo Booked"?]
↓ YES ↓ NO
[Salesforce: Update Opportunity [Update contact:
→ Stage = "Demo Scheduled"] Mark as "Not Ready"]
↓
[HTTP request: Notify #sales-wins on Slack]
Multi-Path Outcome Handler
Different actions for different call outcomes:[Call Ended: My Support Agent]
↓
[Switch: What was the outcome?]
↓ ↓ ↓
"Issue Resolved" "Needs Engineer" "Angry Customer"
↓ ↓ ↓
[Update contact [Salesforce: Create [HTTP request: Page
→ Status: Done] Engineering Ticket] on-call manager]
Stop Calling People Who Said No
Respect opt-outs automatically:[Call Ended: Outbound Agent]
↓
[If/Else: outcome = "Do Not Contact"?]
↓ YES
[Update contact: set "Status" to suppressed]
Push every new contact to your external system:[Contact Created]
↓
[HubSpot/Salesforce: Create record with contact data]
For HubSpot and Salesforce, use the native integration blocks. For other systems like Pipedrive, use the HTTP request block.
Send Follow-Up SMS After Calls
Automatically text customers after the conversation:[Call Ended: Support Agent]
↓
[If/Else: outcome = "Issue Resolved"?]
↓ YES
[Send SMS: "Thanks for calling! Your ticket #{{ticket_number}} is resolved."]
Notify Manager About Hot Leads
Alert team members when important calls happen:[Call Ended: Sales Agent]
↓
[If/Else: outcome = "Demo Booked"?]
↓ YES
[Call notification email → Send summary to [email protected]]
These three states cause the most confusion:| State | What it means |
|---|
| Draft | Your work-in-progress. Auto-saved as you build. Not running for any real calls. Safe to edit. |
| Published | The locked-in version that telli uses for new automatic runs. You publish a draft to make it the new live version. |
| Enabled | A separate ON/OFF switch. A workflow must be published before it can be enabled. Disabling does NOT delete anything - it just pauses execution. |
A workflow only runs automatically if it is BOTH published AND enabled.
Version HistoryEvery publish creates a new revision. You can:
- Browse all previous versions
- Preview an older version on the canvas (read-only)
- Restore a previous version, which republishes it as the current live one
This makes it safe to experiment - if a new version breaks something, roll back in two clicks.