Du betrachtest gerade Automatisierte Anrufintegration: Zoho CRM, Forms und Flow mit Zoiper verbinden

Automatisierte Anrufintegration: Zoho CRM, Forms und Flow mit Zoiper verbinden

  • Beitrags-Autor:

Zoho-Integration auf Steroiden: Telefonanlage mit Forms, CRM & Flow verbinden

Stell dir vor, dein Telefon klingelt. Ein Kunde ruft an. Noch während es klingelt – oder spätestens beim Abheben – öffnet sich automatisch ein vorausgefülltes Formular auf deinem Bildschirm. Es enthält nicht nur die Anrufernummer, sondern auch relevante Kundendaten direkt aus deinem Zoho CRM. Klingt gut? Das ist keine Zukunftsmusik, sondern mit einer cleveren Kombination aus deiner Telefonanlage, Zoho Forms, Zoho CRM, Zoho Flow und einer Prise Deluge-Scripting heute schon Realität. In diesem Artikel zeige ich dir Schritt für Schritt, wie du eine solche Integration aufbaust, um deinen Service- oder Vertriebsprozess effizienter und kontextbezogener zu gestalten.

Warum ist das wichtig? Viele Unternehmen kämpfen damit, Anrufinformationen nahtlos in ihr CRM zu überführen. Oft müssen Daten manuell kopiert oder nachgeschlagen werden – das kostet Zeit, ist fehleranfällig und der Mitarbeiter hat nicht sofort alle relevanten Infos zur Hand. Wir lösen genau diese Herausforderung, indem wir die Telefonanlage direkt mit dem Zoho-Ökosystem verknüpfen und Prozesse automatisieren.

Das typische Praxisproblem: Anrufdaten manuell im CRM erfassen

Ein klassisches Szenario in vielen KMUs: Das Serviceteam nutzt eine VoIP-Telefonanlage wie Placetel, Sipgate oder eine andere Lösung. Parallel dazu wird Zoho CRM für die Kundenverwaltung eingesetzt. Bei einem eingehenden Anruf muss der Mitarbeiter manuell:

  • Die Anrufernummer erkennen oder erfragen.
  • Im CRM nach dem Kunden suchen.
  • Ein neues Ticket, einen Anrufdatensatz oder eine Notiz erstellen.
  • Relevante Informationen aus dem Gespräch eintragen.

Dieser Prozess ist nicht nur mühsam, sondern birgt auch das Risiko, dass wichtige Details verloren gehen oder der Kunde warten muss, während der Mitarbeiter Daten sucht. Ziel ist es, diesen Vorgang zu automatisieren, sodass beim Anruf sofort ein kontextbezogenes Ticket-Formular mit allen bekannten Daten bereitsteht.

Schritt-für-Schritt zur automatisierten Ticketerstellung bei Anruf

Wir bauen eine Lösung, die folgende Schritte automatisiert:

  1. Anruf eingehend: Deine Telefonanlage (hier Zoiper als Beispiel) erkennt den Anruf.
  2. Formular öffnen: Die Telefonanlage öffnet automatisch ein Zoho Forms Formular über eine spezielle URL und übergibt Anrufdaten (Nummer, Call ID etc.) als Parameter (Static Prefill).
  3. Kundendaten anreichern: Zoho Forms ruft über einen Dynamic Prefill Webhook eine Zoho Custom Function auf. Diese sucht anhand der angerufenen Nummer (die dem Kunden zugeordnet ist) den passenden Datensatz in Zoho CRM und füllt relevante Kundeninfos (z.B. Beschreibung, Begrüßungstext, Adressliste) im Formular vorab aus.
  4. Formular ausfüllen & absenden: Der Mitarbeiter ergänzt nur noch die spezifischen Details des Anliegens und sendet das Formular ab.
  5. Ticket erstellen: Zoho Flow wird durch die Formularübermittlung getriggert und erstellt automatisch einen Anrufdatensatz (Ticket) im Zoho CRM, verknüpft mit dem richtigen Kunden.
  6. Kunden benachrichtigen: Ein Zoho CRM Workflow sendet optional eine automatische Eingangsbestätigung per E-Mail an den Kunden.

