Node Server Integration
Use @drivemetadata-ai/sdk/node for backend events only.
Do not use the browser SDK in server code. Browser analytics depends on DOM, cookies, localStorage, sessionStorage, page lifecycle, and session behavior.
Install
npm install @drivemetadata-ai/sdk
Create Client
import { createDmdServerClient } from '@drivemetadata-ai/sdk/node';
const dmd = createDmdServerClient({
clientId: 'client_xxx',
workspaceId: 'workspace_xxx',
appId: 'app_xxx',
token: process.env.DMD_SERVER_TOKEN!,
endpoint: 'https://sdk.drivemetadata.com/v2/data-collector',
timeoutMs: 5000,
retry: {
attempts: 3,
minDelayMs: 250,
maxDelayMs: 2000
}
});
Track Event
await dmd.track({
userId: 'user_123',
event: 'Invoice Paid',
messageId: 'evt_123',
idempotencyKey: 'invoice_123',
properties: {
amount: 500,
currency: 'USD'
}
});
Idempotency
Pass messageId when you already have a unique event ID and idempotencyKey when retrying business events such as orders, invoices, or subscriptions.
await dmd.track({
userId: 'user_123',
event: 'Order Completed',
messageId: 'evt_123',
idempotencyKey: 'order_123'
});
Batch
await dmd.batch([
{ type: 'track', payload: { userId: 'user_123', event: 'Order Completed' } },
{ type: 'identify', payload: { userId: 'user_123', traits: { plan: 'pro' } } }
]);
Identify User
await dmd.identify({
userId: 'user_123',
traits: {
plan: 'enterprise',
seats: 25
}
});
Page Event
await dmd.page({
userId: 'user_123',
name: 'Billing Settings',
properties: {
source: 'server_render'
}
});
Alias User
await dmd.alias({
previousId: 'anonymous_123',
userId: 'user_123'
});
Group User
await dmd.group({
userId: 'user_123',
groupId: 'account_456',
traits: {
companyName: 'Acme Inc'
}
});
Runtime Requirements
The Node SDK requires Node.js 18+ because it uses global fetch. For older runtimes, pass a custom fetch implementation:
const dmd = createDmdServerClient({
clientId: 'client_xxx',
workspaceId: 'workspace_xxx',
appId: 'app_xxx',
token: process.env.DMD_SERVER_TOKEN!,
fetch: customFetch
});
Server Key Safety
Use @drivemetadata-ai/sdk/node only in server runtimes. Never import this entry point from browser bundles, React client components, Angular browser bundles, or Next.js client components.
Store server keys in backend-only environment variables:
const dmd = createDmdServerClient({
clientId: 'client_xxx',
workspaceId: 'workspace_xxx',
appId: 'app_xxx',
token: process.env.DMD_SERVER_TOKEN!,
timeoutMs: 3000
});
Reliability
Use timeoutMs to cap request time and retry to retry transient failures such as 408, 429, and 5xx responses. Timeout timers are cleaned up after each request settles.