@adobe/spacecat-shared-rum-api-client 2.38.10 → 2.39.1

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/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [@adobe/spacecat-shared-rum-api-client-v2.39.1](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.39.0...@adobe/spacecat-shared-rum-api-client-v2.39.1) (2025-11-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * update to node 24 ([#1179](https://github.com/adobe/spacecat-shared/issues/1179)) ([0e60c0a](https://github.com/adobe/spacecat-shared/commit/0e60c0ab791b47662d07822f7c93009a8f7048fd))
7
+
8
+ # [@adobe/spacecat-shared-rum-api-client-v2.39.0](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.38.10...@adobe/spacecat-shared-rum-api-client-v2.39.0) (2025-11-24)
9
+
10
+
11
+ ### Features
12
+
13
+ * use paid event tracking source to classify ([#1166](https://github.com/adobe/spacecat-shared/issues/1166)) ([c477a04](https://github.com/adobe/spacecat-shared/commit/c477a048d3f74fdc315c5c4a6b2e2725cc0e5283))
14
+
1
15
  # [@adobe/spacecat-shared-rum-api-client-v2.38.10](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.38.9...@adobe/spacecat-shared-rum-api-client-v2.38.10) (2025-11-15)
2
16
 
3
17
 
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@adobe/spacecat-shared-rum-api-client",
3
- "version": "2.38.10",
3
+ "version": "2.39.1",
4
4
  "description": "Shared modules of the Spacecat Services - Rum API client",
5
5
  "type": "module",
6
6
  "engines": {
7
- "node": ">=22.0.0 <23.0.0",
7
+ "node": ">=22.0.0 <25.0.0",
8
8
  "npm": ">=10.9.0 <12.0.0"
9
9
  },
10
10
  "main": "src/index.js",
@@ -39,7 +39,7 @@
39
39
  "@adobe/helix-shared-wrap": "2.0.2",
40
40
  "@adobe/helix-universal": "5.3.0",
41
41
  "@adobe/rum-distiller": "1.20.8",
42
- "@adobe/spacecat-shared-utils": "1.66.0",
42
+ "@adobe/spacecat-shared-utils": "1.81.0",
43
43
  "aws4": "1.13.2",
44
44
  "urijs": "1.19.11"
45
45
  },
@@ -68,7 +68,7 @@ const mediums = {
68
68
  };
69
69
 
70
70
  const sources = {
71
- social: /^\b(ig|fb|x|soc)\b|(.*(meta|tiktok|facebook|snapchat|twitter|igshopping|instagram|linkedin|reddit).*)$/,
71
+ social: /^\b(ig|fb|x|soc|ln)\b|(.*(meta|tiktok|facebook|snapchat|twitter|igshopping|instagram|linkedin|reddit).*)$/,
72
72
  search: /^\b(goo)\b|(.*(sea|google|yahoo|bing|yandex|baidu|duckduckgo|brave|ecosia|aol|startpage|ask).*)$/,
73
73
  video: /youtube|vimeo|twitch|dailymotion|wistia/,
74
74
  display: /optumib2b|jun|googleads|dv360|dv36|microsoft|flipboard|programmatic|yext|gdn|banner|newsshowcase/,
@@ -84,12 +84,12 @@ const sources = {
84
84
  */
85
85
  const vendorClassifications = [
86
86
  { regex: /google|googleads|google-ads|google_search|google_deman|adwords|dv360|gdn|doubleclick|dbm|gmb|gemini/i, result: 'google' },
87
- { regex: /instagram|\b(ig)\b/i, result: 'instagram' },
87
+ { regex: /instagram|\b(ig)\b|\b(Insta)\b/i, result: 'instagram' },
88
88
  { regex: /facebook|\b(fb)\b|meta/i, result: 'facebook' },
89
89
  { regex: /bing/i, result: 'bing' },
90
90
  { regex: /tiktok/i, result: 'tiktok' },
91
91
  { regex: /youtube|yt/i, result: 'youtube' },
92
- { regex: /linkedin/i, result: 'linkedin' },
92
+ { regex: /linkedin|\b(ln)\b/i, result: 'linkedin' },
93
93
  { regex: /twitter|^\b(x)\b/i, result: 'x' },
94
94
  { regex: /snapchat/i, result: 'snapchat' },
95
95
  { regex: /microsoft|copilot/i, result: 'microsoft' },
@@ -214,6 +214,7 @@ const RULES = (domain) => ([
214
214
  { type: 'paid', category: 'search', referrer: anyOf(referrers.search), utmSource: any, utmMedium: any, tracking: anyOf(paidTrackingParams) },
215
215
  { type: 'paid', category: 'search', referrer: anyOf(referrers.ad), utmSource: any, utmMedium: anyOf(mediums.paidsearch), tracking: any },
216
216
  { type: 'paid', category: 'search', referrer: none, utmSource: anyOf(sources.search), utmMedium: anyOf(mediums.paidsearch), tracking: any },
217
+ { type: 'paid', category: 'search', referrer: none, utmSource: anyOf(sources.search), utmMedium: none, tracking: anyOf(paidTrackingParams) },
217
218
 
218
219
  { type: 'paid', category: 'social', referrer: anyOf(referrers.social), utmSource: any, utmMedium: anyOf(mediums.paidsocial), tracking: none },
219
220
  { type: 'paid', category: 'social', referrer: anyOf(referrers.social), utmSource: any, utmMedium: any, tracking: anyOf(paidTrackingParams) },
@@ -222,6 +223,7 @@ const RULES = (domain) => ([
222
223
  { type: 'paid', category: 'social', referrer: none, utmSource: anyOf(sources.social), utmMedium: anyOf(mediums.paidall), tracking: any },
223
224
  { type: 'paid', category: 'social', referrer: anyOf(referrers.social), utmSource: notEmpty, utmMedium: notEmpty, tracking: any },
224
225
  { type: 'paid', category: 'social', referrer: none, utmSource: anyOf(sources.social), utmMedium: anyOf(mediums.socialall), tracking: any },
226
+ { type: 'paid', category: 'social', referrer: none, utmSource: anyOf(sources.social), utmMedium: any, tracking: anyOf(paidTrackingParams) },
225
227
 
226
228
  { type: 'paid', category: 'video', referrer: anyOf(referrers.video), utmSource: any, utmMedium: anyOf(mediums.paidall), tracking: any },
227
229
  { type: 'paid', category: 'video', referrer: anyOf(referrers.video), utmSource: any, utmMedium: any, tracking: anyOf(paidTrackingParams) },
@@ -277,6 +279,8 @@ export function extractTrafficHints(bundle) {
277
279
  const utmSource = findEvent('utm', 'utm_source').target || '';
278
280
  const utmMedium = findEvent('utm', 'utm_medium').target || '';
279
281
  const tracking = findEvent('paid').checkpoint || findEvent('email').checkpoint || '';
282
+ const trackingSource = findEvent('paid').source || findEvent('email').source || '';
283
+ const trackingTarget = findEvent('paid').target || findEvent('email').target || '';
280
284
 
281
285
  return {
282
286
  url: bundle.url,
@@ -285,6 +289,8 @@ export function extractTrafficHints(bundle) {
285
289
  utmSource,
286
290
  utmMedium,
287
291
  tracking,
292
+ trackingSource,
293
+ trackingTarget,
288
294
  };
289
295
  }
290
296
 
@@ -303,7 +309,7 @@ export function classifyVendor(referrer, utmSource, utmMedium) {
303
309
  return result ? result.result : '';
304
310
  }
305
311
 
306
- export function classifyTrafficSource(url, referrer, utmSource, utmMedium, trackingParams) {
312
+ export function classifyTrafficSource(url, referrer, utmSource, utmMedium, trackingEvent) {
307
313
  const secondLevelDomain = getSecondLevelDomain(url);
308
314
  const rules = RULES(secondLevelDomain);
309
315
 
@@ -315,7 +321,7 @@ export function classifyTrafficSource(url, referrer, utmSource, utmMedium, track
315
321
  rule.referrer(referrerDomain)
316
322
  && rule.utmSource(sanitize(utmSource))
317
323
  && rule.utmMedium(sanitize(utmMedium))
318
- && rule.tracking(trackingParams)
324
+ && rule.tracking(trackingEvent)
319
325
  ));
320
326
  let { type, category } = match;
321
327
  let vendor = classifyVendor(referrerDomain, utmSource, utmMedium);
@@ -347,11 +353,24 @@ export function classifyTraffic(bundle) {
347
353
  utmSource,
348
354
  utmMedium,
349
355
  tracking,
356
+ trackingSource,
357
+ trackingTarget,
350
358
  } = extractTrafficHints(bundle);
351
359
 
360
+ let source = utmSource;
361
+
362
+ // When there are no explicit UTM parameters, fall back to tracking source
363
+ // as the classification source. This lets "paid + google (tracking_source)"
364
+ // behave like "paid + google (utm_source)" without mutating actual UTMs.
365
+ if (!source && !utmMedium && trackingSource) {
366
+ source = trackingSource;
367
+ }
368
+
352
369
  return {
353
370
  url,
354
371
  weight,
355
- ...classifyTrafficSource(url, referrer, utmSource, utmMedium, tracking),
372
+ trackingSource,
373
+ trackingTarget,
374
+ ...classifyTrafficSource(url, referrer, source, utmMedium, tracking),
356
375
  };
357
376
  }
@@ -106,6 +106,8 @@ async function handler(bundles) {
106
106
  trf_type: trafficData.type,
107
107
  trf_channel: trafficData.category,
108
108
  trf_platform: trafficData.vendor || null,
109
+ tracking_source: trafficData.trackingSource || null,
110
+ tracking_target: trafficData.trackingTarget || null,
109
111
  device: bundle.userAgent.split(':')[0],
110
112
  utm_source: getUTM(bundle, 'source'),
111
113
  utm_medium: getUTM(bundle, 'medium'),