Webkomponenten für American Express
Von Ende 2022 bis Anfang 2026 hat Batunet interaktive Webkomponenten technisch umgesetzt und gepflegt: einen Kreditkartenvergleich, einen persönlichen Inflationsrechner und eine Reihe von Tabellen-, Navigations- und Aktionsmodulen. Die Entwicklung erfolgte im Rahmen einer Projektkette für den deutschsprachigen Guide-Bereich von American Express; American Express war dabei nicht direkter Vertragspartner von Batunet. Mit der Zahl der Bausteine wuchs der Pflegeaufwand — daraus entstand eine Symfony-Anwendung, die Produktangaben und Inhalte zentral verwaltet und die Komponenten als JavaScript ausliefert.
Der Fall in einer Minute.
- Kontext
- Seiten im deutschsprachigen Guide-Bereich von American Express. Die Entwicklung erfolgte im Rahmen einer Projektkette; American Express war nicht direkter Vertragspartner von Batunet.
- Rolle
- Technische Umsetzung und mehrjährige Pflege der Komponenten; Entwicklung der Anwendung für zentrale Verwaltung und Auslieferung.
- Zeitraum
- 7. Dezember 2022 bis 17. März 2026, belegt durch die Versionshistorie.
- Komponenten
- Kreditkartenvergleich, Direktvergleich zweier Karten, persönlicher Inflationsrechner, Vergleichstabelle, mobile Sticky-Navigation, Sticky-Leiste mit Detailansicht, Aktionsmodule.
- Vergleichslogik
- Nutzergesetzte Gewichte über mehrere Kriterien, Punktwert je Karte, Normalisierung auf Prozent gegen die bestplatzierte Karte, Filterung, definierte Reihenfolge ohne Gewichtung.
- Zentrale Verwaltung
- Datenmodell aus Produktdatensätzen und komponentenbezogenen Feldwerten, deklarative Feldsätze für rund zwanzig Komponententypen, Redaktionsoberfläche mit Anmeldung und Rollenbeschränkung, Vorschau vor der Auslieferung.
- Auslieferung
- Serverseitig gerendertes JavaScript; die Zielseite bindet ein Script ein und stellt einen Container bereit.
- Technisches Umfeld
- Erste Generation HTML, CSS und JavaScript; zweite Generation PHP und Symfony 7.1 mit Doctrine, Twig und EasyAdmin.
- Abgrenzung
- Produktinhalte, Konditionen, Bilder und Markenassets stammen nicht von Batunet. Bibliotheken für Diagramme, Karussell und Eingabemasken sind Fremdcode. Die Versionshistorie enthält auch einen Beitrag eines anderen Projektbeteiligten.
Bausteine für Seiten, die anderen gehören.
Der Guide-Bereich von American Express erklärt Kartenprodukte und Finanzthemen in redaktionellen Seiten. In diese Seiten sollten Werkzeuge eingesetzt werden, die mehr können als Text: vergleichen, rechnen, Produkte übersichtlich zeigen. Die Seiten selbst, ihr Aufbau und ihr Betrieb lagen nicht bei uns.
Daraus folgt die Grundbedingung dieses Falls. Eine Komponente läuft in einem Dokument, das ihr nicht gehört, auf Geräten, deren Breite sie nicht kennt. Jede Komponente bringt deshalb ihr Markup, ihre Darstellung und ihre Daten mit. Was sie von der Zielseite trotzdem erwartet — etwa eine bestimmte Bibliothek —, ist ausdrücklich als Voraussetzung benannt, statt stillschweigend angenommen zu werden.
Batunet war dabei für die technische Umsetzung und Pflege zuständig, eingebunden in eine Projektkette; Vertragspartner von American Express war Batunet nicht. Inhalte, Konditionen und Markenassets kamen nicht von uns.
Entscheidungshilfen, die rechnen.
Zwei der Werkzeuge beantworten Fragen, die jeder Leser anders stellt. Welche Karte passt zu dem, was mir wichtig ist? Und wie stark trifft mich die Teuerung, wenn mein Warenkorb nicht dem Durchschnitt entspricht? Beide Antworten entstehen im Browser, sofort und ohne Anmeldung.
Dazu kamen Bausteine ohne eigene Rechenlogik: eine Vergleichstabelle, eine mobile Produktnavigation, eine am unteren Bildschirmrand fixierte Leiste mit Detailansicht und statische Aktionsmodule mit Produktbild, Leistungen und Antragslink. Ihre Anforderung war weniger die Logik als die Darstellung auf jedem Gerät.
Allen gemeinsam war, dass sie nach der ersten Auslieferung nicht fertig waren. Verweise, Konditionen, Bilder und Texte änderten sich laufend — und dieser Teil der Aufgabe hat den Fall später stärker geprägt als jeder einzelne Baustein.
Die Rangfolge gehört dem Nutzer.
Ein Vergleich mit fester Reihenfolge beantwortet die Frage des Anbieters. Hier liegt die Gewichtung beim Leser: Für mehrere Kriterien stellt er in drei Stufen ein, wie wichtig ihm jedes ist. Daraus entsteht je Karte ein Punktwert aus Gewicht und Merkmalswert. Zwei Kriterien tragen einen festen Ausgleichsfaktor, damit sie das Ergebnis nicht allein durch ihre Größenordnung bestimmen.
Der Punktwert selbst sagt niemandem etwas. Angezeigt wird deshalb ein Prozentwert gegen die bestplatzierte Karte. Ist nichts gewichtet, greift eine feste Ausgangsreihenfolge statt einer zufälligen. Ein Filter trennt passende von nicht passenden Karten, ohne diese auszublenden — sie erscheinen abgesetzt unter der Trefferliste.
Auf breiten Bildschirmen stehen die Karten nebeneinander und öffnen eine Detailansicht. Auf schmalen Bildschirmen wird die Liste zum Karussell, und der Antragslink folgt der Karte, die gerade in der Mitte steht.
2025 kam ein zweites Werkzeug hinzu: ein Direktvergleich zweier frei gewählter Karten über elf Kategorien, von Gebühren bis zu Reise- und Versicherungsleistungen.
- Eingabe
- Gewichtung je Kriterium, Filter, Zurücksetzen in den Ausgangszustand
- Berechnung
- Punktwert aus Gewicht und Merkmalswert, Feste Ausgleichsfaktoren, Normalisierung gegen die bestplatzierte Karte
- Ergebnis
- Sortierte Liste mit Prozentwert, Abgesetzte Nicht-Treffer, Detailansicht je Karte
- Darstellung
- Kartenraster auf breiten Bildschirmen, Karussell auf schmalen Viewports, Antragslink folgt der zentrierten Karte
Derselbe Index, ein anderer Warenkorb.
Die amtliche Teuerungsrate beschreibt einen Durchschnittshaushalt. Wer wenig fährt und viel heizt, erlebt eine andere Rate — nicht weil die Zahl falsch wäre, sondern weil sie nach einem fremden Warenkorb gewichtet ist.
Der Inflationsrechner nimmt deshalb die amtlichen Indexreihen, den Gesamtindex und neunzehn Ausgabenkategorien, und gewichtet sie nach den Ausgaben, die jemand selbst einträgt. Für jeden Monat entsteht ein persönlicher Indexwert als gewichtetes Mittel; die Jahresrate ergibt sich aus dem Vergleich mit dem Wert zwölf Monate zuvor. Ein Diagramm zeigt persönlichen und amtlichen Verlauf nebeneinander, auf Wunsch zusätzlich eine einzelne Kategorie.
Der eigentliche Aufwand liegt um die Formel herum. Beträge werden so eingegeben, wie Menschen über Geld denken: in Euro, ohne Nachkommastellen. Zu jeder Kategorie zeigt der Rechner einen Richtwert aus einer Standardgewichtung, bezogen auf die angegebenen Gesamtausgaben. Nicht zugeordnete Ausgaben laufen in eine eigene Restkategorie, und das Ergebnis wird mit jeder Eingabe neu berechnet. Übersteigen die Kategorien die Gesamtausgaben, zeigt der Rechner einen Hinweis statt einer Zahl, die es nicht geben kann.
Wenig Logik, viele Geräte.
Die übrigen Bausteine rechnen nicht. Eine Vergleichstabelle stellt mehrere Karten Zeile für Zeile gegenüber und bekommt auf schmalen Bildschirmen einen eigenen Aufbau statt einer verkleinerten Fassung. Eine mobile Produktnavigation klappt am Bildschirmrand auf. Eine fixierte Leiste am unteren Rand öffnet eine Übersicht mit Detailansicht, die sich per Klick, über den Hintergrund oder mit Escape wieder schließt und auf schmalen Bildschirmen als Karussell läuft.
Die Aktionsmodule der ersten Generation waren statisches HTML und CSS in drei Varianten — als Liste, als kompaktes Menü und als Kartenraster. Technisch sind diese Bausteine schlicht. Ihre Kosten entstanden an anderer Stelle: Dieselben Produktangaben standen in mehreren Modulen, jedes in einer eigenen Ablage mit eigener Historie.
Was an eingebetteten Komponenten altert.
Über 2023 und 2024 bestand ein großer Teil der Arbeit aus Änderungen, die mit Code wenig zu tun hatten: neue Verweisziele, geänderte Startguthaben, ausgetauschte Bilder, umbenannte Produkte. Jede davon musste in mehreren getrennten Bausteinen nachgezogen werden, teils in parallel gepflegten Varianten desselben Werkzeugs.
Solange es wenige Bausteine sind, fällt das nicht auf. Mit jedem weiteren steht dieselbe Angabe an einer weiteren Stelle. Der Punkt, an dem das kippt, ist kein technischer Fehler, sondern eine Mengenfrage.
Aus Dateien werden Daten.
Die Antwort war keine weitere Komponente, sondern eine Ebene darunter: eine Anwendung auf Basis von Symfony 7.1, in der Produktangaben und Komponenteninhalte als Daten liegen statt als Quelltext.
Das Modell ist klein gehalten. Ein Produktdatensatz trägt die Angaben, die überall gebraucht werden — Name, Bild, Verweise. Je Komponente gibt es benannte Feldwerte. Welche Felder ein Komponententyp kennt, steht in einer deklarativen Konfiguration, zuletzt für rund zwanzig Typen. Ein neuer Typ bleibt so eine Konfigurationsfrage und wird keine Modelländerung.
Feldwerte können auf Produktangaben verweisen; beim Rendern werden diese Verweise aus dem Produktdatensatz ersetzt. Eine geänderte Angabe wirkt deshalb in jeder Komponente, die sie nutzt, statt in jeder Datei einzeln nachgezogen zu werden.
Ausgeliefert wird serverseitig gerendert: Die Vorlage einer Komponente wird mit ihren Daten zu JavaScript, das die Zielseite einbindet. Davor steht eine Vorschau, die dieselbe Komponente in verschiedenen Bildschirmbreiten zeigt. Gepflegt wird in einer Redaktionsoberfläche mit Anmeldung und Rollenbeschränkung.
Der Übergang lief in Stufen. Zuerst wurden Inhalte per CSV-Datei importiert, später in einem Datenmodell mit Redaktionsoberfläche gepflegt. Bestehende Bausteine, darunter der Kreditkartenvergleich, wurden in die Anwendung übernommen — ihre Rechenlogik blieb, die Daten kommen seitdem vom Server.

