@adobe/spacecat-shared-rum-api-client 2.35.0 → 2.36.0

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,10 @@
1
+ # [@adobe/spacecat-shared-rum-api-client-v2.36.0](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.35.0...@adobe/spacecat-shared-rum-api-client-v2.36.0) (2025-07-25)
2
+
3
+
4
+ ### Features
5
+
6
+ * classify organic llm referral traffic ([#877](https://github.com/adobe/spacecat-shared/issues/877)) ([63e029e](https://github.com/adobe/spacecat-shared/commit/63e029ee3db343d487ba1cbe2a006b11dce683bf))
7
+
1
8
  # [@adobe/spacecat-shared-rum-api-client-v2.35.0](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.34.1...@adobe/spacecat-shared-rum-api-client-v2.35.0) (2025-07-24)
2
9
 
3
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/spacecat-shared-rum-api-client",
3
- "version": "2.35.0",
3
+ "version": "2.36.0",
4
4
  "description": "Shared modules of the Spacecat Services - Rum API client",
5
5
  "type": "module",
6
6
  "engines": {
@@ -27,9 +27,8 @@ import URI from 'urijs';
27
27
  export function getSecondLevelDomain(url) {
28
28
  if (!hasText(url)) return url;
29
29
  const uri = new URI(url);
30
- const domain = uri.domain();
31
30
  const tld = uri.tld();
32
- return domain.split(`.${tld}`)[0];
31
+ return uri.hostname().split(`.${tld}`)[0];
33
32
  }
34
33
 
35
34
  /*
@@ -39,9 +38,10 @@ export function getSecondLevelDomain(url) {
39
38
  // Referrer related
40
39
  const referrers = {
41
40
  search: /google|yahoo|bing|yandex|baidu|duckduckgo|brave|ecosia|aol|startpage|ask/,
42
- social: /^\b(x)\b|(.*(facebook|tiktok|snapchat|twitter|pinterest|reddit|linkedin|threads|quora|discord|tumblr|mastodon|bluesky|instagram).*)$/,
41
+ social: /^\b((www\.)?x)\b|(.*(facebook|tiktok|snapchat|twitter|pinterest|reddit|linkedin|threads|quora|discord|tumblr|mastodon|bluesky|instagram).*)$/,
43
42
  ad: /googlesyndication|2mdn|doubleclick|syndicatedsearch/,
44
43
  video: /youtube|vimeo|twitch|dailymotion|wistia/,
44
+ llm: /chatgpt|openai|perplexity|claude|gemini\.google|copilot\.microsoft/,
45
45
  };
46
46
 
47
47
  const mediums = {
@@ -66,6 +66,7 @@ const sources = {
66
66
  display: /optumib2b|jun|googleads|dv360|dv36|microsoft|flipboard|programmatic|yext|gdn|banner|newsshowcase/,
67
67
  affiliate: /brandreward|yieldkit|fashionistatop|partner|linkbux|stylesblog|linkinbio|affiliate/,
68
68
  email: /sfmc|email/,
69
+ llm: /chatgpt/,
69
70
  };
70
71
 
71
72
  /**
@@ -74,7 +75,7 @@ const sources = {
74
75
  * Using full word match for social media shorts like ig, fb, x
75
76
  */
76
77
  const vendorClassifications = [
77
- { regex: /google|googleads|google-ads|google_search|google_deman|adwords|dv360|gdn|doubleclick|dbm|gmb/i, result: 'google' },
78
+ { regex: /google|googleads|google-ads|google_search|google_deman|adwords|dv360|gdn|doubleclick|dbm|gmb|gemini/i, result: 'google' },
78
79
  { regex: /instagram|\b(ig)\b/i, result: 'instagram' },
79
80
  { regex: /facebook|\b(fb)\b|meta/i, result: 'facebook' },
80
81
  { regex: /bing/i, result: 'bing' },
@@ -83,7 +84,7 @@ const vendorClassifications = [
83
84
  { regex: /linkedin/i, result: 'linkedin' },
84
85
  { regex: /twitter|^\b(x)\b/i, result: 'x' },
85
86
  { regex: /snapchat/i, result: 'snapchat' },
86
- { regex: /microsoft/i, result: 'microsoft' },
87
+ { regex: /microsoft|copilot/i, result: 'microsoft' },
87
88
  { regex: /pinterest/i, result: 'pinterest' },
88
89
  { regex: /reddit/i, result: 'reddit' },
89
90
  { regex: /spotify/i, result: 'spotify' },
@@ -102,6 +103,9 @@ const vendorClassifications = [
102
103
  { regex: /amazon|ctv/i, result: 'amazon' },
103
104
  { regex: /dailymotion/i, result: 'dailymotion' },
104
105
  { regex: /twitch/i, result: 'twitch' },
106
+ { regex: /chatgpt|openai/i, result: 'openai' },
107
+ { regex: /perplexity/i, result: 'perplexity' },
108
+ { regex: /claude/i, result: 'claude' },
105
109
  { regex: /direct/i, result: 'direct' },
106
110
  ];
107
111
 
@@ -176,6 +180,8 @@ const RULES = (domain) => ([
176
180
  { type: 'paid', category: 'uncategorized', referrer: not(domain), utmSource: any, utmMedium: any, tracking: anyOf(paidTrackingParams) },
177
181
 
178
182
  // EARNED
183
+ { type: 'earned', category: 'llm', referrer: anyOf(referrers.llm), utmSource: any, utmMedium: any, tracking: none },
184
+ { type: 'earned', category: 'llm', referrer: any, utmSource: anyOf(sources.llm), utmMedium: any, tracking: none },
179
185
  { type: 'earned', category: 'search', referrer: anyOf(referrers.search), utmSource: none, utmMedium: none, tracking: none },
180
186
  { type: 'earned', category: 'search', referrer: anyOf(referrers.search), utmSource: any, utmMedium: not(mediums.paidall), tracking: not(paidTrackingParams) },
181
187
  { type: 'earned', category: 'search', referrer: anyOf(referrers.search), utmSource: any, utmMedium: anyOf(mediums.organic), tracking: none },