Better Auth, configured for production
Email + password with verification, OAuth, sessions, and the organization, Stripe and admin plugins wired in the right order — not a bare quickstart.
export const auth = betterAuth({
database: drizzleAdapter(db, { provider: "pg", schema }),
emailAndPassword: { enabled: true, requireEmailVerification: true },
socialProviders: socialProviders(), // GitHub live, Google one flag away
plugins: [
organization({ creatorRole: "owner", invitationExpiresIn: WEEK }),
stripePlugin({ subscription: { enabled: true, plans } }),
admin({ adminRoles: ["admin"] }),
nextCookies(), // must stay last
],
});