Core types
ChurnKitOptions
Copy
Ask AI
interface ChurnKitOptions {
apiKey: string
env?: 'production' | 'staging'
baseUrl?: string
timeout?: number // default: 15000ms
maxRetries?: number // default: 3
onRequest?: (ctx: RequestContext) => void | Promise<void>
onResponse?: (ctx: ResponseContext) => void | Promise<void>
}
CallOptions
Copy
Ask AI
interface CallOptions {
signal?: AbortSignal
}
UserTraits
Copy
Ask AI
interface UserTraits {
plan?: string
mrr?: number
email?: string
name?: string
company?: string
signedUpAt?: string
[key: string]: string | number | boolean | null | undefined
}
EventProperties
Copy
Ask AI
interface EventProperties {
[key: string]: string | number | boolean | null | undefined
}
BulkEventItem
Copy
Ask AI
interface BulkEventItem {
userId: string
event: string
properties?: EventProperties
timestamp?: string // ISO 8601
}
Risk types
RiskScore
Copy
Ask AI
interface RiskScore {
userId: string
score: number // 0.0 → 1.0
tier: RiskTier // 'low' | 'medium' | 'high'
signals: string[]
recommendation: string
}
AtRiskUser
Copy
Ask AI
interface AtRiskUser {
userId: string
score: number
tier: RiskTier
signals: string[]
recommendation: string
}
AtRiskResult
Copy
Ask AI
interface AtRiskResult {
users: AtRiskUser[]
total: number
offset: number
limit: number
}
AtRiskOptions
Copy
Ask AI
interface AtRiskOptions {
threshold?: number // default: 0.5
plan?: string
limit?: number // default: 50, max: 200
offset?: number // default: 0
signal?: AbortSignal
}
AtRiskAllOptions
Copy
Ask AI
interface AtRiskAllOptions {
threshold?: number
plan?: string
pageSize?: number // default: 100
}
RiskTier
Copy
Ask AI
type RiskTier = 'low' | 'medium' | 'high'
Watch types
WatchOptions
Copy
Ask AI
interface WatchOptions {
threshold: number // required, 0–1
webhook: string // required, https:// URL
cooldown: CooldownString // required, e.g. '24h', '7d'
}
CooldownString
A string matching^[1-9]\d*[dh]$:
Copy
Ask AI
type CooldownString = string // '1h', '24h', '7d', '30d', etc.
WatchedUser
Copy
Ask AI
interface WatchedUser {
userId: string
threshold: number
webhook: string
cooldown: string
}
Batcher types
BatcherOptions
Copy
Ask AI
interface BatcherOptions {
flushInterval?: number // ms, default: 5000
maxSize?: number // default: 100, max: 500
onFlush?: (count: number) => void
onError?: (err: unknown) => void
}
EventBatcher
Copy
Ask AI
interface EventBatcher {
push(event: BulkEventItem): void
flush(): Promise<number>
destroy(): Promise<void>
}
Observability types
RequestContext
Copy
Ask AI
interface RequestContext {
method: string
url: string
headers: Record<string, string> // mutable — add custom headers here
body?: unknown
}
ResponseContext
Copy
Ask AI
interface ResponseContext {
method: string
url: string
status: number
durationMs: number
attempt: number // 0 = first attempt, 1 = first retry, etc.
}
Error types
ChurnKitError
Copy
Ask AI
class ChurnKitError extends Error {
readonly status?: number
readonly code?: ErrorCode | string
}
ErrorCode
Copy
Ask AI
const ErrorCode = {
ABORTED: 'ABORTED',
TIMEOUT: 'TIMEOUT',
NETWORK_ERROR: 'NETWORK_ERROR',
VALIDATION_ERROR: 'VALIDATION_ERROR',
UNAUTHORIZED: 'UNAUTHORIZED',
FORBIDDEN: 'FORBIDDEN',
NOT_FOUND: 'NOT_FOUND',
RATE_LIMITED: 'RATE_LIMITED',
SERVER_ERROR: 'SERVER_ERROR',
PAYLOAD_TOO_LARGE: 'PAYLOAD_TOO_LARGE',
} as const