Zum Hauptinhalt springen

Voraussetzungen

  • Ein telli-Konto mit API-Zugang
  • Ein CRM-System (z. B. Airtable, Salesforce, HubSpot, Pipedrive) oder eine Automatisierungsplattform (Zapier, Make, n8n)
  • Eine Webhook-Endpoint-URL von deinem CRM oder deiner Automatisierungsplattform

Einrichtung zum Empfang von Anrufdaten in deinem CRM

Webhooks ermöglichen es telli, Anrufdaten automatisch in Echtzeit an dein CRM zu senden. Wenn Anrufe abgeschlossen sind, sendet telli POST-Anfragen an deinen Webhook-Endpoint mit vollständigen Anrufinformationen, Transkripten und Analyseergebnissen. So kannst du CRM-Einträge automatisch mit Anrufergebnissen aktualisieren, Leads qualifizieren und den Kontaktstatus verfolgen, ohne manuelle Dateneingabe. Du kannst einen Endpoint pro Dienst konfigurieren, um alle Event-Typen zu empfangen. Das bedeutet, dass dein CRM automatisch Daten über Anrufe und deren Analyse in Echtzeit erhält, sodass deine Kundendaten immer aktuell bleiben.

Webhooks für dein CRM einrichten

So synchronisierst du Anrufdaten automatisch mit deinem CRM:
  1. Erstelle in deinem CRM oder deiner Automatisierungsplattform (Zapier, Make, n8n) einen Webhook-Endpoint und kopiere die URL
  2. Gehe in telli zu Einstellungen > API & Webhooks und klicke auf “Configure”
  3. Klicke auf “Add Endpoint” und füge die Webhook-URL deines CRMs ein
  4. Aktiviere die Events, die du empfangen möchtest (z. B. “call_ended”, um CRM-Einträge zu aktualisieren, wenn Anrufe abgeschlossen sind)
  5. Führe einen Testanruf mit deinem telli-Konto durch
  6. Überprüfe, ob der Webhook ausgelöst wurde und dein CRM-Eintrag automatisch aktualisiert wurde
Eine Webhook-Nachricht gilt als verarbeitet, wenn innerhalb eines angemessenen Zeitrahmens (15s) eine 2xx-Antwort (Statuscode 200-299) zurückgegeben wird.
Um dein CRM mit telli zu verbinden, musst du einen Webhook-Endpoint konfigurieren. Das ist die URL, an die telli Anrufdaten sendet, um deine CRM-Einträge zu aktualisieren.Gehe in telli zu Einstellungen > API & Webhooks und klicke auf “Configure”, um das Webhook-Portal aufzurufen.Configure WebhooksKlicke auf “Add Endpoint”, um die Webhook-URL deines CRMs hinzuzufügen. Füge die URL von deinem CRM oder deiner Automatisierungsplattform ein und klicke auf “Add”.Add an endpointDu kannst nun die Events aktivieren, die du empfangen möchtest (z. B. “call_ended”), um dein CRM automatisch zu aktualisieren, wenn Anrufe abgeschlossen sind.

Events

Wir unterstützen die folgenden Webhook-Events:
  • call_ended: Wird ausgelöst, wenn ein Anruf abgeschlossen ist, einschließlich Transkript und Analyse
  • contact_status_changed: Wird ausgelöst, wenn sich der Status eines Kontakts ändert (new, pending, closed, reached)

Call Ended Event

Wenn ein Anruf abgeschlossen und analysiert ist, sendet telli automatisch einen Webhook an dein CRM mit detaillierten Informationen über den Anruf. Dies umfasst das Transkript, die Analyseergebnisse und vollständige Kontaktinformationen, sodass du CRM-Einträge mit Anrufergebnissen aktualisieren, Leads qualifizieren und Kundeninteraktionen automatisch verfolgen kannst. Anrufstatus Der Anrufstatus kann einer der folgenden sein:
  • COMPLETED: Ein Gespräch mit dem Kontakt hat stattgefunden
  • ANSWERED: Ein Anruf hat stattgefunden, aber ein weiterer Versuch wird unternommen, den Kontakt zu erreichen
  • NOT_REACHED: Wir konnten den Kontakt nicht erreichen
  • VOICEMAIL: Wir haben die Mailbox des Kontakts erreicht
  • ERROR: Ein Fehler ist beim Anruf aufgetreten
