@blotoutio/providers-vibe-co-sdk 1.53.0 → 1.54.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.
Files changed (4) hide show
  1. package/index.cjs.js +156 -1
  2. package/index.js +156 -1
  3. package/index.mjs +156 -1
  4. package/package.json +1 -1
package/index.cjs.js CHANGED
@@ -74,6 +74,40 @@ const init = ({ manifest }) => {
74
74
  initVibeCo(pixelId);
75
75
  };
76
76
 
77
+ /**
78
+ * Known ad-network click ID query parameters and the human-readable provider
79
+ * label each one maps to. Used by the CDN worker to resolve `inSessionTouch`
80
+ * and by the analytics API to classify paid-media touch sessions.
81
+ *
82
+ * Keep this list in sync with `defaultParams` in queryParams.ts when new
83
+ * click ID providers are added.
84
+ */
85
+ const CLICK_IDS = [
86
+ { param: 'fbclid', label: 'Facebook' }, // Facebook Ads
87
+ { param: 'gclid', label: 'Google' }, // Google Ads (click)
88
+ { param: 'gbraid', label: 'Google' }, // Google Ads (iOS app)
89
+ { param: 'wbraid', label: 'Google' }, // Google Ads (iOS web)
90
+ { param: 'msclkid', label: 'Bing' }, // Microsoft Bing Ads
91
+ { param: 'ttclid', label: 'TikTok' }, // TikTok Ads
92
+ { param: 'ScCid', label: 'Snapchat' }, // Snapchat Ads
93
+ { param: 'epik', label: 'Pinterest' }, // Pinterest Ads
94
+ { param: 'li_fat_id', label: 'LinkedIn' }, // LinkedIn Ads
95
+ { param: 'twclid', label: 'Twitter' }, // X (Twitter) Ads
96
+ { param: 'rdt_cid', label: 'Reddit' }, // Reddit Ads
97
+ { param: 'aleid', label: 'AppLovin' }, // AppLovin
98
+ { param: 'tabclid', label: 'Taboola' }, // Taboola
99
+ { param: 'obclid', label: 'Outbrain' }, // Outbrain
100
+ { param: 'trybe', label: 'Trybe' }, // Trybe
101
+ { param: '_kx', label: 'Klaviyo' }, // Klaviyo email campaigns
102
+ { param: 'mc_eid', label: 'Mailchimp' }, // Mailchimp email campaigns
103
+ { param: 'ttd_id', label: 'The Trade Desk' }, // The Trade Desk programmatic
104
+ { param: 'evsclid', label: 'EvoSearch' }, // EvoSearch
105
+ { param: 'li_did', label: 'Live Intent' }, // LiveIntent device-level ad
106
+ { param: '_raclid', label: 'Rumble' }, // Rumble Ads
107
+ { param: 'ref_id', label: 'StackAdapt' }, // StackAdapt programmatic
108
+ { param: 'duel_a', label: 'Duel' }, // Duel referral/advocacy
109
+ ];
110
+
77
111
  const expand = (str) => str.split(',').flatMap((entry) => {
78
112
  if (!entry.includes('-')) {
79
113
  return entry;
@@ -442,6 +476,127 @@ const usStates = new Map([
442
476
  ]);
443
477
  new Set([...isoCountries.keys(), ...usStates.keys()]);
444
478
 
479
+ /**
480
+ * Exact utm_source normalization (lowercase key → canonical name).
481
+ *
482
+ * Use exact match when the key is short, generic, or must not accidentally
483
+ * absorb variant spellings (e.g. "impact" must not match "impact_radius").
484
+ *
485
+ * Ordering: Paid (search/social → ad networks → affiliates) →
486
+ * Organic (AI/discovery) → Retention (email → SMS → push → post-purchase)
487
+ */
488
+ const UTM_SOURCE_EXACT = {
489
+ // ── Paid – Search & Social ────────────────────────────────────────────────
490
+ google: 'Google',
491
+ adwords: 'Google',
492
+ youtube: 'Google',
493
+ yt: 'Google',
494
+ meta: 'Facebook',
495
+ facebook: 'Facebook',
496
+ instagram: 'Facebook',
497
+ ig: 'Facebook',
498
+ igshopping: 'Facebook',
499
+ threads: 'Facebook',
500
+ twitter: 'Twitter',
501
+ snapchat: 'Snapchat',
502
+ pinterest: 'Pinterest',
503
+ bing: 'Bing',
504
+ microsoft: 'Bing',
505
+ tiktok: 'TikTok',
506
+ // ── Paid – Ad Networks ───────────────────────────────────────────────────
507
+ rtbhouse: 'RTB House',
508
+ applovin: 'AppLovin',
509
+ ttd: 'The Trade Desk',
510
+ amazondsp: 'Amazon DSP',
511
+ axon: 'Axon',
512
+ duel: 'Duel',
513
+ // ── Paid – Affiliates ────────────────────────────────────────────────────
514
+ awin: 'Awin',
515
+ 'affiliate-cj': 'CJ Affiliate',
516
+ impact: 'Impact',
517
+ rakuten: 'Rakuten',
518
+ superfiliate: 'Superfiliate',
519
+ // ── Organic – AI & Discovery ─────────────────────────────────────────────
520
+ perplexity: 'Perplexity',
521
+ chatgpt: 'ChatGPT',
522
+ 'chatgpt.com': 'ChatGPT',
523
+ openai: 'ChatGPT',
524
+ 'copilot.com': 'Microsoft Copilot',
525
+ copilot: 'Microsoft Copilot',
526
+ applenews: 'Apple News',
527
+ whatsapp: 'WhatsApp',
528
+ podcast: 'Podcast',
529
+ // ── Retention – Email ────────────────────────────────────────────────────
530
+ mailchimp: 'Mailchimp',
531
+ omnisend: 'Omnisend',
532
+ iterable: 'Iterable',
533
+ listrak: 'Listrak',
534
+ sailthru: 'Sailthru',
535
+ // ── Retention – Push ─────────────────────────────────────────────────────
536
+ pushowl: 'PushOwl',
537
+ // ── Retention – Post-purchase / Payment ──────────────────────────────────
538
+ narvar: 'Narvar',
539
+ shop_app: 'Shop App',
540
+ salesforce: 'Salesforce',
541
+ yotpo: 'Yotpo',
542
+ };
543
+ /**
544
+ * Partial utm_source normalization (startsWith prefix check, lowercase).
545
+ *
546
+ * Checked after exact match so short exact keys (e.g. "ig", "yt") win first.
547
+ */
548
+ const UTM_SOURCE_PARTIAL = [
549
+ // ── Paid – Social ─────────────────────────────────────────────────────────
550
+ { prefix: 'tiktok', name: 'TikTok' },
551
+ // ── Paid – Ad Networks ───────────────────────────────────────────────────
552
+ { prefix: 'criteo', name: 'Criteo' },
553
+ // ── Retention – Email ────────────────────────────────────────────────────
554
+ { prefix: 'klaviyo', name: 'Klaviyo' },
555
+ // ── Retention – SMS ──────────────────────────────────────────────────────
556
+ { prefix: 'attentive', name: 'Attentive' },
557
+ { prefix: 'postscript', name: 'Postscript' },
558
+ // ── Retention – Post-purchase / Payment ──────────────────────────────────
559
+ { prefix: 'afterpay', name: 'Afterpay' },
560
+ { prefix: 'klarna', name: 'Klarna' },
561
+ ];
562
+ const ORGANIC_SEARCH_ENGINES = [
563
+ { match: 'google', name: 'Google' },
564
+ { match: 'bing', name: 'Bing' },
565
+ { match: 'yahoo', name: 'Yahoo' },
566
+ { match: 'duckduckgo', name: 'DuckDuckGo' },
567
+ { match: 'baidu', name: 'Baidu' },
568
+ { match: 'yandex', name: 'Yandex' },
569
+ { match: 'brave', name: 'Brave' },
570
+ ];
571
+ const KNOWN_REFERRAL_PLATFORMS = [
572
+ { match: 'facebook', name: 'Facebook' },
573
+ { match: 'instagram', name: 'Facebook' },
574
+ { match: 'twitter', name: 'Twitter' },
575
+ { match: 'x.com', name: 'Twitter' },
576
+ { match: 'tiktok', name: 'TikTok' },
577
+ { match: 'pinterest', name: 'Pinterest' },
578
+ { match: 'linkedin', name: 'LinkedIn' },
579
+ { match: 'youtube', name: 'YouTube' },
580
+ { match: 'chatgpt', name: 'ChatGPT' },
581
+ { match: 'claude', name: 'Claude' },
582
+ { match: 'perplexity', name: 'Perplexity' },
583
+ { match: 'shop.app', name: 'Shop App' },
584
+ { match: 'amazon', name: 'Amazon' },
585
+ { match: 'attentive', name: 'Attentive' },
586
+ ];
587
+ const OFFLINE_TOUCH = 'Blotout_Offline';
588
+ new Set([
589
+ ...CLICK_IDS.map((c) => c.label),
590
+ ...Object.values(UTM_SOURCE_EXACT),
591
+ ...UTM_SOURCE_PARTIAL.map((e) => e.name),
592
+ ...ORGANIC_SEARCH_ENGINES.map((e) => `Organic Search - ${e.name}`),
593
+ ...KNOWN_REFERRAL_PLATFORMS.map((e) => `Referral - ${e.name}`),
594
+ 'Referral - Other',
595
+ 'Direct Traffic',
596
+ 'Other',
597
+ OFFLINE_TOUCH,
598
+ ]);
599
+
445
600
  const DEFAULT_EVENT_MAP = {
446
601
  PageView: 'page_view',
447
602
  Lead: 'lead',
@@ -478,7 +633,7 @@ const triggerEvent = (vbpx, event, data) => {
478
633
  };
479
634
  const tag = ({ data, eventName, manifestVariables }) => {
480
635
  const payload = {
481
- sdkVersion: "1.53.0" ,
636
+ sdkVersion: "1.54.0" ,
482
637
  };
483
638
  if (typeof window === 'undefined' ||
484
639
  !window.vbpx ||
package/index.js CHANGED
@@ -75,6 +75,40 @@ var ProvidersVibeCoSdk = (function () {
75
75
  initVibeCo(pixelId);
76
76
  };
77
77
 
78
+ /**
79
+ * Known ad-network click ID query parameters and the human-readable provider
80
+ * label each one maps to. Used by the CDN worker to resolve `inSessionTouch`
81
+ * and by the analytics API to classify paid-media touch sessions.
82
+ *
83
+ * Keep this list in sync with `defaultParams` in queryParams.ts when new
84
+ * click ID providers are added.
85
+ */
86
+ const CLICK_IDS = [
87
+ { param: 'fbclid', label: 'Facebook' }, // Facebook Ads
88
+ { param: 'gclid', label: 'Google' }, // Google Ads (click)
89
+ { param: 'gbraid', label: 'Google' }, // Google Ads (iOS app)
90
+ { param: 'wbraid', label: 'Google' }, // Google Ads (iOS web)
91
+ { param: 'msclkid', label: 'Bing' }, // Microsoft Bing Ads
92
+ { param: 'ttclid', label: 'TikTok' }, // TikTok Ads
93
+ { param: 'ScCid', label: 'Snapchat' }, // Snapchat Ads
94
+ { param: 'epik', label: 'Pinterest' }, // Pinterest Ads
95
+ { param: 'li_fat_id', label: 'LinkedIn' }, // LinkedIn Ads
96
+ { param: 'twclid', label: 'Twitter' }, // X (Twitter) Ads
97
+ { param: 'rdt_cid', label: 'Reddit' }, // Reddit Ads
98
+ { param: 'aleid', label: 'AppLovin' }, // AppLovin
99
+ { param: 'tabclid', label: 'Taboola' }, // Taboola
100
+ { param: 'obclid', label: 'Outbrain' }, // Outbrain
101
+ { param: 'trybe', label: 'Trybe' }, // Trybe
102
+ { param: '_kx', label: 'Klaviyo' }, // Klaviyo email campaigns
103
+ { param: 'mc_eid', label: 'Mailchimp' }, // Mailchimp email campaigns
104
+ { param: 'ttd_id', label: 'The Trade Desk' }, // The Trade Desk programmatic
105
+ { param: 'evsclid', label: 'EvoSearch' }, // EvoSearch
106
+ { param: 'li_did', label: 'Live Intent' }, // LiveIntent device-level ad
107
+ { param: '_raclid', label: 'Rumble' }, // Rumble Ads
108
+ { param: 'ref_id', label: 'StackAdapt' }, // StackAdapt programmatic
109
+ { param: 'duel_a', label: 'Duel' }, // Duel referral/advocacy
110
+ ];
111
+
78
112
  const expand = (str) => str.split(',').flatMap((entry) => {
79
113
  if (!entry.includes('-')) {
80
114
  return entry;
@@ -443,6 +477,127 @@ var ProvidersVibeCoSdk = (function () {
443
477
  ]);
444
478
  new Set([...isoCountries.keys(), ...usStates.keys()]);
445
479
 
480
+ /**
481
+ * Exact utm_source normalization (lowercase key → canonical name).
482
+ *
483
+ * Use exact match when the key is short, generic, or must not accidentally
484
+ * absorb variant spellings (e.g. "impact" must not match "impact_radius").
485
+ *
486
+ * Ordering: Paid (search/social → ad networks → affiliates) →
487
+ * Organic (AI/discovery) → Retention (email → SMS → push → post-purchase)
488
+ */
489
+ const UTM_SOURCE_EXACT = {
490
+ // ── Paid – Search & Social ────────────────────────────────────────────────
491
+ google: 'Google',
492
+ adwords: 'Google',
493
+ youtube: 'Google',
494
+ yt: 'Google',
495
+ meta: 'Facebook',
496
+ facebook: 'Facebook',
497
+ instagram: 'Facebook',
498
+ ig: 'Facebook',
499
+ igshopping: 'Facebook',
500
+ threads: 'Facebook',
501
+ twitter: 'Twitter',
502
+ snapchat: 'Snapchat',
503
+ pinterest: 'Pinterest',
504
+ bing: 'Bing',
505
+ microsoft: 'Bing',
506
+ tiktok: 'TikTok',
507
+ // ── Paid – Ad Networks ───────────────────────────────────────────────────
508
+ rtbhouse: 'RTB House',
509
+ applovin: 'AppLovin',
510
+ ttd: 'The Trade Desk',
511
+ amazondsp: 'Amazon DSP',
512
+ axon: 'Axon',
513
+ duel: 'Duel',
514
+ // ── Paid – Affiliates ────────────────────────────────────────────────────
515
+ awin: 'Awin',
516
+ 'affiliate-cj': 'CJ Affiliate',
517
+ impact: 'Impact',
518
+ rakuten: 'Rakuten',
519
+ superfiliate: 'Superfiliate',
520
+ // ── Organic – AI & Discovery ─────────────────────────────────────────────
521
+ perplexity: 'Perplexity',
522
+ chatgpt: 'ChatGPT',
523
+ 'chatgpt.com': 'ChatGPT',
524
+ openai: 'ChatGPT',
525
+ 'copilot.com': 'Microsoft Copilot',
526
+ copilot: 'Microsoft Copilot',
527
+ applenews: 'Apple News',
528
+ whatsapp: 'WhatsApp',
529
+ podcast: 'Podcast',
530
+ // ── Retention – Email ────────────────────────────────────────────────────
531
+ mailchimp: 'Mailchimp',
532
+ omnisend: 'Omnisend',
533
+ iterable: 'Iterable',
534
+ listrak: 'Listrak',
535
+ sailthru: 'Sailthru',
536
+ // ── Retention – Push ─────────────────────────────────────────────────────
537
+ pushowl: 'PushOwl',
538
+ // ── Retention – Post-purchase / Payment ──────────────────────────────────
539
+ narvar: 'Narvar',
540
+ shop_app: 'Shop App',
541
+ salesforce: 'Salesforce',
542
+ yotpo: 'Yotpo',
543
+ };
544
+ /**
545
+ * Partial utm_source normalization (startsWith prefix check, lowercase).
546
+ *
547
+ * Checked after exact match so short exact keys (e.g. "ig", "yt") win first.
548
+ */
549
+ const UTM_SOURCE_PARTIAL = [
550
+ // ── Paid – Social ─────────────────────────────────────────────────────────
551
+ { prefix: 'tiktok', name: 'TikTok' },
552
+ // ── Paid – Ad Networks ───────────────────────────────────────────────────
553
+ { prefix: 'criteo', name: 'Criteo' },
554
+ // ── Retention – Email ────────────────────────────────────────────────────
555
+ { prefix: 'klaviyo', name: 'Klaviyo' },
556
+ // ── Retention – SMS ──────────────────────────────────────────────────────
557
+ { prefix: 'attentive', name: 'Attentive' },
558
+ { prefix: 'postscript', name: 'Postscript' },
559
+ // ── Retention – Post-purchase / Payment ──────────────────────────────────
560
+ { prefix: 'afterpay', name: 'Afterpay' },
561
+ { prefix: 'klarna', name: 'Klarna' },
562
+ ];
563
+ const ORGANIC_SEARCH_ENGINES = [
564
+ { match: 'google', name: 'Google' },
565
+ { match: 'bing', name: 'Bing' },
566
+ { match: 'yahoo', name: 'Yahoo' },
567
+ { match: 'duckduckgo', name: 'DuckDuckGo' },
568
+ { match: 'baidu', name: 'Baidu' },
569
+ { match: 'yandex', name: 'Yandex' },
570
+ { match: 'brave', name: 'Brave' },
571
+ ];
572
+ const KNOWN_REFERRAL_PLATFORMS = [
573
+ { match: 'facebook', name: 'Facebook' },
574
+ { match: 'instagram', name: 'Facebook' },
575
+ { match: 'twitter', name: 'Twitter' },
576
+ { match: 'x.com', name: 'Twitter' },
577
+ { match: 'tiktok', name: 'TikTok' },
578
+ { match: 'pinterest', name: 'Pinterest' },
579
+ { match: 'linkedin', name: 'LinkedIn' },
580
+ { match: 'youtube', name: 'YouTube' },
581
+ { match: 'chatgpt', name: 'ChatGPT' },
582
+ { match: 'claude', name: 'Claude' },
583
+ { match: 'perplexity', name: 'Perplexity' },
584
+ { match: 'shop.app', name: 'Shop App' },
585
+ { match: 'amazon', name: 'Amazon' },
586
+ { match: 'attentive', name: 'Attentive' },
587
+ ];
588
+ const OFFLINE_TOUCH = 'Blotout_Offline';
589
+ new Set([
590
+ ...CLICK_IDS.map((c) => c.label),
591
+ ...Object.values(UTM_SOURCE_EXACT),
592
+ ...UTM_SOURCE_PARTIAL.map((e) => e.name),
593
+ ...ORGANIC_SEARCH_ENGINES.map((e) => `Organic Search - ${e.name}`),
594
+ ...KNOWN_REFERRAL_PLATFORMS.map((e) => `Referral - ${e.name}`),
595
+ 'Referral - Other',
596
+ 'Direct Traffic',
597
+ 'Other',
598
+ OFFLINE_TOUCH,
599
+ ]);
600
+
446
601
  const DEFAULT_EVENT_MAP = {
447
602
  PageView: 'page_view',
448
603
  Lead: 'lead',
@@ -479,7 +634,7 @@ var ProvidersVibeCoSdk = (function () {
479
634
  };
480
635
  const tag = ({ data, eventName, manifestVariables }) => {
481
636
  const payload = {
482
- sdkVersion: "1.53.0" ,
637
+ sdkVersion: "1.54.0" ,
483
638
  };
484
639
  if (typeof window === 'undefined' ||
485
640
  !window.vbpx ||
package/index.mjs CHANGED
@@ -72,6 +72,40 @@ const init = ({ manifest }) => {
72
72
  initVibeCo(pixelId);
73
73
  };
74
74
 
75
+ /**
76
+ * Known ad-network click ID query parameters and the human-readable provider
77
+ * label each one maps to. Used by the CDN worker to resolve `inSessionTouch`
78
+ * and by the analytics API to classify paid-media touch sessions.
79
+ *
80
+ * Keep this list in sync with `defaultParams` in queryParams.ts when new
81
+ * click ID providers are added.
82
+ */
83
+ const CLICK_IDS = [
84
+ { param: 'fbclid', label: 'Facebook' }, // Facebook Ads
85
+ { param: 'gclid', label: 'Google' }, // Google Ads (click)
86
+ { param: 'gbraid', label: 'Google' }, // Google Ads (iOS app)
87
+ { param: 'wbraid', label: 'Google' }, // Google Ads (iOS web)
88
+ { param: 'msclkid', label: 'Bing' }, // Microsoft Bing Ads
89
+ { param: 'ttclid', label: 'TikTok' }, // TikTok Ads
90
+ { param: 'ScCid', label: 'Snapchat' }, // Snapchat Ads
91
+ { param: 'epik', label: 'Pinterest' }, // Pinterest Ads
92
+ { param: 'li_fat_id', label: 'LinkedIn' }, // LinkedIn Ads
93
+ { param: 'twclid', label: 'Twitter' }, // X (Twitter) Ads
94
+ { param: 'rdt_cid', label: 'Reddit' }, // Reddit Ads
95
+ { param: 'aleid', label: 'AppLovin' }, // AppLovin
96
+ { param: 'tabclid', label: 'Taboola' }, // Taboola
97
+ { param: 'obclid', label: 'Outbrain' }, // Outbrain
98
+ { param: 'trybe', label: 'Trybe' }, // Trybe
99
+ { param: '_kx', label: 'Klaviyo' }, // Klaviyo email campaigns
100
+ { param: 'mc_eid', label: 'Mailchimp' }, // Mailchimp email campaigns
101
+ { param: 'ttd_id', label: 'The Trade Desk' }, // The Trade Desk programmatic
102
+ { param: 'evsclid', label: 'EvoSearch' }, // EvoSearch
103
+ { param: 'li_did', label: 'Live Intent' }, // LiveIntent device-level ad
104
+ { param: '_raclid', label: 'Rumble' }, // Rumble Ads
105
+ { param: 'ref_id', label: 'StackAdapt' }, // StackAdapt programmatic
106
+ { param: 'duel_a', label: 'Duel' }, // Duel referral/advocacy
107
+ ];
108
+
75
109
  const expand = (str) => str.split(',').flatMap((entry) => {
76
110
  if (!entry.includes('-')) {
77
111
  return entry;
@@ -440,6 +474,127 @@ const usStates = new Map([
440
474
  ]);
441
475
  new Set([...isoCountries.keys(), ...usStates.keys()]);
442
476
 
477
+ /**
478
+ * Exact utm_source normalization (lowercase key → canonical name).
479
+ *
480
+ * Use exact match when the key is short, generic, or must not accidentally
481
+ * absorb variant spellings (e.g. "impact" must not match "impact_radius").
482
+ *
483
+ * Ordering: Paid (search/social → ad networks → affiliates) →
484
+ * Organic (AI/discovery) → Retention (email → SMS → push → post-purchase)
485
+ */
486
+ const UTM_SOURCE_EXACT = {
487
+ // ── Paid – Search & Social ────────────────────────────────────────────────
488
+ google: 'Google',
489
+ adwords: 'Google',
490
+ youtube: 'Google',
491
+ yt: 'Google',
492
+ meta: 'Facebook',
493
+ facebook: 'Facebook',
494
+ instagram: 'Facebook',
495
+ ig: 'Facebook',
496
+ igshopping: 'Facebook',
497
+ threads: 'Facebook',
498
+ twitter: 'Twitter',
499
+ snapchat: 'Snapchat',
500
+ pinterest: 'Pinterest',
501
+ bing: 'Bing',
502
+ microsoft: 'Bing',
503
+ tiktok: 'TikTok',
504
+ // ── Paid – Ad Networks ───────────────────────────────────────────────────
505
+ rtbhouse: 'RTB House',
506
+ applovin: 'AppLovin',
507
+ ttd: 'The Trade Desk',
508
+ amazondsp: 'Amazon DSP',
509
+ axon: 'Axon',
510
+ duel: 'Duel',
511
+ // ── Paid – Affiliates ────────────────────────────────────────────────────
512
+ awin: 'Awin',
513
+ 'affiliate-cj': 'CJ Affiliate',
514
+ impact: 'Impact',
515
+ rakuten: 'Rakuten',
516
+ superfiliate: 'Superfiliate',
517
+ // ── Organic – AI & Discovery ─────────────────────────────────────────────
518
+ perplexity: 'Perplexity',
519
+ chatgpt: 'ChatGPT',
520
+ 'chatgpt.com': 'ChatGPT',
521
+ openai: 'ChatGPT',
522
+ 'copilot.com': 'Microsoft Copilot',
523
+ copilot: 'Microsoft Copilot',
524
+ applenews: 'Apple News',
525
+ whatsapp: 'WhatsApp',
526
+ podcast: 'Podcast',
527
+ // ── Retention – Email ────────────────────────────────────────────────────
528
+ mailchimp: 'Mailchimp',
529
+ omnisend: 'Omnisend',
530
+ iterable: 'Iterable',
531
+ listrak: 'Listrak',
532
+ sailthru: 'Sailthru',
533
+ // ── Retention – Push ─────────────────────────────────────────────────────
534
+ pushowl: 'PushOwl',
535
+ // ── Retention – Post-purchase / Payment ──────────────────────────────────
536
+ narvar: 'Narvar',
537
+ shop_app: 'Shop App',
538
+ salesforce: 'Salesforce',
539
+ yotpo: 'Yotpo',
540
+ };
541
+ /**
542
+ * Partial utm_source normalization (startsWith prefix check, lowercase).
543
+ *
544
+ * Checked after exact match so short exact keys (e.g. "ig", "yt") win first.
545
+ */
546
+ const UTM_SOURCE_PARTIAL = [
547
+ // ── Paid – Social ─────────────────────────────────────────────────────────
548
+ { prefix: 'tiktok', name: 'TikTok' },
549
+ // ── Paid – Ad Networks ───────────────────────────────────────────────────
550
+ { prefix: 'criteo', name: 'Criteo' },
551
+ // ── Retention – Email ────────────────────────────────────────────────────
552
+ { prefix: 'klaviyo', name: 'Klaviyo' },
553
+ // ── Retention – SMS ──────────────────────────────────────────────────────
554
+ { prefix: 'attentive', name: 'Attentive' },
555
+ { prefix: 'postscript', name: 'Postscript' },
556
+ // ── Retention – Post-purchase / Payment ──────────────────────────────────
557
+ { prefix: 'afterpay', name: 'Afterpay' },
558
+ { prefix: 'klarna', name: 'Klarna' },
559
+ ];
560
+ const ORGANIC_SEARCH_ENGINES = [
561
+ { match: 'google', name: 'Google' },
562
+ { match: 'bing', name: 'Bing' },
563
+ { match: 'yahoo', name: 'Yahoo' },
564
+ { match: 'duckduckgo', name: 'DuckDuckGo' },
565
+ { match: 'baidu', name: 'Baidu' },
566
+ { match: 'yandex', name: 'Yandex' },
567
+ { match: 'brave', name: 'Brave' },
568
+ ];
569
+ const KNOWN_REFERRAL_PLATFORMS = [
570
+ { match: 'facebook', name: 'Facebook' },
571
+ { match: 'instagram', name: 'Facebook' },
572
+ { match: 'twitter', name: 'Twitter' },
573
+ { match: 'x.com', name: 'Twitter' },
574
+ { match: 'tiktok', name: 'TikTok' },
575
+ { match: 'pinterest', name: 'Pinterest' },
576
+ { match: 'linkedin', name: 'LinkedIn' },
577
+ { match: 'youtube', name: 'YouTube' },
578
+ { match: 'chatgpt', name: 'ChatGPT' },
579
+ { match: 'claude', name: 'Claude' },
580
+ { match: 'perplexity', name: 'Perplexity' },
581
+ { match: 'shop.app', name: 'Shop App' },
582
+ { match: 'amazon', name: 'Amazon' },
583
+ { match: 'attentive', name: 'Attentive' },
584
+ ];
585
+ const OFFLINE_TOUCH = 'Blotout_Offline';
586
+ new Set([
587
+ ...CLICK_IDS.map((c) => c.label),
588
+ ...Object.values(UTM_SOURCE_EXACT),
589
+ ...UTM_SOURCE_PARTIAL.map((e) => e.name),
590
+ ...ORGANIC_SEARCH_ENGINES.map((e) => `Organic Search - ${e.name}`),
591
+ ...KNOWN_REFERRAL_PLATFORMS.map((e) => `Referral - ${e.name}`),
592
+ 'Referral - Other',
593
+ 'Direct Traffic',
594
+ 'Other',
595
+ OFFLINE_TOUCH,
596
+ ]);
597
+
443
598
  const DEFAULT_EVENT_MAP = {
444
599
  PageView: 'page_view',
445
600
  Lead: 'lead',
@@ -476,7 +631,7 @@ const triggerEvent = (vbpx, event, data) => {
476
631
  };
477
632
  const tag = ({ data, eventName, manifestVariables }) => {
478
633
  const payload = {
479
- sdkVersion: "1.53.0" ,
634
+ sdkVersion: "1.54.0" ,
480
635
  };
481
636
  if (typeof window === 'undefined' ||
482
637
  !window.vbpx ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blotoutio/providers-vibe-co-sdk",
3
- "version": "1.53.0",
3
+ "version": "1.54.0",
4
4
  "description": "Vibe Co Browser SDK for EdgeTag",
5
5
  "author": "Blotout",
6
6
  "license": "MIT",