Zoho Projects, Books und CRM per API für Abrechnungs-Widget verbinden

Zoho Projects, Books und CRM per API für Abrechnungs-Widget verbinden

Zoho-Prozesse automatisieren: Von der Zeiterfassung in Projects zur Abrechnung im CRM-Widget

In der täglichen Arbeit mit der Zoho One Suite stellt sich oft die Frage: Wie verbindest Du die Stärken einzelner Apps zu einem nahtlosen, automatisierten Prozess? Viele Unternehmen nutzen Zoho Projects für die Projektarbeit und Zeiterfassung und Zoho Books für die Buchhaltung. Die eigentliche Herausforderung liegt jedoch darin, diese Daten intelligent zu verknüpfen und dem Anwender dort bereitzustellen, wo er sie wirklich braucht – meist direkt im Kundenkontakt, also im Zoho CRM. Dieser Artikel zeigt Dir einen praxisnahen Lösungsansatz, wie Du eine individuelle Abrechnungslogik entwickelst und diese als interaktives Widget direkt in der Kundenansicht im Zoho CRM integrierst. Wir gehen dabei auf den konkreten Tech-Stack, die nötigen API-Verbindungen und die Umsetzung mit Deluge-Scripting ein.

Die Herausforderung: Manuelle Abrechnungsprozesse über Systemgrenzen hinweg

Stell Dir ein typisches IT-Dienstleistungsunternehmen vor. Die Entwickler und Berater erfassen ihre Arbeitszeiten penibel in den jeweiligen Aufgaben in Zoho Projects. Am Monatsende muss die Buchhaltung diese Zeiten exportieren, aufbereiten, nach kundenindividuellen Regeln (z.B. Aufrundung auf 15-Minuten-Intervalle, spezielle Sätze für Wochenendarbeit) anpassen und anschließend manuell Rechnungen in Zoho Books erstellen. Dieser Prozess ist nicht nur zeitaufwendig, sondern auch fehleranfällig. Es fehlt eine zentrale Übersicht über abrechenbare, aber noch nicht fakturierte Stunden direkt am Kunden im CRM. Der Vertrieb oder das Projektmanagement hat keinen schnellen Einblick, welche Leistungen bereits erbracht wurden und zur Abrechnung anstehen. Genau hier setzen wir an und bauen eine Brücke zwischen den Systemen.

Schritt-für-Schritt: Dein Weg zum automatisierten Abrechnungs-Widget

Unser Ziel ist es, eine Anwendung zu schaffen, die abrechenbare Zeiten aus Zoho Projects und Books aggregiert, mit einer benutzerdefinierten Geschäftslogik verarbeitet und das Ergebnis als Widget direkt im Kundenmodul von Zoho CRM anzeigt. Von dort aus soll mit einem Klick eine Rechnungsvorschau in Zoho Books erzeugt werden können.

Schritt 1: Die Datenbasis schaffen und synchronisieren

Die Grundlage für jede gute Automatisierung sind saubere Daten. Stelle sicher, dass in Zoho Projects die Zeiterfassung konsequent genutzt wird. Ein entscheidender Punkt ist die Erfassung von "Von-Bis"-Zeiten statt pauschaler Stundenangaben. Nur so kannst Du später eine Logik für Nacht- oder Wochenendzuschläge implementieren.

  • Konfiguration in Zoho Projects: Definiere in den Projekteinstellungen, dass Zeiteinträge nur mit Start- und Endzeit möglich sind.
  • Native Synchronisation: Nutze die Standard-Integration zwischen Zoho Projects und Zoho Books. Dadurch werden abrechenbare Zeiteinträge automatisch an das Buchhaltungsmodul übertragen und stehen dort für die weitere Verarbeitung bereit.

Schritt 2: Die Geschäftslogik mit Zoho Creator und Deluge entwickeln

Die eigentliche Intelligenz unserer Lösung liegt in einer benutzerdefinierten Anwendung, die wir mit Zoho Creator bauen. Creator dient als Backend für unsere Logik und als Host für das spätere CRM-Widget. Hier schreiben wir unsere Deluge-Funktionen, um die Daten abzurufen und zu verarbeiten.

Zuerst erstellen wir eine Funktion, die alle noch nicht abgerechneten Zeiteinträge für einen bestimmten Kunden aus Zoho Books abruft. Dazu nutzen wir die Zoho Books API.

