Du betrachtest gerade Automatisierte Event-Kontingentverwaltung mit Zoho CRM und Books

Automatisierte Event-Kontingentverwaltung mit Zoho CRM und Books

  • Beitrags-Autor:

Komplexe Bestände meistern: So automatisierst Du die Reservierung und Abrechnung mit Zoho CRM, Books & Deluge

Du kennst das vielleicht: Dein Geschäftsmodell basiert auf der Vermittlung oder Verwaltung von begrenzten Ressourcen – seien es Veranstaltungsplätze, Mietobjekte, Workshop-Teilnahmen oder eben Tischreservierungen für ein großes Event. Oft kommen diese Ressourcen in größeren Kontingenten herein, müssen aber einzeln oder in kleineren Gruppen an Kunden vermittelt werden. Die Verwaltung erfolgt häufig manuell über Excel-Listen, E-Mails und separate Rechnungsstellung. Das ist nicht nur zeitaufwendig, sondern auch fehleranfällig und skaliert schlecht. Gerade wenn die Nachfrage hoch ist und schnelle Reaktionen gefordert sind, stößt dieser Ansatz schnell an seine Grenzen.

In diesem Fachartikel zeigen wir Dir, wie Du solche komplexen Szenarien mit Bordmitteln des Zoho-Ökosystems abbilden und weitgehend automatisieren kannst. Wir konzentrieren uns dabei auf die geschickte Kombination von Zoho CRM zur Verwaltung der Anfragen und des Inventars, Zoho Books für die automatisierte Rechnungsstellung und Deluge (Zoho’s hauseigene Skriptsprache) für die individuelle Logik und die Verbindung der Systeme. Das Ziel: Ein effizienter, transparenter und weniger fehleranfälliger Prozess von der Kundenanfrage bis zur bezahlten Rechnung.

Das Praxisbeispiel: Verwaltung von Event-Kontingenten

Stell Dir eine Agentur vor, die Kontingente für Plätze bei Großveranstaltungen (z.B. Konzerte, Messen, Volksfeste) von Veranstaltern einkauft und an Endkunden oder Firmen weiterverkauft. Die Herausforderungen sind typisch:

  • Eingangskontingente: Die Agentur erhält Bestätigungen für größere Blöcke (z.B. 5 Tische à 10 Personen für einen bestimmten Abend).
  • Kundenanfragen: Anfragen kommen per E-Mail oder Webformular herein (z.B. „Suche 20 Plätze für Freitagabend“).
  • Matching: Bisher musste manuell in einer Excel-Liste geprüft werden, ob passende Plätze aus den verfügbaren Kontingenten frei sind. Das Splitten von größeren Kontingenten war umständlich.
  • Angebotserstellung: Angebote wurden manuell per E-Mail formuliert, oft durch Copy-Paste aus der Excel-Liste.
  • Rechnungsstellung: Nach Zusage des Kunden wurde manuell eine Rechnung im Buchhaltungssystem erstellt.
  • Restplatzvermarktung: Kurz vor dem Event freibleibende Einzelplätze oder kleine Restkontingente zu verkaufen, war ein zusätzlicher manueller Aufwand.

Dieser manuelle Prozess bindet Ressourcen, führt zu Verzögerungen und potenziellen Doppelbuchungen oder Fehlern bei der Preisgestaltung. Hier setzt die Automatisierung mit Zoho an.

Schritt-für-Schritt zur automatisierten Lösung

Wir bauen die Lösung primär mit Zoho CRM und Zoho Books auf, ergänzt durch individuelle Logik mittels Deluge.

1. Datenstruktur in Zoho CRM anlegen

