TennisSlot.de: Wie aus einem Algorithmus ein Trainingsplaner für Tennisvereine wurde
Wer einmal die Trainingsplanung eines Tennisvereins gemacht hat, kennt das Bild: Anmeldezettel, eine Tabelle mit Wochentagen, und irgendwo dazwischen die Frage, ob die neunjährige Anfängerin wirklich mit dem vierzehnjährigen Mannschaftsspieler in eine Gruppe soll, nur weil beide dienstags um vier können. Bei zwanzig Spielern geht das noch im Kopf. Bei achtzig kostet es den Sportwart mehrere Abende – und am Ende ruft trotzdem jemand an, weil der Termin nicht passt. Aus genau diesem Problem ist TennisSlot.de entstanden: ein Trainingsplaner, der die Gruppen berechnet, statt sie zu erraten.
Am Anfang stand ein Algorithmus, keine Oberfläche
Das Projekt begann im März 2026 nicht mit einem Design, sondern mit einem Konzeptpapier. Die Aufgabe darin: 50 Spieler auf Trainingstermine von Montag bis Freitag zwischen 15 und 19 Uhr verteilen – unter Berücksichtigung von Verfügbarkeit, Spielstärke, Alter und den Zeiten der Trainer. Das ist im Kern ein Zuordnungsproblem mit zwei Arten von Regeln, und diese Trennung trägt das Produkt bis heute:
- Harte Bedingungen müssen erfüllt sein: Ein Spieler landet nur in einem Zeitfenster, für das er sich gemeldet hat. Ein Termin findet nur statt, wenn ein Trainer da ist. Keine Gruppe wird größer, als der Trainer es zulässt. Niemand bekommt mehr Termine als gewünscht.
- Weiche Bedingungen werden optimiert: möglichst ähnliche Spielstärke in einer Gruppe, möglichst ähnliches Alter, möglichst alle Spieler untergebracht, möglichst viele Terminwünsche erfüllt.
Der Algorithmus arbeitet in vier Schritten. Zuerst sortiert er die Spieler nach Spielstärke und Alter vor. Dann bildet er Gruppen. Anschließend weist er den Gruppen Zeitfenster zu – und zwar die am stärksten eingeschränkten zuerst, denn wer nur donnerstags um fünf kann, muss vor denen drankommen, die überall können. Zum Schluss folgt eine Nachoptimierung: Nicht untergebrachte Spieler werden in passende Gruppen eingefügt, und das Programm tauscht probeweise Spieler zwischen Gruppen, solange die Gesamtbewertung dadurch steigt.
Diese Gesamtbewertung ist eine schlichte Punkteformel: Pluspunkte für zugewiesene Spieler und erfüllte Terminwünsche, Abzüge für Unterschiede in Spielstärke und Alter sowie für ungleich große Gruppen. Sie steht im Planer oben als „Score", gleich neben der Zahl der zugewiesenen und der offenen Spieler – der Verein sieht auf einen Blick, wie gut der berechnete Plan aufgeht.
Ein Trainingsplan ist nie perfekt. Aber er lässt sich bewerten. Sobald es eine Zahl gibt, kann ein Programm tausende Varianten durchprobieren und die beste behalten – statt bei der ersten aufzuhören, die irgendwie aufgeht.
Zehn zusätzliche Anläufe für 0,8 Prozent
Ein Verfahren, das Schritt für Schritt die jeweils beste Entscheidung trifft, hat eine bekannte Schwäche: Das Ergebnis hängt davon ab, in welcher Reihenfolge die Spieler verarbeitet werden. Im April kam deshalb eine Mehrfachstart-Optimierung dazu. Der Algorithmus rechnet den Plan zehn weitere Male mit zufällig gemischter Reihenfolge und behält das beste Ergebnis.
Wir haben das vor der Übernahme gemessen, statt es zu vermuten: In einem Vergleich über zehn Datensätze verbesserte sich die Bewertung bei acht davon, im Schnitt um 0,8 Prozent, bei keinem wurde sie schlechter. Die Laufzeit blieb unter 100 Millisekunden. Das klingt nach wenig – aber 0,8 Prozent sind in der Praxis ein oder zwei Kinder, die in einer passenderen Gruppe spielen.
Weil jeder Verein anders gewichtet, sind die Stellschrauben nicht im Quelltext vergraben. Auf einer eigenen Einstellungsseite legt der Verein fest, wie viele Stufen Spielstärke und wie viele Jahre Altersunterschied in einer Gruppe noch zulässig sind, wie stark Spielstärke, Alter und Wunschpartner in die Bewertung eingehen und wie viele Optimierungsrunden gerechnet werden.
Vom Werkzeug zum Produkt in fünf Tagen
Die erste Fassung vom 12. März war ein Planer für einen einzelnen Verein. Fünf Tage später stand der Umbau zur mandantenfähigen Anwendung: eigenes Backend, Vereinsregistrierung, Abrechnung, Startseite und ein geführter Rundgang durch das Programm. Der Stack ist bewusst unaufgeregt:
- Frontend: React mit Vite und React Router. Das Verschieben von Spielern läuft über dnd kit, der PDF-Export entsteht direkt im Browser.
- Backend: Node.js mit Express und MySQL. Anmeldung über signierte Cookies, Passwörter mit bcrypt, Ratenbegrenzung gegen Missbrauch.
- Abrechnung und Mail: Stripe Billing für die Abos, Nodemailer für den Versand.
- Betrieb: ein Docker-Container hinter nginx, ausgeliefert über GitLab CI.
Warum Node.js für so ein Backend eine gute Wahl ist, steht in unserem Beitrag zur Backend-Entwicklung mit Node.js.
Was TennisSlot heute kann
Aus dem einen Knopf „Plan berechnen" ist in einem halben Jahr ein vollständiges Werkzeug für die Trainingsorganisation geworden. Die wichtigsten Funktionen:
- Automatische Gruppenbildung: Trainer mit ihren Zeiten und Gruppengrößen anlegen, Zeitfenster festlegen, Spieler erfassen – der Plan für die ganze Woche entsteht in Sekunden.
- Nachbessern per Drag & Drop: Kein Algorithmus kennt den Verein so gut wie der Sportwart. Spieler lassen sich mit der Maus zwischen Gruppen verschieben, das Programm prüft dabei sofort, ob Spielstärke und Alter zur neuen Gruppe passen, und warnt, wenn nicht.
- Selbstregistrierung der Spieler: Der Verein verschickt einen Link, die Spieler tragen Name, Alter, Spielstärke, freie Zeiten und Wunschpartner selbst ein. Das Abtippen von Anmeldezetteln entfällt.
- Wunschpartner: Wer mit der besten Freundin trainieren möchte, gibt das an. Der Algorithmus berücksichtigt den Wunsch, ohne die Spielstärke zu ignorieren.
- CSV-Import und -Export: Bestehende Listen aus Excel oder Google Tabellen lassen sich übernehmen. Das Trennzeichen wird erkannt, und Fehlermeldungen nennen Spalte, Spaltenname und den beanstandeten Wert – statt vierzigmal „Zeile ungültig".
- Versand per Klick: Jeder Spieler bekommt seinen persönlichen Plan mit Trainer und Mitspielern per E-Mail – über den eigenen Mailserver des Vereins oder über den mitgelieferten Versand von TennisSlot. Dazu PDF-Export und Druckansicht für den Aushang im Clubhaus.
- Pläne speichern und laden: Sommer- und Winterplan, Entwurf und Endfassung bleiben nebeneinander erhalten.
- SEPA-Lastschriftmandate: Auf Wunsch erteilen Spieler im eigenen Spieler-Portal ein Mandat für die Trainingsgebühr. Die IBAN wird mit AES-256 verschlüsselt gespeichert, die Mandatsreferenz automatisch erzeugt, und der Verein exportiert die Daten für seine Bank.
- Mehrere Zugänge je Verein: Der Vorstand sieht alles einschließlich Abrechnung und Einstellungen, Sportwarte nur Trainer, Spieler, Zeitfenster und Planung. Eingeladen wird per E-Mail, das Passwort vergibt jeder selbst.
- Demo ohne Konto: Wer das Programm ausprobieren will, landet mit einem Klick im Planer mit Beispieldaten – ohne Registrierung. Die Demo-Daten werden nach sieben Tagen gelöscht.
Drei Pakete decken die Vereinsgrößen ab: Basic für 9,99 Euro im Monat (2 Trainer, 20 Spieler), Advanced für 19,99 Euro (7 Trainer, 150 Spieler, mit Wunschpartnern und CSV-Import) und Ultra für 49,99 Euro (20 Trainer, 550 Spieler). Jeder Verein testet 14 Tage kostenlos. Läuft die Testphase ab, wird der Zugang nur für Änderungen gesperrt – die Daten bleiben erhalten und lesbar.
Datenschutz: Hier geht es um Kinder und Kontodaten
Ein Trainingsplaner für Vereine verarbeitet zwei besonders heikle Arten von Daten: Angaben zu Minderjährigen und Bankverbindungen. Das haben wir nicht als Pflichtübung behandelt, sondern als Teil des Produkts.
- Einwilligung der Eltern: Meldet sich ein Kind unter 16 Jahren selbst an, verlangt das Formular Name und E-Mail-Adresse einer erziehungsberechtigten Person. Bis diese bestätigt hat, bleibt der Datensatz schwebend und wird nicht eingeplant. Ohne Bestätigung wird er nach 14 Tagen gelöscht. Grundlage ist Artikel 8 der DSGVO.
- Auftragsverarbeitung: Der Vertrag nach Artikel 28 DSGVO ist fester Bestandteil der Registrierung. Zeitpunkt und Fassung der Zustimmung werden festgehalten.
- Löschen mit Mechanismus: Ein täglicher Lauf entfernt Vereine, deren Vertrag seit mehr als 30 Tagen beendet ist, mit allen zugehörigen Daten. Wird ein Verein in dieser Zeit wieder aktiv, stoppt die Frist. Unser Grundsatz dabei: Eine Löschfrist in der Datenschutzerklärung, hinter der kein Programm steht, ist eine Falschaussage.
- Auskunft und Löschung auf Knopfdruck: Vereine exportieren ihren gesamten Datenbestand selbst, Spieler sehen im Portal ihre Daten und können sie dort löschen. Bankdaten sind im Vereinsexport bewusst nicht enthalten – ein Export soll nicht die Stelle sein, an der alle IBANs eines Vereins das Haus verlassen.
- Keine fremden Dienste im Seitenaufruf: Schriften liegen lokal, die Besucherstatistik läuft mit einem selbst betriebenen Matomo ohne Cookies.
Die Grundlagen dazu beschreibt unser Beitrag zu DSGVO-konformer Webentwicklung.
Bezahlen ist mehr als ein Checkout-Knopf
Die Anbindung von Stripe war im März in zwei Tagen „fertig". Im September, bei der Vorbereitung auf den echten Zahlbetrieb, haben wir sie systematisch gegen die Stripe-Schnittstelle geprüft – und dabei mehr gelernt als beim Einbau. Drei Beispiele:
- Eine Weiterleitung legt die Abrechnung lahm. Nach dem Umzug auf tennisslot.de als Hauptdomain zeigte der Webhook noch auf die alte Adresse, die brav mit einer 301-Weiterleitung antwortete. Stripe folgt Weiterleitungen nicht – jede Zustellung galt als fehlgeschlagen. Niemand hätte es bemerkt, bis der erste Verein bezahlt und trotzdem keinen Zugang bekommen hätte.
- Fehler müssen wie Fehler aussehen. Der Webhook antwortete auch dann mit „200 OK", wenn die Verarbeitung gescheitert war. Für Stripe war das Ereignis damit erledigt. Jetzt antwortet er mit 500, Stripe wiederholt die Zustellung, und eine eigene Tabelle sorgt dafür, dass kein Ereignis doppelt gebucht wird.
- Das Erscheinungsbild gilt für das ganze Konto. Name, Logo und der Text auf der Kartenabrechnung sind in Stripe kontoweit. Wer mehrere Produkte über ein Konto abrechnet, zeigt dem Kunden beim Bezahlen den falschen Namen. TennisSlot hat deshalb ein eigenes Stripe-Konto bekommen.
Dazu kamen Fälle, an die man beim ersten Einbau nicht denkt: der Tarifwechsel im Kundenportal, die fehlgeschlagene Folgezahlung mit einem deutlichen Hinweis im Dashboard, das Gutscheinfeld. Wer vor derselben Aufgabe steht, findet die Grundlagen in unserem Beitrag zur Payment-Integration.
Ausliefern ohne Ausfall: Blue/Green und eine Abnahme, die wirklich klickt
Bis zum Sommer lief das Deployment so, wie es bei kleinen Projekten oft läuft: alten Container stoppen, neuen starten, hoffen. Seit September arbeitet TennisSlot mit Blue/Green-Deployment: Die neue Fassung startet neben der alten, muss eine Gesundheitsprüfung bestehen – die nicht nur den Prozess, sondern auch die Datenbankverbindung testet – und einen Rauchtest überstehen. Erst dann schaltet nginx um. Schlägt etwas fehl, bleibt die alte Fassung einfach in Betrieb.
Der zweite Baustein ist eine Abnahme-Suite mit Playwright. Sie startet MySQL, einen Test-Mailserver und genau das Image, das später ausgeliefert wird, und klickt die Kernabläufe echt durch: Vereinsregistrierung, Anmeldung, Trainer, Zeitfenster und Spieler anlegen, „Passwort vergessen" einschließlich des Links aus der E-Mail, Selbstregistrierung mit Einwilligung der Eltern, Spieler-Konto mit SEPA-Mandat, Bezahlung. In der CI-Pipeline steht sie zwischen Bauen und Ausliefern.
Dass sich der Aufwand lohnt, zeigte sich sofort: Schon die ersten Läufe fanden Fehler, die bei der Arbeit am Programm niemandem aufgefallen waren – im Spieler-Portal funktionierte nach dem Abmelden kein erneutes Anmelden, und Bankdaten ließen sich anlegen, aber nicht bearbeiten. Solche Fehler findet kein Komponententest, weil jede Komponente für sich funktioniert. Mehr zum Thema in unseren Beiträgen zu Testing-Strategien und CI/CD-Pipelines.
Ein Produktvideo aus echten Aufnahmen
Der jüngste Baustein ist der Rundgang auf der Startseite. Das Video dort ist keine nachgebaute Animation: Playwright bedient das echte Programm und zeichnet den Bildschirm auf, Remotion legt Kamerafahrten, Hervorhebungen und Untertitel darüber. Ändert sich die Oberfläche, wird das Video neu erzeugt statt neu gedreht.
Neben dem Video laufen erklärende Texttafeln, die laufend die Position des Videos auslesen. Sie bleiben dadurch auch beim Pausieren, Springen und in der Endlosschleife synchron, und ein Klick auf ein Kapitel springt im Video an die passende Stelle. Das Video lädt erst, wenn der Abschnitt ins Bild kommt, und startet nicht von selbst, wenn der Besucher reduzierte Bewegung eingestellt hat.
Was wir aus dem Projekt mitgenommen haben
Erstens: Der Algorithmus war der kleinste Teil der Arbeit. Er stand nach wenigen Tagen. Registrierung, Abrechnung, Mailversand, Datenschutz und Betrieb haben ein Vielfaches davon gekostet. Wer ein SaaS-Produkt kalkuliert, sollte den Kern mit einem Bruchteil des Gesamtaufwands ansetzen.
Zweitens: „Eingebaut" ist nicht „geprüft". Die Bezahlung war ein halbes Jahr lang eingerichtet und hätte im Ernstfall nicht funktioniert. Erst die Prüfung gegen die echte Schnittstelle und eine Abnahme, die wirklich klickt, haben die Lücken gezeigt.
Drittens: Der Mensch behält das letzte Wort. Kein Verein übernimmt einen berechneten Plan blind. Dass sich jede Zuordnung von Hand ändern lässt und das Programm dabei vor unpassenden Gruppen warnt, ist für die Akzeptanz wichtiger als das letzte Prozent Optimierung.
Wenn Sie ein ähnliches Vorhaben haben – einen Ablauf, der heute in Tabellen und Telefonaten steckt und ein eigenes Werkzeug verdient –, dann ist das die Art von Projekt, die wir in der Webentwicklung umsetzen. Und wenn Sie in Ihrem Verein für die Trainingsplanung zuständig sind: TennisSlot.de lässt sich ohne Konto ausprobieren und 14 Tage kostenlos testen.

Lassen Sie uns Ihr Projekt gemeinsam umsetzen
Vereinbaren Sie ein kostenloses Erstgespräch – wir beraten Sie persönlich und unverbindlich.
Kostenloses Erstgespräch vereinbaren