WhatsApp als Vereins-Backend: Wie ein Fussballverein Trainings per Umfrage organisiert
Eine technische Case Study: Wie wir für den FC Zugersee WhatsApp-Umfragen, automatische Mitglieder-Erfassung und Squad-Ankündigungen direkt in die Vereins-Software integriert haben – inklusive Architektur, Datenfluss und den Stolpersteinen der inoffiziellen WhatsApp-Anbindung.
- Softwareentwicklung
- WhatsApp-Integration
- Next.js
- Case Study
Kurzfassung
Vereine leben auf WhatsApp – nicht in Apps, die niemand installiert. Für den FC Zugersee haben wir genau dort angedockt: Die Trainingsorganisation läuft komplett über eine WhatsApp-Gruppe, aber im Hintergrund steuert und protokolliert eine Next.js-Anwendung alles mit. Ein Admin startet mit einem Klick eine Wochenumfrage, die Spieler antworten wie gewohnt direkt in WhatsApp, und jede Stimme landet automatisch in der Datenbank – inklusive Anwesenheits-Tracking, automatischer Mitglieder-Erfassung und einem Punktesystem für die Selektion.
Das Spannende daran ist nicht das Frontend, sondern die Brücke zwischen einer Cloud-App und WhatsApp – einem Dienst, der dafür eigentlich gar keine offene Tür hat. Diese Case Study zeigt, wie diese Brücke gebaut ist.
Das Problem: Die Software, die niemand öffnet
Die meisten Vereins-Tools scheitern am gleichen Punkt: Sie verlangen, dass alle Mitglieder eine zusätzliche App installieren, sich einloggen und dort aktiv werden. In der Praxis passiert das nicht. Die Kommunikation findet weiterhin in der WhatsApp-Gruppe statt, und die schöne App verwaist.
Die Anforderung für den FC Zugersee war deshalb klar:
Die Spieler sollen nichts Neues lernen. Sie antworten in WhatsApp wie immer. Die Organisation, das Tracking und die Auswertung passieren unsichtbar im Hintergrund.
Das verschiebt die ganze Komplexität von der Benutzeroberfläche in die Integration. Genau dort liegt der eigentliche Engineering-Aufwand.
Die Architektur aus der Vogelperspektive
Das Herzstück ist eine Anbindung an WhatsApp über die Evolution API – eine selbst gehostete Schnittstelle, die auf dem quelloffenen Baileys-Protokoll aufsetzt. Sie läuft – zusammen mit dem Tunnel-Client cloudflared – als Docker-Container auf einem schlanken Host. Bei uns ist das ein Mac mini im Vereinsheim; dank Containerisierung liesse sich derselbe Stack aber ohne Anpassung genauso auf einem VPS in der Cloud betreiben. Da die Schnittstelle aus Sicherheitsgründen nicht direkt aus dem Internet erreichbar sein soll, wird sie über einen Cloudflare Tunnel sicher nach aussen verbunden.
Vier bewusste Architektur-Entscheidungen stecken darin:
- Cloud-App auf Vercel für die eigentliche Vereins-Software (Admin-Bereich, Datenbank, öffentliche Website). Skaliert von selbst, kostet im Ruhezustand fast nichts.
- Evolution API selbst gehostet, weil die offizielle WhatsApp Business API für einen Amateurverein zu teuer und zu bürokratisch ist (Meta-Verifizierung, Template-Freigaben, Mindestvolumen).
- Alles in Docker-Containern (Evolution API +
cloudflared), die die WhatsApp-Session kapseln. Bei uns läuft das auf einem günstigen Mac mini im Vereinsheim, der als Dauerläufer die Session hält – derselbe Container-Stack liesse sich aber ohne Änderung auf einen VPS in der Cloud heben. - Cloudflare Tunnel statt offenem Port, damit der Mac mini nirgends direkt aus dem Internet erreichbar ist, die Cloud-App ihn aber trotzdem ansprechen kann.
Der Datenfluss: Zwei Richtungen
Die Integration funktioniert in beide Richtungen – das ist der Schlüssel zum Verständnis.
Ausgehend: Die App spricht zur Gruppe
Wenn ein Trainer im Admin-Bereich auf „Umfrage starten" klickt, baut die App eine Multiple-Choice-Umfrage für die ganze Trainingswoche zusammen – eine Antwort-Option pro Trainingstermin (z. B. „Di 23.04. 19:00 · Sportplatz Herti"). Diese Umfrage wird über die Evolution API in die WhatsApp-Gruppe gepostet:
POST /api/admin/training-weeks/[id]/poll
→ sendPoll(gruppe, "Football Training KW 17", [optionen], multiSelect)
→ Evolution API → WhatsApp-Gruppe
Die zurückgegebene Nachrichten-ID der Umfrage wird in der Datenbank gespeichert. Sie ist später der entscheidende Schlüssel, um eingehende Stimmen wieder dem richtigen Training zuzuordnen.
Genauso funktioniert die Selektions-Ankündigung: Hat der Trainer die Mannschaft zusammengestellt, postet die App die finale Liste als formatierte Textnachricht. Ein nettes Detail – die ausgewählten Spieler werden über eine stille Erwähnung (mentioned) angepingt: Sie bekommen eine Push-Benachrichtigung, selbst wenn die Gruppe stummgeschaltet ist, ohne dass im sichtbaren Text hässliche @4179…-Marker stehen.
Eingehend: Die Gruppe spricht zur App
Hier wird es interessant. Sobald ein Spieler in WhatsApp auf eine Antwort-Option tippt, schickt die Evolution API einen Webhook an die Cloud-App. Dieser Endpunkt ist das eigentliche Nervenzentrum der Integration:
Schritt für Schritt passiert Folgendes:
- Authentifizierung – Der Webhook prüft ein geheimes Token. Ohne gültiges Secret wird die Anfrage mit
401abgewiesen. Das ist der einzige Schutz davor, dass jemand gefälschte Stimmen einschleust. - Zuordnung – Über die gespeicherte Umfrage-ID wird die Stimme der richtigen Trainingswoche (und dem richtigen Termin) zugeordnet.
- Mitglieder-Erkennung – Der Absender wird über seine WhatsApp-Kennung bzw. Telefonnummer einem bestehenden Mitglied zugeordnet. Ist die Person noch nicht erfasst, wird das Mitglied automatisch angelegt – aus Telefonnummer und WhatsApp-Anzeigenamen. Niemand muss manuell Mitglieder pflegen.
- Speichern – Die Zu-/Absage wird pro Training gespeichert, inklusive Zeitstempel (wichtig für die „Wer-zuerst-kommt"-Selektion) und Rückzugs-Markierungen bei späten Absagen.
- Punkteberechnung – Im Anschluss wird der Zuverlässigkeits-Score des Mitglieds neu berechnet.
Das alles passiert in Sekundenbruchteilen, während der Spieler einfach nur in WhatsApp getippt hat.
Die spannenden Stolpersteine
Eine saubere Theorie trifft hier auf eine sehr unsaubere Realität. Genau diese Details unterscheiden ein Wochenend-Experiment von einer produktiven Integration.
1. Die Identitäts-Krise: @lid statt Telefonnummer
WhatsApp hat aus Datenschutzgründen begonnen, in Gruppen nicht mehr die echte Telefonnummer auszuliefern, sondern eine gruppen-interne, anonyme Kennung (@lid). Eine Stimme kommt also oft ohne Telefonnummer herein. Die App muss diese anonyme Kennung erst über die Teilnehmerliste der Gruppe in eine echte Nummer auflösen – und das pro Webhook-Aufruf nur einmal, gecacht, um die API nicht zu überlasten. Lässt sich eine Kennung gar nicht auflösen (komplett privater Teilnehmer), wird die Stimme bewusst sauber verworfen statt einen Müll-Datensatz anzulegen.
2. Jede Evolution-Version spricht anders
Die Umfrage-Antworten kommen je nach WhatsApp-Client und Evolution-Version in mindestens vier verschiedenen Datenformaten an – mal mit Zähler, mal mit Wähler-Liste, mal als verschachteltes Objekt. Der Parser ist deshalb bewusst defensiv geschrieben und akzeptiert alle bekannten Varianten. Was er nicht entschlüsseln kann, wird nicht still verschluckt, sondern in einer eigenen Tabelle (whatsapp_webhook_failures) protokolliert – so werden stille Ausfälle sichtbar und debugbar.
3. Immer „200 OK" – auch im Fehlerfall
Der Webhook antwortet bewusst immer mit Erfolg, selbst wenn intern etwas schiefläuft. Der Grund: Würde er einen Fehler zurückgeben, würde Evolution dieselbe Nachricht endlos erneut zustellen und eine Warteschlange aufbauen. Fehler werden also intern abgefangen und geloggt, aber nach aussen wird sofort quittiert.
4. Mitglieder-Abgleich in beide Richtungen
Zusätzlich zum automatischen Anlegen gibt es einen expliziten Sync: Die App vergleicht die aktuelle Gruppen-Teilnehmerliste mit dem Mitgliederstamm und schlägt vor, wer neu angelegt, reaktiviert oder deaktiviert werden sollte. Wichtig dabei: Mitglieder mit besonderer Rolle (Komitee, Materialwart, Login-Account) sind vor automatischer Deaktivierung geschützt – die Software trifft hier keine voreiligen Entscheidungen über Menschen.
Was man daraus mitnehmen kann
Diese Integration ist ein gutes Beispiel dafür, dass die richtige Architektur dort ansetzt, wo die Nutzer bereits sind – nicht dort, wo es technisch am bequemsten wäre.
- Treffen Sie die Nutzer in ihrem Kanal. Eine WhatsApp-Umfrage hat eine Antwortquote, von der jede eigene App nur träumen kann.
- Die Komplexität verschiebt sich, sie verschwindet nicht. Wer das Frontend einfach hält, zahlt den Preis in der Integration – mit Identitäts-Auflösung, defensivem Parsing und Fehler-Protokollierung.
- Inoffizielle Schnittstellen brauchen Sorgfalt. WhatsApp bietet keine offizielle, günstige API für solche Fälle. Eine selbst gehostete Lösung ist machbar und robust, verlangt aber bewusste Entscheidungen bei Sicherheit (Secret, Tunnel statt offener Port) und Betrieb (ein Container-Host, der die Session dauerhaft hält).
- Mach das Unsichtbare sichtbar. Jeder verworfene Vote, jeder nicht auflösbare Teilnehmer wird protokolliert. Bei einer Integration mit so vielen Fremd-Variablen ist Nachvollziehbarkeit kein Luxus, sondern Voraussetzung.
Fazit
Für den FC Zugersee bedeutet das konkret: Der Trainer klickt einmal, die Spieler antworten in WhatsApp wie immer – und im Hintergrund entsteht ein vollständiges, auswertbares Bild von Anwesenheit, Zuverlässigkeit und Selektion. Keine zusätzliche App, kein neuer Login, kein Schulungsaufwand.
Wenn Sie eine ähnliche Brücke zwischen Ihren bestehenden Kommunikationskanälen und einer sauberen Software-Lösung brauchen – ob WhatsApp, Telegram oder ein anderes System – vereinbaren Sie ein kostenloses Erstgespräch. Wir schauen uns an, wo Ihre Nutzer bereits sind, und bauen die Integration dorthin.