Los geht’s mit der Umsetzung!

Schritt 1: Telefonanlage konfigurieren & Static Prefill URL erstellen

Die meisten modernen VoIP-Telefonanlagen bieten die Möglichkeit, bei einem eingehenden Anruf eine externe URL aufzurufen („URL Agent“, „Screen Pop“, o.ä.). Prüfe die Dokumentation deiner Anlage (z.B. Zoiper). Dort konfigurierst du den Aufruf eines Zoho Forms Formulars.

Zuerst brauchst du die Basis-URL deines Zoho Forms. Erstelle ein neues Formular (z.B. „Anruf Ticket“) in Zoho Forms. Gehe dann zu Einstellungen -> Prefill -> Static Prefill.

Hier kannst du eine URL generieren lassen, die Formularfelder vorausfüllt. Wähle die Felder aus, die du mit Daten aus deiner Telefonanlage befüllen möchtest (z.B. Anrufernummer, Call ID). In die Werte-Felder trägst du die Platzhalter deiner Telefonanlage ein. Diese sehen oft so aus: {Variable_Name} (z.B. {CallerID}, {CalledNumber}, {CallID}). Es ist sinnvoll, *alle* verfügbaren Variablen der Telefonanlage zu übergeben, um maximale Flexibilität zu haben.

Lege dafür in deinem Zoho Formular entsprechende (ggf. versteckte) Felder vom Typ „Einzeilig“ an, z.B.:

  • Solper_Name (Wird oft für die angerufene Nummer verwendet, wichtig für Schritt 3!)
  • Solper_Vorname
  • Solper_Account
  • Solper_Call_ID
  • Solper_Phone (Die Nummer des Anrufers)
  • … (alle weiteren Variablen deiner Anlage)

Generiere die Prefill-URL in Zoho Forms. Sie sieht dann etwa so aus:

https://forms.zohopublic.eu/DEIN_PORTAL/form/AnrufTicket/FORM_LINK/pageperma/FORM_PERMALINK?zf_referrer_name=DeineQuelle&zf_tracking_id=Optional&Solper_Name={CalledNumber}&Solper_Call_ID={CallID}&Solper_Phone={CallerID}

Wichtiger Hinweis: Zoho Forms kodiert die geschweiften Klammern { und } in der generierten URL oft zu %7B und %7D. Deine Telefonanlage erwartet aber wahrscheinlich die echten Klammern, um die Variablen zu ersetzen. Du musst die generierte URL also kopieren und in einem Texteditor die kodierten Klammern wieder durch echte ersetzen (%7B -> {, %7D -> }), bevor du sie in deiner Telefonanlage (z.B. Zoiper) hinterlegst!

Teste, ob beim Anruf das Formular korrekt mit den Daten aus der Telefonanlage vorausgefüllt wird.

Schritt 2: Zoho Forms Felder für CRM-Daten vorbereiten

Zusätzlich zu den Feldern für die Zoiper-Daten brauchst du Felder im Formular, die später dynamisch mit Kundendaten aus dem CRM befüllt werden sollen. Zum Beispiel:

  • Kundenname (Einzeilig)
  • Beschreibung (Mehrzeilig)
  • Begruessungstext (Mehrzeilig)
  • Adressen (Mehrzeilig – hier kann eine Liste von Adressen/Standorten aus dem CRM angezeigt werden)
  • CAM_Account_ID (Einzeilig, versteckt – hier speichern wir die ID des gefundenen CRM-Kontakts/Accounts)

Außerdem Felder, die der Mitarbeiter ausfüllt:

  • Grund_des_Anrufs (Dropdown oder Einzeilig)
  • Notizen (Mehrzeilig)
  • Ticket_E_Mail_Empfaenger (E-Mail – für die optionale Benachrichtigung)
  • Ansprechpartner (Einzeilig oder Nachschlagefeld, falls Kontakte verknüpft werden sollen)

Schritt 3: Dynamische Datenanreicherung mit Custom Function & Dynamic Prefill

Jetzt kommt der smarte Teil: Wir wollen anhand der angerufenen Nummer (die im Feld Solper_Name übergeben wird) den zugehörigen Kunden im CRM finden und dessen Daten ins Formular laden.

