Zum Inhalt springen

Better Auth vs. Clerk: Warum wir Better Auth nutzen

Für CTOs und EntwicklerCTO-Entscheidungen · Aktualisiert

Filip PapranecGründer, Digitaliko

Better Auth vs. Clerk. Illustration: links eine Nutzertabelle in Ihrer eigenen Datenbank, rechts ein gehostetes Nutzerverzeichnis hinter einer API, dazu die Frage, wo Ihre Sessions liegen.Better Auth vs. Clerk. Illustration: links eine Nutzertabelle in Ihrer eigenen Datenbank, rechts ein gehostetes Nutzerverzeichnis hinter einer API, dazu die Frage, wo Ihre Sessions liegen.

Better Auth vs. Clerk entscheidet sich an einer Frage: Wo liegen Ihre Nutzer und Sessions? Clerk hält sie in seinem gehosteten Dienst. Better Auth schreibt sie in Ihre eigene Datenbank, als normale Tabellen neben dem Rest der App.

Wir sind in jeder neuen App von NextAuth auf Better Auth gewechselt und haben Clerk nie gewählt. Ehrlich vorweg: Clerk haben wir nicht in Produktion betrieben. Das hier ist also kein Benchmark. Es erklärt, warum wir uns dagegen entschieden haben, mit den Konfigurationen, die bei uns wirklich laufen.

Was ist der Unterschied zwischen Better Auth und Clerk?

Better Auth ist eine Bibliothek. Sie beschreibt sich als „a framework-agnostic, universal authentication and authorization framework for TypeScript“ (Better-Auth-Dokumentation, Stand 24.10.2026). Sie steht unter MIT-Lizenz. Clerk ist ein gehosteter Dienst mit fertigen Anmeldekomponenten und einer Nutzerverwaltung.

Better AuthClerk
Was es istTypeScript-Bibliothek in Ihrem RepositoryGehosteter Auth-Dienst mit UI-Komponenten
Wo Nutzer und Sessions liegenTabellen in Ihrer DatenbankInfrastruktur von Clerk
PreisMIT, Sie zahlen eigene Datenbank und E-Mails0 USD bis 50.000 MRU pro App, danach kostenpflichtig (Preise, Stand 24.10.2026)
Anmelde-UIBauen Sie selbstFertige Komponenten
SicherheitsupdatesSie aktualisieren das Paket und releasenLiefert Clerk
Bestätigungs-E-Mails und Magic LinksIhr E-Mail-DienstVerschickt Clerk
WechselNichts zu verlassen, das Schema gehört IhnenNutzerexport mit gehashten Passwörtern, danach UI und Session-Prüfungen umbauen

Entschieden haben für uns die zweite und die dritte Zeile. Code, Daten und Infrastruktur gehören dem Kunden ab dem ersten Tag. Eine Nutzertabelle auf fremden Servern, bezahlt pro Nutzer, passt dazu nicht.

Warum sind wir von NextAuth auf Better Auth gewechselt?

Ältere Kunden-Apps laufen auf NextAuth v4 mit dem Prisma-Adapter. Sie laufen, und wir lassen sie in Ruhe. Eine Anmeldung, die funktioniert, schreiben wir nicht für einen Blogartikel neu.

Für neue Apps wurde die Entscheidung im September 2025 einfacher. Auth.js, früher NextAuth.js, ging an das Better-Auth-Team über. Die Ankündigung sagt es klar:

We strongly recommend new projects to start with Better Auth unless there are some very specific feature gaps.

Bereket Engida
Better Auth, Auth.js is now part of Better Auth (22.09.2025)

Die genannte Lücke sind zustandslose Sessions ohne Datenbank. Die Datenbank wollen wir sowieso, also betrifft es uns nicht.

Wie sieht Better Auth in einer echten App aus?

Das ist das Auth-Paket aus unserem Starter-Template, leicht gekürzt. TanStack Start auf Cloudflare Workers, Drizzle auf D1:

import { betterAuth } from 'better-auth'
import { drizzleAdapter } from 'better-auth/adapters/drizzle'
import { tanstackStartCookies } from 'better-auth/tanstack-start'
import { checkout, polar, portal } from '@polar-sh/better-auth'

