Panel klienta VulCode

Kundenpanel unserer eigenen Marke: Projekte, Abrechnungen, ein Partnerprogramm mit automatischer Provisionsauszahlung und Support-Tickets. Rollenbasierte Zugriffskontrolle, mehrsprachige Oberfläche und echte Daten, keine Attrappe. Derselbe Code läuft wie eine native App auf dem Telefon.

Panel klienta VulCode
TL;DR

Das Kundenpanel unserer eigenen Marke VulCode: Projekte, Abrechnungen, Tickets und ein Partnerprogramm in einem Fenster statt hin und her springender E-Mails. Provisionen werden in ganzen Grosze berechnet und automatisch in die Wallet ausgezahlt, die Zugriffskontrolle basiert auf Rollen, und derselbe Code, der auf dem Computer läuft, installiert sich auf dem Telefon und verhält sich wie eine native App.

Einführung

VulCode ist unsere eigene Marke, also haben wir dieses Panel für uns selbst gebaut, und das erwies sich als der schwierigste denkbare Kunde. Wenn man etwas für sich selbst baut, gibt es niemanden, hinter dem man sich verstecken kann: jede Abkürzung, jede Zahl, die nicht aufgeht, fällt direkt auf einen selbst zurück. Deshalb sollte dieses Projekt von Anfang an die Vorlage dafür sein, wie ein Kundenpanel bei uns überhaupt aussieht, und keine Behelfslösung für den internen Gebrauch.

Die Aufgabe klang einfach: dem Kunden einen einzigen Ort zu geben, an dem er alles sieht, was ihn betrifft, und Angelegenheiten selbst erledigt, die früher eine E-Mail erforderten. In der Praxis bedeutete das, mehrere Welten auf einmal zu verbinden - den Projektstatus, Rechnungen, Support-Tickets und ein Partnerprogramm, das mit echtem Geld rechnet - zu einem zusammenhängenden Bildschirm, der auf dem Schreibtisch und in der Hosentasche gleich funktioniert. Diese Fallstudie zeigt, wo die echten Fallen lagen und wie wir sie umgangen haben.

Schluss mit "Wo ist meine Rechnung"-E-Mails

Vor dem Panel endete jede Frage nach einer Projektphase oder einem Dokument in einer E-Mail, und die Antwort hing davon ab, wer sie gerade las und ob er sich an den Kontext erinnerte. Das skaliert nicht einmal bei einem Dutzend Kunden: dieselbe Information lebte im Postfach einer einzigen Person, und der Kunde wartete, statt einfach hinzuschauen.

Das Panel dreht das um. Der Kunde loggt sich ein und hat sofort seine Projekte mit dem Arbeitsstatus vor sich, eine Liste der Rechnungen mit dem, was bezahlt und was offen ist, sowie die Historie aller Tickets, die er je eröffnet hat. Nichts muss aus E-Mails herausgesucht werden, denn die Quelle der Wahrheit ist eine einzige Ansicht und nicht das Gedächtnis von jemandem.

Weniger Warten auf beiden Seiten

Die Wirkung ist auf beiden Seiten spürbar. Der Kunde wartet nicht mehr auf einen Menschen, um Dinge zu erfahren, die das System ohnehin kennt. Das Team beantwortet dieselben Fragen nicht mehr zum hundertsten Mal, weil die Antwort schon auf dem Bildschirm steht, bevor sie überhaupt jemand tippt.

Schritte, um den Projektstatus zu prüfen (Richtwert)

Per E-Mail und Warten
5
Im Panel
1

Geld in Grosze berechnet, nicht in Näherung

Ein Partnerprogramm sieht harmlos aus, bis man anfängt, Provisionen auf Beträgen mit Grosze zu berechnen. Hier beginnen die klassischen Dramen: zehn Prozent von 19.99 zł auf einer Gleitkommazahl berechnet können drei leicht unterschiedliche Ergebnisse in der Provisionsliste, in der Wallet und auf der Auszahlung ergeben, und dann gehen die Salden nicht mehr auf und niemand traut dem Panel.

Deshalb halten wir das Geld im gesamten Panel als ganze Zahlen in Grosze und berechnen jede Provision auf Integern. Es gibt hier nie einen Bruchteil eines Złoty, der sich einmal in die eine und einmal in die andere Richtung runden könnte. Eine Operation, eine Abrundungsregel, dasselbe Ergebnis überall, wo dieser Betrag auftaucht.

commission.ts · ts
type Grosze = number;

function commission(amountGrosze: Grosze, rateBps: number): Grosze {
  return Math.floor((amountGrosze * rateBps) / 10000);
}
➜
Tipp

Den Provisionssatz halten wir in Basispunkten (bps), nicht in Prozent mit Komma. Zehn Prozent sind 1000 bps, nicht 0.1 als Float gespeichert. So läuft die gesamte Provisionsmathematik auf ganzen Zahlen, vom Satz bis zum Ergebnis, und es gibt keine Stelle, an der sich ein Rundungsfehler einschleichen könnte.

Wer was sieht und warum

