Ein Brand Portal ist der Ort, an dem Marketing nachschlägt, welche Regel für die eigene Marke gilt. Technisch ist das keine Dokumentenablage, sondern ein Auflösungsproblem: Zwei Datensätze beschreiben dieselbe Sache, einer gilt.

Überblick

Das Wichtigste in Kürze

  • Die Vererbung zwischen Dachmarke und Einzelmarke ist eine reine Funktion und gehört nicht in die Datenbankabfrage.
  • Bilder kommen aus dem Digital Asset Management, aber nie über dessen Adressen — dazwischen liegt ein eigener Proxy.
  • Design Tokens werden nachts von den Live-Auftritten geholt und schreibgeschützt angezeigt.
  • Die wichtigste Schnittstelle liefert das aufgelöste Ergebnis, nicht die Rohdaten.

Aufbau

Headless CMS, React-Frontend, dateibasierte Datenbank

Der Kern ist ein Headless CMS mit React-Frontend und einer dateibasierten Datenbank. Das klingt nach wenig und ist genau richtig dimensioniert, denn ein Brand Portal hat viele Leser und eine Handvoll Redakteure. Für diese Last braucht es keinen Datenbankserver, der eigenständig betrieben und gesichert werden will.

Zwei Dinge gehören trotzdem von Anfang an geklärt. Datenbank und hochgeladene Dateien liegen außerhalb des ausgelieferten Bereichs, damit sie nicht versehentlich abrufbar sind. Und jede Schemaänderung läuft über Migrationsdateien, auch lokal. Der bequeme automatische Abgleich, den viele Systeme anbieten, führt früher oder später dazu, dass die Datenbank etwas enthält, das in keiner Migration steht — dann läuft es lokal und scheitert produktiv an einem Zustand, den es dort nie gab.

Kernstück

Vererbung als reine Funktion

Die eigentliche Arbeit steckt in einer Funktion. Die Dachmarke hält allgemeine Vorgaben, jede Einzelmarke kann sie ersetzen oder eigene ergänzen. Aus zwei Mengen wird eine Liste, in der jeder Eintrag einen von drei Zuständen trägt.

// Zwei Mengen, ein Merkmalspaar als Schlüssel, drei mögliche Zustände.
function aufloesen(dachmarke, marke) {
  const key = r => r.kategorie + "/" + r.kurzname;
  const eigene = new Map(marke.map(r => [key(r), r]));
  const out = [];

  for (const vorgabe of dachmarke) {
    const abweichung = eigene.get(key(vorgabe));
    out.push(abweichung
      ? { ...abweichung, zustand: "ersetzt" }
      : { ...vorgabe, zustand: "geerbt" });
    eigene.delete(key(vorgabe));
  }
  for (const rest of eigene.values()) {
    out.push({ ...rest, zustand: "markeneigen" });
  }
  return out;
}

Entscheidend ist, dass diese Funktion nichts lädt. Sie bekommt zwei Listen und gibt eine zurück, sonst nichts. Das Datenholen steckt in einer dünnen Hülle darum. Der Grund ist nicht Eleganz, sondern Prüfbarkeit: So lässt sich jeder der drei Zustände mit einem Testfall absichern, ohne dass dafür eine Datenbank laufen muss. Wer die Auflösung in eine Datenbankabfrage schreibt, kann genau das nicht mehr.

In der Redaktionsansicht bekommt der Zustand eine Folge. Geerbte Einträge sind sichtbar, aber gesperrt, daneben steht eine Schaltfläche für eine eigene Fassung. Wer einen geerbten Eintrag bearbeiten könnte, würde in Wahrheit die Vorgabe der Dachmarke ändern und damit alle anderen Marken gleich mit. Eine Warnung reicht dafür nicht, Warnungen werden weggeklickt.

Schema der Vererbung: oben eine Vorgabe der Dachmarke, darunter drei Marken — eine übernimmt sie unverändert, eine ersetzt sie, eine ergänzt eine eigeneAI
Drei Zustände je Eintrag — geerbt, ersetzt, markeneigen. KI-erzeugte Illustration.

Bilder

Ein eigener Proxy vor dem Digital Asset Management