Das Herzstück ist eine saubere Datenstruktur in Zoho CRM. Wir benötigen dafür benutzerdefinierte Module (Custom Modules):

  • Modul 1: Anfragen (z.B. basierend auf Leads oder Deals)
    • Standardfelder wie Name, Firma, E-Mail, Telefon.
    • Benutzerdefinierte Felder: Gewünschtes Datum, Anzahl Personen, Spezielle Wünsche, Status der Anfrage (Offen, Angeboten, Gebucht, Abgelehnt).
  • Modul 2: Kontingente (Custom Module)
    • Name des Kontingents (z.B. „Oktoberfest Zelt X – Block A“).
    • Veranstaltung / Ort.
    • Datum und Uhrzeit.
    • Gesamtanzahl Plätze im Kontingent (z.B. 60).
    • Einkaufspreis pro Platz / Gesamt.
    • Verkaufspreis pro Platz (Standard).
    • Status (Aktiv, Inaktiv, Ausverkauft).
  • Modul 3: Verkaufseinheiten (Custom Module)
    • Name der Einheit (z.B. „Tisch A1“, „Platzgruppe 5“).
    • Lookup-Feld zum Modul „Kontingente“: Verknüpft die Einheit mit dem übergeordneten Kontingent.
    • Datum und Uhrzeit (kann vom Kontingent geerbt werden).
    • Anzahl Plätze dieser Einheit (z.B. 10).
    • Verkaufspreis dieser Einheit.
    • Status (Verfügbar, Reserviert, Verkauft).
    • Lookup-Feld zum Modul „Anfragen“ (oder Deals/Accounts): Verknüpft die verkaufte Einheit mit dem Kunden/der Anfrage.
    • Eindeutige ID (wichtig für die spätere Zuordnung).

Wichtig: Das Modul „Verkaufseinheiten“ ist der Schlüssel zur Lösung des Splitting-Problems. Ein „Kontingent“ mit 60 Plätzen wird nicht direkt verkauft, sondern es werden 6 „Verkaufseinheiten“ à 10 Plätzen erstellt, die einzeln verwaltet und verkauft werden können.

2. Automatisches Erstellen der Verkaufseinheiten (Splitting)

Sobald ein neues „Kontingent“ erstellt oder ein bestehendes aktiviert wird, sollen automatisch die dazugehörigen „Verkaufseinheiten“ generiert werden. Dies lässt sich über eine Workflow-Regel im Modul „Kontingente“ realisieren, die eine Custom Function (Deluge) auslöst.

Workflow-Regel im Modul „Kontingente“:

  • Auslöser: Bei Erstellung ODER Bearbeitung (wenn z.B. der Status auf „Aktiv“ gesetzt wird und die Gesamtanzahl Plätze > 0 ist).
  • Aktion: Funktion aufrufen.

Beispielhafte Deluge Custom Function (vereinfacht):

// Funktion wird vom Kontingente-Workflow aufgerufen
// kontingentId = ID des auslösenden Kontingent-Datensatzes

// 1. Kontingent-Daten abrufen
kontingentInfo = zoho.crm.getRecordById("Kontingente", kontingentId);
gesamtPlaetze = kontingentInfo.get("Gesamtanzahl_Plaetze");
plaetzeProEinheit = 10; // Fester Wert oder Feld aus Kontingent holen
kontingentName = kontingentInfo.get("Name_des_Kontingents");
kontingentDatum = kontingentInfo.get("Datum_und_Uhrzeit");
kontingentPreisProPlatz = kontingentInfo.get("Verkaufspreis_pro_Platz");