Ein Kundenpanel zeigt Geld und Dokumente, also ist die Frage "wer darf das sehen" nicht kosmetisch. Der Kunde soll ausschließlich seine eigenen Daten sehen, das Team nur das, wozu es berechtigt ist, und die Grenze zwischen ihnen darf nicht davon abhängen, ob das Frontend gerade einen Button versteckt hat.

Wir haben das auf rollenbasierter Zugriffskontrolle und sicherer Authentifizierung aufgebaut, aber die entscheidende Wahl ist architektonisch: den Umfang dessen, was man sehen und tun kann, prüft das Backend am Eingang zur API, nicht die Oberfläche. Das Frontend kann zeigen oder verbergen, was es will, aber wenn eine Anfrage fremde Daten betrifft, weist die API sie ab, bevor sie überhaupt die Datenbank erreicht.

Es ist dasselbe Prinzip, das wir überall anwenden: man bewacht die Grenze dort, wo Daten von außen hereinkommen, also an der API, und verlässt sich nicht darauf, dass der Nutzer keine Kennung in der Adresse austauscht.

Derselbe Code auf dem Schreibtisch und in der Hosentasche

Der Kunde sitzt nicht die ganze Zeit am Computer. Die Rechnung prüft er in der Straßenbahn, auf eine Ticket-Benachrichtigung reagiert er vom Telefon. Dafür eine separate mobile App zu bauen würde einen zweiten zu pflegenden Code bedeuten und die Gewissheit, dass die beiden Versionen früher oder später auseinanderdriften.

Stattdessen ist das Panel eine Web-App, die sich als PWA auf dem Telefon installiert, mit einem Manifest und einem Service Worker. Derselbe Code, dasselbe Backend, dieselbe Provisionslogik. Auf dem Computer ist es ein voller Desktop, auf dem Telefon ein Icon auf dem Startbildschirm und ein Fenster ohne Browserleiste, das sich wie eine native App verhält.

2
Oberflächensprachen aus einer Quelle (PL und EN)
1
gemeinsames Backend für Web und Telefon
0
Rundungsfehler bei Provisionsbeträgen

Echte Daten vom ersten Tag an

Am einfachsten ist es, ein Panel zu bauen, das auf im Voraus vorbereiteten Zahlen gut aussieht. Es sieht gut aus, bis jemand klickt und sich herausstellt, dass darunter nichts ist. Wir sind den umgekehrten Weg gegangen: das Panel steht vom ersten Tag an auf einem echten Backend, und jeder Bildschirm zeigt das, was tatsächlich in der Datenbank steht.

Diese Wahl kostet am Anfang mehr, weil man eine funktionierende API braucht, bevor überhaupt etwas gezeichnet wird. Sie zahlt sich aber sofort aus, weil es keinen Moment "die Daten hängen wir später an" gibt, in dem üblicherweise all die Annahmen auftauchen, die den Kontakt mit der Realität nicht überlebt haben. Was man im Panel sieht, ist das, was das System wirklich weiß.

Stack

SchichtTechnologie
FrontendReact + TypeScript auf Vite
BackendNode + TypeScript, SQLite
ZugriffRollen und Authentifizierung auf der API-Seite
Geldganze Zahlen in Grosze, Sätze in bps
i18neine Übersetzungsquelle für PL und EN
Auf dem TelefonPWA mit Manifest und Service Worker

Was das fertige Produkt tatsächlich liefert

Der Kunde bekommt einen einzigen Ort, an dem er seinen Stand sieht und Angelegenheiten selbst erledigt, die früher eine E-Mail an das Team erforderten. Er kommt herein, prüft ein Projekt, lädt eine Rechnung herunter, antwortet in einem Ticket, schaut auf den Provisionssaldo aus dem Partnerprogramm, und wenn er gerade unterwegs ist, macht er dasselbe vom Telefon aus, weil es dieselbe App ist. Nichts davon hängt davon ab, ob jemand aus dem Team gerade am Postfach sitzt.

Auf unserer Seite ist der Gewinn ebenso konkret. Das Partnerprogramm läuft, ohne dass jemand etwas von Hand nachrechnet, weil es von Code auf ganzen Zahlen bewacht wird und nicht von einer Tabelle, die jemand abstimmen muss. Die Salden stimmen, weil es keine Stelle gibt, an der ein Rundungsfehler entstehen könnte. Das Team gewinnt die Zeit zurück, die früher in die Beantwortung derselben Fragen floss.

Am wichtigsten ist jedoch, dass dieses Panel zu unserer Vorlage wurde. Der Kern, auf dem es steht - Rollen, Wallets, Provisionen, Tickets, i18n, App-Modus - ist sauber genug, dass er sich auf weitere Marken übertragen ließ, ohne von Grund auf neu geschrieben zu werden. Wir haben mit dem schwierigsten Kunden angefangen, uns selbst, und heraus kam eine Architektur, die wir später nur noch in neue Farben gekleidet haben.

Weitere Projekte

Weitere Projekte aus derselben Kategorie - sehen Sie, wie wir ähnliche Herausforderungen angehen.

Haben Sie ein ähnliches Projekt?

Melden Sie sich - ein Angebot ist kostenlos und kommt innerhalb einer Stunde.