@datalyr/web 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Datalyr Inc.
3
+ Copyright (c) 2025 Datalyr Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -34,16 +34,13 @@ pnpm add @datalyr/web
34
34
  ## Quick Start
35
35
 
36
36
  ```javascript
37
- import { Datalyr } from '@datalyr/web';
37
+ import datalyr from '@datalyr/web';
38
38
 
39
- // Initialize with your workspace ID
40
- const datalyr = new Datalyr({
39
+ // Initialize the SDK with your workspace ID
40
+ datalyr.init({
41
41
  workspaceId: 'YOUR_WORKSPACE_ID'
42
42
  });
43
43
 
44
- // Initialize the SDK
45
- await datalyr.init();
46
-
47
44
  // Track an event
48
45
  datalyr.track('Button Clicked', {
49
46
  button_name: 'Sign Up',
@@ -63,7 +60,10 @@ datalyr.identify('user_123', {
63
60
  ### Initialization
64
61
 
65
62
  ```javascript
66
- const datalyr = new Datalyr({
63
+ import datalyr from '@datalyr/web';
64
+
65
+ // Initialize the SDK with configuration
66
+ datalyr.init({
67
67
  workspaceId: 'YOUR_WORKSPACE_ID',
68
68
 
69
69
  // Optional configuration
@@ -79,8 +79,6 @@ const datalyr = new Datalyr({
79
79
  trackSPA: true, // Track SPA route changes
80
80
  trackPageViews: true // Track initial page view
81
81
  });
82
-
83
- await datalyr.init();
84
82
  ```
85
83
 
86
84
  ### Track Events
@@ -243,7 +241,9 @@ datalyr.track('Signup');
243
241
  // Includes: utm_source, utm_medium, first_touch_source, last_touch_source, etc.
244
242
 
245
243
  // Track custom URL parameters
246
- const datalyr = new Datalyr({
244
+ import datalyr from '@datalyr/web';
245
+
246
+ datalyr.init({
247
247
  workspaceId: 'YOUR_WORKSPACE_ID',
248
248
  trackedParams: ['ref', 'affiliate_id', 'promo_code']
249
249
  });
@@ -254,7 +254,9 @@ const datalyr = new Datalyr({
254
254
  For single-page applications:
255
255
 
256
256
  ```javascript
257
- const datalyr = new Datalyr({
257
+ import datalyr from '@datalyr/web';
258
+
259
+ datalyr.init({
258
260
  workspaceId: 'YOUR_WORKSPACE_ID',
259
261
  trackSPA: true // Auto-track route changes (default: true)
260
262
  });
@@ -270,14 +272,16 @@ datalyr.page('Product Details', {
270
272
  Control data collection:
271
273
 
272
274
  ```javascript
275
+ import datalyr from '@datalyr/web';
276
+
273
277
  // Standard mode (default) - balanced privacy
274
- const datalyr = new Datalyr({
278
+ datalyr.init({
275
279
  workspaceId: 'YOUR_WORKSPACE_ID',
276
280
  privacyMode: 'standard'
277
281
  });
278
282
 
279
- // Strict mode - minimal data collection
280
- const datalyr = new Datalyr({
283
+ // Or strict mode - minimal data collection
284
+ datalyr.init({
281
285
  workspaceId: 'YOUR_WORKSPACE_ID',
282
286
  privacyMode: 'strict'
283
287
  });
@@ -300,14 +304,16 @@ await datalyr.flush();
300
304
  Automatically track users across subdomains:
301
305
 
302
306
  ```javascript
307
+ import datalyr from '@datalyr/web';
308
+
303
309
  // Auto-detect domain for *.example.com
304
- const datalyr = new Datalyr({
310
+ datalyr.init({
305
311
  workspaceId: 'YOUR_WORKSPACE_ID',
306
312
  cookieDomain: 'auto' // Default
307
313
  });
308
314
 
309
315
  // Or set explicitly
310
- const datalyr = new Datalyr({
316
+ datalyr.init({
311
317
  workspaceId: 'YOUR_WORKSPACE_ID',
312
318
  cookieDomain: '.example.com'
313
319
  });
@@ -318,7 +324,9 @@ const datalyr = new Datalyr({
318
324
  The SDK can automatically load and manage third-party tracking scripts with built-in security:
319
325
 
320
326
  ```javascript
321
- const datalyr = new Datalyr({
327
+ import datalyr from '@datalyr/web';
328
+
329
+ datalyr.init({
322
330
  workspaceId: 'YOUR_WORKSPACE_ID',
323
331
  enableContainer: true // Default: true
324
332
  });
@@ -352,6 +360,8 @@ The container manager supports:
352
360
  Extend SDK functionality:
353
361
 
354
362
  ```javascript
363
+ import datalyr from '@datalyr/web';
364
+
355
365
  // Create a plugin
356
366
  const myPlugin = {
357
367
  name: 'my-plugin',
@@ -373,8 +383,8 @@ const myPlugin = {
373
383
  }
374
384
  };
375
385
 
376
- // Register plugin
377
- const datalyr = new Datalyr({
386
+ // Register plugin during initialization
387
+ datalyr.init({
378
388
  workspaceId: 'YOUR_WORKSPACE_ID',
379
389
  plugins: [myPlugin]
380
390
  });
@@ -385,9 +395,10 @@ const datalyr = new Datalyr({
385
395
  Full TypeScript definitions are included:
386
396
 
387
397
  ```typescript
388
- import { Datalyr, EventProperties, UserTraits } from '@datalyr/web';
398
+ import datalyr, { EventProperties, UserTraits } from '@datalyr/web';
389
399
 
390
- const datalyr = new Datalyr({
400
+ // Initialize the SDK
401
+ datalyr.init({
391
402
  workspaceId: 'YOUR_WORKSPACE_ID'
392
403
  });
393
404
 
@@ -416,15 +427,13 @@ datalyr.identify('user_123', traits);
416
427
 
417
428
  ```jsx
418
429
  import { useEffect } from 'react';
419
- import { Datalyr } from '@datalyr/web';
420
-
421
- const datalyr = new Datalyr({
422
- workspaceId: 'YOUR_WORKSPACE_ID'
423
- });
430
+ import datalyr from '@datalyr/web';
424
431
 
425
432
  function App() {
426
433
  useEffect(() => {
427
- datalyr.init();
434
+ datalyr.init({
435
+ workspaceId: 'YOUR_WORKSPACE_ID'
436
+ });
428
437
  }, []);
429
438
 
430
439
  const handleClick = () => {
@@ -442,14 +451,12 @@ function App() {
442
451
  ```vue
443
452
  <script setup>
444
453
  import { onMounted } from 'vue';
445
- import { Datalyr } from '@datalyr/web';
446
-
447
- const datalyr = new Datalyr({
448
- workspaceId: 'YOUR_WORKSPACE_ID'
449
- });
454
+ import datalyr from '@datalyr/web';
450
455
 
451
456
  onMounted(() => {
452
- datalyr.init();
457
+ datalyr.init({
458
+ workspaceId: 'YOUR_WORKSPACE_ID'
459
+ });
453
460
  });
454
461
 
455
462
  const trackClick = () => {
@@ -469,15 +476,13 @@ const trackClick = () => {
469
476
  'use client';
470
477
 
471
478
  import { useEffect } from 'react';
472
- import { Datalyr } from '@datalyr/web';
473
-
474
- const datalyr = new Datalyr({
475
- workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID
476
- });
479
+ import datalyr from '@datalyr/web';
477
480
 
478
481
  export function AnalyticsProvider({ children }) {
479
482
  useEffect(() => {
480
- datalyr.init();
483
+ datalyr.init({
484
+ workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID
485
+ });
481
486
  }, []);
482
487
 
483
488
  return children;
@@ -506,16 +511,14 @@ Initialize the SDK as early as possible in your application lifecycle:
506
511
 
507
512
  ```javascript
508
513
  // In your main entry file
509
- import { Datalyr } from '@datalyr/web';
514
+ import datalyr from '@datalyr/web';
510
515
 
511
- const datalyr = new Datalyr({
516
+ // Initialize before other code
517
+ datalyr.init({
512
518
  workspaceId: 'YOUR_WORKSPACE_ID'
513
519
  });
514
520
 
515
- // Initialize before other code
516
- datalyr.init().then(() => {
517
- // Start your app
518
- });
521
+ // Your app code...
519
522
  ```
520
523
 
521
524
  ### 2. Use Consistent Event Naming
@@ -617,13 +620,12 @@ If you're currently using the Datalyr script tag, migration is straightforward:
617
620
 
618
621
  ### After (Web SDK):
619
622
  ```javascript
620
- import { Datalyr } from '@datalyr/web';
623
+ import datalyr from '@datalyr/web';
621
624
 
622
- const datalyr = new Datalyr({
625
+ datalyr.init({
623
626
  workspaceId: 'YOUR_WORKSPACE_ID'
624
627
  });
625
628
 
626
- await datalyr.init();
627
629
  datalyr.track('Button Clicked');
628
630
  ```
629
631
 
@@ -660,7 +662,9 @@ The SDK is designed with privacy in mind:
660
662
  Enable debug mode for detailed logging:
661
663
 
662
664
  ```javascript
663
- const datalyr = new Datalyr({
665
+ import datalyr from '@datalyr/web';
666
+
667
+ datalyr.init({
664
668
  workspaceId: 'YOUR_WORKSPACE_ID',
665
669
  debug: true
666
670
  });
@@ -672,7 +676,7 @@ const datalyr = new Datalyr({
672
676
 
673
677
  ## API Reference
674
678
 
675
- ### Constructor Options
679
+ ### Initialization Options
676
680
 
677
681
  | Option | Type | Default | Description |
678
682
  |--------|------|---------|-------------|
@@ -694,7 +698,7 @@ const datalyr = new Datalyr({
694
698
 
695
699
  | Method | Description |
696
700
  |--------|-------------|
697
- | `init()` | Initialize the SDK |
701
+ | `init(config)` | Initialize the SDK with configuration |
698
702
  | `track(event, properties?)` | Track an event |
699
703
  | `identify(userId?, traits?)` | Identify a user |
700
704
  | `page(name?, properties?)` | Track a page view |
@@ -8,6 +8,7 @@ export declare class AttributionManager {
8
8
  private trackedParams;
9
9
  private UTM_PARAMS;
10
10
  private CLICK_IDS;
11
+ private DEFAULT_TRACKED_PARAMS;
11
12
  constructor(options?: {
12
13
  attributionWindow?: number;
13
14
  trackedParams?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../src/attribution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,UAAU,CAA2E;IAC7F,OAAO,CAAC,SAAS,CAA6F;gBAElG,OAAO,GAAE;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB;IAKN;;OAEG;IACH,kBAAkB,IAAI,WAAW;IAwDjC;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAU/C;;OAEG;IACH,aAAa,IAAI,WAAW,GAAG,IAAI;IAInC;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAO9C;;OAEG;IACH,YAAY,IAAI,WAAW,GAAG,IAAI;IAIlC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IAqBhE;;OAEG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;OAEG;IACH,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAgDzC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAKvD;;OAEG;IACH,uBAAuB,IAAI,IAAI;CAYhC"}
1
+ {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../src/attribution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,UAAU,CAA2E;IAE7F,OAAO,CAAC,SAAS,CAgBf;IAEF,OAAO,CAAC,sBAAsB,CAO5B;gBAEU,OAAO,GAAE;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB;IAMN;;OAEG;IACH,kBAAkB,IAAI,WAAW;IAwDjC;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAU/C;;OAEG;IACH,aAAa,IAAI,WAAW,GAAG,IAAI;IAInC;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAO9C;;OAEG;IACH,YAAY,IAAI,WAAW,GAAG,IAAI;IAIlC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IAqBhE;;OAEG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;OAEG;IACH,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAgDzC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAKvD;;OAEG;IACH,uBAAuB,IAAI,IAAI;CAYhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @datalyr/web v1.0.0
2
+ * @datalyr/web v1.0.2
3
3
  * Datalyr Web SDK - Modern attribution tracking for web applications
4
4
  * (c) 2025 Datalyr Inc.
5
5
  * Released under the MIT License
@@ -809,9 +809,36 @@ class SessionManager {
809
809
  class AttributionManager {
810
810
  constructor(options = {}) {
811
811
  this.UTM_PARAMS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
812
- this.CLICK_IDS = ['fbclid', 'gclid', 'ttclid', 'msclkid', 'twclid', 'li_fat_id', 'sclid', 'dclid', 'epik'];
812
+ // Updated to match dl.js - includes ALL ad platform click IDs
813
+ this.CLICK_IDS = [
814
+ 'fbclid', // Facebook/Meta
815
+ 'gclid', // Google Ads
816
+ 'gbraid', // Google Ads (iOS)
817
+ 'wbraid', // Google Ads (web)
818
+ 'ttclid', // TikTok
819
+ 'msclkid', // Microsoft/Bing
820
+ 'twclid', // Twitter/X
821
+ 'li_fat_id', // LinkedIn
822
+ 'sclid', // Snapchat
823
+ 'dclid', // Google Display/DoubleClick
824
+ 'epik', // Pinterest
825
+ 'rdt_cid', // Reddit
826
+ 'obclid', // Outbrain
827
+ 'irclid', // Impact Radius
828
+ 'ko_click_id' // Klaviyo
829
+ ];
830
+ // Default tracked params matching dl.js
831
+ this.DEFAULT_TRACKED_PARAMS = [
832
+ 'lyr', // Datalyr partner tracking
833
+ 'ref', // Generic referral
834
+ 'source', // Generic source (non-UTM)
835
+ 'campaign', // Generic campaign (non-UTM)
836
+ 'medium', // Generic medium (non-UTM)
837
+ 'gad_source' // Google Ads source parameter
838
+ ];
813
839
  this.attributionWindow = options.attributionWindow || 30 * 24 * 60 * 60 * 1000; // 30 days
814
- this.trackedParams = options.trackedParams || [];
840
+ // Merge default tracked params with user-provided ones
841
+ this.trackedParams = [...this.DEFAULT_TRACKED_PARAMS, ...(options.trackedParams || [])];
815
842
  }
816
843
  /**
817
844
  * Capture current attribution from URL
@@ -898,9 +925,9 @@ class AttributionManager {
898
925
  const touchpoint = {
899
926
  timestamp: Date.now(),
900
927
  sessionId,
901
- source: attribution.source,
902
- medium: attribution.medium,
903
- campaign: attribution.campaign
928
+ source: attribution.source || undefined,
929
+ medium: attribution.medium || undefined,
930
+ campaign: attribution.campaign || undefined
904
931
  };
905
932
  journey.push(touchpoint);
906
933
  // Keep last 30 touchpoints
@@ -1072,7 +1099,6 @@ class EventQueue {
1072
1099
  this.recentEventIds = new Set();
1073
1100
  this.MAX_RECENT_EVENT_IDS = 1000;
1074
1101
  this.OFFLINE_QUEUE_KEY = 'dl_offline_queue';
1075
- this.currentEndpointIndex = 0;
1076
1102
  this.config = {
1077
1103
  batchSize: config.batchSize || 10,
1078
1104
  flushInterval: config.flushInterval || 5000,
@@ -1133,7 +1159,10 @@ class EventQueue {
1133
1159
  const toDelete = this.recentEventIds.size - this.MAX_RECENT_EVENT_IDS;
1134
1160
  const iterator = this.recentEventIds.values();
1135
1161
  for (let i = 0; i < toDelete; i++) {
1136
- this.recentEventIds.delete(iterator.next().value);
1162
+ const next = iterator.next();
1163
+ if (!next.done) {
1164
+ this.recentEventIds.delete(next.value);
1165
+ }
1137
1166
  }
1138
1167
  }
1139
1168
  return false;
@@ -1244,7 +1273,6 @@ class EventQueue {
1244
1273
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
1245
1274
  }
1246
1275
  this.log(`Batch sent successfully to ${currentEndpoint}: ${events.length} events`);
1247
- this.currentEndpointIndex = 0; // Reset to primary on success
1248
1276
  }
1249
1277
  catch (error) {
1250
1278
  // Try next fallback endpoint if available
@@ -2058,8 +2086,8 @@ class ContainerManager {
2058
2086
  document.head.appendChild(script);
2059
2087
  // Initialize gtag
2060
2088
  window.dataLayer = window.dataLayer || [];
2061
- function gtag() {
2062
- window.dataLayer.push(arguments);
2089
+ function gtag(...args) {
2090
+ window.dataLayer.push(args);
2063
2091
  }
2064
2092
  window.gtag = gtag;
2065
2093
  gtag('js', new Date());
@@ -2078,7 +2106,7 @@ class ContainerManager {
2078
2106
  initializeTikTokPixel(config) {
2079
2107
  try {
2080
2108
  // Load TikTok Pixel script
2081
- (function (w, d, t) {
2109
+ (function (w, _d, t) {
2082
2110
  w.TiktokAnalyticsObject = t;
2083
2111
  var ttq = w[t] = w[t] || [];
2084
2112
  ttq.methods = ['page', 'track', 'identify', 'instances', 'debug', 'on', 'off', 'once', 'ready', 'alias', 'group', 'enableCookie', 'disableCookie'];
@@ -2095,6 +2123,7 @@ class ContainerManager {
2095
2123
  return e;
2096
2124
  };
2097
2125
  ttq.load = function (e, n) {
2126
+ var _a;
2098
2127
  var i = 'https://analytics.tiktok.com/i18n/pixel/events.js';
2099
2128
  ttq._i = ttq._i || {};
2100
2129
  ttq._i[e] = [];
@@ -2105,7 +2134,7 @@ class ContainerManager {
2105
2134
  o.async = true;
2106
2135
  o.src = i + '?sdkid=' + e + '&lib=' + t;
2107
2136
  var a = document.getElementsByTagName('script')[0];
2108
- a.parentNode.insertBefore(o, a);
2137
+ (_a = a.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(o, a);
2109
2138
  };
2110
2139
  })(window, document, 'ttq');
2111
2140
  // Initialize pixel
@@ -2121,7 +2150,7 @@ class ContainerManager {
2121
2150
  * Track event to all initialized pixels
2122
2151
  */
2123
2152
  trackToPixels(eventName, properties = {}) {
2124
- var _a, _b, _c, _d, _e, _f;
2153
+ var _a, _b, _c, _e, _f, _g;
2125
2154
  // Track to Meta Pixel
2126
2155
  if (((_b = (_a = this.pixels) === null || _a === void 0 ? void 0 : _a.meta) === null || _b === void 0 ? void 0 : _b.enabled) && window.fbq) {
2127
2156
  try {
@@ -2132,7 +2161,7 @@ class ContainerManager {
2132
2161
  }
2133
2162
  }
2134
2163
  // Track to Google Tag
2135
- if (((_d = (_c = this.pixels) === null || _c === void 0 ? void 0 : _c.google) === null || _d === void 0 ? void 0 : _d.enabled) && window.gtag) {
2164
+ if (((_e = (_c = this.pixels) === null || _c === void 0 ? void 0 : _c.google) === null || _e === void 0 ? void 0 : _e.enabled) && window.gtag) {
2136
2165
  try {
2137
2166
  window.gtag('event', eventName, properties);
2138
2167
  }
@@ -2141,7 +2170,7 @@ class ContainerManager {
2141
2170
  }
2142
2171
  }
2143
2172
  // Track to TikTok Pixel
2144
- if (((_f = (_e = this.pixels) === null || _e === void 0 ? void 0 : _e.tiktok) === null || _f === void 0 ? void 0 : _f.enabled) && window.ttq) {
2173
+ if (((_g = (_f = this.pixels) === null || _f === void 0 ? void 0 : _f.tiktok) === null || _g === void 0 ? void 0 : _g.enabled) && window.ttq) {
2145
2174
  try {
2146
2175
  // Map common events to TikTok names
2147
2176
  const tiktokEventMap = {
@@ -2643,13 +2672,39 @@ class Datalyr {
2643
2672
  // Create payload with both camelCase and snake_case fields
2644
2673
  const identityFields = this.identity.getIdentityFields();
2645
2674
  const eventId = generateUUID();
2646
- const payload = Object.assign(Object.assign({
2675
+ // Ensure we have all required identity fields
2676
+ const distinctId = identityFields.distinct_id;
2677
+ const anonymousId = identityFields.anonymous_id;
2678
+ const visitorId = identityFields.visitor_id || anonymousId;
2679
+ const sessionId = identityFields.session_id;
2680
+ const payload = {
2647
2681
  // Required fields
2648
- workspaceId: this.config.workspaceId, workspace_id: this.config.workspaceId, eventId: eventId, event_id: eventId, // Snake case alias (same ID)
2649
- eventName, event_name: eventName, // Snake case alias
2650
- eventData, event_data: eventData, source: 'web', timestamp: new Date().toISOString() }, identityFields), {
2682
+ workspaceId: this.config.workspaceId,
2683
+ workspace_id: this.config.workspaceId, // Snake case alias
2684
+ eventId: eventId,
2685
+ event_id: eventId, // Snake case alias (same ID)
2686
+ eventName,
2687
+ event_name: eventName, // Snake case alias
2688
+ eventData,
2689
+ event_data: eventData, // Snake case alias
2690
+ source: 'web',
2691
+ timestamp: new Date().toISOString(),
2692
+ // Identity fields (explicit to satisfy TypeScript)
2693
+ distinct_id: distinctId,
2694
+ anonymous_id: anonymousId,
2695
+ visitor_id: visitorId,
2696
+ visitorId: visitorId,
2697
+ user_id: identityFields.user_id,
2698
+ canonical_id: identityFields.canonical_id,
2699
+ sessionId: sessionId,
2700
+ session_id: sessionId,
2701
+ // Resolution metadata
2702
+ resolution_method: 'browser_sdk',
2703
+ resolution_confidence: 1.0,
2651
2704
  // SDK metadata
2652
- sdk_version: '1.0.0', sdk_name: 'datalyr-web-sdk' });
2705
+ sdk_version: '1.0.0',
2706
+ sdk_name: 'datalyr-web-sdk'
2707
+ };
2653
2708
  return payload;
2654
2709
  }
2655
2710
  /**