Registry /
auth-security / better-auth-organization-member
Install & Compatibility
Where this runs
tested against v? · npm install
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
muslnode 18–226 runs
build_error
glibcnode 18–226 runs
build_error
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
organizationMember
✓ import { organizationMember } from 'better-auth-organization-member'
✗ const { organizationMember } = require('better-auth-organization-member')
ESM-only since v1; ships types
organizationMemberClient
✓ import { organizationMemberClient } from 'better-auth-organization-member/client'
✗ import { organizationMemberClient } from 'better-auth-organization-member'
Client-side plugin is in /client subpath; not exported from main entry
inferOrgMemberAdditionalFields
✓ import { inferOrgMemberAdditionalFields } from 'better-auth-organization-member/client'
✗ import { inferOrgMemberAdditionalFields } from 'better-auth-organization-member'
Helper for full type inference, exported from /client only
Shows server and client setup with custom additional fields, automatic hook injection, and member update call.
import { betterAuth } from 'better-auth';
import { organization } from 'better-auth/plugins';
import { organizationMember } from 'better-auth-organization-member';
export const auth = betterAuth({
plugins: [
organization({
schema: {
member: {
additionalFields: {
firstName: { type: 'string', input: true, required: false },
lastName: { type: 'string', input: true, required: false },
avatar: { type: 'string', input: true, required: false },
},
},
invitation: {
additionalFields: {
firstName: { type: 'string', input: true, required: false },
lastName: { type: 'string', input: true, required: false },
avatar: { type: 'string', input: true, required: false },
},
},
},
}),
organizationMember({
schema: {
member: {
additionalFields: {
firstName: { type: 'string', input: true, required: false },
lastName: { type: 'string', input: true, required: false },
avatar: { type: 'string', input: true, required: false },
},
}
},
organizationMemberHooks: {
async beforeUpdateMember(data) {
return { data: { ...data.updates } };
},
},
}),
],
});
// Client setup
import { createAuthClient } from 'better-auth/client';
import { organizationClient } from 'better-auth/client/plugins';
import { organizationMemberClient, inferOrgMemberAdditionalFields } from 'better-auth-organization-member/client';
import type { auth } from './auth';
const client = createAuthClient({
plugins: [
organizationClient({
schema: inferOrgMemberAdditionalFields<typeof auth>()
}),
organizationMemberClient({
schema: inferOrgMemberAdditionalFields<typeof auth>()
})
],
});
// Update member
await client.organization.updateMember({
memberId: 'member-id',
data: {
role: 'admin',
firstName: 'Jane',
lastName: 'Doe',
avatar: 'https://example.com/avatar.png'
}
});
Errors
Common errors & fixes
ERR_REQUIRE_ESM
Using require() on ESM-only package better-auth-organization-member
fixChange to import statement or use dynamic import(). Also ensure 'type': 'module' in package.json
TypeError: Cannot read properties of undefined (reading 'additionalFields')
organizationMember plugin not added after organization plugin, or organization plugin missing schema
fixAdd organization plugin before organizationMember, and define schema for member.additionalFields if using custom fields
Module not found: Error: Can't resolve 'better-auth-organization-member/client'
Missing installation or incorrect path; package must be installed
fixRun npm install better-auth-organization-member. If using TypeScript, ensure moduleResolution is set to bundler or node16
TypeScript error: Type '{}' is not assignable to type 'InferOrgMemberAdditionalFields<AuthType>'
Passing auth object type incorrectly; inferOrgMemberAdditionalFields expects a generic type parameter
fixUse inferOrgMemberAdditionalFields<typeof auth>() properly; ensure auth is exported as a type
Error: afterAcceptInvitation hook already exists
Manually defining afterAcceptInvitation hook in organization plugin conflicts with automatic injection
fixRemove manually defined afterAcceptInvitation hook from organization plugin config; let organizationMember handle it
Audit
Dependencies
@better-auth/oauth-providerrequiredPeer dependency; required for OAuth provider integration
better-authrequiredPeer dependency; core authentication library