Official API SDK for Datalyr server-side tracking with identity resolution support.
npm install @datalyr/api
# or
yarn add @datalyr/api
# or
pnpm add @datalyr/api
const { Datalyr } = require('@datalyr/api');
// or
import { Datalyr } from '@datalyr/api';
// Initialize with your API key
const datalyr = new Datalyr('your_api_key_here');
// Track an event
await datalyr.track('user_123', 'Purchase Completed', {
amount: 99.99,
currency: 'USD',
products: ['item_1', 'item_2']
});
// Identify a user
await datalyr.identify('user_123', {
email: 'user@example.com',
name: 'John Doe',
plan: 'premium'
});
// Track a pageview
await datalyr.page('user_123', 'Homepage', {
url: 'https://example.com',
referrer: 'https://google.com'
});
// Group a user
await datalyr.group('user_123', 'company_456', {
name: 'Acme Corp',
industry: 'Technology'
});
// Clean up when done
await datalyr.close();
The SDK now supports anonymous IDs for complete user journey tracking:
// Option 1: Pass anonymous_id from browser/mobile for attribution preservation
await datalyr.track({
event: 'Purchase Completed',
userId: 'user_123',
anonymousId: req.body.anonymous_id, // From browser/mobile SDK
properties: {
amount: 99.99,
currency: 'USD'
}
});
// Option 2: Use legacy signature (SDK generates anonymous_id)
await datalyr.track('user_123', 'Purchase Completed', {
amount: 99.99
});
// Get the SDK's anonymous ID (useful for server-only tracking)
const anonymousId = datalyr.getAnonymousId();
app.post('/api/purchase', async (req, res) => {
const { items, anonymous_id } = req.body; // anonymous_id from browser
// Track with anonymous_id to preserve attribution (fbclid, gclid, etc.)
await datalyr.track({
event: 'Purchase Completed',
userId: req.user?.id,
anonymousId: anonymous_id, // Links to browser events!
properties: {
total: calculateTotal(items),
items: items.length
}
});
res.json({ success: true });
});
- Attribution Preservation: Never lose fbclid, gclid, ttclid, or lyr tracking
- Complete Journey: Track users from web → server → mobile
- Flexible API: Support both legacy and new tracking methods
const datalyr = new Datalyr({
apiKey: 'your_api_key_here',
host: 'https://api.datalyr.com', // Optional: custom host
flushAt: 20, // Optional: batch size (default: 20)
flushInterval: 10000, // Optional: batch interval in ms (default: 10000)
debug: true, // Optional: enable debug logging (default: false)
timeout: 10000, // Optional: request timeout in ms (default: 10000)
retryLimit: 3, // Optional: max retries (default: 3)
maxQueueSize: 1000 // Optional: max events in queue (default: 1000)
});
const { Datalyr } = require('@datalyr/api');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const datalyr = new Datalyr(process.env.DATALYR_API_KEY);
app.post('/webhooks/stripe', async (req, res) => {
const sig = req.headers['stripe-signature'];
const event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
switch (event.type) {
case 'checkout.session.completed':
await datalyr.track(
event.data.object.client_reference_id,
'Purchase Completed',
{
amount: event.data.object.amount_total / 100,
currency: event.data.object.currency,
stripeSessionId: event.data.object.id
}
);
break;
case 'customer.subscription.created':
await datalyr.track(
event.data.object.metadata.userId,
'Subscription Started',
{
plan: event.data.object.items.data[0].price.nickname,
mrr: event.data.object.items.data[0].price.unit_amount / 100,
interval: event.data.object.items.data[0].price.recurring.interval
}
);
break;
}
res.json({ received: true });
});
Creates a new Datalyr instance.
Track a custom event.
Identify a user with traits.
Track a pageview.
Associate a user with a group.
Manually flush the event queue.
Flush remaining events and clean up resources.
MIT