code
// Deluge Custom Function in Zoho Creator
// Parameter: crmContactID - Die ID des Kontakts aus Zoho CRM
list getBillableHours(int crmContactID)
{
// 1. Finde die Zoho Books Customer ID basierend auf der CRM ID
search_customer = zoho.books.getRecords("Contacts","","zoho_crm_contact_id=" + crmContactID);
if(search_customer.get("code") == 0 && search_customer.get("contacts").size() > 0)
{
booksCustomerID = search_customer.get("contacts").get(0).get("contact_id");
// 2. Rufe alle nicht fakturierten Zeiteinträge für diesen Kunden ab
param_map = Map();
param_map.put("customer_id",booksCustomerID);
param_map.put("status","unbilled");
time_entries = zoho.books.getRecords("TimeEntries","",param_map);
processed_entries = List();
if(time_entries.get("code") == 0)
{
// 3. Verarbeite jeden Zeiteintrag mit unserer Business-Logik
for each entry in time_entries.get("time_entries")
{
// Beispiel: Aufrundung auf die nächste Viertelstunde
minutes = entry.get("log_time").toLong();
rounded_minutes = (minutes / 15 + (if(minutes % 15 > 0, 1, 0))) * 15;
// Beispiel: Prüfung auf Wochenende (Samstag=6, Sonntag=7)
log_date = entry.get("log_date").toDate();
is_weekend = log_date.getDayOfWeek() > 5;
// Füge verarbeitete Daten zur Liste hinzu
processed_entry = Map();
processed_entry.put("project_name", entry.get("project_name"));
processed_entry.put("task_name", entry.get("task_name"));
processed_entry.put("user_name", entry.get("user_name"));
processed_entry.put("original_minutes", minutes);
processed_entry.put("billed_minutes", rounded_minutes);
processed_entry.put("is_weekend_rate", is_weekend);
processed_entries.add(processed_entry);
}
}
return processed_entries;
}
return List();
}

Diese Funktion ist das Herzstück. Sie holt die Rohdaten, wendet einfache Regeln wie Aufrundung an und prüft auf Wochenenden. Du kannst diese Logik beliebig erweitern, zum Beispiel durch die Anbindung an eine externe Feiertags-API (z.B. über invokeurl), um spezielle Stundensätze zu berechnen.

Schritt 3: Das Frontend als CRM-Widget bauen

Nachdem die Logik im Backend steht, bauen wir in Zoho Creator eine "Page". Diese Page wird unser Widget sein. Sie visualisiert die von unserer Deluge-Funktion zurückgegebenen Daten in einer übersichtlichen Tabelle.

  • Erstelle in Creator eine neue Seite (Page).
  • Füge einen HTML-Snippet hinzu und nutze JavaScript, um beim Laden der Seite die Deluge-Funktion getBillableHours aufzurufen. Du übergibst dabei die Kunden-ID, die das CRM beim Einbetten des Widgets automatisch bereitstellt.
  • Die Ergebnisse stellst Du in einer ansprechenden Tabelle dar. Füge einen Button "Rechnungsvorschau erstellen" hinzu.

Schritt 4: Das Widget im Zoho CRM einbinden

Die Verbindung zwischen Zoho Creator und Zoho CRM erfolgt über "Connected Apps".

  1. Gehe im CRM zu Einstellungen > Entwicklerbereich > Widgets.
  2. Erstelle ein neues Widget. Gib ihm einen Namen (z.B. "Abrechnungs-Vorschau").
  3. Wähle als Hosting "Zoho Creator" und wähle die entsprechende Creator-Anwendung und die Page aus, die Du in Schritt 3 erstellt hast.
  4. Wähle aus, in welchem Modul (hier: "Kontakte" oder "Firmen") und an welcher Stelle (z.B. als "Button" oder in der "Related List") das Widget erscheinen soll.

Nach dem Speichern erscheint das Widget nun in jedem Kunden-Datensatz. Es ruft dynamisch die Daten für den jeweiligen Kunden ab und zeigt "Keine abrechenbaren Stunden gefunden" an, falls keine Daten vorhanden sind.

Schritt 5: Aktionen aus dem Widget heraus starten

Der Button "Rechnungsvorschau erstellen" in unserem Widget soll eine weitere Deluge-Funktion aufrufen. Diese Funktion nimmt die aufbereiteten Daten und erstellt über die Zoho Books API einen Rechnungsentwurf.

code
// Deluge-Funktion, die vom Widget-Button aufgerufen wird
void createDraftInvoice(int crmContactID, list line_items)
{
// 1. Finde die Zoho Books Customer ID (wie oben)
search_customer = zoho.books.getRecords("Contacts","","zoho_crm_contact_id=" + crmContactID);
if(search_customer.get("code") == 0 && search_customer.get("contacts").size() > 0)
{
booksCustomerID = search_customer.get("contacts").get(0).get("contact_id");
// 2. Erstelle die JSON-Struktur für die Rechnung
invoice_json = Map();
invoice_json.put("customer_id", booksCustomerID);
invoice_line_items = List();
for each item in line_items
{
line_item_map = Map();
line_item_map.put("name", item.get("project_name") + " - " + item.get("task_name"));
line_item_map.put("description", "Geleistete Arbeitszeit von " + item.get("user_name"));
line_item_map.put("quantity", (item.get("billed_minutes").toDecimal() / 60)); // Menge in Stunden
line_item_map.put("rate", 100.0); // Hier den Stundensatz dynamisch laden!
invoice_line_items.add(line_item_map);
}
invoice_json.put("line_items", invoice_line_items);
// 3. Sende den API-Aufruf an Zoho Books, um den Entwurf zu erstellen
response = zoho.books.createRecord("Invoices", invoice_json);
info response;
}
}

