Automatisierte Angebotserstellung mit Zoho CRM, Books und Deluge in B2B-Prozessen

  • Beitrags-Autor:

Vom Deal zum Angebot: Smarte Automatisierung mit Zoho CRM, Books und Deluge

In vielen Unternehmen, insbesondere im B2B-Umfeld, ist die Angebotserstellung ein zentraler, aber oft zeitaufwändiger Prozess. Daten werden manuell von einem System ins andere übertragen, Preise müssen nachgeschlagen und Dokumente von Hand zusammengestellt werden. Das kostet nicht nur wertvolle Zeit, sondern ist auch eine häufige Fehlerquelle. Wenn dein Vertriebsteam mehr Zeit mit Verkaufen statt mit Administration verbringen soll, ist die Automatisierung dieses Prozesses unerlässlich. In diesem Artikel zeigen wir dir, wie du eine nahtlose Brücke zwischen deinem Zoho CRM und Zoho Books baust, um Angebote dynamisch, schnell und fehlerfrei zu erstellen. Wir gehen dabei tief in die Technik, nutzen Custom Functions mit Deluge und binden externe Logiken ein.

Die Herausforderung: Ein typisches Praxisbeispiel

Stell dir vor, du vertreibst anpassbare Produkte oder Dienstleistungen, zum Beispiel technische Anlagen, Softwarelizenzen mit individuellem Service-Level oder hochwertige Konsumgüter mit verschiedenen Konfigurationen. Der finale Preis wird im Verkaufsgespräch verhandelt und im Deal-Modul deines Zoho CRM im Feld „Betrag“ festgehalten. Dein Prozess sieht außerdem vor, dass je nach Art des Geschäftsabschlusses – sei es ein direkter Vertragsabschluss vor Ort oder ein klassisches Angebot, das der Innendienst erstellt – unterschiedliche rechtliche Rahmenbedingungen gelten. Das bedeutet, mal müssen die AGBs mitgeschickt werden, mal nicht. Zudem soll natürlich der richtige Vertriebsmitarbeiter auf dem Angebot stehen, um die Provisionen korrekt zuzuordnen und dem Kunden einen klaren Ansprechpartner zu nennen.

Die manuelle Umsetzung dieses Prozesses sieht oft so aus:

  • Der Vertriebsmitarbeiter pflegt die Daten im CRM-Deal.
  • Ein Mitarbeiter im Innendienst öffnet Zoho Books, sucht den Kunden und den passenden Artikel.
  • Der verhandelte Preis aus dem CRM wird manuell in das Angebot eingetragen.
  • Die richtige Angebotsvorlage (mit oder ohne AGB) wird manuell ausgewählt.
  • Der Vertriebsmitarbeiter wird manuell als Ansprechpartner im Angebot gesetzt.
  • Nach dem Versand wird der Deal im CRM manuell auf die Stufe „Angebot versendet“ geschoben.

Dieser Ablauf ist ineffizient und fehleranfällig. Unser Ziel ist es, diesen kompletten Vorgang auf einen einzigen Klick im Zoho CRM zu reduzieren.

Schritt-für-Schritt zur automatisierten Angebotserstellung

Um diese Automatisierung umzusetzen, nutzen wir die volle Power von Zoho, insbesondere eine Custom Function in Zoho CRM, die mit der Deluge-Skriptsprache geschrieben wird. Diese Funktion wird durch einen Button im Deal-Modul ausgelöst.

Schritt 1: Dynamische Preisübernahme aus dem CRM Deal

Das Kernproblem ist, dass Zoho Books standardmäßig den im Artikel hinterlegten Preis verwendet. Wir wollen aber den individuell im Deal verhandelten Betrag nutzen.

Die Lösung: Unsere Deluge-Funktion liest den Betrag aus dem Deal und übergibt ihn beim Erstellen des Angebots in Zoho Books. Wir erstellen in Zoho Books einen „Platzhalter-Artikel“ (z.B. mit dem Namen „Individuelles Servicepaket“ und einem Preis von 0 €), den wir für die Automatisierung verwenden.

