Vom Standard-ERP zur maßgeschneiderten Lösung: Komplexe Dienstleistungsprozesse mit Zoho automatisieren
Stehst Du vor der Herausforderung, dass Dein aktuelles ERP-System zu starr für Deine dynamischen Dienstleistungsprozesse ist? Viele Standardlösungen stoßen an ihre Grenzen, wenn es um flexible Abrechnungsmodelle, individuelle Angebotsgestaltung oder spezifische Automatisierungswünsche geht. Genau hier entfaltet das Zoho-Ökosystem seine wahre Stärke: Nicht als fertiges Produkt von der Stange, sondern als eine flexible Plattform, die sich durch intelligente Kombination verschiedener Apps und gezielte Eigenentwicklung exakt an Deine Bedürfnisse anpassen lässt. In diesem Artikel zeigen wir Dir anhand eines konkreten Praxisbeispiels aus der IT-Dienstleistungsbranche, wie Du komplexe Anforderungen wie variable Stundensätze und dynamische Angebotstexte umsetzen kannst. Wir tauchen tief in den Tech-Stack ein und demonstrieren, wie Du mit Zoho CRM, Zoho Projects, Zoho Books und der Skriptsprache Deluge eine hochgradig individualisierte Lösung baust.
Das Praxisbeispiel: Die Herausforderung eines Cyber-Security-Dienstleisters
Stell Dir ein spezialisiertes Cyber-Security-Unternehmen vor. Bisher nutzt es ein branchenspezifisches ERP-System, das jedoch immer mehr zum Hemmschuh wird. Die Prozesse sind starr, Anpassungen kaum möglich. Das Team kämpft täglich mit manuellen Workarounds, die fehleranfällig und zeitaufwendig sind. Folgende Kernanforderungen kann die bestehende Software nicht oder nur unzureichend abbilden:
- Variable Stundensätze: Innerhalb desselben Projekts müssen unterschiedliche Stundensätze abgerechnet werden können – zum Beispiel ein Satz für Remote-Arbeit und ein höherer für Einsätze vor Ort (Onsite). Das System soll automatisch den korrekten Satz basierend auf der erfassten Zeitart ziehen.
- Dynamische Angebotstexte: Wenn ein bestimmter Service, z.B. ein „Penetrationstest“, zum Angebot hinzugefügt wird, soll automatisch ein vordefinierter, ausführlicher Beschreibungstext am Anfang des Angebots eingefügt werden.
- Zeitversetzter Versand: Eine Auftragsbestätigung, die spät abends erstellt wird, soll nicht sofort, sondern erst am nächsten Morgen um 8:00 Uhr automatisch versendet werden, um einen professionelleren Eindruck zu hinterlassen.
- Durchgängiger Prozess: Der gesamte Workflow von der Angebotserstellung über die Zeiterfassung im Projekt bis hin zur automatisierten Rechnungsstellung und dem Versand von E-Rechnungen an den externen Buchhaltungsdienstleister muss nahtlos und ohne manuelle Eingriffe funktionieren.
Das Ziel ist klar: Weg von einer rigiden Insellösung, hin zu einem integrierten und flexiblen System, das die einzigartigen Prozesse des Unternehmens unterstützt und nicht behindert.
Schritt-für-Schritt zur Lösung: Der Tech-Stack im Detail
Um diese anspruchsvollen Anforderungen umzusetzen, genügt nicht eine einzelne App. Die Lösung liegt in der intelligenten Verknüpfung mehrerer Zoho-Anwendungen, die durch Custom Functions (geschrieben in Deluge) und APIs zu einer maßgeschneiderten Einheit verschmelzen. Die Basis bildet in der Regel eine Zoho One Lizenz, die den Zugriff auf alle notwendigen Apps ermöglicht.
Schritt 1: Flexible Angebotserstellung in Zoho CRM
Während Zoho Books hervorragend für die Buchhaltung und Rechnungsstellung geeignet ist, sind seine Angebotsvorlagen eher standardisiert. Die Anforderung, dynamisch ganze Textblöcke basierend auf den Angebotspositionen einzufügen, lässt sich wesentlich flexibler im Angebotsmodul von Zoho CRM umsetzen.
Die Umsetzung:
Wir erstellen eine Custom Function in Zoho CRM, die immer dann ausgelöst wird, wenn ein Produkt zu einem Angebot hinzugefügt oder entfernt wird. Diese Funktion prüft den Namen des Artikels und aktualisiert ein mehrzeiliges Textfeld im Angebot, das wir „Vortext“ nennen. Dieses Feld wird dann in der Angebotsvorlage an prominenter Stelle platziert.
Beispiel-Code (Deluge für Zoho CRM):
// Custom Function, die an das Angebotsmodul gebunden ist
// Parameter: quoteId (ID des aktuellen Angebots)
// Angebot und zugehörige Posten abrufen
quoteDetails = zoho.crm.getRecordById("Quotes", quoteId);
lineItems = quoteDetails.get("Product_Details");
vortext = "";
// Prüfen, ob bestimmte Produkte im Angebot enthalten sind
for each item in lineItems
{
productName = item.get("product").get("name");
if(productName.containsIgnoreCase("Penetrationstest"))
{
// Vordefinierten Textbaustein hinzufügen
vortext = vortext + "Einleitung zum Penetrationstest:nUnser umfassender Sicherheitstest analysiert Ihre Systeme auf Schwachstellen und bietet konkrete Handlungsempfehlungen. Der Prozess umfasst die Phasen X, Y und Z...nn";
}
if(productName.containsIgnoreCase("Mitarbeiterschulung"))
{
vortext = vortext + "Informationen zur Mitarbeiterschulung:nUnsere interaktiven Schulungen sensibilisieren Ihr Team für aktuelle Cyber-Bedrohungen und stärken Ihre menschliche Firewall...nn";
}
}
// Das "Vortext"-Feld im Angebot aktualisieren
updateMap = Map();
updateMap.put("Beschreibung_Vortext", vortext); // "Beschreibung_Vortext" ist der API-Name des Custom Fields
updateResponse = zoho.crm.updateRecord("Quotes", quoteId, updateMap);
info updateResponse;
Schritt 2: Variable Stundensätze in Zoho Projects & Books
Dies ist eine der kniffligsten Anforderungen, da Zoho Projects standardmäßig einen Stundensatz pro Projekt oder pro Benutzer vorsieht, aber nicht pro einzelnem Task oder Zeitbucheintrag. Wir müssen diese Logik selbst bauen.
Die Umsetzung:
1. Datenmodell erweitern: In Zoho Projects fügen wir dem Zeiterfassungsmodul (Timesheet) ein benutzerdefiniertes Auswahlfeld hinzu, z.B. „Abrechnungsart“ mit den Werten „Remote“ und „Onsite“.
2. Zentrale Logik via Custom Function: Anstatt die Zeiteinträge direkt in Zoho Books zu fakturieren, erstellen wir eine geplante Custom Function (z.B. in Zoho CRM oder direkt in Zoho Books), die täglich oder wöchentlich läuft.
3. Prozess der Funktion: Die Funktion ruft per API alle fakturierbaren, aber noch nicht fakturierten Zeiteinträge aus Zoho Projects ab. Für jeden Eintrag prüft sie den Wert im Feld „Abrechnungsart“ und wendet den entsprechenden, in der Funktion hinterlegten Stundensatz an (z.B. Remote = 100€, Onsite = 150€). Anschließend erstellt oder aktualisiert sie die Rechnungsposten in Zoho Books über dessen API.
Beispiel-Code (Konzeptionelles Deluge-Skript):
// Geplante Funktion, die z.B. täglich läuft
// Verbindung zu Zoho Projects und Zoho Books herstellen
projects_connection = "zoho_projects_connection";
books_connection = "zoho_books_connection";
// Alle fakturierbaren Zeiteinträge abrufen
timeLogs = invokeurl
[
url :"https://projects.zoho.eu/restapi/portal/{portal_id}/projects/{project_id}/logs/"
type :GET
connection:projects_connection
];
for each log in timeLogs.get("logs")
{
if(log.get("is_billable") == true && log.get("invoiced_status") == "Not Invoiced")
{
// Custom Field für Abrechnungsart auslesen
billingType = log.get("custom_fields").get("Abrechnungsart");
hours = log.get("log_hours").toDecimal();
rate = 0.0;
// Stundensatz basierend auf der Abrechnungsart festlegen
if(billingType == "Remote")
{
rate = 100.0;
}
else if(billingType == "Onsite")
{
rate = 150.0;
}
// Hier folgt der API-Call, um den Posten in einer Zoho Books Rechnung zu erstellen/aktualisieren
// z.B. zoho.books.createRecord("Invoices", organizationId, invoiceData, books_connection);
}
}
Diese Methode gibt Dir die volle Kontrolle über die Abrechnungslogik, erfordert aber eine saubere Programmierung und Fehlerbehandlung.
Schritt 3: Zeitversetzter Versand von Dokumenten
Diese Anforderung ist ein klassischer Fall für eine geplante Automatisierung. Wir nutzen dafür eine Scheduler-Funktion.
Die Umsetzung:
1. Füge dem entsprechenden Modul (z.B. Auftragsbestätigungen in Zoho Books) ein Kontrollkästchen hinzu, etwa „Für geplanten Versand vormerken“.
2. Erstelle eine geplante Custom Function, die jeden Werktag um 8:00 Uhr morgens ausgeführt wird.
3. Die Funktion sucht nach allen Datensätzen, bei denen das Kontrollkästchen aktiviert ist. Für jeden gefundenen Datensatz führt sie die Standard-E-Mail-Versandaktion über die API aus und deaktiviert anschließend das Kontrollkästchen.
Beispiel-Code (Deluge für Zoho Books Scheduler):
// Geplante Funktion, läuft jeden Tag um 08:00 Uhr
organizationId = zoho.books.getOrganizations().get("organizations").get(0).get("organization_id");
// Suche nach Rechnungen (oder SalesOrders), die zum Versand markiert sind
searchCriteria = "(cf_geplanter_versand == true)"; // cf_geplanter_versand ist der API-Name des Custom Fields
invoicesToSend = zoho.books.getRecords("Invoices", organizationId, {"search_text":searchCriteria});
for each invoice in invoicesToSend.get("invoices")
{
invoiceId = invoice.get("invoice_id");
// E-Mail-Versand per API auslösen
emailParams = Map();
// Hier können E-Mail-Parameter wie Empfänger, Vorlage etc. definiert werden
emailResponse = zoho.books.sendEmail("Invoices", invoiceId, emailParams, organizationId);
// Nach erfolgreichem Versand das Kontrollkästchen zurücksetzen
if(emailResponse.get("code") == 0)
{
updateMap = Map();
updateMap.put("cf_geplanter_versand", false);
zoho.books.updateRecord("Invoices", invoiceId, updateMap, organizationId);
}
}
Schritt 4: Die Brücke bauen mit Zoho Flow und externen APIs
Nicht jede Verbindung muss von Grund auf programmiert werden. Für die Synchronisation zwischen Zoho CRM (Angebot angenommen) und Zoho Projects (Projekt anlegen) oder Zoho Books (Auftrag erstellen) kann Zoho Flow eine visuelle, Low-Code-Alternative sein.
Zusätzlich ermöglicht die `invokeurl`-Task in Deluge die Anbindung beliebiger externer Systeme über deren REST-APIs. So könnten die finalen Rechnungsdaten aus Zoho Books nicht nur als PDF exportiert, sondern direkt an das System des externen Buchhaltungsdienstleisters oder an eine Plattform wie DATEV übertragen werden, sofern diese eine entsprechende Schnittstelle anbietet.
Tipps und Best Practices
- Datenmodell zuerst: Bevor Du eine Zeile Code schreibst, plane Dein Datenmodell. Welche benutzerdefinierten Felder benötigst Du in welcher App? Eine saubere Datenstruktur ist die halbe Miete.
- Prozessbrüche managen: Der Wechsel von Zoho CRM (Angebot) zu Zoho Books (Rechnung) ist ein potenzieller Bruch. Gestalte ihn für den Anwender so nahtlos wie möglich, z.B. durch einen Button im CRM („Auftrag & Rechnung erstellen“), der eine Custom Function auslöst, die alle Daten sauber überträgt.
- Testen in der Sandbox: Entwickle und teste Deine Custom Functions immer in einer Sandbox-Umgebung von Zoho, bevor Du sie im Live-System einsetzt. Das verhindert teure Fehler im produktiven Betrieb.
- Dokumentation ist entscheidend: Kommentiere Deinen Deluge-Code und dokumentiere die Logik Deiner Automatisierungen. Das hilft Dir (und anderen), die Funktionen auch Monate später noch zu verstehen und zu warten.
Fazit
Die wahre Stärke von Zoho liegt nicht darin, eine „Out-of-the-box“-Lösung für jedes Problem zu sein. Sie liegt in der beispiellosen Flexibilität, die es Dir ermöglicht, eine perfekt auf Deine Geschäftsprozesse zugeschnittene Lösung zu entwickeln. Das vorgestellte Beispiel zeigt, dass selbst komplexe Anforderungen wie variable Stundensätze und dynamische Dokumente realisierbar sind, wenn man bereit ist, über den Tellerrand der Standardkonfiguration hinauszuschauen.
Die Umsetzung erfordert zwar eine Investition in Konzeption und Entwicklung, doch das Ergebnis ist ein System, das mit Deinem Unternehmen wächst, manuelle Arbeit eliminiert und Dir einen echten Wettbewerbsvorteil verschafft. Du bist nicht länger gezwungen, Deine Prozesse an die Software anzupassen – Du passt die Software an Deine Prozesse an.
Verwendete Zoho Apps in dieser Lösung:
- Zoho CRM
- Zoho Projects
- Zoho Books
- Zoho Flow (optional)
- Deluge Scripting (als Teil der Plattform)