Zum Inhalt springen
ausgeliefert

Designsystem und Gast-Checkout bei einer E-Commerce-Plattform

Ein Designsystem mit Vue und Quasar, ein Gast-Checkout und gehärtete Auth-Abläufe.

Kaufwillige brachen an einem erzwungenen Login vor der Zahlung ab, und dem Frontend, ursprünglich vom Backend-Team gebaut, fehlte eine wiederverwendbare Komponentenschicht.

Rolle:
Erster Frontend-Entwickler: Designsystem, Checkout, Auth; Mentoring für Nachwuchskräfte
Stack:
Vue 3 · Quasar · Pinia · Vitest · Cypress · GitHub Actions
Zeitraum:
2023–2025
veröffentlicht:
E-Commerce-Plattform: Architektur Eine Web-App mit Vue 3, Quasar, Pinia und einem Designsystem aus rund 100 Komponenten, mit rollenbasierten Router-Guards, und eine Flutter-App für iOS und Android rufen beide parallele Elixir-Microservices auf, die einen Monolithen ablösen und vor der Datenbank sitzen. Die Web-App ruft außerdem den Zahlungsanbieter direkt auf, gestrichelt gezeichnet als vorläufiger Checkout im Client. Web-App Vue 3 · Quasar · Pinia Designsystem, ~100 Komponenten RBAC in Router-Guards Mobile App Flutter · iOS & Android Zahlungsanbieter Checkout vorerst im Client Elixir-Microservices lösen einen Monolithen ab parallele Dienste DB fest zuständig
Zwei Client-Apps über einem Backend mitten in der Migration von einem Monolithen zu parallelen Elixir-Microservices. Der Checkout der Web-App spricht direkt mit dem Zahlungsanbieter: eine bewusste Zwischenlösung, bis der serverseitige Checkout angebunden ist. · seitlich scrollen, um alles zu sehen

Problem und Rahmenbedingungen

Ich kam als erster dedizierter Frontend-Entwickler zu einer E-Commerce-Plattform. Bis dahin hatte das Backend-Team das Frontend neben der eigenen Arbeit gebaut, ohne eine wiederverwendbare Komponentenschicht, auf der sich aufbauen ließ.

Zwei Kräfte bestimmten die Arbeit. Erstens brauchte das Produkt vor dem öffentlichen Start eine komplette Überarbeitung des Designs, und die Figma-Dateien aus dem UI-Design waren der Vertrag; wie etwas aussah, entschied am Ende das Design. Zweitens zeigten die Produktdaten klar, wo Geld verloren ging: Product Owner und UX-Forschung fanden heraus, dass viele Kaufwillige eine Produktseite erreichten, auf Kaufen klickten, auf eine Login-Seite umgeleitet wurden und nie zurückkamen.

Das Team arbeitete ohne formale Hierarchie: vier Personen im Backend, die in Elixir arbeiteten, eine für Datenbank und DevOps zugleich, zwei für Flutter und die mobilen Apps und ich fürs Web. Alle verantworteten ihren eigenen Bereich und entschieden darin, abgestimmt mit dem Product Owner; die großen Entscheidungen fielen gemeinsam mit der technischen Leitung (CTO). Was gebaut wurde, kam von CTO, Produkt und Design; meine Entscheidungen betrafen, wie es im Web umgesetzt wurde. Mein Bereich waren die Überarbeitung des Designs, die Komponentenbibliothek, der Checkout sowie Authentifizierung und Autorisierung; später kam das Mentoring für zwei Nachwuchskräfte im Frontend dazu.

Die Arbeit verlief in Etappen. Die Überarbeitung setzte ich allein in zwei Wochen um, von der Startseite bis zur kleinsten Menüseite, und schloss sie rechtzeitig zum öffentlichen Start ab. Danach folgten kleinere Verbesserungen an UI, UX und Logik als Jira-Vorgänge aus Test und Design, und parallel begann ich mit der Komponentenbibliothek, denn das Produkt hatte noch keine.

Architektur

Auf der Plattform sitzen zwei Client-Apps: die Web-App (Vue 3 mit Quasar, Pinia für den Zustand und die Komponentenbibliothek) und eine Flutter-App für iOS und Android. Das Backend war mitten in der Migration von einem Monolithen zu parallelen Elixir-Microservices.

Der neue Registrierungs- und Kaufablauf brauchte drei Wege: ein Konto anlegen, sich bei einem bestehenden Konto anmelden und einen Gast-Checkout, der nur das abfragt, was der Kauf braucht. Das Backend für die Registrierung war zuerst fertig; im Frontend ging es dort darum, es anzubinden und das State Management sauber darauf abzustimmen. Das Backend für den Checkout war noch nicht fertig und brauchte weitere zwei bis drei Monate.

Der Checkout lief deshalb als bewusste Zwischenlösung im Client: Das Frontend baute den Warenkorb, berechnete Rabatte pro Artikel und pro Bundle, rief den Zahlungsanbieter direkt auf und erhielt das Ergebnis, weil das Backend noch keine Live-Preise liefern konnte. Pinia-Stores hielten den Checkout-Zustand über alle Schritte, die Auth-Sitzungen und die Admin- und Nutzerkontexte, mit rollenbasierten Zugriffsprüfungen im Router. Bis die Autorisierung im Backend vollständig angebunden war, war das Frontend praktisch die Zugriffskontrolle, also musste jeder Schritt jeder User Story auf Lecks und falsche Navigationspfade durchgegangen werden. Die Entscheidungen dahinter stehen im Entscheidungsprotokoll unten, jede mit der Alternative, gegen die sie sich durchgesetzt hat.