Voraussetzung: Du benötigst ein Feld in deinem Zoho CRM Kunden-Modul (z.B. „Accounts“ oder ein Custom Module), das die eindeutige Telefonnummer speichert, die von deiner Telefonanlage für diesen Kunden signalisiert wird. Im Beispiel aus dem Gesprächsprotokoll war dies das Feld `TelJ.com`. Stelle sicher, dass dieses Feld im CRM gepflegt ist und als „Unique Field“ markiert ist, um Dubletten zu vermeiden.

1. Zoho Custom Function (Deluge) erstellen:
Gehe zu Zoho CRM -> Einstellungen (Zahnrad) -> Entwicklerbereich -> Funktionen -> Neue Funktion erstellen.

  • Funktionsname: z.B. `getCustomerByCalledNumber`
  • Anzeigename: z.B. „Kundeninfos anhand angerufener Nummer holen“
  • Beschreibung: „Sucht Kunden anhand der TelJ.com Nummer und gibt Beschreibung, Begrüßungstext und Adressen zurück.“
  • Kategorie: Standalone

Füge folgendes Deluge-Skript ein (passe Modul-API-Namen und Feld-API-Namen an deine Zoho CRM Konfiguration an!):

// API Name des Feldes im CRM, das die angerufene Nummer enthält (z.B. TelJ_com)
calledNumberFieldAPIName = "TelJ_com";
// API Name des Kunden-Moduls (z.B. Accounts oder ein Custom Module)
customerModuleAPIName = "Accounts";

// API Namen der Felder, die zurückgegeben werden sollen
descriptionFieldAPIName = "Description";
greetingFieldAPIName = "Begruessungstext"; // Beispiel für ein Custom Field
addressFieldAPIName = "Adressen"; // Beispiel für ein Custom Field

// Argument definieren (wird vom Webhook übergeben)
void getCustomerByCalledNumber(string calledNumber)
{
    // Initialisiere die Rückgabe-Map
    responseData = Map();
    responseData.put("success", false); // Standardmäßig nicht erfolgreich

    if(calledNumber != null && calledNumber.length() > 0)
    {
        // Suche nach dem Kunden im CRM anhand der übergebenen Nummer
        // Wichtig: Passe den Modul- und Feld-API-Namen an!
        searchCriteria = "(" + calledNumberFieldAPIName + ":equals:" + calledNumber + ")";
        customerRecords = zoho.crm.searchRecords(customerModuleAPIName, searchCriteria);

        if(customerRecords != null && customerRecords.size() > 0)
        {
            // Nimm den ersten gefundenen Datensatz (TelJ.com sollte UNIQUE sein)
            customerRecord = customerRecords.get(0);
            customerId = customerRecord.get("id");

            // Hole die gewünschten Felder
            description = ifnull(customerRecord.get(descriptionFieldAPIName),"");
            greeting = ifnull(customerRecord.get(greetingFieldAPIName),"");
            addresses = ifnull(customerRecord.get(addressFieldAPIName),"");

            // Bereite die erfolgreiche Antwort vor
            responseData.put("success", true);
            responseData.put("Kundenname", ifnull(customerRecord.get("Account_Name"),"")); // Beispiel: Account Name
            responseData.put("Beschreibung", description);
            responseData.put("Begruessungstext", greeting);
            responseData.put("Adressen", addresses);
            responseData.put("CAM_Account_ID", customerId); // Wichtig: ID für Flow übergeben!
        }
        else
        {
            // Kein Kunde gefunden
            responseData.put("message", "Kein Kunde für Nummer " + calledNumber + " gefunden.");
            // Du könntest hier Standardwerte setzen, wenn kein Kunde gefunden wird
            responseData.put("Kundenname", "Unbekannter Anrufer");
            responseData.put("Beschreibung", "Neuer Kontakt?");
            responseData.put("Begruessungstext", "Hallo!");
            responseData.put("Adressen", "");
            responseData.put("CAM_Account_ID", null);
        }
    }
    else
    {
        responseData.put("message", "Keine angerufene Nummer übergeben.");
    }
    // Gib die Daten als JSON zurück (wichtig für den Webhook)
    info responseData;
    return responseData;
}