export function createAuth() {
  const db = createDb()
  const plugins = [tanstackStartCookies()]

  // Zahlungen nur, wenn die App ein Zahlungs-Token hat.
  if (env.POLAR_ACCESS_TOKEN) {
    plugins.push(polar({ client: polarClient, createCustomerOnSignUp: true, use: [checkout({ /* Produkte */ }), portal()] }))
  }

  return betterAuth({
    database: drizzleAdapter(db, { provider: 'sqlite', schema }),
    trustedOrigins: [env.CORS_ORIGIN],
    emailAndPassword: { enabled: true },
    socialProviders: { /* Google und GitHub, nur wenn Schlüssel gesetzt sind */ },
    secret: env.BETTER_AUTH_SECRET,
    baseURL: env.BETTER_AUTH_URL,
    plugins,
  })
}

Auch das Schema gehört uns. Nutzer und Sessions sind Drizzle-Tabellen wie alle anderen:

const user = sqliteTable('user', {
  id: text('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull().unique(),
  emailVerified: integer('email_verified', { mode: 'boolean' }).default(false).notNull(),
})

const session = sqliteTable('session', {
  id: text('id').primaryKey(),
  token: text('token').notNull().unique(),
  expiresAt: integer('expires_at', { mode: 'timestamp_ms' }).notNull(),
  userId: text('user_id').notNull().references(() => user.id, { onDelete: 'cascade' }),
})
Better Auth vs. Clerk als zwei Fenster. Links Better Auth: Die Tabellen user, session und account liegen in Ihrer eigenen Datenbank neben den App-Tabellen, und Plugins wie Passkeys, Zwei-Faktor-Anmeldung und Organisationen laufen als Code in Ihrem Repository. Rechts Clerk: ein gehostetes Nutzerverzeichnis mit fertiger Anmelde-UI, abgerechnet pro MRU (monthly retained user), die App spricht per API mit ihm.Better Auth vs. Clerk als zwei Fenster. Links Better Auth: Die Tabellen user, session und account liegen in Ihrer eigenen Datenbank neben den App-Tabellen, und Plugins wie Passkeys, Zwei-Faktor-Anmeldung und Organisationen laufen als Code in Ihrem Repository. Rechts Clerk: ein gehostetes Nutzerverzeichnis mit fertiger Anmelde-UI, abgerechnet pro MRU (monthly retained user), die App spricht per API mit ihm.

Das ist der praktische Unterschied. Ein Datensatz, den ein Nutzer angelegt hat, ist ein Fremdschlüssel auf user.id in derselben Datenbank. Eine Auswertung „wer hat was getan“ ist ein SQL-Join, kein Aufruf einer externen API plus Sync-Job.

Wie wird die Anmeldung Teil Ihres eigenen Codes?

Unsere interne Cockpit-App zeigt, wie weit das geht. Registrieren darf sich nur eine kurze Liste von Personen, und nur über GitHub. Keine Einstellung bei einem Anbieter macht das. Es sind ein paar Zeilen in einem Datenbank-Hook:

return betterAuth({
  database: drizzleAdapter(db, { provider: 'sqlite', schema }),
  emailAndPassword: { enabled: false },
  databaseHooks: {
    user: {
      create: {
        before: async (user) => {
          if (allowedEmails.length > 0 && !allowedEmails.includes(user.email.toLowerCase())) return false
        },
      },
    },
  },
  socialProviders: { github: { clientId, clientSecret, scope: ['repo', 'read:user', 'user:email'] } },
})

Was bei einer Registrierung passiert:

  1. Anmeldung über GitHub

    Die Person meldet sich über GitHub an. Die App fragt nach Repository-Zugriff, weil sie Issues und Pull Requests liest.

  2. Der Hook läuft vor dem Insert

    databaseHooks.user.create.before bekommt den neuen Nutzer, bevor er geschrieben wird.

  3. Nicht auf der Liste: kein Nutzer

    Die Rückgabe false stoppt den Insert. Es entsteht weder Nutzerzeile noch Session.

  4. Auf der Liste: eine Session-Zeile

    Nutzer und Session landen in der eigenen D1-Datenbank der App, lesbar mit jedem SQL-Client.

Die Allowlist ist eine Umgebungsvariable. Sie zu ändern ist ein Deploy, der wie jede andere Änderung reviewt wird. Bei einem gehosteten Dienst läge dieselbe Regel in einem Dashboard oder einem Webhook außerhalb des Repositorys.

Welche Better-Auth-Plugins laufen bei uns in Produktion?

Jedes Plugin ist Code im Repository, die Liste ist also leicht zu prüfen:

  • Unser Starter-Template: tanstackStartCookies und das Polar-Billing-Plugin (Checkout und Kundenportal, ein Kunde entsteht bei der Registrierung). Polar kommt nur dazu, wenn das Token existiert.
  • Eine Web-App für einen Kunden: Better Auth innerhalb von Payload CMS mit admin, organization, twoFactor, emailOTP, magicLink, multiSession und dem Passkey-Plugin.
  • Ein Kunde mit Online-Marktplatz: ein eigener Auth-Dienst auf MongoDB mit magicLink und oidcProvider. Die anderen Apps des Marktplatzes melden sich darüber an, wie über jeden OpenID-Connect-Anbieter.

Drei Datenbanken, drei Setups, eine Bibliothek. Das schätzen wir am meisten: Dieselbe Bibliothek passt zu SQLite am Edge, zu Postgres hinter einem CMS und zu MongoDB in einem eigenen Dienst.

Wann ist Clerk die bessere Wahl?

Clerk ist sinnvoll, wenn die Anmeldung diese Woche fertig sein soll und niemand im Team Auth-Code verantworten soll. Fertige Komponenten sparen die Screens. Clerk verschickt die E-Mails und patcht den Dienst. Für einen Prototyp ist der kostenlose Plan großzügig: 50.000 MRU (monthly retained users) pro App, Pro für 25 USD im Monat und 0,02 USD pro Nutzer von 50.001 bis 100.000 (Clerk-Preise, Stand 24.10.2026).

Der Lock-in ist kleiner als gedacht. Admins exportieren Nutzer samt gehashten Passwörtern als CSV (Clerk-Dokumentation, Stand 24.10.2026). Die Daten sind keine Geisel. Arbeit macht alles, was daran hängt: Anmelde-UI, Session-Prüfungen auf dem Server und Nutzerdaten, die Sie in eigene Tabellen kopiert haben.

Noch ein Fakt zum Abwägen. Better Auth hat sich am 7. Juli 2026 Vercel angeschlossen. Der Beitrag sagt: „Vercel shares our commitment to keeping auth open source, framework and platform agnostic.“ (Better-Auth-Blog). Die MIT-Lizenz bleibt, was sie ist. Wir notieren es, wie jeden Eigentümerwechsel einer Abhängigkeit, auf die wir bauen.

Was übernehmen Sie, wenn Ihnen die Anmeldung gehört?

Eigene Anmeldung ist nicht ohne Arbeit. Sie verschiebt die Arbeit nur zu Ihrem Team. Bevor Sie Better Auth wählen, gehen Sie diese Liste durch:

Der letzte Punkt ist die günstigste Versicherung. Unser Starter führt genau dafür Playwright-Tests aus: Das Login-Formular wird gerendert, die Registrierung funktioniert, und das Dashboard leitet ohne Session zum Login um.

Wie wir App-Daten auf dieser Anmeldung für KI-Agenten öffnen, steht in MCP-Server bauen: Anleitung, und wann Sie es lassen.

Möchten Sie eine Anmeldung, die in Ihrer Datenbank bleibt?

Web-Apps, in denen Nutzer, Sessions und Berechtigungen in der eigenen Datenbank des Kunden liegen, bauen wir im Rahmen von Webanwendungen nach Maß. Code, Daten und Infrastruktur gehören dem Kunden ab dem ersten Tag. KI schreibt heute unseren gesamten Code, und ein Senior steht für das Ergebnis gerade. Seit 2023 haben wir 15+ Produktionsprojekte geliefert.

Wir melden uns innerhalb von zwei Arbeitstagen und wählen gemeinsam, was wir zuerst lösen.

Wenn Sie lieber zuerst sprechen möchten, buchen Sie ein 15-Minuten-Meeting mit Filip.

Wo liegen Ihre Nutzer heute, und kämen Sie mit einem SQL-Join an sie heran?

Kurz gesagt

  • Better Auth speichert Nutzer und Sessions in Ihrer Datenbank. Clerk hält sie in seinem gehosteten Dienst.
  • Für neue Apps sind wir von NextAuth auf Better Auth gewechselt, funktionierende NextAuth-Apps bleiben, wie sie sind.
  • Mit Better Auth ist eine Regel wie eine E-Mail-Allowlist ein paar Zeilen in Ihrem Repository.
  • Clerk passt, wenn niemand Auth-Code verantworten soll. Nutzer lassen sich später exportieren, das Umbauen kostet aber Arbeit.

Häufige Fragen

Was ist der Unterschied zwischen Better Auth und Clerk?

Better Auth ist eine Open-Source-Bibliothek für TypeScript, die Nutzer und Sessions in Ihrer eigenen Datenbank speichert. Clerk ist ein gehosteter Dienst, der sie für Sie speichert und fertige Anmelde-UI liefert. Sie wählen zwischen Kontrolle ohne Preis pro Nutzer und weniger eigenem Code.

Was kostet Better Auth?

Better Auth steht unter MIT-Lizenz, für die Bibliothek zahlen Sie nichts. Sie zahlen, worauf sie läuft: Datenbank, Hosting und den E-Mail-Dienst, der Bestätigungslinks und Magic Links verschickt.

Was kostet Clerk?

Stand 24.10.2026 kostet der Hobby-Plan 0 USD mit einem Limit von 50.000 MRU (monthly retained users) pro App, Pro kostet 25 USD im Monat (20 USD bei jährlicher Zahlung), und Nutzer 50.001 bis 100.000 kosten je 0,02 USD im Monat. Aktuelle Zahlen stehen auf clerk.com/pricing.

Lohnt sich der Wechsel von NextAuth zu Better Auth?

Für neue Projekte ja: Auth.js wird heute vom Better-Auth-Team gepflegt, und das empfiehlt Better Auth für neue Arbeit. Eine funktionierende NextAuth-App schreiben wir nicht nur deshalb um. Wir wechseln, wenn die App eine Funktion braucht, die NextAuth nicht hat.

Kann man Clerk später verlassen?

Ja. Admins exportieren Nutzer samt gehashten Passwörtern als CSV aus dem Dashboard. Arbeit macht der Rest: Anmelde-UI, Session-Prüfungen auf dem Server und Nutzerdaten, die Sie in eigene Tabellen kopiert haben.

Fragen Sie eine KI zu diesem Artikel

Die KI nutzt dabei auch unsere anderen Artikel und Erfahrung aus echten Projekten.

ChatGPTClaudePerplexity
Engineering

Weitere Artikel

CTO-Entscheidungen

Claude Code Preise fürs Team: Pläne, API und Agenten

Claude Code Pricing laut der öffentlichen Preisliste von Anthropic (Oktober 2026): Pro, Max, Team-Seats, Enterprise und API-Tokens. Was zu Entwicklern passt, worauf ein dauerhaft laufender Agent und ein CI-Reviewer laufen, und die Leitplanken, die einen Hintergrund-Agenten davon abhalten, das Budget zu verbrennen.

CTO-Entscheidungen

Vercel-Alternativen: warum wir Vercel und Cloudflare nutzen

Wir haben Vercel nicht ersetzt, wir haben die Arbeit aufgeteilt. Next.js-Websites bleiben auf Vercel, neue Apps laufen auf Cloudflare Workers und D1, in TypeScript mit Alchemy beschrieben. Preise mit Quellen, unsere Konfiguration und der blockierte Deploy eines KI-Agenten.

CTO-Entscheidungen

Drizzle vs Prisma: warum wir beide in Produktion nutzen

Drizzle vs Prisma aus zwei ORMs, die wir in Produktion betreiben: Prisma auf Postgres in älteren Kunden-Apps, Drizzle auf Cloudflare D1 in allem Neuen. Echte Konfiguration, der Migrationsablauf, was Prisma 7 geändert hat und wann wir nicht wechseln würden.

Zeit, mit dem Planen aufzuhören und das Problem zu lösen.

Kontakt

  • Digitaliko s.r.o.
    Šípková 377/17
    958 03 Malé Uherce, Slowakei
  • Melden Sie sich bei uns
    info@digitaliko.com
    +421 950 595 506
    WhatsApp