Hier ist ein grundlegendes Deluge-Skript, das an einen Button im Deal-Modul („Angebot erstellen“) gebunden wird:

// Deal-ID vom Button-Argument abrufen
dealIdStr = input.dealId.toString();

// Deal-Details aus dem CRM abrufen
dealDetails = zoho.crm.getRecordById("Deals", dealIdStr.toLong());

// Relevante Daten extrahieren
dealAmount = dealDetails.get("Amount");
accountId = dealDetails.get("Account_Name").get("id");
contactId = dealDetails.get("Contact_Name").get("id");

// Zoho Books Customer ID basierend auf der CRM Account ID abrufen
// HINWEIS: Hierfür muss die Zoho CRM/Books Integration aktiv sein.
booksCustomerSearch = zoho.books.getRecords("Contacts", "DEIN_BOOKS_ORG_ID", {"crm_account_id": accountId});
if(booksCustomerSearch.get("code") == 0 && booksCustomerSearch.get("contacts").size() > 0)
{
    booksCustomerId = booksCustomerSearch.get("contacts").get(0).get("contact_id");

    // Ein JSON-Objekt für das neue Angebot erstellen
    quoteJSON = {
        "customer_id": booksCustomerId,
        "line_items": [
            {
                "item_id": "DEIN_PLATZHALTER_ARTIKEL_ID_AUS_BOOKS",
                "name": "Individuelles Servicepaket",
                "description": "Basierend auf unserem Gespräch am " + zoho.currentdate.toString("dd.MM.yyyy"),
                "rate": dealAmount,
                "quantity": 1
            }
        ]
    };

    // Angebot in Zoho Books erstellen
    createQuote = zoho.books.createRecord("Estimates", "DEIN_BOOKS_ORG_ID", quoteJSON);
    info createQuote;
}
else
{
    info "Kunde nicht in Zoho Books gefunden.";
}

Wichtiger Hinweis: Kläre intern, ob der Betrag im Deal als Netto- oder Bruttowert zu verstehen ist. Das Skript muss entsprechend angepasst werden, um die Steuern korrekt zu berechnen. Zoho Books erwartet in der Regel den Nettopreis (`rate`).

Schritt 2: Bedingte Logik für AGB und Vorlagen

Je nach Deal-Typ („Direkter Vertrag“, „Angebot Innendienst“) benötigen wir eine andere Angebotsvorlage in Zoho Books. Dafür legen wir in Zoho Books zwei Vorlagen an: eine mit AGB und eine ohne. Jede Vorlage hat eine eindeutige `template_id`.

Wir erweitern unser Skript um eine `if`-Abfrage, die ein benutzerdefiniertes Feld im Deal (z.B. ein Picklistenfeld namens „Vertragstyp“) auswertet.

// ... (Code aus Schritt 1) ...

// Deal-Typ auslesen (benutzerdefiniertes Feld im Deal)
contractType = dealDetails.get("Vertragstyp");
templateId = ""; // Leere Variable für die Template-ID

// Je nach Vertragstyp die richtige Template-ID zuweisen
if(contractType == "Angebot Innendienst")
{
    templateId = "TEMPLATE_ID_MIT_AGB";
}
else if(contractType == "Direkter Vertrag" || contractType == "Vertrag auf Abruf")
{
    templateId = "TEMPLATE_ID_OHNE_AGB";
}

// ... (Code zur Vorbereitung der quoteJSON) ...

// JSON-Objekt um die Template-ID erweitern
quoteJSON.put("template_id", templateId);

// Angebot in Zoho Books erstellen
createQuote = zoho.books.createRecord("Estimates", "DEIN_BOOKS_ORG_ID", quoteJSON);
info createQuote;

// ... (Restlicher Code) ...