// Argument Mapping für den Test (und für den Webhook)
// Der Name des Arguments hier ('calledNumber') muss mit dem im Funktionscode übereinstimmen.
// Der Wert ('123456789') ist nur zum Testen.
// Der Webhook wird hier den Wert aus dem Feld 'Solper_Name' einsetzen.
// add argument calledNumber string;

Klicke auf „Argumente bearbeiten“, füge ein Argument namens `calledNumber` vom Typ `String` hinzu und speichere die Funktion.

2. Dynamic Prefill Webhook in Zoho Forms konfigurieren:
Gehe zurück zu deinem Zoho Forms Formular -> Einstellungen -> Prefill -> Dynamic Prefill.

  • Klicke auf „Webhook konfigurieren“.
  • Webhook URL: Hier trägst du nichts ein, wir nutzen eine Zoho Function.
  • Form Field to Watch: Wähle das Feld aus, das die Suche auslöst. Das ist das Feld, das die eindeutige Kundennummer von Zoiper enthält, also Zoiper_Name.
  • Choose Service: Wähle „Zoho Function“.
  • Function Name: Wähle die gerade erstellte Funktion `getCustomerByCalledNumber` aus.
  • Parameter Mapping:
    • Parameter Name: calledNumber (muss exakt dem Argumentnamen in der Deluge-Funktion entsprechen!)
    • Parameter Value: Wähle unter „Form Fields“ das Feld ${form.Solper_Name} aus.
  • Response Mapping: Jetzt verbindest du die Rückgabewerte der Funktion mit den Formularfeldern.
    • Function Response Key: Kundenname -> Form Field: Kundenname
    • Function Response Key: Beschreibung -> Form Field: Beschreibung
    • Function Response Key: Begruessungstext -> Form Field: Begruessungstext
    • Function Response Key: Adressen -> Form Field: Adressen
    • Function Response Key: CAM_Account_ID -> Form Field: CAM_Account_ID

    (Die „Function Response Keys“ müssen exakt den Schlüsseln entsprechen, die du im `responseData` Map in der Deluge-Funktion verwendest.)

  • Speichere die Webhook-Konfiguration.

Teste nun, indem du die Prefill-URL aus Schritt 1 mit einer bekannten `CalledNumber` (die im CRM im Feld `TelJ.com` existiert) im Browser aufrufst. Das Formular sollte sich öffnen, die Zoiper-Daten aus der URL anzeigen UND kurz darauf die Felder `Kundenname`, `Beschreibung` etc. mit den Daten aus dem CRM befüllen.

Schritt 4: Anrufdatensatz im CRM erstellen mit Zoho Flow

Nachdem das Formular abgeschickt wurde, soll automatisch ein Eintrag im Zoho CRM erstellt werden (z.B. in einem Modul „Anrufaktivitäten“ oder „Tickets“). Dafür nutzen wir Zoho Flow.

Wichtiger Hinweis: Deaktiviere die Standard-Zoho-CRM-Integration in den Zoho Forms Einstellungen (unter Integrationen), da wir den Prozess über Flow steuern wollen, um mehr Kontrolle zu haben.

Erstelle einen neuen Flow in Zoho Flow:

  • Trigger: Wähle „App“ -> „Zoho Forms“ -> „New Form Entry“. Konfiguriere den Trigger für dein „Anruf Ticket“-Formular.
  • Action: Wähle „App“ -> „Zoho CRM“ -> „Create Record“.
    • Module: Wähle das Zielmodul in CRM (z.B. „Anrufaktivitäten“, „Tasks“, „Tickets“ oder ein Custom Module).
    • Layout: Wähle das passende Layout.
    • Field Mapping: Jetzt ordnest du die Felder aus dem Zoho Forms Trigger den Feldern im CRM-Modul zu. Ziehe die Variablen aus dem Trigger (linke Seite) auf die entsprechenden CRM-Felder (rechte Seite). Beispiele:
      • Subject (CRM) <- Grund_des_Anrufs (Forms)
      • Description (CRM) <- Notizen (Forms)
      • Phone (CRM) <- Solper_Phone (Forms – die Nummer des Anrufers)
      • Call_Start_Time (CRM) <- submitted_time (Forms – oder eine andere Zeitvariable)
      • Wichtig: Verknüpfung zum Kunden! Suche das Nachschlagefeld in deinem CRM-Modul, das auf den Kunden (Account/Kontakt) verweist. Ordne diesem Feld die Variable CAM_Account_ID aus dem Formular-Trigger zu. Diese ID haben wir in Schritt 3 ermittelt und im versteckten Feld gespeichert.
      • Call_ID_Telephony (CRM Custom Field) <- Solper_Call_ID (Forms)
      • Called_Number (CRM Custom Field) <- Solper_Name (Forms)
      • … weitere Felder nach Bedarf zuordnen.
  • Speichere und aktiviere den Flow.