- 01
Produktdaten
Ein Datensatz je Produkt trägt die Angaben, die alle Komponenten gemeinsam brauchen.
- 02
Feldsatz
Je Komponententyp ist deklarativ festgelegt, welche Felder er kennt.
- 03
Redaktion
Die Werte werden in einer rollenbeschränkten Oberfläche gepflegt, nicht im Quelltext.
- 04
Zusammenführung
Beim Rendern werden Verweise auf Produktangaben aus dem Datensatz ersetzt.
- 05
Vorschau
Die Komponente wird vor der Auslieferung in mehreren Bildschirmbreiten geprüft.
- 06
Auslieferung
Dieselbe Komponente wird als JavaScript ausgegeben und von der Zielseite eingebunden.
Drei Jahre, zwei Generationen.
Die Arbeit verlief nicht als Projekt mit Anfang und Abnahme, sondern als laufende Weiterentwicklung. Die Versionshistorie reicht vom 7. Dezember 2022 bis zum 17. März 2026 und zeigt zwei Generationen: zuerst eigenständige Einbettungskomponenten, dann eine zentrale Anwendung, in die bestehende Komponenten übernommen wurden.
- 01
Ende 2022 bis Anfang 2023
Inflationsrechner mit Berechnung, Diagramm und Eingabemaske.
- 02
Frühjahr 2023
Kreditkartenvergleich, Vergleichstabelle und Sticky-Komponenten.
- 03
Mitte 2023 bis Ende 2024
Laufende Pflege, statische Aktionsmodule, parallel gepflegte Varianten.
- 04
Ende 2024 bis Mitte 2025
Grundgerüst der Symfony-Anwendung, CSV-Import, Übernahme des Vergleichs.
- 05
Mitte bis Ende 2025
Datenmodell mit Redaktionsoberfläche, Direktvergleich, neue Komponententypen, Übernahme weiterer Module.
- 06
Ende 2025 bis März 2026
Umstellung der Auslieferung auf das neue Datenmodell und weitere Pflege.
Was bei uns lag — und was nicht.
Bei Batunet lagen die technische Umsetzung der Komponenten, ihre Pflege über mehr als drei Jahre und die Entwicklung der Anwendung für Verwaltung und Auslieferung.
Nicht bei uns lagen die Seiten, in die die Komponenten eingebettet wurden, deren Betrieb sowie Produktinhalte, Konditionen, Bilder und Markenassets. Diagramm-, Karussell- und Eingabebibliotheken sind Fremdcode, und die Versionshistorie enthält auch einen Beitrag eines anderen Projektbeteiligten.
- Bei Batunet
- Umsetzung der Komponenten, Rechen- und Vergleichslogik, Responsive Darstellung, Pflege über mehrere Jahre, Datenmodell, Redaktionsoberfläche und Auslieferung
- Nicht bei Batunet
- Zielseiten und ihr Betrieb, Produktinhalte und Konditionen, Bilder und Markenassets, Vertragsbeziehung zu American Express
Der richtige Zeitpunkt für eine eigene Ebene.
Rückblickend ist nicht der einzelne Baustein der interessante Teil, sondern der Übergang. Für eine Handvoll Module wäre eine eigene Verwaltungsanwendung überzogen gewesen: Sie kostet Betrieb, Pflege und Einarbeitung, bevor sie etwas spart. Mit mehreren Komponenten, die dieselben Produktangaben tragen und sich laufend ändern, kippt die Rechnung.
Übernommen wurde schrittweise, Komponente für Komponente, über mehrere Monate. Möglich war das, weil die Bausteine schon vorher getrennt vorlagen. Die Rechenlogik des Vergleichs etwa blieb beim Umzug unverändert; ausgetauscht wurde die Herkunft der Daten.
Eingesetzte Technologien
Zwei Generationen in einem Fall: eigenständige Frontend-Bausteine in HTML, CSS und JavaScript ohne Framework-Voraussetzung, später eine Symfony-Anwendung für Verwaltung und Auslieferung. jQuery, Owl Carousel, Highcharts und Inputmask sind Fremdbibliotheken und als solche genannt.
Woran dieser Fall anschließt.
Fragen zu diesem Fall
War American Express Kunde von Batunet?
Nein. Die Entwicklung erfolgte im Rahmen einer Projektkette für den deutschsprachigen Guide-Bereich von American Express; American Express war dabei nicht direkter Vertragspartner von Batunet. Batunet war für die technische Umsetzung und Pflege der Komponenten zuständig. Produktinhalte, Konditionen und Markenassets stammen nicht von uns.
Wie funktioniert ein Produktvergleich mit gewichteter Bewertung?
Die Gewichtung liegt beim Nutzer. Für mehrere Kriterien wird eingestellt, wie wichtig jedes ist; daraus entsteht je Produkt ein Punktwert, der gegen das bestplatzierte Produkt auf Prozent normalisiert wird. Kriterien mit abweichender Größenordnung brauchen einen festen Ausgleich, sonst bestimmt eines allein das Ergebnis.
Wie berechnet man eine persönliche Inflationsrate?
Man nimmt die amtlichen Indexreihen der einzelnen Ausgabenkategorien und gewichtet sie nach den eigenen Ausgaben statt nach dem Durchschnittswarenkorb. Für jeden Monat entsteht ein gewichteter Indexwert; die Jahresrate ist der Vergleich mit dem Wert zwölf Monate zuvor.
Ab wann lohnt sich eine zentrale Verwaltung für eingebettete Komponenten?
Sobald dieselbe inhaltliche Änderung an mehreren Stellen anfällt. Für ein oder zwei Bausteine ist eine eigene Anwendung überzogen. Tragen mehrere Komponenten dieselben Produktangaben und ändern sich diese laufend, ist eine Datenebene mit Redaktionsoberfläche günstiger als das Nachziehen jeder einzelnen Datei.
Wie wird eine Komponente in eine fremde Seite eingebunden?
Über ein Script und ein Container-Element. Das Script bringt Darstellung, Verhalten und Daten der Komponente mit und rendert in den Container. In der zweiten Generation wird dieses Script serverseitig aus Vorlage und Datenbestand erzeugt.
Setzen Sie Ihren Engineering-Weg fort.
Verwandte Konzepte, Entscheidungen, Playbooks und Standpunkte — als zusammenhängender Pfad, nicht als Linkliste.
Sprechen wir über Ihr Vorhaben.
Kein Vertrieb. Ein direktes Gespräch mit der Geschäftsführung.