Fotos bleiben im Digital Asset Management, etwa pixx.io, weil dort Lizenz, Version und Rechtelage hängen. Das Portal speichert nur eine Kennung. Der naheliegende Weg wäre nun, die Vorschau-Adresse des Archivs direkt in die Seite zu schreiben — und genau das ist der Fehler.

Stattdessen liegt ein eigener Endpunkt dazwischen, der das Bild serverseitig holt, auf die gebrauchte Größe rechnet und ausliefert. Das bringt drei Dinge an eine Stelle. Die Herkunftsadresse verlässt den Server nie. Die Größenbegrenzung gilt wirklich, statt nur in der Anfrage zu stehen. Und ein Zwischenspeicher im Arbeitsspeicher federt die Wiederholungen ab, die beim Blättern durch eine Übersicht entstehen — der kostet Speicher und wird beim Neustart verworfen, was für Bilder genau richtig ist.

Schema des Bild-Proxys: der Weg vom Bildarchiv zum Browser führt durch eine Zwischenschicht, der direkte Weg daran vorbei ist durchgestrichenAI
Die Herkunftsadresse erreicht den Browser nie. KI-erzeugte Illustration.
Eine Adresse, die den Browser nie erreicht, kann auch niemand weitergeben.

Videos laufen nach demselben Muster über eine Videoplattform wie 3Q. Das Portal bettet ein, hostet aber nicht. Wichtig ist, was beim Speichern passiert: Redaktionen fügen den fertigen Einbettungscode ein, also fremdes HTML, das damit in der eigenen Datenbank landet. Besser ist es, beim Speichern auf die reine Kennung zurückzuführen und die Einbettung selbst zu erzeugen. Dann ist eine Änderung am Abspieler eine Änderung an einer Stelle.

Automatik

Design Tokens nachts von den Live-Auftritten holen

Farben, Schriftgrößen und Abstände der Marken-Websites ändern sich mit jeder Veröffentlichung. Sie von Hand ins Portal zu übertragen ist aussichtslos, deshalb holt sie ein nächtlicher Lauf direkt von den Live-Auftritten.

Eine Kleinigkeit entscheidet dabei über Erfolg oder Dauerärger. Die Adresse der Datei mit diesen Werten ändert sich bei vielen Systemen mit jeder Veröffentlichung. Wer sie fest hinterlegt, hat nach dem nächsten Deployment nichts mehr. Sie gehört bei jedem Lauf frisch aus dem Quelltext der Seite gelesen.

Die so geholten Felder sind schreibgeschützt. Das Portal ist an dieser Stelle ein Spiegel und keine zweite Quelle. Scheitert ein Lauf, bleibt der alte Stand stehen und der Fehler wird am Datensatz vermerkt, denn ein stiller Fehlschlag ist schlimmer als ein sichtbar veralteter Wert.

Schema der eingesammelten Gestaltungswerte: ein Raster aus Farbflächen und Abstandsbalken, in das ein Pfeil von einer Website hineinführtAI
Farben, Größen und Abstände werden eingesammelt statt abgetippt. KI-erzeugte Illustration.

Schnittstellen

REST, GraphQL und der Endpunkt, auf den es ankommt

Das CMS liefert REST und GraphQL gleich mit, und beides hat seine Berechtigung. GraphQL ist praktisch, wenn ein Frontend genau die Felder braucht, die es anzeigt. REST ist praktisch, wenn ein fremdes System ohne große Einarbeitung etwas abholen soll.

Der wichtigste Endpunkt ist aber keiner von beiden, sondern ein eigener, der das aufgelöste Ergebnis für eine Marke zurückgibt. Ohne ihn baut das erste angebundene System die Vererbung selbst nach, das zweite baut sie anders nach, und ab da gibt es zwei Antworten auf dieselbe Frage. Dazu liefert das System eine maschinenlesbare Beschreibung seiner Schnittstelle aus, was fast nichts kostet und jede Anbindung ohne Rückfragen möglich macht.

Für Systeme, die nur lesen sollen, gibt es einen rein lesenden Zugang. Abgleiche in ein Wiki laufen einseitig aus dem Portal hinaus. Sobald zwei Systeme schreiben dürfen, braucht es Konfliktauflösung, und die will niemand pflegen, solange der Nutzen dafür nicht feststeht.

Fremdsysteme

Vier Annahmen, die man besser nachmisst

