See the video tutorial below for a step-by-step guide:
Get the Make.com template here

Prerequisites

  • Accounts at telli and Make.com
  • CRM system (e.g. Airtable, Salesforce, Pipedrive, etc.) or any other system to store your contact information

Add your CRM contacts and schedule calls in telli

When new contacts are added to your CRM, you can automatically add them to telli:
  1. Create a new scenario in Make.com (e.g. “Add contacts and schedule calls in telli”)
  2. Add a trigger module for your CRM (e.g., “New Contact” in Airtable, “Watch new Rows” in Google Sheets)
  3. Link your data source correctly (the table in which you stored the contact information in your CRM).
  4. Add a telli “Add a Contact” module (authenticate via your API Key from your telli Dashboard)
  5. Map your CRM fields from step 2 to the properties the “Add a Contact” module expects
  6. Add a telli “Schedule a Call” module
  7. Map your contact_ids (return values from previous request) and agent_id (find that ID in your telli Dashboard) to the “Schedule a Call” module
If you want to add multiple contacts at once, use the “Add multiple Contacts” and “Schedule multiple Calls” modules. Instead of a “Watch” Module, you will need to use a “Get”, “List”, or “Search” Module to fetch all the entries from your data source. Find the Make.com template here soon.

Process call information with webhooks

Once you’ve set up the contact addition and call scheduling, you can enhance your workflow by capturing real-time call events and automatically updating your CRM. See the video tutorial below for a step-by-step guide:
Get the Make.com template here

Updating CRM Contact Status with Call Analysis

A typical use case is to automatically update a contact’s status in your CRM based on the call outcome and analysis. Here’s how to implement this workflow:
  1. Set up a webhook in Make.com and telli:
    • In Make.com, create a new scenario with “Webhooks” → “Custom webhook” as your trigger
    • Copy the webhook URL that Make.com provides
    • Go to Settings > API & Webhooks in your telli dashboard
    • Click “Configure” to access the webhook portal
    • Add the Make.com webhook URL as an endpoint URL
    • Enable the call_ended event
    • Test the webhook by making a sample call in telli to your registered phone number
    • After the call ends, the webhook will trigger automatically
  2. Add a JSON parser module:
    • This is needed to be able to work with the data in the next steps. This is the payload that you will receive from the webhook, copy this to determine the data structure for the module:
    {
      "event": "call_ended",
      "call": {
        "call_id": "YOUR_CALL_ID",
        "loop_id": "YOUR_LOOP_ID",
        "attempt": 1,
        "from_number": "YOUR_FROM_NUMBER",
        "direction": "outbound",
        "to_number": "YOUR_TO_NUMBER",
        "external_contact_id": "YOUR_EXTERNAL_CONTACT_ID",
        "contact_id": "YOUR_CONTACT_ID",
        "agent_id": "YOUR_AGENT_ID",
        "triggered_at": 1731956924302,
        "triggered_at_iso": "YOUR_TRIGGERED_AT_ISO",
        "started_at": 1731956932264,
        "started_at_iso": "YOUR_STARTED_AT_ISO",
        "ended_at": 1731957002078,
        "ended_at_iso": "YOUR_ENDED_AT_ISO",
        "call_length_min": 1.17,
        "call_status": "COMPLETED",
        "transcript": "YOUR_TRANSCRIPT",
        "recording_url": "YOUR_RECORDING_URL",
        "transcriptObject": [
          {
            "role": "agent",
            "content": "YOUR_TRANSCRIPT"
          },
          {
            "role": "customer",
            "content": "YOUR_TRANSCRIPT"
          }
        ],
        "call_analysis": {
          "summary": {
            "value": true,
            "details": "YOUR_SUMMARY_DETAILS"
          },
          "appointment": {
            "value": true,
            "details": "YOUR_APPOINTMENT_DETAILS"
          },
          "interest": {
            "value": true,
            "details": "YOUR_INTEREST_DETAILS"
          },
          "follow_up_required": {
            "value": false
          },
          "questions": {
            "value": true,
            "details": "YOUR_QUESTIONS_DETAILS"
          }
        },
        "booked_slot_for": "YOUR_BOOKED_SLOT_FOR"
      },
      "contact": {
        "contact_id": "YOUR_CONTACT_ID",
        "external_contact_id": "YOUR_EXTERNAL_CONTACT_ID",
        "created_at": "2024-11-18T15:30:00.000Z",
        "gender": "F",
        "first_name": "YOUR_FIRST_NAME",
        "last_name": "YOUR_LAST_NAME",
        "phone_number": "YOUR_PHONE_NUMBER",
        "in_call_since": null,
        "reached_at": "2024-11-18T15:45:00.000Z",
        "contact_details": {
          "company": "YOUR_COMPANY",
          "notes": "YOUR_NOTES"
        },
        "call_attempts": 1,
        "next_call_at": null,
        "email": "YOUR_EMAIL",
        "timezone": "YOUR_TIMEZONE",
        "salutation": "YOUR_SALUTATION",
        "status": "reached"
      }
    }
    
  3. Add a Router module to create different paths based on call outcomes:
    This could be an example for tracking call statuses and interest to determine whether we would need to follow-up or have already scheduled an appointment.
    • Set up a filter for Path 1: call.call_status = "COMPLETED" AND call.call_analysis.interest.value = true AND call.call_analysis.appointment.value = true
    • Set up a filter for Path 2: call.call_status = "COMPLETED" AND call.call_analysis.interest.value = true AND call.call_analysis.appointment.value = false
    • Set up a filter for Path 3: call.call_status = "COMPLETED" AND call.call_analysis.interest.value = false
    • Optional: Set up a filter for Path 4: call.call_status = "NOT_REACHED" OR call.call_status = "VOICEMAIL"
  4. For each path, add an Airtable “Update a record” module:
    • Connect to your Airtable account
    • Select your base and table
    • Set record ID search: Find records where “External ID” equals call.external_contact_id
  5. Configure each Airtable module with appropriate field mappings:
    Map the fields to the fields in your Airtable base. E.g. if a contact has been called and it confirmed interest, you can update the status to “Qualified Lead” and add a note with the call summary.
    For Path 1 (Interested + Appointment):
    Status: "Qualified Lead"
    Next Step: "Calendar Appointment"
    Appointment Date: call.call_analysis.appointment.details (format as date)
    Notes: "Call Summary: " + call.call_analysis.summary.details
    Last Contact: current date/time
    
    For Path 2 (Interested but needs follow-up):
    Status: "Interested"
    Next Step: "Schedule Follow-up Call"
    Notes: "Call Summary: " + call.call_analysis.summary.details
    Last Contact: current date/time
    
    For Path 3 (Not Interested):
    Status: "Not Interested"
    Next Step: "Remove from Campaign"
    Notes: "Call Summary: " + call.call_analysis.summary.details
    Last Contact: current date/time
    
    For Path 4 (Not Reached):
    Status: "Pending"
    Next Step: "Retry Call"
    Last Contact: current date/time
    
This workflow automatically categorizes leads based on call outcomes and prepares them for the next appropriate action in your sales process. Your Airtable base will always reflect the most current status of each contact.

Security Best Practices

For production implementations, verify webhook signatures to ensure requests are genuinely from telli and not malicious:
import { Webhook } from "svix";

const secret = "whsec_YOUR_WEBHOOK_SECRET"; // From telli dashboard
const wh = new Webhook(secret);
const payload = wh.verify(requestBody, headers);
By integrating these webhook events with Make.com, you create an automated system that keeps your CRM updated in real-time with valuable insights from customer calls, helping your sales team prioritize leads effectively and take timely actions based on actual customer interactions with telli.