if (gesamtPlaetze != null && gesamtPlaetze > 0)
{
    anzahlEinheiten = Math.ceil(gesamtPlaetze / plaetzeProEinheit); // Aufrunden für Restplätze

    // 2. Bestehende Einheiten für dieses Kontingent prüfen (optional, zur Vermeidung von Duplikaten)
    existingUnits = zoho.crm.searchRecords("Verkaufseinheiten", "(Kontingente:equals:" + kontingentId + ")");
    if (existingUnits.size() == 0) // Nur erstellen, wenn noch keine Einheiten existieren
    {
        // 3. Schleife zum Erstellen der Verkaufseinheiten
        for each index einheitIndex in range from 1 to anzahlEinheiten
        {
            einheitName = kontingentName + " - Einheit " + einheitIndex;
            aktuellePlaetze = (einheitIndex == anzahlEinheiten && gesamtPlaetze % plaetzeProEinheit != 0) ? gesamtPlaetze % plaetzeProEinheit : plaetzeProEinheit; // Restplätze korrekt zuweisen
            einheitPreis = aktuellePlaetze * kontingentPreisProPlatz;

            // Datensatz für neue Verkaufseinheit vorbereiten
            neueEinheitMap = Map();
            neueEinheitMap.put("Name", einheitName);
            neueEinheitMap.put("Kontingente", kontingentId); // Lookup-Verknüpfung
            neueEinheitMap.put("Datum_und_Uhrzeit", kontingentDatum);
            neueEinheitMap.put("Anzahl_Plaetze_dieser_Einheit", aktuellePlaetze);
            neueEinheitMap.put("Verkaufspreis_dieser_Einheit", einheitPreis);
            neueEinheitMap.put("Status", "Verfügbar");
            neueEinheitMap.put("Eindeutige_ID", kontingentId + "_" + einheitIndex); // Beispiel für eine ID

            // Verkaufseinheit in Zoho CRM erstellen
            createResponse = zoho.crm.createRecord("Verkaufseinheiten", neueEinheitMap);
            info "Verkaufseinheit erstellt: " + createResponse;
        }
    }
    else
    {
        info "Für Kontingent " + kontingentId + " existieren bereits Einheiten.";
    }
}

Diese Funktion erstellt nun für jedes Kontingent die entsprechenden, einzeln buchbaren Verkaufseinheiten im CRM.

3. Matching von Anfragen und Verkaufseinheiten

Wenn eine neue Anfrage im Modul „Anfragen“ eingeht, muss diese mit verfügbaren „Verkaufseinheiten“ abgeglichen werden.

Manuelles Matching:

Der Vertriebsmitarbeiter kann direkt im CRM nach passenden Verkaufseinheiten suchen und filtern:

  • Erstelle eine benutzerdefinierte Ansicht (Custom View) im Modul „Verkaufseinheiten“.
  • Filtere nach Status = „Verfügbar“.
  • Filtere nach Datum (basierend auf dem Datum der Anfrage).
  • Sortiere nach Anzahl Plätze.
  • Der Mitarbeiter kann nun manuell eine oder mehrere passende Einheiten auswählen und gedanklich der Anfrage zuordnen.

Automatisiertes Matching (Vorschläge):

Um den Prozess zu beschleunigen, kannst Du eine Funktion erstellen, die passende Einheiten vorschlägt. Dies kann z.B. über einen Custom Button im „Anfragen“-Modul ausgelöst werden.

Beispielhafte Deluge Custom Function für Vorschläge (vereinfacht):

// Funktion wird durch Button in 'Anfragen' ausgelöst
// anfrageId = ID des aktuellen Anfrage-Datensatzes

// 1. Anfrage-Daten abrufen
anfrageInfo = zoho.crm.getRecordById("Anfragen", anfrageId);
gewuenschtesDatum = anfrageInfo.get("Gewuenschtes_Datum");
gewuenschtePlaetze = anfrageInfo.get("Anzahl_Personen");

// 2. Suche nach passenden, verfügbaren Verkaufseinheiten
// (Hier stark vereinfacht, echte Logik wäre komplexer: exaktes Datum, Datumsbereich, Summe von Plätzen etc.)
criteria = "((Status:equals:Verfügbar) and (Datum_und_Uhrzeit:equals:" + gewuenschtesDatum + ") and (Anzahl_Plaetze_dieser_Einheit:greater_equal:" + gewuenschtePlaetze + "))";
passendeEinheiten = zoho.crm.searchRecords("Verkaufseinheiten", criteria);

// 3. Vorschläge verarbeiten (z.B. in einem Related List oder Multi-Select Lookup Feld in 'Anfragen' speichern)
vorschlagsIDs = List();
if (passendeEinheiten != null)
{
    for each einheit in passendeEinheiten
    {
        vorschlagsIDs.add(einheit.get("id"));
        // Optional: Komplexere Logik, um die besten Matches zu finden
    }
}

// 4. Vorschläge im Anfrage-Datensatz speichern (Beispiel für ein Multi-Select Lookup Feld 'Vorgeschlagene_Einheiten')
updateMap = Map();
updateMap.put("Vorgeschlagene_Einheiten", vorschlagsIDs);
updateResponse = zoho.crm.updateRecord("Anfragen", anfrageId, updateMap);
info "Vorschläge aktualisiert: " + updateResponse;

// Gib dem Nutzer eine Rückmeldung
return "Passende Verkaufseinheiten gesucht und Vorschläge aktualisiert.";

Diese Funktion bietet dem Mitarbeiter eine Liste potenziell passender Einheiten direkt im Anfragedatensatz.

4. Angebotserstellung und Buchung

Sobald passende Einheiten identifiziert sind (manuell oder per Vorschlag), kann der Mitarbeiter:

  1. Die ausgewählte(n) Verkaufseinheit(en) im CRM markieren (z.B. Status auf „Reserviert“ setzen und das Lookup-Feld zur Anfrage füllen).
  2. Eine E-Mail-Vorlage in Zoho CRM nutzen, die automatisch die Daten der verknüpften Verkaufseinheit(en) enthält (Name, Datum, Plätze, Preis). Diese Vorlage wird als Angebot an den Kunden gesendet.
  3. Bei Zusage des Kunden wird der Status der Anfrage auf „Gebucht“ und der Status der Verkaufseinheit(en) auf „Verkauft“ gesetzt.

5. Automatisierte Rechnungsstellung mit Zoho Books

Der entscheidende Automatisierungsschritt: Wenn der Status der Anfrage auf „Gebucht“ gesetzt wird, soll automatisch eine Rechnung in Zoho Books erstellt werden.

Workflow-Regel im Modul „Anfragen“:

  • Auslöser: Bei Bearbeitung (wenn Status auf „Gebucht“ geändert wird).
  • Aktion: Funktion aufrufen (oder Webhook an Zoho Flow/eigenen Service senden).

Beispielhafte Deluge Custom Function zur Rechnungserstellung (vereinfacht):

// Funktion wird vom Anfragen-Workflow ausgelöst
// anfrageId = ID des auslösenden Anfrage-Datensatzes

try
{
    // 1. Anfrage-Daten abrufen (inkl. Kundeninfos)
    anfrageInfo = zoho.crm.getRecordById("Anfragen", anfrageId);
    kundenId = anfrageInfo.get("Kontakte").get("id"); // Annahme: Anfrage ist mit Kontakt verknüpft
    // Evtl. Kundeninfos direkt aus Anfrage holen oder über Kontakt-ID abrufen

    // 2. Zugehörige verkaufte Verkaufseinheiten finden
    verkaufteEinheiten = zoho.crm.searchRecords("Verkaufseinheiten", "(Anfragen:equals:" + anfrageId + ")"); // Suche über Lookup-Feld

    if (verkaufteEinheiten != null && verkaufteEinheiten.size() > 0)
    {
        // 3. Rechnungsdaten vorbereiten
        lineItemsList = List();
        for each einheit in verkaufteEinheiten
        {
            lineItemMap = Map();
            lineItemMap.put("item_id", "DEIN_ITEM_ID_AUS_BOOKS"); // Oder Name/SKU verwenden
            lineItemMap.put("name", einheit.get("Name"));
            lineItemMap.put("description", "Reservierung für " + einheit.get("Anzahl_Plaetze_dieser_Einheit") + " Plätze am " + einheit.get("Datum_und_Uhrzeit"));
            lineItemMap.put("quantity", 1); // Jede Einheit ist eine Zeile
            lineItemMap.put("rate", einheit.get("Verkaufspreis_dieser_Einheit"));
            // Ggf. Steuern hinzufügen etc.
            lineItemsList.add(lineItemMap);
        }

        // Kunden-ID in Zoho Books suchen (oder erstellen, falls nicht vorhanden)
        // Dies ist oft der komplexeste Teil - Mapping CRM Kontakt/Account zu Books Customer
        // Hier vereinfacht angenommen, die Books Customer ID ist im CRM Kontakt gespeichert
        crmKontakt = zoho.crm.getRecordById("Contacts", kundenId);
        booksCustomerId = crmKontakt.get("Zoho_Books_Customer_ID"); // Beispielhaftes Feld

        if (booksCustomerId != null)
        {
            // 4. Rechnung in Zoho Books erstellen
            rechnungMap = Map();
            rechnungMap.put("customer_id", booksCustomerId);
            rechnungMap.put("date", zoho.currentdate);
            rechnungMap.put("line_items", lineItemsList);
            // Optional: Rechnungsnummer, Fälligkeitsdatum, Notizen etc.
            // Verwende die Zoho Books API v3
            // ACHTUNG: 'zoho.books.createRecord' benötigt die korrekte Organization ID und Connection
            // connectionName = "zohobooksconnection"; // Beispiel Connection Name
            // organizationId = "DEINE_ORG_ID"; // Deine Zoho Books Org ID
            // createInvoiceResponse = invokeurl
            // [
            //     url :"https://books.zoho.com/api/v3/invoices?organization_id=" + organizationId
            //     type :POST
            //     parameters:{"JSONString": rechnungMap.toString()}
            //     connection:connectionName
            // ];

            // Alternative (wenn die neuere integrierte Funktion verfügbar ist):
             createInvoiceResponse = zoho.books.createRecord("Invoices", "DEINE_ORG_ID", rechnungMap, "zohobooksconnection");


            info "Rechnung erstellt: " + createInvoiceResponse;

            // Optional: Rechnungs-ID zurück ins CRM schreiben
            if (createInvoiceResponse.get("invoice") != null)
            {
                 invoiceId = createInvoiceResponse.get("invoice").get("invoice_id");
                 updateAnfrageMap = Map();
                 updateAnfrageMap.put("Zoho_Books_Rechnungs_ID", invoiceId);
                 zoho.crm.updateRecord("Anfragen", anfrageId, updateAnfrageMap);
            }
        }
        else
        {
            info "Fehler: Zoho Books Customer ID nicht im CRM Kontakt gefunden.";
        }
    }
    else
    {
        info "Keine verkauften Einheiten für diese Anfrage gefunden.";
    }
}
catch (e)
{
    info "Fehler bei der Rechnungserstellung: " + e;
    // Fehlerbehandlung: Benachrichtigung senden etc.
}

Wichtige Hinweise zur Books-Integration:

  • Du benötigst eine konfigurierte Verbindung (Connection) zwischen Zoho CRM und Zoho Books.
  • Die Zuordnung von CRM-Kontakten/Accounts zu Zoho Books Kunden muss sauber gelöst sein (z.B. durch Speichern der Books-ID im CRM).
  • Die Artikel (Items) in Zoho Books müssen ggf. vorher angelegt werden, oder Du arbeitest mit nicht-inventarisierten Artikeln direkt in der Rechnung.
  • Fehlerbehandlung ist essenziell! Was passiert, wenn die API nicht erreichbar ist oder Daten fehlen?

Tipps und Best Practices

  • Datenqualität ist entscheidend: Stelle sicher, dass die Daten in den Modulen „Kontingente“ und „Verkaufseinheiten“ stets korrekt und aktuell sind. Nutze Validierungsregeln und Pflichtfelder.
  • Klare Status-Definitionen: Definiere eindeutig, was die Statuswerte („Verfügbar“, „Reserviert“, „Verkauft“, etc.) bedeuten und wer sie wann ändern darf.
  • Deluge Error Handling: Baue `try…catch`-Blöcke in Deine Deluge-Skripte ein und implementiere Benachrichtigungen (z.B. per E-Mail an Admins) bei Fehlern.
  • Zoho Flow als Alternative/Ergänzung: Für einfachere Integrationen zwischen Apps (z.B. Statusänderung in CRM löst Aktion in Books aus) kann Zoho Flow eine grafische Alternative zu reinen Deluge-Skripten sein, besonders wenn externe Apps (nicht nur Zoho) angebunden werden sollen.
  • Skalierbarkeit bedenken: Wenn Du sehr viele Einheiten oder Anfragen erwartest, achte auf die API-Limits von Zoho. Optimiere Deine Skripte (z.B. durch Massen-Updates statt Einzel-Updates in Schleifen).
  • Benutzerfreundlichkeit: Gestalte die CRM-Ansichten und -Layouts so, dass Mitarbeiter schnell die benötigten Informationen finden und Aktionen ausführen können. Nutze Buttons und Widgets sinnvoll.
  • Testing: Teste den gesamten Prozess gründlich mit verschiedenen Szenarien (genug Plätze, zu wenig Plätze, Stornierungen etc.), bevor Du ihn produktiv schaltest.

Zusätzliche Hinweise und Erweiterungen

  • Webformulare mit Zoho Forms: Nutze Zoho Forms, um Anfragen direkt von Deiner Website strukturiert in das „Anfragen“-Modul im CRM zu leiten.
  • Analysen mit Zoho Analytics: Integriere Deine CRM-Daten mit Zoho Analytics, um detaillierte Auswertungen zu erstellen: Welche Kontingente/Veranstaltungen laufen am besten? Wie ist die Auslastung? Wo gibt es Engpässe?
  • Kommunikationsautomatisierung: Nutze Workflows in CRM oder Zoho Campaigns/Marketing Automation, um automatisierte E-Mails an Kunden zu senden (z.B. Erinnerungen vor dem Event, Zusatzangebote, Follow-ups).
  • Restplatzvermarktung: Erstelle eine eigene Ansicht oder einen Prozess, um kurz vor einem Event alle „Verkaufseinheiten“ mit Status „Verfügbar“ zu identifizieren und gezielt (z.B. über einen separaten Newsletter) anzubieten.
  • Partnerportal mit Zoho Creator: Wenn Du mit Partneragenturen arbeitest, könntest Du mit Zoho Creator ein einfaches Portal bauen, über das Partner verfügbare Einheiten einsehen oder sogar selbst buchen können (mit Zugriff auf die CRM-Daten über APIs).
  • Externe APIs anbinden: Denke über die Anbindung weiterer Systeme nach. Beispiele:
    • Payment Gateways (Stripe, PayPal): Integriere Bezahl-Links direkt in die Angebote oder Rechnungen.
    • Kalender-Systeme: Synchronisiere gebuchte Termine mit den Kalendern der Mitarbeiter oder Kunden.
    • LinkedIn Sales Navigator: Wie im Ursprungsgespräch angedacht, könntest Du über die API Leads aus LinkedIn-Suchen oder -Profilen automatisiert ins CRM übertragen (oft aufwendiger).

Fazit

Die Automatisierung komplexer Buchungs- und Verkaufsprozesse ist mit dem Zoho-Ökosystem sehr gut machbar. Durch die Kombination von Zoho CRM als flexibler Datenbank und Prozess-Steuerzentrale, Zoho Books für die Finanzabwicklung und der Mächtigkeit von Deluge für individuelle Logik und API-Anbindungen kannst Du maßgeschneiderte Lösungen bauen, die weit über Standardfunktionen hinausgehen.

Der Schlüssel liegt in einer durchdachten Datenstruktur (insbesondere das Aufsplitten von Kontingenten in verkaufbare Einheiten) und der gezielten Automatisierung der Kernschritte: Matching, Angebot, Buchung und Rechnungsstellung. Auch wenn die initiale Einrichtung Aufwand bedeutet, sparst Du langfristig enorm viel Zeit, reduzierst Fehler und schaffst die Grundlage für weiteres Wachstum, indem Du Dein System mit anderen Zoho Apps oder externen Diensten über APIs und Webhooks erweiterst. Trau Dich, die Möglichkeiten von Zoho voll auszuschöpfen!