Wir haben das Helpdesk gebaut, das wir selbst wollten
Better Helpdesk ist ein Open-Source-Helpdesk, das Sie mit npm direkt in Ihre eigene App installieren. Es nutzt Ihre Datenbank und Ihr Login. Hier steht, warum wir es so gebaut haben.
Better Helpdesk ist ein Open-Source-Helpdesk, das Sie mit npm direkt in Ihre eigene App installieren. Es nutzt Ihre Datenbank und Ihr Login. Hier steht, warum wir es so gebaut haben.
Wir arbeiten seit vielen Jahren mit Helpdesks. Wir haben sie als Entwickler in Produkte eingebaut, und wir haben selbst darin Kundenanfragen beantwortet. Am längsten kennen wir Intercom. Als wir für devguard ein eigenes Helpdesk brauchten, wussten wir also genau, was wir suchen. Gefunden haben wir es nicht.
Intercom ist gut, aber teuer. Bezahlt wird pro Person im Support. Jede weitere Kollegin und jeder weitere Kollege kostet extra. Und die Gespräche mit Ihren Kunden liegen auf den Servern von Intercom.
Chatwoot ist Open Source, aber aufwendig. Wer es selbst betreibt, hat eine zweite Anwendung am Hals: eine Rails-App mit Postgres, Redis und Sidekiq und einem eigenen Login. Sie müssen sie hosten und aktuell halten, oder Sie bezahlen für Chatwoot Cloud. In beiden Fällen müssen Sie sie mit Ihrem Produkt verbinden, damit sie Ihre Kunden kennt.
Beide Lösungen stehen neben Ihrem Produkt. Sie wissen nichts über Ihre Kunden, solange Sie es ihnen nicht mitteilen.
Wir wollten etwas Einfaches. Ein Paket, das man installiert, und kein System, das man betreiben muss.
Wir wollten etwas, das mit uns wächst. Die zehnte Person im Support soll gleich viel kosten wie die erste, nämlich nichts. Und keine Funktion soll erst im teureren Abo verfügbar sein.
Wir wollten die Daten bei uns behalten. Die Gespräche mit unseren Kunden gehören in unsere eigene Datenbank, in unsere eigenen Backups.
Helpdesks gibt es viele, und wir wollten nicht einfach noch eines bauen. Aber wir bauen seit Jahren Produkte, und wir kennen Helpdesks aus der täglichen Arbeit. Wir wussten, was uns fehlt, und wir wussten, wie man es baut.
So ist Better Helpdesk entstanden. Sie installieren es mit npm in Ihre bestehende Next.js-App. Dort läuft es: im selben Prozess, mit Ihrer Datenbank und mit Ihrem Login.
Man kann es sich so vorstellen: Sie bauen ein Zimmer an Ihr Haus an, statt ein Büro am anderen Ende der Stadt zu mieten. Das Büro braucht eigene Schlüssel und eine eigene Heizung. Das Zimmer nutzt einfach, was schon da ist.
Im Code sind das drei Dateien:
// app/api/helpdesk/[...slug]/route.ts: every helpdesk route, one handlerimport { helpdesk } from "@/lib/helpdesk";const handle = (request: Request) => helpdesk.handler(request);export { handle as GET, handle as POST, handle as PATCH, handle as PUT, handle as DELETE, handle as OPTIONS,};
// app/helpdesk/[[...slug]]/page.tsx: the inbox, for your support teamimport { HelpdeskAdmin } from "better-helpdesk/admin";export default () => ( <HelpdeskAdmin api="/api/helpdesk" basePath="/helpdesk" locale="en" />);
// app/layout.tsx: the widget, for your customersimport { HelpdeskWidget } from "better-helpdesk/widget";<HelpdeskWidget inbox="support" locale="en" />;
Dazu kommt eine vierte Datei, lib/helpdesk.ts. Sie verbindet das Helpdesk mit Ihrer Datenbank und Ihrem Login. Eine Zeile in next.config und ein Befehl für die Datenbanktabellen, und es läuft.
Ihr Login. Sie schreiben eine einzige Funktion, identify(request). Sie sagt dem Helpdesk, wer angemeldet ist und ob die Person zum Support-Team gehört. Sie müssen keine zusätzlichen Konten anlegen und niemanden einladen. Ein angemeldeter Kunde öffnet das Widget und sieht sofort seine bisherigen Anfragen.
Ihre Datenbank. Anfragen, Kontakte und Firmen sind normale Tabellen in Ihrer Datenbank. Unterstützt werden Postgres, MySQL, SQL Server und SQLite. Auf Postgres und SQL Server liegen die Tabellen im Schema helpdesk, auf MySQL und SQLite tragen sie das Präfix helpdesk_. Sie können die Support-Daten direkt mit Ihren eigenen Tabellen auswerten. Auf Postgres sieht das zum Beispiel so aus:
select o.plan, count(*) as open
from helpdesk.conversation c
join helpdesk.company co on co.id = c.company_id
join organizations o on o.id::text = co.external_org_id -- your table
where c.status = 'open'
group by o.plan;Der Zusammenhang. Meldet ein Kunde einen Fehler, schickt das Widget die wichtigsten Angaben gleich mit: die Seite, die Bildschirmgrösse, die Sprache, die Version Ihrer App und die letzten JavaScript-Fehler. Der Kunde sieht, was mitgeschickt wird, und kann einzelne Angaben weglassen. Mit der Funktion resolveContext ergänzen Sie, was Ihre App über die Firma des Kunden weiss, zum Beispiel das Abo und die Anzahl Lizenzen. Ihr Support-Team sieht das direkt neben der Anfrage.
Ihr Design. Widget und Inbox übernehmen Ihre Farben, Ihre Schrift und Ihre Eckenradien über CSS-Variablen (--helpdesk-*). Mit theme="auto" passt sich das Widget dem Dark Mode des Betriebssystems an.
Direkter Zugriff aus Ihrem Code. Ihr Servercode ruft das Helpdesk als normale Funktion auf. Schlägt eine Zahlung fehl, kann Ihr Billing-Webhook automatisch eine Anfrage für den Kunden eröffnen. Wechselt ein Kunde das Abo, erscheint das in seinem Verlauf. Dazu braucht es keine REST-Schnittstelle. Weil ein Webhook kein Login mitbringt, signieren Sie dort ein kurzlebiges Token für den Kunden.
Die beste Technik nützt nichts, wenn die tägliche Arbeit mühsam ist. Darauf haben wir besonders geachtet.
Sie können mehrere Inboxen führen, zum Beispiel eine für Support und eine für Sales. Jede Anfrage hat eine Referenz wie ACME-1042, die ein Kunde auch am Telefon nennen kann. Dazu kommen Priorität, Tags und eine zuständige Person. Ihr Team kann Anfragen auf später zurückstellen, mit Textbausteinen antworten, interne Notizen schreiben und Kolleginnen und Kollegen darin erwähnen. Die ganze Inbox lässt sich mit der Tastatur bedienen. Und wenn zwei Personen dieselbe Anfrage geöffnet haben, sehen es beide.
E-Mail funktioniert in beide Richtungen. Antworten gehen über Ihren eigenen Absender hinaus. Antwortet der Kunde per E-Mail, landet seine Nachricht wieder in der richtigen Anfrage. Die DKIM-Signatur wird dabei geprüft.
Für Teams mit vereinbarten Reaktionszeiten gibt es Service-Levels. Sie legen pro Kundenstufe und Priorität fest, wie schnell geantwortet und gelöst werden soll. Die Uhr hält an, solange Sie auf den Kunden warten. Die Statistik zeigt, wie oft die Ziele erreicht wurden.
Ein kleines CRM ist auch dabei. Kontakte und Firmen kommen direkt aus Ihrer App, niemand muss sie von Hand erfassen. Zu jedem Kontakt gibt es einen Verlauf, eine Lead-Stufe und eigene Felder.
Die meisten Helpdesks haben einen Regel-Editor mit vielen Auswahlfeldern: «Wenn ein Fehler dringend ist, melde ihn in Slack.» Better Helpdesk hat dafür eine Funktion. onEvent wird bei jeder neuen Anfrage, jeder Nachricht und jeder Änderung aufgerufen. Was dann passiert, bestimmen Sie in Ihrem eigenen Code:
onEvent: async event => { const { conversation } = event; if (event.kind !== 'conversation.created') return; if (conversation.type !== 'bug' || conversation.priority !== 'urgent') return; await fetch(process.env.SLACK_WEBHOOK_URL!, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ text: `Urgent bug ${helpdesk.reference(conversation)}: ${conversation.subject}`, }), });},
Die Regel liegt in Ihrem Repository und durchläuft denselben Review wie jede andere Änderung. Auf dieselbe Art können Sie Anfragen nach Abo zuweisen, ein Ticket in Ihrem Issue-Tracker eröffnen oder jemanden alarmieren, wenn ein Service-Level verpasst wird.
Einiges haben wir absichtlich weggelassen. Das steht auch so in der Roadmap.
Es gibt kein eigenes Login, denn Ihre Benutzer sind bereits angemeldet. Es gibt keine gehostete Version: Better Helpdesk läuft dort, wo Ihre App läuft, und wir sehen Ihre Daten nie. Sie müssen deshalb auch keinen Vertrag zur Auftragsbearbeitung mit uns abschliessen. Es gibt keine Kosten pro Person und keine kostenpflichtigen Zusatzfunktionen. Alles steht unter der MIT-Lizenz. Und es gibt keine KI, die Ihren Kunden antwortet. Eine KI kann Anfragen einordnen und Antworten vorschlagen. Abgeschickt wird jede Antwort von einem Menschen.
Better Helpdesk hat auch weniger Kanäle als andere Lösungen. Anfragen kommen über das Widget und per E-Mail, mehr nicht. Wenn Sie WhatsApp im Support brauchen, ist es nicht das Richtige für Sie.
Die erste Version erschien am 28. September 2026 auf npm. Version 1.0.0 folgte am 22. Oktober, aktuell ist 1.2.0. Neben dem Beschriebenen gibt es Rollen (Agent, Supervisor, Viewer), ein Audit-Log und Dateianhänge. Die Oberfläche gibt es auf Deutsch, Französisch, Italienisch und Englisch. Das Paket selbst hat nur vier Abhängigkeiten: kysely, zod, mailparser und mailauth.
Wir setzen Better Helpdesk bei devguard produktiv ein. Das ist bisher der einzige produktive Einsatz, den wir nennen können, und es ist unser eigenes Unternehmen. Bitte ordnen Sie das entsprechend ein.
Die Demo auf better-helpdesk.com/demo läuft ohne Installation und ohne Konto. Schreiben Sie als Kunde eine Nachricht, wechseln Sie die Rolle und antworten Sie als Support. Unten auf der Seite sehen Sie die Einträge direkt in der Datenbank.
Uns interessiert vor allem eines: Was fehlt Ihnen, damit Sie es einsetzen würden? Schreiben Sie es uns als Issue auf GitHub.
Starten Sie kostenlos, bringen Sie Ihre Frameworks mit, und die Nachweise bleiben an der Arbeit, während sie ausgeliefert wird, ohne Setup-Reibung, ohne Feuerwehrübung in der Audit-Woche.
Starten Sie kostenlos, bringen Sie Ihre Frameworks mit, und die Nachweise bleiben an der Arbeit, während sie ausgeliefert wird, ohne Setup-Reibung, ohne Feuerwehrübung in der Audit-Woche.