Call Outcome und Call Analysis Nach jedem Kundenanruf analysiert telli automatisch das Transkript, um wichtige Erkenntnisse zu extrahieren, die du zur Aktualisierung deines CRMs nutzen kannst. Der Webhook enthält zwei Arten von Analysedaten:
  • call_outcome: Benutzerdefinierte Anrufanalyse-Felder, die du in der telli-App konfigurieren kannst
    {
      "custom_lost_reason": {             // call analysis field name
        "value": "PRODUCT_TOO_EXPENSIVE", // call analysis value
        "fieldSchema": ...                // information about schema
      }
    }
    
  • call_analysis: Vom System bereitgestellte Anrufanalyse-Felder Beachte, dass das call_analysis-Format sich vom call_outcome-Format unterscheidet:
    {
      "appointment": {
        "value": true,                     // boolean: is the value present?
        "details": "2025-02-18T15:30:00Z", // additional details (string or number)
      }
    }
    
Erfasste Daten Wenn der Agent Daten erfassen-Aufgaben konfiguriert hat, enthält das collected_data-Feld Daten, die während des Anrufs aktiv erfasst und mit dem Anrufer bestätigt wurden:
{
  "email": {
    "status": "confirmed",
    "value": "[email protected]"
  },
  "case_number": {
    "status": "declined",
    "value": null
  }
}
Jeder Key bildet auf ein Objekt mit folgenden Feldern ab:
  • status: "confirmed" | "declined" | "error" | "in_progress"
  • value: der erfasste String, oder null wenn nicht erfasst
Wenn keine Daten-erfassen-Aufgaben konfiguriert sind oder keine ausgelöst wurden, ist collected_data null.
{
  "event": "call_ended",
  "call": {
    "agent_id": "d8931604-92ad-45cf-9071-d9cd2afbad0c",
    "attempt": 1,
    "booked_slot_for": "2025-02-24T15:30:00Z",
    "call_analysis": {
      "appointment": {
        "details": "2025-02-18T15:30:00Z",
        "value": true
      },
      "interest": {
        "details": "The customer is interested in buying an ice cream machine",
        "value": true
      },
      "summary": {
        "details": "A call between an agent and a customer talking about buying an ice cream machine",
        "value": true
      }
    },
    "call_id": "b4a05730-2abc-4eb0-8066-2e4d23b53ba9",
    "call_length_min": 2,
    "call_outcome": {
      "custom_lost_reason": {
        "fieldSchema": {
          "enum": [
            "CUSTOMER_NOT_INTERESTED",
            "CUSTOMER_PREVIOUSLY_CONTACTED",
            "PRODUCT_TOO_EXPENSIVE"
          ],
          "type": ["string", "null"]
        },
        "value": "PRODUCT_TOO_EXPENSIVE"
      }
    },
    "call_status": "COMPLETED",
    "collected_data": {
      "email": {
        "status": "confirmed",
        "value": "[email protected]"
      }
    },
    "contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
    "direction": "outbound",
    "ended_at": 1731957002078,
    "external_contact_id": "external-123",
    "from_number": "+17755719467",
    "loop_id": "ba99c99d-19b9-4a0d-8df6-3e213088989a",
    "recording_url": "<url-of-recording>",
    "started_at": 1731956932264,
    "to_number": "+16506794960",
    "transcript": "Agent: Hello...",
    "transcriptObject": [
      {
        "content": "Hello...",
        "role": "agent"
      }
    ],
    "triggered_at": 1731956924302
  },
  "contact": {
    "call_attempts": 1,
    "contact_details": {
      "company": "Art Studio Inc",
      "notes": "Interested in solar panels"
    },
    "contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
    "created_at": "2024-11-18T15:30:00.000Z",
    "email": "[email protected]",
    "external_contact_id": "external-123",
    "first_name": "Frida",
    "in_call_since": null,
    "last_name": "Kahlo",
    "next_call_at": null,
    "phone_number": "+14155552671",
    "reached_at": "2024-11-18T15:45:00.000Z",
    "salutation": "Ms.",
    "status": "reached",
    "timezone": "America/Los_Angeles"
  }
}

Contact Status Changed Event

Das Contact Status Changed Event aktualisiert dein CRM automatisch, wenn Kontakte in Anrufkampagnen voranschreiten. Jeder Kontakt durchläuft verschiedene Zustände, und dein CRM wird in Echtzeit benachrichtigt, damit du den Lead-Fortschritt verfolgen und Follow-ups priorisieren kannst.

Kontaktstatus

Kontakte können die folgenden Status haben:
  • new: Kontakt wurde noch nicht angerufen
  • pending: Kontakt ist im Dialer und wir versuchen, ihn zu erreichen
  • closed: Dialer wurde ausgeschöpft und wir versuchen nicht mehr, den Kontakt anzurufen
  • reached: Kontakt wurde erreicht und ein Gespräch hat stattgefunden. Wir versuchen nicht mehr, ihn anzurufen
{
  "event": "contact_status_changed",
  "contact": {
    "contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
    "external_contact_id": "external-123",
    "status": "reached",
    "status_updated_at": "2024-03-18T15:30:00Z",
    "reached_at": "2024-03-18T15:30:00Z",
    "first_name": "Frida",
    "last_name": "Kahlo",
    "phone_number": "+14155552671",
    "email": "[email protected]"
  }
}

Sicherheit und Zuverlässigkeit

Signaturen verifizieren

Um sicherzustellen, dass Webhook-Nachrichten, die dein CRM aktualisieren, tatsächlich von telli stammen und nicht von einem böswilligen Akteur, solltest du Webhook-Signaturen verifizieren. Dies ist optional, wird aber für produktive CRM-Integrationen empfohlen. Für eine detailliertere Erklärung lies diesen Artikel darüber, warum du Webhooks verifizieren solltest.
import { Webhook } from "svix";

// You can get this secret from the Webhook Configuration in the telli dashboard
const secret = "whsec_GET_THIS_FROM_THE_DASHBOARD";

// These were all sent from the server
const headers = {
  "svix-id": "msg_p5jXN8AQM9LWM0D4loKWxJek",
  "svix-timestamp": "1614265330",
  "svix-signature": "v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=",
};
const payload = '{"test": 2432232314}';

const wh = new Webhook(secret);
// Throws on error, returns the verified content on success
const payload = wh.verify(payload, headers);
Anleitungen zur Signaturverifizierung findest du in der Webhook-Verifizierungsdokumentation. Die Dokumentation enthält Beispiele in JavaScript, Python, Go, Java, PHP und anderen Sprachen.
Hinweis: Deaktiviere den CSRF-Schutz für deinen Endpoint, um Webhook-POST-Anfragen zuzulassen

Automatische Wiederholungsversuche

Wir versuchen, jede Webhook-Nachricht basierend auf einem Wiederholungsplan mit exponentiellem Backoff zuzustellen.Der ZeitplanJede Nachricht wird nach folgendem Zeitplan versucht, wobei jeder Zeitraum nach dem Fehlschlagen des vorherigen Versuchs beginnt:
  • Sofort
  • 5 Sekunden
  • 5 Minuten
  • 30 Minuten
  • 2 Stunden
  • 5 Stunden
  • 10 Stunden
  • 10 Stunden (zusätzlich zum vorherigen)
Wenn ein Endpoint entfernt oder deaktiviert wird, werden auch die Zustellversuche an den Endpoint eingestellt.Zum Beispiel wird ein Versuch, der dreimal fehlschlägt, bevor er schließlich erfolgreich ist, ungefähr 35 Minuten und 5 Sekunden nach dem ersten Versuch zugestellt.

Manuelle Wiederholungsversuche

Du kannst auch das Webhook-Portal nutzen, um jede Nachricht jederzeit manuell erneut zu senden, oder alle fehlgeschlagenen Nachrichten ab einem bestimmten Datum automatisch wiederholen (“Recover”).Zuverlässigkeitsfunktionen:
  • Automatische Wiederholungsversuche: Fehlgeschlagene Webhook-Zustellungen werden mit exponentiellem Backoff wiederholt
  • Manuelle Wiederherstellung: Fehlgeschlagene Nachrichten über das Webhook-Portal erneut senden