Nach dem Klick wird im Hintergrund ein Rechnungsentwurf in Zoho Books erzeugt, der von der Buchhaltung nur noch geprüft und versendet werden muss.

Tipps und Best Practices

  • Berechtigungen: Nicht jeder CRM-Nutzer soll Rechnungen erstellen dürfen. Innerhalb Deiner Deluge-Funktion kannst Du den angemeldeten Benutzer über zoho.loginuserid abfragen und seine CRM-Rolle oder sein Profil prüfen. Zeige den "Erstellen"-Button im Widget nur an, wenn die Berechtigung vorhanden ist.
  • Entwicklungsumgebung: Während der initialen Entwicklung kann es effizienter sein, direkt im Live-System zu arbeiten (solange die App nicht produktiv ist), um Synchronisationsaufwand zu sparen. Vor dem Go-Live ist es jedoch unerlässlich, die gesamte Lösung in eine saubere Sandbox-Umgebung zu überführen und einen CI/CD-Prozess für das Deployment aufzusetzen.
  • Skalierbarkeit und externe Systeme: Dieser Ansatz ist nicht auf Zoho beschränkt. Dein Zoho Creator Backend kann Daten aus beliebigen externen Systemen abrufen, die eine API anbieten. Stell Dir vor, Du integrierst Daten aus einer Microsoft Azure Umgebung oder einem anderen ERP-System. Die Logik bleibt dieselbe: Daten holen, verarbeiten, im CRM-Kontext darstellen.
  • Fehlerbehandlung: Baue in Deine Deluge-Skripte immer eine robuste Fehlerbehandlung ein. Prüfe die API-Antworten (response.get("code") == 0) und gib dem Anwender im Widget klares Feedback, falls etwas schiefgeht.

Zusätzliche Hinweise: Das Ökosystem erweitern

Diese Lösung ist nur der Anfang. Du könntest den Prozess weiter ausbauen:

  • Benachrichtigungen mit Zoho Cliq: Informiere die Buchhaltung automatisch über den Chat-Dienst Zoho Cliq, sobald ein neuer Rechnungsentwurf erstellt wurde.
  • Reporting mit Zoho Analytics: Übertrage die verarbeiteten Abrechnungsdaten an Zoho Analytics, um detaillierte Auswertungen über abrechenbare Stunden pro Mitarbeiter, Projekt oder Kunde zu erstellen.
  • Prozesssteuerung mit Qntrl: Für sehr komplexe Freigabeprozesse könntest Du Qntrl nutzen, um einen mehrstufigen Genehmigungsworkflow für Rechnungen abzubilden, bevor diese an den Kunden gesendet werden.

Fazit: Mehr als die Summe der Teile

Dieses Praxisbeispiel zeigt eindrücklich, wie die wahre Stärke des Zoho-Ökosystems in der intelligenten Kombination seiner Apps liegt. Indem wir Zoho Projects, Zoho Books und Zoho CRM mittels einer in Zoho Creator entwickelten Logik verbinden, schaffen wir einen hochgradig automatisierten und effizienten Prozess. Der Nutzer verbleibt in seiner gewohnten Umgebung (Zoho CRM) und erhält kontextbezogene, entscheidungsrelevante Informationen und Aktionen auf Knopfdruck. Du reduzierst manuelle Arbeit, minimierst Fehler und schaffst einen transparenten Abrechnungsprozess, der mit Deinem Unternehmen wachsen kann. Genau solche Widgets für Zoho CRM und Zoho Books bauen wir als Pro-Code auf Zoho Catalyst – versioniert in Git, weiterentwickelt von Coding-Agenten, statt im Klick-Baukasten.

Verwendete Zoho Apps:

SprintCX · AI-first Zoho Agentur

Dein nächstes Zoho-Projekt? Mach es mit uns.

Wir sind keine klassische Agentur – wir bauen digitale Mitarbeiter, intelligente Zoho-Prozesse und echte Automatisierung, die Deinem Team tatsächlich Arbeit abnimmt. Wenn Du bis hier gelesen hast, hast Du einen Use-Case im Kopf. Lass uns 15 Minuten darüber sprechen.

Ausgewiesene Zoho Experten100% AI-first AnsatzKeine Verkaufsgespräche, nur Klartext