Schritt 3: Korrekten Vertriebsmitarbeiter zuweisen

Standardmäßig würde das Angebot dem Benutzer gehören, dessen API-Schlüssel für die Funktion verwendet wird. Wir wollen aber den im Deal hinterlegten Vertriebsmitarbeiter setzen. Dafür nutzen wir ein benutzerdefiniertes Lookup-Feld im Deal-Modul namens „Vertriebsmitarbeiter“, das auf einen CRM-Benutzer verweist.

Achtung: Der Vertriebsmitarbeiter muss sowohl in Zoho CRM als auch in Zoho Books als Benutzer existieren und verknüpft sein.

Das Skript wird erneut erweitert, um die ID des Vertriebsmitarbeiters abzurufen und zu übergeben.

// ... (Code aus Schritt 1 & 2) ...

// ID des Vertriebsmitarbeiters aus dem Deal abrufen
salesRepIdCrm = dealDetails.get("Vertriebsmitarbeiter").get("id");

// Den entsprechenden Benutzer in Zoho Books finden
// Annahme: Die E-Mail-Adresse ist in beiden Systemen identisch
salesRepCrmUser = zoho.crm.getUser(salesRepIdCrm);
salesRepEmail = salesRepCrmUser.get("users").get(0).get("email");

// Suche den Benutzer in Books via E-Mail
booksUsers = zoho.books.getRecords("Users", "DEIN_BOOKS_ORG_ID", {});
salespersonIdBooks = "";
for each user in booksUsers.get("users")
{
    if(user.get("email") == salesRepEmail)
    {
        salespersonIdBooks = user.get("user_id");
    }
}

// ... (Code zur Vorbereitung der quoteJSON) ...

// JSON-Objekt um die salesperson_id erweitern, falls gefunden
if (salespersonIdBooks != "")
{
    quoteJSON.put("salesperson_id", salespersonIdBooks);
}

// Angebot in Zoho Books erstellen
createQuote = zoho.books.createRecord("Estimates", "DEIN_BOOKS_ORG_ID", quoteJSON);
info createQuote;

// ... (Restlicher Code) ...

Schritt 4: Automatisches Update der CRM-Pipeline

Nachdem das Angebot erfolgreich erstellt wurde, soll der Deal im CRM automatisch in die nächste Phase verschoben werden. Dies können wir direkt am Ende unserer Deluge-Funktion erledigen.

Wichtig ist hier eine Bedingung: Das Update sollte nur erfolgen, wenn der Deal sich in einer „frühen“ Phase befindet (z.B. „Beratungstermin abgeschlossen“ oder „Angebot erstellen“), um nicht versehentlich einen Deal zurückzusetzen, der schon in der Montageplanung ist.

// ... (gesamter Code von oben, nach dem erfolgreichen "createQuote") ...

if(createQuote.get("code") == 0)
{
    // Erfolgsmeldung für den User
    info "Angebot erfolgreich erstellt!";
    
    // Aktuelle Deal-Stufe prüfen
    currentStage = dealDetails.get("Stage");
    
    // Nur updaten, wenn der Deal in einer der definierten Vor-Stufen ist
    if(currentStage == "Angebot erstellen" || currentStage == "Beratungstermin vereinbart" || currentStage == "Beratungstermin abgeschlossen")
    {
        // Deal-Stufe im CRM aktualisieren
        updateMap = Map();
        updateMap.put("Stage", "Angebot versendet");
        updateResponse = zoho.crm.updateRecord("Deals", dealIdStr.toLong(), updateMap);
        info updateResponse;
    }
}
else
{
    // Fehlermeldung, falls die Angebotserstellung fehlschlägt
    info "Fehler beim Erstellen des Angebots: " + createQuote;
}