Sende ein Testformular ab. Prüfe, ob der Datensatz korrekt im Zoho CRM erstellt und mit dem richtigen Kunden verknüpft wird. Achte auf mögliche Fehler im Flow (siehe Tipps).

Schritt 5: Optionale Kundenbenachrichtigung per Zoho CRM Workflow

Wenn du nach Erstellung des Anruf-Tickets automatisch eine E-Mail an den Kunden senden möchtest (z.B. eine Eingangsbestätigung), ist ein Zoho CRM Workflow die robusteste Methode – besser als es direkt im Flow zu tun.

Gehe zu Zoho CRM -> Einstellungen (Zahnrad) -> Automatisierung -> Workflow-Regeln -> Regel erstellen.

  • Modul: Wähle das Modul, in dem Flow den Datensatz erstellt (z.B. „Anrufaktivitäten“).
  • Regelname: z.B. „Eingangsbestätigung Anruf-Ticket senden“
  • Beschreibung: Optional.
  • Wann: Wähle „Bei einer Datensatzerstellung“. Klicke auf Weiter.
  • Bedingung: Definiere, wann die E-Mail gesendet werden soll. Z.B. „Alle Datensätze“ oder spezifischer, falls das Feld `Ticket_E_Mail_Empfaenger` (das vom Flow befüllt werden muss) nicht leer ist. Beispiel: `Ticket E-Mail Empfänger` `ist nicht leer`. Klicke auf Weiter.
  • Sofortige Aktionen: Klicke auf „Aktion hinzufügen“ -> „E-Mail senden“.
    • Name: z.B. „Ticket Bestätigung senden“
    • Empfänger: Wähle das Feld aus, das die E-Mail-Adresse enthält (z.B. `Ticket E-Mail Empfänger`).
    • Vorlage auswählen: Erstelle oder wähle eine E-Mail-Vorlage in Zoho CRM. Hier kannst du mit `#` Merge-Felder aus dem erstellten Anrufdatensatz einfügen (z.B. `#Anrufaktivitäten.Betreff#`, `#Anrufaktivitäten.ID#`).
    • Von/Antwort an: Konfigurieren.
  • Speichere die Aktion und die Workflow-Regel.

Wenn nun Flow einen neuen Datensatz erstellt und das E-Mail-Feld gefüllt ist, löst dieser Workflow aus und sendet die formatierte E-Mail.

