ActualTime vs. Contract Hours: Zeiterfassung im GLPI

ActualTime misst die tatsächliche Zeit des Technikers; Contract Hours verwaltet das Vertragsguthaben und rechnet ab. Vergleich der beiden Zeit-Plugins für GLPI, der Zielkonflikt beim gemeinsam genutzten actiontime, Empfehlung je Szenario und wie Sie die Rundungsdifferenz messen.

In diesem Artikel8 Abschnitte

Die Zeit eines Tickets zu messen und diese Zeit abzurechnen, sind zwei verschiedene Probleme. Beim einen geht es um die Produktivität des Teams: Wie viel tatsächliche Zeit hat der Techniker aufgewendet? Beim anderen geht es um den Vertrag: Wie viele Stunden hat der Kunde bereits verbraucht und wie viele bleiben ihm noch? Beides zu verwechseln ist der Fehler, den wir im Betrieb am häufigsten sehen – und genau dort beginnt die Wahl zwischen ActualTime und Contract Hours.

Das Problem: drei Ebenen von „Zeit“ im GLPI

Bevor Sie ein Plugin wählen, lohnt es sich, drei Dinge zu unterscheiden, die GLPI unterschiedlich behandelt:

  • Geschätzte Zeit – die Dauer, die Sie für die Aufgabe geplant haben.
  • Tatsächliche Zeit – wie lange der Techniker wirklich gebraucht hat, mit Stoppuhr gemessen.
  • Abrechenbare Zeit – was in die Vertragsabrechnung eingeht, bereits gerundet und mit kaufmännischen Regeln.

Das native Feld Dauer der Aufgabe (in Sekunden in actiontime gespeichert) deckt die Grundlagen ab, erfordert aber manuelle Eingabe und weiß nichts über Verträge. Hier kommen die beiden Plugins ins Spiel.

ActualTime (TICGAL)

ActualTime ist ein kostenloses Open-Source-Plugin von TICGAL. Es fügt der Ticketaufgabe Schaltflächen für Start, Pause und Stopp hinzu und misst die tatsächliche Zeit, die der Techniker damit verbringt. Beim Stoppen speichert es diese gemessene Zeit in der Dauer der Aufgabe. Der Fokus ist ehrlich und eng: aus „Ich glaube, ich habe etwa 40 Minuten gebraucht“ eine gemessene Zahl zu machen. Es kennt weder Vertrag noch Guthaben noch Abrechnung – und muss es auch nicht, denn sein Ziel ist eine Aufwandskennzahl, keine Abrechnung.

Contract Hours (NexTool)

Contract Hours ist ein lizenziertes Modul von NexTool für alle, die Stundenpakete verkaufen. Die Stoppuhr sitzt in der Timeline des Tickets, aber sie erzeugt etwas anderes: Beim Stoppen wird die Zeit auf die konfigurierte abrechenbare Mindesteinheit gerundet (Standard 15 Minuten), wird zu einer automatischen privaten TicketTask und wird vom Guthaben des mit diesem Ticket verknüpften Vertrags abgebucht. Es bringt mit, was ActualTime fehlt: monatliches Kontingent pro Vertrag, Verbrauchsauszug, ein Dashboard „Stundenverbrauch“ für den Kunden in der vereinfachten Oberfläche, Warnungen bei abgelaufenem oder überschrittenem Vertrag und seit Version 3.6 nicht abrechenbare Stunden (Kulanz) – Zeit, die erfasst, aber nicht vom Guthaben abgezogen wird.

Direkter Vergleich

KriteriumNative Dauer (manuell)ActualTime (TICGAL)Contract Hours (NexTool)
Wie die Zeit erfasst wirdManuelle EingabeStoppuhr in der AufgabeStoppuhr in der Timeline
Misst tatsächliche ZeitNein (was Sie eingeben)JaJa
Abrechenbare RundungNeinNeinJa (konfigurierbares Minimum, Vielfaches von 5)
Verknüpfung mit VertragNeinNeinJa (pro Einheit; Gruppe UND Kategorie)
Guthaben / StundenkontingentNeinNeinJa (monatliches Kontingent + Warnungen)
Nicht abrechenbare Stunden (Kulanz)NeinNeinJa (Schalter pro Aufgabe)
Auszug / VerbrauchsberichtNativ (eingeschränkt)EinfachDetailliert pro Zyklus / Zeitraum
Dashboard für den KundenNeinNeinJa („Stundenverbrauch“)
Wo die Zeit gespeichert wirdactiontimeactiontimeactiontime (maßgebliche Quelle) + Guthaben
LizenzNativKostenlos (GPL)Lizenziert
Unterstütztes GLPI10 und 1110 und 11nur 11

Der Zielkonflikt, auf den es im Betrieb ankommt

Im Betrieb haben wir beide eingesetzt: ActualTime bei Kunden, bei denen die interne Produktivität der Schmerzpunkt war, Contract Hours dort, wo der Stundenvertrag im Zentrum der Abrechnung stand. Ein Detail, das erst im laufenden Betrieb auffällt: Beide schreiben am Ende in dasselbe native Feld, actiontime der Aufgabe. ActualTime speichert dort die tatsächlich gemessene Zeit; Contract Hours behandelt actiontime der Aufgabe als maßgebliche Quelle (ab 3.4.2) und erstellt eine private Aufgabe mit der bereits gerundeten Zeit. Laufen beide im selben Ticket, ohne Regel, wem die Aufgabe „gehört“, entstehen zwei konkurrierende Dauern – die rohe Messung des Technikers im Konflikt mit der gerundeten abrechenbaren Buchung. Deshalb haben wir uns entschieden, die Ebenen zu trennen: ActualTime als interne Kennzahl (nie abrechenbar) und Contract Hours als vertragliche Ebene, und nie zuzulassen, dass beide im selben Ticket Aufgaben anlegen. Der Grund ist einfach: Die Zahl auf der Kundenrechnung muss die gerundete, vertragsbewusste sein, nicht die rohen Sekunden – und gerade diese rohen Sekunden braucht die Leitung zur Kapazitätsplanung. Zwei Zielgruppen, zwei Zahlen, zwei Werkzeuge.

Ein häufiger Fehler ist, von ActualTime eine Antwort auf „Wie viele Stunden bleiben im Vertrag?“ zu erwarten. Dieses Konzept kennt es nicht. Jeder Kunde, der versucht hat, so etwas durch Export von ActualTime-Daten in eine Tabelle nachzubauen, sah die Zahl innerhalb von Wochen von der Realität abweichen. Hinzu kommt die Rundungsdifferenz: Contract Hours rundet bis zur abrechenbaren Mindesteinheit auf (standardmäßig 15 Minuten, aus Kompatibilitätsgründen mit GLPI ein Vielfaches von 5). Eine Aufgabe von 3 Minuten wird mit 15 abgerechnet. In einem Monat mit vielen kurzen Tickets ist die Differenz zwischen tatsächlicher Gesamtzeit (ActualTime) und abgerechneter Gesamtzeit (Contract Hours) erheblich – und genau diese Differenz verhandeln Sie mit dem Kunden oder übernehmen sie als Kulanz über den Schalter für nicht abrechenbare Zeit.

Messen Sie die Differenz selbst

Da beide Plugins in das native Feld actiontime (in Sekunden) schreiben, lässt sich die erfasste Zeit direkt in der Datenbank beziffern, ohne von einer Plugin-Tabelle abzuhängen. Summieren Sie pro Techniker und Monat und vergleichen Sie mit der abgerechneten Gesamtzeit im Auszug von Contract Hours:

-- Hours logged per technician in the month (native actiontime field, in seconds)
SELECT u.name AS technician,
       ROUND(SUM(tt.actiontime) / 3600, 2) AS logged_hours
FROM glpi_tickettasks tt
JOIN glpi_users u ON u.id = tt.users_id_tech
WHERE tt.date BETWEEN '2026-06-01' AND '2026-06-30 23:59:59'
  AND tt.actiontime IS NOT NULL
GROUP BY tt.users_id_tech
ORDER BY logged_hours DESC;

Stimmt diese Summe mit der tatsächlich gemessenen Zeit überein, weicht aber von der abgerechneten ab, besteht die Differenz aus Rundung plus Kulanzstunden – und eine solche Information ist Verhandlungsgrundlage, kein Fehler.

Empfehlung je Szenario

  • Nutzen Sie ActualTime, wenn die Frage lautet: „Ist mein Team produktiv?“ Sie möchten den tatsächlichen Aufwand messen, interne Kennzahlen speisen und rechnen nicht nach Stunden ab. Keine Kosten, einfache Installation.
  • Nutzen Sie Contract Hours, wenn Sie Stundenpakete verkaufen und der Kunde fragt: „Wie viel habe ich schon verbraucht und wie viel bleibt?“ Sie brauchen Guthaben, Auszug, abrechenbare Rundung, Kunden-Dashboard und Warnung bei Überschreitung. Es ist eine Investition, die sich aber beim ersten Vertrag bezahlt macht, den Sie nicht mehr zu niedrig abrechnen.
  • Nutzen Sie beide, wenn Sie intern die tatsächliche UND extern die abrechenbare Zeit wollen, sofern auf getrennten Ebenen: ActualTime als Kennzahl (nicht abrechenbar) und Contract Hours für die Abrechnung, mit der klaren Regel, dass pro Ticket nur eines davon Aufgaben anlegt.
  • Bleiben Sie beim nativen Feld, wenn das Volumen gering ist und die manuelle Dauer ausreicht. Installieren Sie kein Plugin für ein Problem, das Sie nicht haben.

Kosten und Aufwand

ActualTime ist kostenlos (GPL): Die Kosten sind die üblichen bei einem Plugin – den Build für Ihre GLPI-Version validieren und es in das Upgrade-Fenster einplanen. Contract Hours ist lizenziert, aber der eigentliche Einführungsaufwand liegt nicht im Timer, sondern im Vertragsmodell: Kontingent festlegen, die Gruppe und die Kategorie zuordnen, die jeden Vertrag bestimmen (die Regel ist UND, nicht ODER), die abrechenbare Mindesteinheit konfigurieren und festlegen, wer welchen Vertrag im Dashboard sieht. Eine halbe Stunde Klicken und einige Stunden kaufmännischer Entscheidungen. Der Nutzen zeigt sich beim ersten Monatsabschluss, bei dem der Auszug fertig für den Kunden vorliegt, ohne Tabelle.

Bei NexTool führen wir beide Modelle in GLPI-Installationen von B2B-Kunden ein und betreuen sie. Wenn Ihr Engpass darin liegt, Ticketstunden in eine belastbare Abrechnung zu verwandeln – mit Guthaben, Auszug und einem Dashboard, das der Kunde versteht –, löst das Modul Contract Hours des Plugins NexTool genau diese Aufgabe. Wenn noch offen ist, welche Ebene für Ihren Betrieb sinnvoll ist, sprechen Sie mit uns.


Geprüft vom Team von NexTool Solutions.

Häufig gestellte Fragen

Ja, beide schreiben am Ende in das native Feld actiontime der Aufgabe. Sie können nebeneinander bestehen, aber auf getrennten Ebenen: ActualTime als interne Kennzahl (nicht abrechenbar) und Contract Hours für die Abrechnung. Lassen Sie nie beide im selben Ticket Aufgaben anlegen, sonst addieren Sie die rohe Messung zur gerundeten Buchung und blähen die Stunden auf.

Weil Contract Hours bis zur abrechenbaren Mindesteinheit aufrundet (Standard 15 Minuten, Vielfaches von 5). Eine Aufgabe von 3 Minuten wird mit 15 abgerechnet. Die Differenz zwischen tatsächlicher und abgerechneter Zeit ist die Rundung plus die als nicht abrechenbar markierten Stunden (Kulanz). Dies ist zu erwarten und genau der Punkt, den Sie mit dem Kunden verhandeln.

Nein. ActualTime misst nur die tatsächlich für eine Aufgabe aufgewendete Zeit; es kennt weder Vertrag noch Kontingent noch Guthaben. Um „Wie viel habe ich schon verbraucht und wie viel bleibt?“ zu beantworten, brauchen Sie Contract Hours oder eine externe Kontrolle, die mit der Zeit tendenziell von der Realität abweicht.

Nein. Contract Hours unterstützt nur GLPI 11. Unter GLPI 10 messen Sie Zeit mit ActualTime oder dem nativen Feld Dauer; die Vertragskontrolle muss bis zur Migration auf 11 auf anderem Weg gelöst werden.

Ohne Plugins bietet GLPI in der Aufgabe das Feld Dauer (actiontime, in Sekunden). Sie können es per SQL oder über die Suche pro Techniker summieren. Für geringes Volumen funktioniert dies, aber es ist manuell und weiß nichts über Verträge oder abrechenbare Rundung.

Brauchen Sie Hilfe?