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 pro Service einen Endpoint konfigurieren, der alle Event-Typen empfängt. 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

Um Anrufdaten automatisch mit deinem CRM zu synchronisieren:
  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 „Konfigurieren”
  3. Klicke auf „Endpoint hinzufügen” und füge die Webhook-URL deines CRM ein
  4. Aktiviere die Events, die du empfangen möchtest (z. B. call_ended, um CRM-Einträge bei Anrufabschluss zu aktualisieren)
  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
Um anzuzeigen, dass ein Webhook verarbeitet wurde, muss innerhalb eines angemessenen Zeitrahmens (15 Sekunden) eine 2xx-Antwort (Statuscode 200–299) auf die Webhook-Nachricht zurückgegeben werden.
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 zum Bereich Einstellungen > API & Webhooks und klicke auf „Konfigurieren”, um das Webhook-Portal zu öffnen.Configure WebhooksKlicke auf „Endpoint hinzufügen”, um die Webhook-URL deines CRM hinzuzufügen. Füge die URL von deinem CRM oder deiner Automatisierungsplattform ein und klicke auf „Hinzufügen”.Add an endpointDu kannst nun die Events aktivieren, die du empfangen möchtest (z. B. call_ended), um dein CRM automatisch bei Anrufabschluss zu aktualisieren.

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 wurde, sendet telli automatisch einen Webhook an dein CRM mit detaillierten Informationen zum Anruf. Dies umfasst das Transkript, Analyseergebnisse und vollständige Kontaktinformationen, sodass du CRM-Einträge mit Anrufergebnissen aktualisieren, Leads qualifizieren und Kundeninteraktionen automatisch nachverfolgen kannst. Anrufstatus Der Anrufstatus kann einer der folgenden sein:
  • COMPLETED: Ein Gespräch mit dem Kontakt hat stattgefunden
  • ANSWERED: Ein Anruf fand statt, aber ein weiterer Versuch wird unternommen, den Kontakt zu erreichen
  • NOT_REACHED: Der Kontakt konnte nicht erreicht werden
  • VOICEMAIL: Die Mailbox des Kontakts wurde erreicht
  • ERROR: Beim Anruf ist ein Fehler aufgetreten
Anrufergebnis und Anrufanalyse Nach jedem Kundenanruf analysiert telli automatisch das Transkript, um wichtige Erkenntnisse zu extrahieren, die du zur Aktualisierung deines CRM 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 sich das Format von call_analysis vom Format von call_outcome 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 im Verlauf von Anrufkampagnen fortschreiten. Jeder Kontakt durchläuft verschiedene Status, und dein CRM wird in Echtzeit benachrichtigt, sodass du den Lead-Fortschritt verfolgen und Nachfassaktionen priorisieren kannst.

Kontaktstatus

Kontakte können die folgenden Status haben:
  • new: Kontakt wurde noch nicht angerufen
  • pending: Kontakt befindet sich im Dialer und wir versuchen, ihn zu erreichen
  • closed: Der Dialer hat alle Versuche 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. Eine ausführlichere Erklärung findest du in diesem 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 zu ermöglichen

Automatische Wiederholungsversuche

Wir versuchen, jede Webhook-Nachricht nach einem Wiederholungsplan mit exponentiellem Backoff zuzustellen.Der ZeitplanJede Nachricht wird nach dem folgenden Zeitplan versucht, wobei jede Periode nach dem Fehlschlag 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 diesen 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 verwenden, um jede Nachricht jederzeit manuell erneut zu senden, oder alle fehlgeschlagenen Nachrichten ab einem bestimmten Datum automatisch erneut senden („Wiederherstellen”).Zuverlässigkeitsfunktionen:
  • Automatische Wiederholungsversuche: Fehlgeschlagene Webhook-Zustellungen werden mit exponentiellem Backoff wiederholt
  • Manuelle Wiederherstellung: Fehlgeschlagene Nachrichten über das Webhook-Portal erneut senden