Next.js ist in vielen SaaS-Teams die Standardwahl, und die Diskussion dreht sich meist um Funktionen. Für ein Produkt, das mehrere Jahre laufen soll, sind aber drei Architekturentscheidungen wichtiger als jede einzelne Funktion: wo die Mandantengrenze verläuft, wo Autorisierung durchgesetzt wird, und was serverseitig bleibt.
Wer diese drei früh falsch trifft, zahlt später mit einem Umbau, der jede Datei berührt.
Die Mandantengrenze gehört in die Datenbank
Die naheliegende Lösung ist, den Mandanten aus der Sitzung zu lesen und in jeder Abfrage als Filterbedingung mitzugeben. Das funktioniert, solange niemand eine Abfrage schreibt, die den Filter vergisst.
Genau das passiert. Nicht aus Nachlässigkeit, sondern weil bei Dutzenden Abfragen und wechselnden Teammitgliedern jede vergessene Bedingung ein stiller Datenabfluss ist. Die belastbare Variante ist, die Trennung in der Datenbank zu erzwingen — bei PostgreSQL über Row Level Security —, sodass eine Abfrage ohne Mandantenkontext keine Zeilen liefert statt alle.
Das kostet beim Aufsetzen etwas und macht einige Abfragen komplizierter. Es ist die einzige Massnahme, die auch dann trägt, wenn jemand einen Fehler macht.
Server Actions sind ein API-Endpunkt
Server Actions fühlen sich an wie Funktionsaufrufe. Das täuscht: Jede Server Action ist ein öffentlich erreichbarer Endpunkt. Wer sie aufruft, kontrolliert die Argumente vollständig, unabhängig davon, was das Formular im Browser vorgibt.
Daraus folgt zweierlei. Erstens gehört in jede Action eine eigene Autorisierungsprüfung — die Prüfung in der Komponente, die sie aufruft, ist wirkungslos. Zweitens sind die Eingaben zu validieren, und zwar serverseitig, mit einem Schema statt mit Einzelprüfungen.
Der häufigste Fehler in Produktivsystemen ist eine Action, die eine Ressourcen-Id entgegennimmt und darauf operiert, ohne zu prüfen, ob die aufrufende Person Zugriff auf diese Ressource hat.
Client- und Server-Grenze bewusst ziehen
Die Versuchung ist gross, eine Komponente zum Client zu schieben, sobald ein Zustand oder ein Ereignis nötig wird. Damit wandert oft mehr in den Browser als beabsichtigt, weil alles unterhalb dieser Grenze mitgeht.
Der tragfähige Zuschnitt ist, den interaktiven Teil so klein wie möglich zu halten und die Datenbeschaffung serverseitig zu lassen. Praktisch heisst das: nicht die Seite zum Client machen, sondern den Knopf.
Ein Nebeneffekt betrifft Geheimnisse. Alles, was in eine Client-Komponente gelangt, ist im Browser sichtbar. Umgebungsvariablen mit öffentlichem Präfix sind keine Geheimnisse, auch wenn sie so heissen.
Zwischenspeicherung ist der Punkt, an dem Mandantenfähigkeit bricht
Caching und Mandantentrennung stehen in einem Spannungsverhältnis. Ein zwischengespeichertes Ergebnis, das ohne Mandantenkontext gebildet wurde, kann an den falschen Mandanten ausgeliefert werden — ein Fehler, der in der Entwicklung nie auftritt, weil dort nur ein Mandant existiert.
Die Regel, die sich bewährt: Alles, was mandantenabhängige Daten enthält, wird entweder gar nicht zwischengespeichert oder mit dem Mandanten als Teil des Schlüssels. Und jede Änderung an dieser Stelle braucht einen Test mit zwei Mandanten.
Was für Compliance-Anforderungen früh feststehen sollte
Bei Kunden aus regulierten Bereichen kommen Fragen nach Datenresidenz, Protokollierung und Löschbarkeit, bevor der erste Vertrag zustande kommt. Zwei Punkte sind später teuer zu ändern.
Der erste ist die Region: In welcher Region liegen Datenbank, Sicherungen, Protokolle und die Werkzeuge, mit denen der Support arbeitet. Das ist nicht eine Frage, sondern vier.
Der zweite ist die Nachvollziehbarkeit: Wer hat wann welche Daten gesehen oder verändert. Ein nachträglich eingezogenes Protokoll deckt die Vergangenheit nicht ab, und genau danach wird gefragt.
Was sich später leicht ändern lässt
Nicht alles muss früh entschieden werden. Die Wahl der Komponentenbibliothek, die Struktur der Ordner, die Aufteilung in Pakete, der Anbieter für den Versand von E-Mails — all das lässt sich austauschen, ohne die Architektur anzufassen.
Die Energie gehört an die drei Stellen oben. Alles andere ist reversibel, und Zeit, die dort in Perfektion fliesst, fehlt bei den Entscheidungen, die es nicht sind.