Die folgenden Punkte stammen aus Projekten mit verschiedenen Systemen und sind keine Aussage über ein bestimmtes Produkt. Sie treten bei fremden Schnittstellen regelmäßig auf, unabhängig davon, wer sie anbietet.

  • Wie lange eine Vorschau-Adresse gilt — Vorschau- und Freigabeadressen sind bei vielen Bildarchiven dauerhaft gültig, je nach Einstellung auch ohne Anmeldung. Einmal nachmessen, bevor man solche Adressen in den Browser lässt.
  • Ob Liste und Einzelabruf dieselben Namen benutzen — Felder heißen mitunter unterschiedlich, und Kennungen zum Weiterblättern kommen anders zurück, als sie gesendet wurden. Solche Abweichungen scheitern nicht laut, sie liefern leere Ergebnisse. Gegenprobe an echten Daten, nicht nur an Attrappen.
  • Ob eine Größenangabe etwas bewirkt — steht die Begrenzung nur in der Anfrage, ist sie erbeten und nicht belegt. Nachmessen, was ankommt, und im Zweifel serverseitig selbst verkleinern.
  • Wie streng die Herkunftsprüfung ist — eine feste Liste erlaubter Gegenstellen ist besser als eine Platzhalterregel, denn ein neuer Server soll auffallen und nicht still durchgehen. Und weil Browser Bilder zwischenspeichern, gehört ein Fehlschlag ins Dienstprotokoll, sonst bemerkt ihn zuerst der Kunde.

Verzicht

Was bewusst nicht gebaut wird

Ein Brand Portal braucht keinen Nachbau des Bildarchivs, keinen eigenen Upload für Fotos und keinen mehrstufigen Freigabeprozess, solange niemand danach fragt. Jede dieser Funktionen klingt vernünftig und erzeugt Pflegeaufwand für einen Fall, den es nicht gibt.

Ein Verzicht lohnt besonders. Viele Systeme bringen einen eigenen Entwurfsmodus mit. Führt der Datensatz zusätzlich ein eigenes Statusfeld, gibt es zwei Wahrheiten darüber, ob etwas veröffentlicht ist, und sie widersprechen sich früher oder später. Besser ist ein einziger Mechanismus, und zwar der eigene.

Versionsgeschichte und Änderungsprotokoll gehören dagegen von Tag eins hinein. Beides nachträglich einzuführen beantwortet die Frage, wie etwas vorher aussah, für alles Zurückliegende nicht mehr.

Fazit

Die Auflösung ist das Produkt

Ein Brand Portal sieht von außen aus wie eine Sammlung von Seiten. Der Unterschied zu einer Dateiablage steckt in einer einzigen Funktion, die aus zwei Datensätzen einen macht und dabei sagt, warum. Alles andere — Bilder, Videos, Gestaltungswerte — liegt schon woanders und wird angebunden, nicht nachgebaut.

Wer mit dem Befüllen beginnt, bevor diese Funktion steht, schreibt dieselbe Regel für jede Marke neu und merkt es erst, wenn sich die erste davon ändert.

Fragen

Häufige Fragen

Warum reicht ein Wiki als Brand Portal nicht?

Ein Wiki verwaltet Seiten, löst aber keine Vererbung auf. Es kann nicht beantworten, ob eine Vorgabe für eine bestimmte Marke gilt, und genau dafür wird ein Brand Portal gebaut. Als Ziel eines einseitigen Abgleichs bleibt ein Wiki trotzdem sinnvoll.

Warum nicht die Bild-Adressen des DAM direkt einbinden?

Weil solche Adressen oft dauerhaft und ohne Anmeldung funktionieren. Wer eine davon kopiert, kommt später weiter an das Bild, auch ohne Zugang zum Portal. Ein eigener Endpunkt davor löst das und erlaubt nebenbei, die Größe wirklich zu begrenzen.

Gehört die Vererbung nicht in die Datenbankabfrage?

Dort wäre sie schneller, aber nicht mehr prüfbar. Als reine Funktion lässt sich jeder Zustand mit einem Testfall absichern, ohne laufende Datenbank. Bei der Datenmenge eines Brand Portals ist die Geschwindigkeit ohnehin kein Argument.

Ein Brand Portal geplant?

Über Vererbung und führende Quellen spricht man am besten, bevor der erste Inhalt drin ist.

Kontakt aufnehmen