@datalyr/api
Version:
Datalyr API SDK for server-side tracking
195 lines (148 loc) • 4.75 kB
Markdown
# @datalyr/api
Official API SDK for Datalyr server-side tracking with identity resolution support.
## Installation
```bash
npm install @datalyr/api
# or
yarn add @datalyr/api
# or
pnpm add @datalyr/api
```
## Quick Start
```javascript
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();
```
## Identity Resolution (New in v1.1.0)
The SDK now supports anonymous IDs for complete user journey tracking:
```javascript
// 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();
```
### Express.js Example with Browser Attribution
```javascript
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 });
});
```
### Key Benefits:
- **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
## Configuration
```javascript
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)
});
```
## Stripe Webhook Example
```javascript
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 });
});
```
## API Reference
### `new Datalyr(config)`
Creates a new Datalyr instance.
### `track(userId, event, properties?)`
Track a custom event.
### `identify(userId, traits?)`
Identify a user with traits.
### `page(userId, name?, properties?)`
Track a pageview.
### `group(userId, groupId, traits?)`
Associate a user with a group.
### `flush()`
Manually flush the event queue.
### `close()`
Flush remaining events and clean up resources.
## License
MIT