Tipps und Best Practices

  • Fehler im Flow beheben: Wenn ein Flow-Lauf fehlschlägt, prüfe die „Run History“ in Zoho Flow. Häufige Ursachen sind fehlgeschlagene Feldzuordnungen oder Pflichtfelder im CRM, die vom Flow keinen Wert erhalten haben. Stelle sicher, dass alle CRM-Pflichtfelder entweder vom Flow befüllt werden oder im CRM (temporär) nicht mehr als Pflichtfeld markiert sind. Du kannst fehlgeschlagene Flow-Runs oft manuell erneut ausführen („Rerun“), nachdem der Fehler behoben wurde.
  • URL Encoding: Denke an die Korrektur der geschweiften Klammern (%7B -> {, %7D -> }) in der Prefill-URL, die du in deiner Telefonanlage hinterlegst.
  • Eindeutige Kundennummer: Die Zuverlässigkeit der dynamischen Anreicherung hängt davon ab, dass die im CRM hinterlegte Telefonnummer (`TelJ.com` im Beispiel) eindeutig ist und exakt mit der von der Telefonanlage übergebenen Nummer (`Solper_Name`) übereinstimmt. Nutze die „Unique Field“-Eigenschaft im CRM.
  • Kunde vs. Anrufer: Die hier gezeigte Lösung identifiziert primär den angerufenen *Kundenaccount* anhand einer festen Nummer. Eine nächste Evolutionsstufe könnte sein, auch *individuelle Anrufer* (Kontakte) anhand ihrer *eigenen* Telefonnummer (`Solper_Phone`) zu erkennen und zuzuordnen. Dies erfordert eine komplexere Logik in der Custom Function oder im Flow (Suche in Kontakten statt Accounts).
  • Lange Adresslisten: Wenn das Feld `Adressen` sehr viele Informationen enthält, kann die Darstellung im mehrzeiligen Textfeld von Zoho Forms unübersichtlich werden. Für den Anfang ist es oft „herrlich simpel“ und ausreichend. Später könnte man über eine andere Darstellung nachdenken (z.B. Formatierung mit HTML in der Custom Function, falls Forms das zulässt, oder Aufteilung auf mehrere Felder).
  • Zoho One Lizenzierung: Wenn du mehrere Zoho Apps wie CRM (Enterprise), Forms und Flow intensiv nutzt, prüfe unbedingt die **Zoho One** Lizenz. Sie enthält Lizenzen für über 40 Apps (inklusive CRM Enterprise, Forms Premium, Flow etc.) pro Benutzer und ist oft günstiger als einzelne Lizenzen für wenige High-End-Apps. Jeder Mitarbeiter, der das System aktiv nutzt (Formulare bearbeitet, CRM-Zugriff hat), benötigt eine Lizenz.
  • Skalierbarkeit: Die gezeigte Lösung mit Custom Functions, Flow und Workflows ist gut skalierbar. Achte auf die API-Limits deines Zoho-Plans, aber für die meisten KMU-Anwendungsfälle sind diese großzügig bemessen.

Zusätzliche Hinweise und Erweiterungen

  • CRM-Verknüpfung verfeinern: Stelle sicher, dass der Flow den erstellten Anrufdatensatz nicht nur mit der Account-ID verknüpft, sondern ggf. auch den richtigen Ansprechpartner (Kontakt) zuordnet, falls diese Information verfügbar ist.
  • Reporting mit Zoho Analytics: Die gesammelten Anrufdaten im CRM können hervorragend mit Zoho Analytics ausgewertet werden, um Einblicke in Anrufvolumen, Bearbeitungszeiten, häufige Anrufgründe etc. zu gewinnen.
  • Integration anderer Systeme: Neben Telefonanlagen lassen sich über Zoho Flow, Webhooks und APIs auch unzählige andere externe Tools anbinden, z.B. ERP-Systeme (wie SAP, Navision mittels Connectoren oder APIs), Buchhaltungssoftware (z.B. lexoffice, sevDesk über deren APIs), Projektmanagement-Tools (wie Jira, Asana) oder E-Commerce-Plattformen (Shopify, WooCommerce).

Fazit: Effizienzsprung durch smarte Integration

Die Integration deiner Telefonanlage mit dem Zoho-Ökosystem ist ein mächtiger Hebel zur Effizienzsteigerung und Verbesserung des Kundenservice. Durch die Automatisierung der Datenerfassung und -anreicherung sparen deine Mitarbeiter wertvolle Zeit, vermeiden Fehler und haben sofort den nötigen Kontext für jedes Gespräch zur Hand.

Dieses Beispiel zeigt eindrucksvoll, wie du durch die geschickte Kombination verschiedener Zoho Apps (Forms, CRM, Flow, Custom Functions/Deluge) und die Nutzung von Schnittstellen (URL Prefill, Webhooks) maßgeschneiderte Lösungen für deine spezifischen Anforderungen bauen kannst. Es erfordert zwar etwas Einarbeitung in die Konfiguration und ggf. ein wenig Deluge-Code, aber der Nutzen im täglichen Betrieb ist enorm. Trau dich ran und experimentiere – die Möglichkeiten sind vielfältig!