Better Auth Studio provides helper functions to create event ingestion providers for popular databases.
createPostgresProvider
Create a PostgreSQL event ingestion provider. Supports pg, Prisma, and Drizzle clients.
function createPostgresProvider ( options : {
client : any ;
tableName ?: string ;
schema ?: string ;
clientType ?: "postgres" | "prisma" | "drizzle" ;
}) : EventIngestionProvider
Parameters
The database client instance:
pg : Pool or Client instance
Prisma : PrismaClient instance
Drizzle : Drizzle instance wrapping pg or postgres-js
tableName
string
default: "auth_events"
Name of the table to store events
clientType
'postgres' | 'prisma' | 'drizzle'
Type of client being used. Auto-detected if not provided.
Examples
pg (node-postgres)
Prisma
Drizzle
import { Pool } from "pg" ;
import { createPostgresProvider } from "better-auth-studio" ;
const pool = new Pool ({
connectionString: process . env . DATABASE_URL ,
});
const provider = createPostgresProvider ({
client: pool ,
tableName: "auth_events" ,
schema: "public" ,
clientType: "postgres" ,
});
createSqliteProvider
Create a SQLite event ingestion provider using better-sqlite3.
function createSqliteProvider ( options : {
client : any ;
tableName ?: string ;
}) : EventIngestionProvider
Parameters
better-sqlite3 Database instance
tableName
string
default: "auth_events"
Name of the table to store events
Example
import Database from "better-sqlite3" ;
import { createSqliteProvider } from "better-auth-studio" ;
const db = new Database ( "./data.db" );
const provider = createSqliteProvider ({
client: db ,
tableName: "auth_events" ,
});
createNodeSqliteProvider
Create a SQLite event ingestion provider using Node.js built-in SQLite (Node 22.5+).
function createNodeSqliteProvider ( options : {
client : any ;
tableName ?: string ;
}) : EventIngestionProvider
Parameters
node:sqlite DatabaseSync instance (requires Node.js 22.5+)
tableName
string
default: "auth_events"
Name of the table to store events
Example
import { DatabaseSync } from "node:sqlite" ;
import { createNodeSqliteProvider } from "better-auth-studio" ;
const db = new DatabaseSync ( ":memory:" );
// or
// const db = new DatabaseSync("./data.db");
const provider = createNodeSqliteProvider ({
client: db ,
tableName: "auth_events" ,
});
createClickHouseProvider
Create a ClickHouse event ingestion provider for high-volume event storage.
function createClickHouseProvider ( options : {
client : any ;
table ?: string ;
database ?: string ;
}) : EventIngestionProvider
Parameters
ClickHouse client instance (from @clickhouse/client)
table
string
default: "auth_events"
Name of the table to store events
ClickHouse database name. If provided, uses database.table format.
Example
import { createClient } from "@clickhouse/client" ;
import { createClickHouseProvider } from "better-auth-studio" ;
const client = createClient ({
host: process . env . CLICKHOUSE_HOST ,
username: process . env . CLICKHOUSE_USER ,
password: process . env . CLICKHOUSE_PASSWORD ,
});
const provider = createClickHouseProvider ({
client ,
table: "auth_events" ,
database: "analytics" ,
});
createHttpProvider
Create an HTTP event ingestion provider that sends events to a remote endpoint.
function createHttpProvider ( options : {
url : string ;
client ?: typeof fetch ;
headers ?: Record < string , string >;
transform ?: ( event : AuthEvent ) => any ;
}) : EventIngestionProvider
Parameters
The HTTP endpoint URL to send events to
client
typeof fetch
default: "fetch"
Custom fetch implementation (useful for adding interceptors)
Additional HTTP headers to include with requests
transform
(event: AuthEvent) => any
Optional function to transform the event before sending
Example
import { createHttpProvider } from "better-auth-studio" ;
const provider = createHttpProvider ({
url: "https://api.example.com/events" ,
headers: {
"Authorization" : `Bearer ${ process . env . API_KEY } ` ,
"X-Service" : "better-auth" ,
},
transform : ( event ) => ({
// Transform to match your API's expected format
event_type: event . type ,
timestamp: event . timestamp . toISOString (),
user_id: event . userId ,
data: event . metadata ,
}),
});
createStorageProvider
Create a provider using Better Auth’s storage adapter interface.
function createStorageProvider ( options : {
adapter : any ;
tableName ?: string ;
}) : EventIngestionProvider
Parameters
Better Auth storage adapter instance
tableName
string
default: "auth_events"
Name of the table/collection to store events
Example
import { createStorageProvider } from "better-auth-studio" ;
import { prismaAdapter } from "better-auth/adapters/prisma" ;
import { PrismaClient } from "@prisma/client" ;
const prisma = new PrismaClient ();
const adapter = prismaAdapter ( prisma );
const provider = createStorageProvider ({
adapter ,
tableName: "auth_events" ,
});
Usage with defineStudioConfig
All helper functions return an EventIngestionProvider that can be used with defineStudioConfig:
import { defineStudioConfig , createPostgresProvider } from "better-auth-studio" ;
import { Pool } from "pg" ;
const pool = new Pool ({ connectionString: process . env . DATABASE_URL });
export const studioConfig = defineStudioConfig ({
events: {
enabled: true ,
provider: createPostgresProvider ({ client: pool }),
batchSize: 100 ,
flushInterval: 5000 ,
},
});