Konteo Management Panel
Münzautomaten und Prepaid-Karten pro Gerät skalieren in Getränkeflotten nicht: Bargeld muss eingesammelt, Guthaben pro Maschine abgeglichen werden.

Ausgangslage
Konteo ist eine bargeldlose Bezahlplattform für Getränke- und Snackautomaten. ESP32-Automaten authentifizieren jede Transaktion gegen RFID-Chips von Mitarbeitenden, Mitgliedern oder Mietern einer Organisation; das Guthaben liegt zentral im Panel, nicht auf der Karte. Der klassische Mix aus Münzmechanik und Prepaid-Karten pro Gerät skaliert nicht: Bargeld muss eingesammelt, Karten sind an ein Gerät gebunden, der Abgleich über eine Flotte ist Handarbeit.
Lösung
Das Management Panel ist das Cockpit des Betreibers: Chip-Lebenszyklus, Produkte und Preislisten, Slot-Belegung pro Automat, Firmware-Rollouts und ein unveränderlicher Audit-Trail. Drei Rollen teilen sich eine Oberfläche – Administratoren konfigurieren Mandanten und geben hohe Erstattungen frei, Operatoren erledigen das Tagesgeschäft, Auditoren lesen Ledger und Berichte.


Jeder Verkauf läuft dreistufig: Guthaben reservieren, Produkt ausgeben, Transaktion bestätigen oder abbrechen. Jeder Schritt schreibt in eine Append-only-Tabelle, deren Zeilen per SHA-256-Hash-Kette verbunden sind. Ein Artisan-Kommando prüft die Kette Ende zu Ende und meldet die exakte Zeile, an der sie bricht. Erstattungen erzeugen einen gespiegelten Gegen-Eintrag statt den Originaldatensatz zu ändern.

Ledger: jede Zeile verweist per Hash auf ihre Vorgängerin.
Automaten holen ihre Konfiguration – Slot-zu-Produkt, aktive Preisliste, Feature-Flags – von einem ETag-gecachten Endpunkt. Firmware-Updates laufen gleich: Administrator lädt ein signiertes Image hoch, wählt die Zielgeräte, der OTA-Endpunkt liefert das Manifest beim nächsten Heartbeat aus. Geräte authentifizieren sich per HMAC-SHA256 über eine kanonische Anfrage mit Nonce (Redis, 300 s TTL) und Zeitfenster ±60 s – replay-sicher und billig genug für Mikrocontroller.


Geräteflotte: Status, Konfiguration und Firmware-Stand pro Automat.
Mehrere Betreiber-Organisationen laufen auf einer Instanz. Die Trennung sitzt auf Zeilenebene (globaler OrganizationScope), ohne Datenbank pro Mandant. Eine Registrar-API mit drei Token-Scopes erlaubt externen Systemen – Empfang, Mitgliederportal – Chips anzulegen und aufzuladen, ohne die Operator-UI zu berühren.

Ergebnis
Jede Buchung landet in einem manipulationssicheren Ledger, Firmware und Konfiguration werden zentral ausgerollt, und ein Stromausfall mitten im Verkauf führt zu einer ablaufenden Reservierung statt zu verlorenem Guthaben. Die Anwendung läuft auf Hetzner Cloud, provisioniert mit eigenem Tooling (forge-lite).
Technik
- PHP 8.3, Laravel 13 (Sanctum, Spatie Permissions, Horizon)
- React 18, TypeScript, Inertia v2, shadcn/ui, Tailwind, TanStack Query
- MariaDB 11 LTS, Redis 7; Geldbeträge als BIGINT-Cents (moneyphp)
- Pest 4 (106 Tests), Playwright E2E, PHPStan Level 6, axe-core (WCAG 2.2 AA)
- Hetzner Cloud, Provisionierung mit
forge-lite
Ähnliches Vorhaben?
Schildern Sie mir kurz, worum es geht. Rückmeldung innerhalb von 24 h, werktags.