Ergebnisse

Der Gast-Checkout verbesserte die Conversion-Rate messbar: Die Abbruchstelle, die die UX-Forschung gefunden hatte, war schlicht beseitigt. Das Designsystem gab dem Team eine gemeinsame Komponentenschicht, die die Entwicklung neuer Features beschleunigte: rund hundert Komponenten, vom ganzen Team übernommen, passend zu den Figma-Entwürfen und mit Quasar darunter. Tests wurden vertrauenswürdig und für jedes Feature Pflicht, und eine Caching-Schicht in GitHub Actions, die ich ergänzte, verkürzte den Workflow zum Paketieren der App, der bei jedem Merge, Release und Test-Build lief, um rund 40 %.

Die Nachwuchskräfte, die ich betreute, entwickelten sich vom Pair-Programming über Anleitung anhand von Issues dahin, eigenständig besser zugeschnittene PRs mit schnelleren Review-Zyklen zu liefern.

Lehren

Ich hätte Quasar bei der ersten echten Unbequemlichkeit fallen lassen. Je länger es blieb, desto schwerer fiel der Abschied, und seine stark gestylten, mit Klassen überladenen Komponenten an die maßgeschneiderten Vorgaben des Designs anzupassen, war ein ständiger Aufpreis auf genau die Arbeit, die das Designsystem billiger machen sollte. Ein gestyltes Komponenten-Framework unter einem pixelgenauen Designsystem zu kapseln heißt, ständig gegen seine eingebauten Konventionen anzukämpfen; wenn das Design der Vertrag ist, sind Headless-Primitive (oder eigene) das solidere Fundament. Es ist der deutlichste Fall vom Sog versunkener Kosten, den ich erlebt habe, und er hat verändert, wie schnell ich bereit bin, eine Grundsatzentscheidung neu zu verhandeln.

Zentrale Entscheidungen

  1. 01 Ein Designsystem, das Quasar kapselt

    Eine eigene Schicht aus rund 100 Komponenten, die Quasar-Primitive kapseln und erweitern.

    Die Figma-Komponenten aus dem Design gab es in Quasar schlicht nicht, und der Vertrag waren die Spezifikationen, nicht die Standardwerte des Frameworks; darunter konnte die Bibliothek trotzdem Quasars Logik und einfache Komponenten wiederverwenden.

    Alle rund hundert Komponenten wurden vom ganzen Team übernommen. Mein ehrlicher Rückblick auf den Teil „Quasar behalten“ dieser Entscheidung steht oben unter „Lehren“.

    verworfen: Quasar-Komponenten direkt in den Features verwenden

  2. 02 Gast-Checkout

    Ein Kaufablauf für Gäste, bei dem E-Mail oder Telefonnummer nur für die Zustellung der Bestellung nötig sind.

    Die Daten von Product Owner und UX-Forschung zeigten genau, wo Kaufwillige verschwanden: an der erzwungenen Weiterleitung zum Login zwischen „Kaufen“ und Bezahlung.

    verworfen: Die Registrierung als Voraussetzung für den Kauf beibehalten

  3. 03 Clientseitiger Checkout als bewusste Zwischenlösung

    Warenkorbsummen und Rabattlogik im Frontend berechnen und den Zahlungsanbieter direkt aufrufen.

    Das Backend konnte noch keine Live-Preise liefern, also war clientseitig der einzige Weg, korrekte Rabatte pro Artikel und pro Bundle sofort auszuliefern, mit serverseitig als geplantem Endzustand.

    Knifflig waren die geschichteten Rabatte: Bundle-Rabatte, die zusätzlich zu Artikelrabatten griffen, auf Preise, die das Backend erst nachträglich aktualisierte. Das Backend für den serverseitigen Checkout war etwa zwei bis drei Monate später fertig, und danach stellte ich das Frontend darauf um.

    verworfen: Auf einen serverseitigen Checkout warten (Live-Preise, Lagerbestand, Zahlungssitzungen aus dem Backend)

  4. 04 Frontend als vorläufige Zugriffskontrolle

    Lückenlose, schrittweise RBAC-Prüfungen in den Pinia-Stores und Router-Guards.

    Bis die Autorisierung im Backend stand, war das Frontend das Einzige zwischen Rollen und Daten; deshalb musste jede User Story Schritt für Schritt auf Lecks und falsche Navigationspfade durchgegangen werden.

    verworfen: Auf eine Durchsetzung im Backend vertrauen, die noch nicht vollständig angebunden war

  5. 05 Vertrauen in Tests wiederherstellen

    Das Test-Setup von Grund auf neu aufsetzen und jeden Feature-PR an Tests knüpfen.

    Das Vitest-Setup war so veraltet, dass ein fehlschlagender Test nicht bedeutete, dass etwas kaputt war; Grün hatte keine Aussagekraft, also musste das Vertrauen von null an neu entstehen.

    Vitest für Unit-Tests, Cypress für die vielen Abläufe, die Unit-Tests nicht ehrlich abdecken können. Das Gate galt nur für Feature-PRs (Hotfix-, Chore- und Docs-PRs waren ausgenommen), und genau deshalb setzte sich die Regel durch.

    verworfen: Die bestehende Suite schrittweise flicken

Kennzahlen

Kennzahlen (eigene Angaben)
KennzahlWertStatus
Komponenten im Designsystem~100eigene Angabe

Eigene Angaben: Umfang der Bibliothek bei der Übergabe