Tipps und Best Practices

  • Datenkonsistenz ist alles: Der CRM-Deal sollte die „Single Source of Truth“ für alle kaufmännischen Daten sein. Stelle sicher, dass Felder wie „Betrag“, „Vertragstyp“ und „Vertriebsmitarbeiter“ immer korrekt gepflegt werden. Die Trennung zwischen „Abschlussbesitzer“ (Deal Owner) und einem dedizierten „Vertriebsmitarbeiter“-Feld kann sehr nützlich sein, um spätere Prozessübergaben (z.B. an Projektteams) sauber abzubilden.
  • Skalierbare Preisgestaltung: Für unterschiedliche Kundengruppen (z.B. Händler, Endkunden) oder Regionen solltest du die Zoho Books Funktion „Preislisten“ nutzen. Deine Deluge-Funktion kann dann die passende Preisliste basierend auf einem Feld im Kunden- oder Deal-Datensatz auswählen.
  • Fehlerbehandlung: Umfasse deine API-Aufrufe immer mit einem `try…catch`-Block, um auf Fehler (z.B. ungültige IDs, API-Limits) reagieren zu können. Gib dem auslösenden Benutzer eine verständliche Fehlermeldung zurück.
  • Dokumentenmanagement: Erweitere deine Funktion, um automatisch einen Ordner in Zoho WorkDrive für den Deal anzulegen. So sind das Angebot und alle zukünftigen Dokumente (Auftragsbestätigung, Rechnung, Verträge) zentral an einem Ort gespeichert.
  • Externe Daten anbinden: Was, wenn deine Preise aus einem externen System kommen? Kein Problem. Du kannst dein Deluge-Skript erweitern, um vor der Angebotserstellung eine externe API abzufragen. Zum Beispiel könntest du über `invokeurl` die aktuelle Preisliste aus einem SAP S/4HANA, einem Microsoft Dynamics 365 oder sogar einer einfachen Google Sheet API abrufen und in die Kalkulation einfließen lassen.

Weitere Optimierungsmöglichkeiten im Zoho-Ökosystem

Dieser Prozess ist nur der Anfang. Du könntest ihn wie folgt ausbauen:

  • Digitale Signatur: Integriere Zoho Sign, um das erstellte Angebot direkt an den Kunden zur digitalen Unterschrift zu senden. Der Status des Dokuments kann automatisch zurück ins CRM synchronisiert werden.
  • Low-Code-Alternative: Für einige Teile dieser Automatisierung könntest du auch Zoho Flow verwenden. Flow bietet eine grafische Oberfläche, um Workflows zwischen verschiedenen Apps zu erstellen, was für einfachere Logiken eine gute Alternative zu Deluge sein kann.
  • Umfassende Auswertungen: Da deine Daten nun konsistent sind, kannst du mit Zoho Analytics detaillierte Berichte erstellen. Analysiere Konversionsraten pro Vertriebsmitarbeiter, durchschnittliche Angebotswerte pro Vertragstyp oder die Zeit, die ein Deal in jeder Phase verbringt.
  • Kommunikation: Sende nach erfolgreicher Erstellung des Angebots automatisch eine Nachricht in einen relevanten Zoho Cliq Channel, um das Team zu informieren.

Fazit: Mehr als nur Zeitersparnis

Die Automatisierung der Angebotserstellung durch die tiefe Integration von Zoho CRM und Zoho Books ist ein Paradebeispiel dafür, wie du dein Zoho-Ökosystem optimal nutzt. Es geht nicht nur darum, ein paar Minuten pro Angebot zu sparen. Du reduzierst die Fehlerquote drastisch, stellst eine konsistente Datenbasis für zukünftige Auswertungen sicher und verbesserst die Customer Experience durch schnelle und professionelle Dokumente. Die hier gezeigte Lösung ist ein mächtiges Fundament, das du flexibel an deine spezifischen Geschäftsprozesse anpassen und erweitern kannst. Der initiale Aufwand für die Einrichtung des Skripts zahlt sich durch die gewonnene Effizienz und Prozesssicherheit schnell aus.

Verwendete Zoho Apps in diesem Szenario: