Du betrachtest gerade Zoho CRM, Zoho Books und PHP-API: Event-Ticketing-Workflow automatisieren

Zoho CRM, Zoho Books und PHP-API: Event-Ticketing-Workflow automatisieren

  • Beitrags-Autor:

Vom Angebot zur Rechnung: Ein Event-Ticketing-Workflow mit Zoho CRM, Books und externen APIs

In der schnelllebigen Welt des Event-Managements oder des Handels mit exklusiven Tickets ist ein reibungsloser, automatisierter Prozess entscheidend. Oft sind die Systeme für Vertrieb, Buchhaltung und Partner-Management voneinander getrennt, was zu manueller Datenübertragung, Fehlern und wertvollen Zeitverlusten führt. Du kennst das vielleicht: Daten werden aus dem CRM kopiert, manuell in ein Buchhaltungstool wie LexOffice eingegeben und die Kommunikation mit Partnern läuft unstrukturiert über E-Mail. Genau hier zeigt das Zoho-Ökosystem seine Stärke: durch die nahtlose Integration seiner Apps und die Offenheit gegenüber externen Diensten. In diesem Artikel zeigen wir dir, wie du einen robusten Workflow vom ersten Angebot bis zur finalen Rechnung aufbaust und dabei sogar Partner über eine eigene API an dein System anbindest.

Die Herausforderung: Ein typisches Praxisbeispiel

Stell dir eine Agentur vor, die sich auf die Vermittlung von Tischen und Tickets für ein großes, bekanntes Volksfest spezialisiert hat. Das Geschäftsmodell ist komplex:

  • Einkauf: Tische werden von verschiedenen Zeltbetreibern eingekauft. Diese „Einkaufstische“ haben unterschiedliche Konditionen, Preise und Menüs.
  • Verkauf: Anfragen von Kunden und Partnern kommen herein. Für jeden Kunden wird ein individuelles Angebot erstellt, das auf den verfügbaren Einkaufstischen basiert.
  • Abrechnung: Nach Bestätigung muss eine korrekte Rechnung erstellt werden. Hierbei gibt es steuerliche Besonderheiten zu beachten, z.B. sind Wertgutscheine oft als durchlaufende Posten mit 0 % MwSt. zu behandeln, während Servicegebühren oder zusätzliche Getränke mit 19 % MwSt. versteuert werden.
  • Partner-Management: Externe Partner-Agenturen sollen die aktuellen Verfügbarkeiten einsehen können, ohne direkten Zugriff auf das CRM zu haben.
  • Marketing: Eine große Datenbank mit Tausenden potenziellen Kontakten soll für die Kaltakquise genutzt werden, ohne die E-Mail-Reputation der Hauptdomain zu gefährden.

Ziel ist es, diesen gesamten Prozess zu digitalisieren und zu automatisieren, um Skalierbarkeit zu gewährleisten und Fehler zu minimieren.

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

Schritt 1: Die Datenbasis in Zoho CRM schaffen

Das Herzstück unseres Systems ist Zoho CRM. Es dient als „Single Source of Truth“ für alle einkaufs- und verkaufsrelevanten Daten. Anstatt nur die Standardmodule zu verwenden, erstellen wir eigene Module, um den Prozess exakt abzubilden:

  • Custom Modul „EK-Tische“: Hier erfasst du alle eingekauften Tische. Wichtige Felder sind: Zeltname, Datum, Preis, Anzahl der Plätze, enthaltene Leistungen (z.B. „EK-Verzehr“, „EK-Wertgutschein“) und der Status (z.B. „Verfügbar“, „Reserviert“, „Verkauft“).
  • Standardmodul „Angebote“ (Quotes/Deals): Ein Angebot wird immer mit einem oder mehreren Datensätzen aus dem Modul „EK-Tische“ verknüpft. So weißt du immer genau, welche Ressource du gerade anbietest. Im Angebot selbst definierst du den Verkaufspreis und fügst eventuelle Zusatzleistungen hinzu.

Diese saubere Datenstruktur ist die Grundlage für jede Automatisierung. Ohne sie bleiben alle nachfolgenden Schritte fehleranfällig.

Schritt 2: Automatisierte Rechnungserstellung in Zoho Books

Wenn ein Kunde dein Angebot annimmt (im CRM wird der Status des Deals auf „Gewonnen“ gesetzt), soll die Rechnung automatisch in Zoho Books erstellt werden. Manuelle Übertragungen sind hier die größte Fehlerquelle. Die Lösung ist eine Custom Function mit Deluge, die durch eine Workflow-Regel im CRM ausgelöst wird.

Die Funktion holt sich alle relevanten Daten aus dem CRM-Deal und den verknüpften „EK-Tischen“ und erstellt damit eine neue Rechnung in Zoho Books. Besonders wichtig ist die korrekte Zuordnung der Steuerarten.

Beispiel einer Deluge Custom Function (vereinfacht):


// Funktion wird durch einen Workflow-Rule im "Deals"-Modul ausgelöst, wenn "Stage" auf "Closed Won" gesetzt wird.
// Argument: dealId (vom Deal-Datensatz)

// Deal- und zugehörige Kontoinformationen abrufen
dealDetails = zoho.crm.getRecordById("Deals", dealId);
accountId = dealDetails.get("Account_Name").get("id");
accountDetails = zoho.crm.getRecordById("Accounts", accountId);
contactId = dealDetails.get("Contact_Name").get("id");

// Prüfen, ob der Kontakt bereits in Zoho Books existiert, sonst neu anlegen
zohoBooksContact = zoho.books.getRecords("contacts", "YOUR_ORGANIZATION_ID", {"email": accountDetails.get("Email")});
if(zohoBooksContact.get("code") != 0 || zohoBooksContact.get("contacts").size() == 0)
{
    // Kontakt in Books erstellen
    contactMap = Map();
    contactMap.put("contact_name", accountDetails.get("Account_Name"));
    contactMap.put("email", accountDetails.get("Email"));
    newContact = zoho.books.createRecord("contacts", "YOUR_ORGANIZATION_ID", contactMap);
    booksContactId = newContact.get("contact").get("contact_id");
}
else
{
    booksContactId = zohoBooksContact.get("contacts").get(0).get("contact_id");
}

// Rechnungs-Line-Items vorbereiten
lineItems = List();

// Beispiel: Feste Servicepauschale hinzufügen (19% MwSt.)
serviceItem = Map();
serviceItem.put("name", "Service- & Bearbeitungspauschale");
serviceItem.put("description", "Unsere Pauschale für die Organisation und Abwicklung.");
serviceItem.put("rate", dealDetails.get("Service_Fee")); // Benutzerdefiniertes Feld im Deal
serviceItem.put("quantity", 1);
serviceItem.put("tax_id", "YOUR_19_PERCENT_TAX_ID_IN_BOOKS"); // Die ID des 19% Steuersatzes in Books
lineItems.add(serviceItem);

// Beispiel: Wertgutschein als durchlaufender Posten (0% MwSt.)
voucherItem = Map();
voucherItem.put("name", "Wertgutschein " + dealDetails.get("Tent_Name"));
voucherItem.put("description", "Einzulösen für Speisen und Getränke vor Ort.");
voucherItem.put("rate", dealDetails.get("Voucher_Value")); // Benutzerdefiniertes Feld im Deal
voucherItem.put("quantity", 1);
voucherItem.put("tax_id", "YOUR_0_PERCENT_TAX_ID_IN_BOOKS"); // Die ID des 0% Steuersatzes in Books
lineItems.add(voucherItem);


// Rechnung in Zoho Books erstellen
invoiceMap = Map();
invoiceMap.put("customer_id", booksContactId);
invoiceMap.put("date", today);
invoiceMap.put("line_items", lineItems);

createInvoice = zoho.books.createRecord("invoices", "YOUR_ORGANIZATION_ID", invoiceMap);
info createInvoice;

Diese Funktion sorgt dafür, dass jede Rechnung konsistent und mit den korrekten Steuersätzen erstellt wird, sobald der Vertrieb den Deal abschließt.

Schritt 3: Datenmigration und Konfiguration der Rechnungsnummern

Beim Wechsel von einem Altsystem wie LexOffice ist es oft gewünscht, den bestehenden Nummernkreis für Rechnungen fortzuführen, um eine lückenlose Buchhaltung zu gewährleisten. Zoho Books macht das sehr einfach:

  1. Gehe zu Einstellungen > Weitere Einstellungen > Präferenzen > Rechnungen.
  2. Unter „Rechnungsnummer“ kannst du ein Präfix festlegen und die „Nächste Nummer“ manuell auf den gewünschten Wert (z.B. 110) setzen.
  3. Alle zuvor erstellten Testrechnungen im Status „Entwurf“ kannst du einfach löschen, damit die neue Sequenz sauber beginnt.

Schritt 4: E-Mail-Reputation schützen bei Kaltakquise

Eine große Kontaktdatenbank (z.B. 20.000 Adressen) ist wertvoll, birgt aber Risiken. Werden von deiner Hauptdomain massenhaft E-Mails an „kalte“ Kontakte gesendet, steigt die Gefahr, als Spam markiert zu werden. Dies kann deine Domain-Reputation nachhaltig schädigen, sodass auch wichtige E-Mails an Bestandskunden nicht mehr zugestellt werden.

Best Practice:

  • Separate Domain/Subdomain: Nutze für Kaltakquise-Kampagnen eine separate Domain (z.B. deine-agentur-angebote.de) oder eine Subdomain (z.B. news.deine-agentur.de).
  • Tools nutzen: Führe die Kampagnen über Zoho Campaigns oder Zoho Marketing Automation durch. Diese Tools sind für Massenversand ausgelegt und bieten Funktionen wie Abmelde-Management und detaillierte Analysen.
  • Aufwärmen: Beginne mit einer kleinen Anzahl von E-Mails pro Tag (z.B. 50) und steigere das Volumen langsam. So „wärmst“ du die neue Domain bei den E-Mail-Providern wie Gmail oder Outlook auf.
  • Authentifizierung: Stelle sicher, dass für deine Versanddomain SPF, DKIM und DMARC korrekt eingerichtet sind. Dies ist ein technisches Muss, um Vertrauenswürdigkeit zu signalisieren.

Schritt 5: Partner-Portal mit einer externen PHP-API

Deine Partner sollen aktuelle Verfügbarkeiten sehen, aber keinen vollen CRM-Zugang erhalten. Eine professionelle Lösung ist eine kleine, externe Anwendung, die über die Zoho CRM API auf die Daten zugreift. Dies lässt sich mit einem einfachen PHP-Skript auf einem Webserver realisieren.

Das Skript authentifiziert sich bei Zoho via OAuth2, fragt über COQL (Zoho Query Language) die verfügbaren Datensätze im Modul „EK-Tische“ ab und stellt diese auf einer passwortgeschützten Webseite dar.

Beispiel eines PHP-Skripts zum Abruf von Daten (vereinfacht):


<?php
// In einer echten Anwendung: OAuth2-Token-Management verwenden!
$accessToken = 'DEIN_GÜLTIGER_OAUTH2_ACCESS_TOKEN';
$apiUrl = 'https://www.zohoapis.eu/crm/v2/coql';

// COQL-Abfrage: Wähle alle Tische aus, deren Status "Verfügbar" ist
$coqlQuery = [
    'select_query' => "select Name, Zeltname, Datum, Preis from EK_Tische where Status = 'Verfügbar' limit 200"
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($coqlQuery));

$headers = [
    'Authorization: Zoho-oauthtoken ' . $accessToken,
    'Content-Type: application/json',
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

$data = json_decode($result, true);

// Daten als einfache HTML-Tabelle ausgeben
if (isset($data['data'])) {
    echo "<table border='1'>";
    echo "<tr><th>Tisch</th><th>Zelt</th><th>Datum</th><th>Preis</th></tr>";
    foreach ($data['data'] as $table) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($table['Name']) . "</td>";
        echo "<td>" . htmlspecialchars($table['Zeltname']) . "</td>";
        echo "<td>" . htmlspecialchars($table['Datum']) . "</td>";
        echo "<td>" . htmlspecialchars($table['Preis']) . "</td>";
        echo "</tr>";
    }
    echo "</table>";
} else {
    echo "Keine verfügbaren Tische gefunden oder Fehler bei der Abfrage.";
    print_r($data);
}
?>

Diese Lösung ist extrem flexibel. Du könntest auch ein Anfrageformular (erstellt mit Zoho Forms) auf dieser Partnerseite einbetten, das direkt einen neuen Lead im CRM anlegt.

Tipps und Best Practices

  • Fehlerbehandlung: Baue in deine Deluge-Skripte immer try...catch-Blöcke ein. Bei einem Fehler (z.B. API nicht erreichbar), sende eine Benachrichtigung an einen Admin-Nutzer via Zoho Cliq, anstatt dass der Prozess stillschweigend fehlschlägt.
  • API-Limits beachten: Zoho hat tägliche API-Limits. Bei sehr vielen Abfragen (z.B. durch das Partner-Portal) solltest du die Ergebnisse serverseitig cachen, um nicht bei jedem Seitenaufruf eine neue Anfrage an Zoho zu senden.
  • Sicherheit: Speichere API-Keys, Client-Secrets und andere Zugangsdaten niemals direkt im Code. Nutze sichere Speicherorte wie Zoho Vault.
  • Alternative zu Code: Für einfachere Integrationen zwischen Zoho Apps kannst du oft auch Zoho Flow verwenden. Dies ist ein No-Code-Tool, das eine grafische Oberfläche zur Erstellung von Workflows bietet.

Weitere Integrationsmöglichkeiten

Das Potenzial ist bei Weitem nicht ausgeschöpft. Du könntest das System erweitern mit:

  • Zoho Analytics: Erstelle umfassende BI-Dashboards, um Verkaufszahlen, Margen pro Zelt und die Performance deiner Partner in Echtzeit zu visualisieren.
  • Stripe-Integration: Verbinde Stripe mit Zoho Books, um deinen Kunden die direkte Online-Zahlung von Rechnungen per Kreditkarte zu ermöglichen.
  • Zoho Sites / Zoho LandingPage: Erstelle schnell professionelle Landingpages für deine Marketing-Kampagnen, deren Formulare direkt mit dem CRM verbunden sind.
  • Automatisierte Alerts: Richte einen Workflow ein, der dich per Zoho Cliq benachrichtigt, wenn ein neuer „EK-Tisch“ hereinkommt, der zu einer offenen Kundenanfrage passt. So kannst du proaktiv auf Kunden zugehen.

Fazit: Mehr als nur Software – ein Betriebssystem für dein Unternehmen

Dieses Praxisbeispiel zeigt, dass die Stärke von Zoho nicht nur in den einzelnen Apps liegt, sondern in ihrer Fähigkeit, als vernetztes Betriebssystem für dein Unternehmen zu agieren. Durch die Kombination von Zoho CRM für die Datenhaltung und Zoho Books für die Abrechnung, automatisiert durch Deluge, schaffst du einen effizienten und fehlerresistenten Kernprozess. Die Offenheit der API erlaubt es dir zudem, maßgeschneiderte Lösungen wie ein Partner-Portal zu entwickeln und dein Geschäft damit auf die nächste Stufe zu heben. Du verlässt die Welt der isolierten Insellösungen und baust ein System, das mit deinen Anforderungen wächst.


In diesem Artikel verwendete Zoho Apps: