Zum Inhalt springen
Kontakt
Case Study · Business · Cloud

Zeiterfassungs-App mit Geo-Fencing für Teams mit mehreren Standorten

Cloud-basierte Arbeitszeiterfassung für iOS & Android – ortsunabhängig, mit optionalem Geo-Fencing und rollenbasierten Rechten. Für einen Kunden mit verteilten Standorten umgesetzt.

FlutterGoogle CloudGeo-FencingRollen & Rechte
Zeiterfassungs-App von SB-Techworks: Schicht-Timer mit Start-Button, Reports und Schichtplanung
500.000+App-Downloads
24 hAntwort-Zeit (Mo–Fr)
100 %Code-Eigentum bei dir
1Ansprechpartner von Anfrage bis Launch

Die Herausforderung

Zeiterfassung wirkt wie ein gelöstes Problem: Start, Stopp, Summe. Anspruchsvoll wird es in dem Moment, in dem die Erfassung das Büro verlässt. Gebucht wird dort, wo gearbeitet wird – an mehreren, räumlich verteilten Standorten desselben Unternehmens. Und jede Buchung ist kein beiläufiger Log-Eintrag, sondern ein Datensatz, der auch Monate später noch erklärbar sein muss: wer hat wann für welchen Standort erfasst. Damit ist die Frage nach dem Datenmodell beantwortet, bevor der erste Bildschirm entworfen ist.

Der zweite Anspruch war optionales Geo-Fencing – technisch deutlich mehr als eine Punkt-in-Polygon-Prüfung. Eine Ortung liefert nie einen Punkt, sondern einen Punkt mit Genauigkeitsradius. Auf freier Fläche ist dieser Radius klein, zwischen hohen Gebäuden, in Hallen, Tiefgaragen oder Stahlbeton-Umgebungen wächst er erheblich. Wer nahe an der Grenze einer Zone bucht, produziert mit einer naiven Prüfung beides: falsche Ablehnungen und falsche Freigaben. Dazu kommen die Plattformen selbst – iOS und Android behandeln Standort im Hintergrund unterschiedlich, mit eigenen Region-Monitoring-APIs, abgestuften Berechtigungsstufen und Energiespar-Mechanismen, die Hintergrundarbeit gezielt drosseln.

Der dritte Anspruch war das Rollen- und Rechtemodell, und es ist der eigentliche Architektur-Kern. Dieselbe App bedient Mitarbeitende, Manager und Admins mit unterschiedlichen Ansichten, Datenausschnitten und erlaubten Aktionen. Der schwierige Teil ist nicht das Ein- und Ausblenden von Schaltflächen, sondern die Frage dahinter: Welche Datensätze darf eine Rolle überhaupt lesen und schreiben, wenn mehrere verteilte Standorte im Spiel sind und Zuständigkeiten sich überschneiden? Eine Antwort, die nur in der Oberfläche existiert, ist keine Antwort.

Der Ansatz

Umgesetzt ist die App als eine einzige Flutter-Codebasis für iOS und Android. Die Fachlogik – Buchungen, Schichten, Rollenlogik, Darstellung – existiert damit genau einmal, und beide Plattformen bekommen dieselbe Änderung zur selben Zeit. Plattformspezifisch bleibt vor allem das, was tatsächlich am Betriebssystem hängt: Standortberechtigungen, Verhalten im Hintergrund, Energiesparregeln. Diese Teile sind hinter einer schmalen Schnittstelle gekapselt, sodass der Rest der Anwendung nicht wissen muss, auf welcher Plattform er gerade läuft.

Daten und Authentifizierung liegen in der Google Cloud. Die Identität stammt aus der Authentifizierung, die Rollenzuordnung hängt am Backend – nicht am Gerät und nicht an einer im Client gesetzten Variable. Die serverseitigen Regeln entscheiden pro Anfrage, welche Buchungen, Schichten und Standorte eine Rolle lesen oder ändern darf. Die rollenabhängige Oberfläche ist damit eine Projektion desselben Rechtemodells und nicht dessen Durchsetzung: Was die App einer Rolle nicht zeigt, wäre für sie serverseitig ohnehin nicht abrufbar.

Die Echtzeit-Übersicht über Schichten und Buchungen entsteht aus derselben Datenschicht. Clients hängen an aktualisierten Datenständen, statt in Intervallen nachzufragen – das hält die Ansicht aktuell, ohne dass jede geöffnete App im Minutentakt Anfragen erzeugt. Für eine Führungsrolle bedeutet das eine Übersicht, die sich mitbewegt; für die Architektur bedeutet es, dass die Rechteregeln auch für laufende Abonnements greifen müssen und nicht nur für einzelne Abrufe.

Das Geo-Fencing sitzt als optionale Schicht darüber: Standorte werden definiert, und wo die Option aktiv ist, wird eine Buchung an den passenden Standort gebunden. Optional ist dabei bewusst gewählt und nicht als Kompromiss gemeint – es gibt Einsatzorte, an denen eine zuverlässige Ortung schlicht nicht verfügbar ist. Dass Authentifizierung, Datenhaltung, Echtzeit-Verteilung und Skalierung von verwalteten Cloud-Diensten kommen, ist die Voraussetzung dafür, dass eine Anwendung dieser Größe ohne großen Betriebsapparat entwickelt und dauerhaft gepflegt werden kann: Der Betriebsaufwand bleibt dort, wo er automatisierbar ist.

Was entstanden ist

  • Ortsunabhängige Zeiterfassung
  • Optionales Geo-Fencing pro Standort
  • Rollen & Rechte (Mitarbeitende, Manager, Admins)
  • Echtzeit-Übersicht über Schichten & Buchungen
  • Eine Codebasis für iOS & Android

Technische Entscheidungen

Flutter statt zwei nativer Apps

Zur Wahl standen zwei native Apps in Swift und Kotlin oder eine gemeinsame Codebasis. Da der fachliche Kern – Buchungslogik, Rollen, Ansichten – auf beiden Plattformen identisch ist, hätte die native Variante dieselbe Logik zweimal implementiert, zweimal getestet und zweimal gepflegt, mit dem bekannten Risiko, dass die Plattformen langsam auseinanderlaufen. Der Preis dafür ist ehrlich zu benennen: Alles, was tief am Betriebssystem hängt – Standortberechtigungen, Hintergrundverhalten, Energiesparregeln – muss trotzdem plattformspezifisch behandelt werden, teils über Plugins, teils über eigenen nativen Code. Gespart wird die doppelte Fachlogik, nicht die doppelte Auseinandersetzung mit den Plattformen.

Eine App für alle Rollen statt getrennter Apps

Die Alternative wäre gewesen, eine schlanke Mitarbeitenden-App und eine separate Verwaltungsoberfläche zu bauen. Umgesetzt ist stattdessen eine App, die je Rolle andere Ansichten und Aktionen zeigt: eine Installation, ein Release-Zyklus, und eine geänderte Rolle wirkt sofort, ohne dass jemand eine andere App installieren muss. Der Preis ist Testaufwand – jede Änderung muss gegen jede Rolle geprüft werden – und Gestaltungsdruck, weil auch Verwaltungsaufgaben auf ein Telefondisplay passen müssen und dort nicht beliebig dicht werden dürfen.

Rechte im Backend durchsetzen, nicht in der Oberfläche

Der schnellere Weg wäre, die Rolle im Client zu prüfen und Ansichten auszublenden. Das ist aber keine Sicherheitsgrenze, sondern Kosmetik: Eine App-Oberfläche lässt sich umgehen, eine serverseitige Regel nicht. Deshalb liegt die Autorisierung im Backend, und die App fragt nur an, was ihre Rolle abrufen darf. Der Preis ist Vorlaufzeit: Das Rechtemodell muss stehen, bevor die ersten Ansichten entstehen, jede neue Ansicht braucht eine passende Regel, und die App muss abgelehnte Anfragen als erwarteten Zustand behandeln statt als Fehler.

Geo-Fencing optional statt als harte Sperre

Ein hartes Modell – Buchung nur innerhalb der Zone, sonst gar nicht – klingt sauber und scheitert an der Physik der Ortung. Die Genauigkeit schwankt mit Umgebung, Satellitensichtbarkeit und Gerät, und ausgerechnet dort, wo eine Buchung dringend nötig ist, würde sie blockiert. Das Geo-Fencing ist deshalb zuschaltbar und bindet Buchungen an definierte Standorte, wo das sinnvoll ist. Der Preis: Geo-Fencing ist damit ein starkes Indiz und keine lückenlose Erzwingung, und die Konfigurierbarkeit selbst kostet – ein zusätzlicher Pfad im Code und eine Einstellung mehr in der Verwaltung.

Tech-Stack

FlutterGoogle CloudGeo-FencingRollen & Rechte

Ergebnis

Ausgeliefert und beim Kunden in Produktion im Einsatz: eine App statt getrennter Insellösungen, mit rollenbasierten Rechten und Geo-Fencing im produktiven Alltag. Aus Rücksicht auf das Kundenverhältnis nennen wir hier keine internen Kennzahlen – die technische Umsetzung steht für sich.

Was das für ähnliche Projekte bedeutet

Bei Vorhaben dieser Art liegt der Aufwand selten dort, wo er vermutet wird. Das Erfassen selbst – starten, stoppen, summieren – ist der kleinste Teil. Entscheidend sind das Rechtemodell und die Randfälle: Was passiert bei einer vergessenen Buchung, wer darf sie nachträglich korrigieren, bleibt die Korrektur sichtbar, wie verhält sich die App bei ungenauer Ortung, und was soll gelten, wenn am Einsatzort gerade keine Verbindung besteht. Diese Fragen gehören vor die erste Zeile Oberflächen-Code, weil sie das Datenmodell prägen. Nachträglich eingezogen, wird jede einzelne von ihnen teuer.

Für die Abwägung zwischen individueller Lösung und Standard-Software ist die nützlichste Frage nicht die nach dem Funktionsumfang, sondern die nach der Struktur: Lassen sich Rollen, Standorte und Freigabewege des Betriebs im Modell des Standardprodukts abbilden? Wenn ja, ist Standard fast immer die günstigere Wahl, und das offen zu sagen gehört zur Beratung dazu. Wenn nein, werden Prozesse dauerhaft an ein Werkzeug angepasst – und dann rechnet sich eine eigene Anwendung, die Rollenlogik, Standortbindung und Auswertungen so abbildet, wie tatsächlich gearbeitet wird.

Häufige Fragen

Was unterscheidet Geo-Fencing von einer einfachen GPS-Abfrage beim Buchen?

Eine GPS-Abfrage beim Buchen ist eine Momentaufnahme: ein Koordinatenpaar mit Genauigkeitsradius zum Zeitpunkt des Antippens. Geo-Fencing beschreibt darüber hinaus definierte Zonen, deren Betreten und Verlassen das Betriebssystem überwachen kann – auch dann, wenn die App nicht im Vordergrund läuft. Beide Varianten brauchen ein Toleranzmodell, weil die Genauigkeit einer Ortung je nach Umgebung stark schwankt und ein Grenzfall sonst zufällig entschieden wird.

Wie zuverlässig funktioniert Geo-Fencing unter realen Bedingungen?

Im Freien, mit freier Sicht zum Himmel, reicht die Genauigkeit üblicher Satellitenortung in der Regel aus, um einen abgegrenzten Standort sauber zu treffen. In Hallen, Tiefgaragen, zwischen hohen Gebäuden oder in Stahlbeton-Umgebungen wird sie deutlich schlechter, und zusätzliche Signale wie WLAN- oder Mobilfunkortung gleichen das nur teilweise aus. Ein tolerantes Modell mit definiertem Ausweichweg ist deshalb praxistauglicher als eine harte Sperre – sonst blockiert die App genau in dem Moment, in dem sie gebraucht wird.

Braucht eine Zeiterfassungs-App dauerhaften Zugriff auf den Standort?

Das hängt davon ab, wann geprüft wird. Wird der Standort nur im Moment der Buchung ausgewertet, während die App im Vordergrund ist, genügt die Berechtigung für die Nutzungsdauer. Soll das Betreten oder Verlassen einer Zone auch im Hintergrund erkannt werden, verlangen iOS und Android die weitergehende Hintergrund- beziehungsweise Immer-Berechtigung, die Nutzende ausdrücklich erteilen müssen und an die das System regelmäßig erinnert. Diese Entscheidung sollte früh fallen, weil sie Funktionsumfang, Akkuverhalten und Akzeptanz gleichzeitig betrifft.

Warum eine gemeinsame Flutter-Codebasis statt zwei nativer Apps?

Weil bei einer Business-App ein Großteil des Codes Fachlogik ist: Buchungen, Rollen, Listen, Formulare, Auswertungen. Dieser Teil existiert mit Flutter einmal statt zweimal, wodurch Funktionen auf beiden Plattformen gleichzeitig und gleich verhalten ankommen. Native Entwicklung spielt ihre Stärken dann aus, wenn eine App überwiegend aus plattformnahen Funktionen besteht; die betriebssystemnahen Teile – hier vor allem Standort und Hintergrundverhalten – müssen ohnehin plattformspezifisch gelöst werden.

Wie wird verhindert, dass Mitarbeitende Daten anderer Standorte sehen?

Über serverseitige Autorisierung. Die Identität stammt aus der Authentifizierung, die Rollenzuordnung liegt im Backend, und die Regeln entscheiden pro Anfrage, welche Datensätze überhaupt ausgeliefert werden. Dass die App je Rolle andere Ansichten zeigt, ist die sichtbare Folge davon und nicht der Schutzmechanismus – als alleiniger Schutz wäre eine Prüfung im Client wirkungslos, weil sich eine Oberfläche umgehen lässt, eine Server-Regel aber nicht.

Wann lohnt sich eine individuelle Zeiterfassung gegenüber Standard-Software?

Solange sich Rollen, Standorte und Freigabewege im Modell eines Standardprodukts abbilden lassen, ist Standard-Software meist die wirtschaftlichere Wahl. Für eine eigene Lösung spricht es, wenn Abläufe dauerhaft an das Werkzeug angepasst werden müssten, wenn Zeiterfassung nur ein Baustein in einem größeren betrieblichen Ablauf ist oder wenn Anforderungen wie standortgebundene Buchungen und ein feingliedriges Rechtemodell im Standard nur halb passen. Sinnvoll ist, diese Frage vor dem Projekt zu klären statt danach.

Ähnliches Projekt geplant?

SB-Techworks entwickelt individuelle Apps für iOS und Android – vom MVP bis zur skalierbaren Business-App, direkt aus der Entwicklung. Du bekommst innerhalb von 24 Stunden (Mo–Fr) eine ehrliche Einschätzung zu Machbarkeit und Kosten.

Kostenlose Einschätzung anfordern  App entwickeln lassen →