@segment/analytics-browser-actions-google-analytics-4 1.33.0 → 1.34.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 (171) hide show
  1. package/dist/cjs/addPaymentInfo/generated-types.d.ts +1 -0
  2. package/dist/cjs/addPaymentInfo/index.js +4 -2
  3. package/dist/cjs/addPaymentInfo/index.js.map +1 -1
  4. package/dist/cjs/addToCart/generated-types.d.ts +1 -0
  5. package/dist/cjs/addToCart/index.js +4 -2
  6. package/dist/cjs/addToCart/index.js.map +1 -1
  7. package/dist/cjs/addToWishlist/generated-types.d.ts +1 -0
  8. package/dist/cjs/addToWishlist/index.js +4 -2
  9. package/dist/cjs/addToWishlist/index.js.map +1 -1
  10. package/dist/cjs/beginCheckout/generated-types.d.ts +1 -0
  11. package/dist/cjs/beginCheckout/index.js +4 -2
  12. package/dist/cjs/beginCheckout/index.js.map +1 -1
  13. package/dist/cjs/customEvent/generated-types.d.ts +1 -0
  14. package/dist/cjs/customEvent/index.js +4 -2
  15. package/dist/cjs/customEvent/index.js.map +1 -1
  16. package/dist/cjs/ga4-properties.d.ts +1 -0
  17. package/dist/cjs/ga4-properties.js +7 -1
  18. package/dist/cjs/ga4-properties.js.map +1 -1
  19. package/dist/cjs/generateLead/generated-types.d.ts +1 -0
  20. package/dist/cjs/generateLead/index.js +4 -2
  21. package/dist/cjs/generateLead/index.js.map +1 -1
  22. package/dist/cjs/login/generated-types.d.ts +1 -0
  23. package/dist/cjs/login/index.js +4 -2
  24. package/dist/cjs/login/index.js.map +1 -1
  25. package/dist/cjs/purchase/generated-types.d.ts +1 -0
  26. package/dist/cjs/purchase/index.js +4 -2
  27. package/dist/cjs/purchase/index.js.map +1 -1
  28. package/dist/cjs/refund/generated-types.d.ts +1 -0
  29. package/dist/cjs/refund/index.js +4 -2
  30. package/dist/cjs/refund/index.js.map +1 -1
  31. package/dist/cjs/removeFromCart/generated-types.d.ts +1 -0
  32. package/dist/cjs/removeFromCart/index.js +4 -2
  33. package/dist/cjs/removeFromCart/index.js.map +1 -1
  34. package/dist/cjs/search/generated-types.d.ts +1 -0
  35. package/dist/cjs/search/index.js +4 -2
  36. package/dist/cjs/search/index.js.map +1 -1
  37. package/dist/cjs/selectItem/generated-types.d.ts +1 -0
  38. package/dist/cjs/selectItem/index.js +4 -2
  39. package/dist/cjs/selectItem/index.js.map +1 -1
  40. package/dist/cjs/selectPromotion/generated-types.d.ts +1 -0
  41. package/dist/cjs/selectPromotion/index.js +4 -2
  42. package/dist/cjs/selectPromotion/index.js.map +1 -1
  43. package/dist/cjs/signUp/generated-types.d.ts +1 -0
  44. package/dist/cjs/signUp/index.js +4 -2
  45. package/dist/cjs/signUp/index.js.map +1 -1
  46. package/dist/cjs/viewCart/generated-types.d.ts +1 -0
  47. package/dist/cjs/viewCart/index.js +4 -2
  48. package/dist/cjs/viewCart/index.js.map +1 -1
  49. package/dist/cjs/viewItem/generated-types.d.ts +1 -0
  50. package/dist/cjs/viewItem/index.js +4 -2
  51. package/dist/cjs/viewItem/index.js.map +1 -1
  52. package/dist/cjs/viewItemList/generated-types.d.ts +1 -0
  53. package/dist/cjs/viewItemList/index.js +4 -2
  54. package/dist/cjs/viewItemList/index.js.map +1 -1
  55. package/dist/cjs/viewPromotion/generated-types.d.ts +1 -0
  56. package/dist/cjs/viewPromotion/index.js +4 -2
  57. package/dist/cjs/viewPromotion/index.js.map +1 -1
  58. package/dist/esm/addPaymentInfo/generated-types.d.ts +1 -0
  59. package/dist/esm/addPaymentInfo/index.js +5 -3
  60. package/dist/esm/addPaymentInfo/index.js.map +1 -1
  61. package/dist/esm/addToCart/generated-types.d.ts +1 -0
  62. package/dist/esm/addToCart/index.js +5 -3
  63. package/dist/esm/addToCart/index.js.map +1 -1
  64. package/dist/esm/addToWishlist/generated-types.d.ts +1 -0
  65. package/dist/esm/addToWishlist/index.js +5 -3
  66. package/dist/esm/addToWishlist/index.js.map +1 -1
  67. package/dist/esm/beginCheckout/generated-types.d.ts +1 -0
  68. package/dist/esm/beginCheckout/index.js +5 -3
  69. package/dist/esm/beginCheckout/index.js.map +1 -1
  70. package/dist/esm/customEvent/generated-types.d.ts +1 -0
  71. package/dist/esm/customEvent/index.js +5 -3
  72. package/dist/esm/customEvent/index.js.map +1 -1
  73. package/dist/esm/ga4-properties.d.ts +1 -0
  74. package/dist/esm/ga4-properties.js +6 -0
  75. package/dist/esm/ga4-properties.js.map +1 -1
  76. package/dist/esm/generateLead/generated-types.d.ts +1 -0
  77. package/dist/esm/generateLead/index.js +5 -3
  78. package/dist/esm/generateLead/index.js.map +1 -1
  79. package/dist/esm/login/generated-types.d.ts +1 -0
  80. package/dist/esm/login/index.js +5 -3
  81. package/dist/esm/login/index.js.map +1 -1
  82. package/dist/esm/purchase/generated-types.d.ts +1 -0
  83. package/dist/esm/purchase/index.js +5 -3
  84. package/dist/esm/purchase/index.js.map +1 -1
  85. package/dist/esm/refund/generated-types.d.ts +1 -0
  86. package/dist/esm/refund/index.js +5 -3
  87. package/dist/esm/refund/index.js.map +1 -1
  88. package/dist/esm/removeFromCart/generated-types.d.ts +1 -0
  89. package/dist/esm/removeFromCart/index.js +5 -3
  90. package/dist/esm/removeFromCart/index.js.map +1 -1
  91. package/dist/esm/search/generated-types.d.ts +1 -0
  92. package/dist/esm/search/index.js +5 -3
  93. package/dist/esm/search/index.js.map +1 -1
  94. package/dist/esm/selectItem/generated-types.d.ts +1 -0
  95. package/dist/esm/selectItem/index.js +5 -3
  96. package/dist/esm/selectItem/index.js.map +1 -1
  97. package/dist/esm/selectPromotion/generated-types.d.ts +1 -0
  98. package/dist/esm/selectPromotion/index.js +5 -3
  99. package/dist/esm/selectPromotion/index.js.map +1 -1
  100. package/dist/esm/signUp/generated-types.d.ts +1 -0
  101. package/dist/esm/signUp/index.js +5 -3
  102. package/dist/esm/signUp/index.js.map +1 -1
  103. package/dist/esm/viewCart/generated-types.d.ts +1 -0
  104. package/dist/esm/viewCart/index.js +5 -3
  105. package/dist/esm/viewCart/index.js.map +1 -1
  106. package/dist/esm/viewItem/generated-types.d.ts +1 -0
  107. package/dist/esm/viewItem/index.js +5 -3
  108. package/dist/esm/viewItem/index.js.map +1 -1
  109. package/dist/esm/viewItemList/generated-types.d.ts +1 -0
  110. package/dist/esm/viewItemList/index.js +5 -3
  111. package/dist/esm/viewItemList/index.js.map +1 -1
  112. package/dist/esm/viewPromotion/generated-types.d.ts +1 -0
  113. package/dist/esm/viewPromotion/index.js +5 -3
  114. package/dist/esm/viewPromotion/index.js.map +1 -1
  115. package/dist/tsconfig.tsbuildinfo +1 -1
  116. package/package.json +2 -2
  117. package/src/__tests__/addPaymentInfo.test.ts +74 -2
  118. package/src/__tests__/addToCart.test.ts +67 -2
  119. package/src/__tests__/addToWishlist.test.ts +68 -2
  120. package/src/__tests__/beginCheckout.test.ts +72 -2
  121. package/src/__tests__/customEvent.test.ts +62 -2
  122. package/src/__tests__/generateLead.test.ts +50 -2
  123. package/src/__tests__/login.test.ts +47 -2
  124. package/src/__tests__/purchase.test.ts +71 -2
  125. package/src/__tests__/refund.test.ts +70 -2
  126. package/src/__tests__/removeFromCart.test.ts +69 -2
  127. package/src/__tests__/search.test.ts +48 -2
  128. package/src/__tests__/selectItem.test.ts +69 -2
  129. package/src/__tests__/selectPromotion.test.ts +81 -2
  130. package/src/__tests__/signUp.test.ts +42 -2
  131. package/src/__tests__/viewCart.test.ts +69 -2
  132. package/src/__tests__/viewItem.test.ts +68 -2
  133. package/src/__tests__/viewItemList.test.ts +70 -2
  134. package/src/__tests__/viewPromotion.test.ts +80 -2
  135. package/src/addPaymentInfo/generated-types.ts +4 -0
  136. package/src/addPaymentInfo/index.ts +6 -3
  137. package/src/addToCart/generated-types.ts +4 -0
  138. package/src/addToCart/index.ts +5 -3
  139. package/src/addToWishlist/generated-types.ts +4 -0
  140. package/src/addToWishlist/index.ts +5 -3
  141. package/src/beginCheckout/generated-types.ts +4 -0
  142. package/src/beginCheckout/index.ts +14 -3
  143. package/src/customEvent/generated-types.ts +4 -0
  144. package/src/customEvent/index.ts +5 -3
  145. package/src/ga4-properties.ts +7 -0
  146. package/src/generateLead/generated-types.ts +4 -0
  147. package/src/generateLead/index.ts +5 -3
  148. package/src/login/generated-types.ts +4 -0
  149. package/src/login/index.ts +5 -3
  150. package/src/purchase/generated-types.ts +4 -0
  151. package/src/purchase/index.ts +6 -3
  152. package/src/refund/generated-types.ts +4 -0
  153. package/src/refund/index.ts +6 -3
  154. package/src/removeFromCart/generated-types.ts +4 -0
  155. package/src/removeFromCart/index.ts +5 -3
  156. package/src/search/generated-types.ts +4 -0
  157. package/src/search/index.ts +5 -3
  158. package/src/selectItem/generated-types.ts +4 -0
  159. package/src/selectItem/index.ts +6 -3
  160. package/src/selectPromotion/generated-types.ts +4 -0
  161. package/src/selectPromotion/index.ts +6 -3
  162. package/src/signUp/generated-types.ts +4 -0
  163. package/src/signUp/index.ts +5 -3
  164. package/src/viewCart/generated-types.ts +4 -0
  165. package/src/viewCart/index.ts +5 -3
  166. package/src/viewItem/generated-types.ts +4 -0
  167. package/src/viewItem/index.ts +5 -3
  168. package/src/viewItemList/generated-types.ts +4 -0
  169. package/src/viewItemList/index.ts +13 -3
  170. package/src/viewPromotion/generated-types.ts +4 -0
  171. package/src/viewPromotion/index.ts +6 -3
@@ -15,6 +15,9 @@ const subscriptions: Subscription[] = [
15
15
  value: {
16
16
  '@path': '$.properties.value'
17
17
  },
18
+ send_to: {
19
+ '@path': '$.properties.send_to'
20
+ },
18
21
  coupon: {
19
22
  '@path': '$.properties.coupon'
20
23
  },
@@ -67,7 +70,71 @@ describe('GoogleAnalytics4Web.refund', () => {
67
70
  await trackEventPlugin.load(Context.system(), {} as Analytics)
68
71
  })
69
72
 
70
- test('GA4 Refund Event', async () => {
73
+ test('GA4 Refund Event when send to is false', async () => {
74
+ const context = new Context({
75
+ event: 'Refund',
76
+ type: 'track',
77
+ properties: {
78
+ currency: 'USD',
79
+ value: 10,
80
+ transaction_id: 12321,
81
+ send_to: false,
82
+ products: [
83
+ {
84
+ product_id: '12345',
85
+ name: 'Monopoly: 3rd Edition',
86
+ currency: 'USD'
87
+ }
88
+ ]
89
+ }
90
+ })
91
+ await refundEvent.track?.(context)
92
+
93
+ expect(mockGA4).toHaveBeenCalledWith(
94
+ expect.anything(),
95
+ expect.stringContaining('refund'),
96
+ expect.objectContaining({
97
+ currency: 'USD',
98
+ transaction_id: 12321,
99
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
100
+ value: 10,
101
+ send_to: 'default'
102
+ })
103
+ )
104
+ })
105
+ test('GA4 Refund Event when send to is true', async () => {
106
+ const context = new Context({
107
+ event: 'Refund',
108
+ type: 'track',
109
+ properties: {
110
+ currency: 'USD',
111
+ value: 10,
112
+ transaction_id: 12321,
113
+ send_to: true,
114
+ products: [
115
+ {
116
+ product_id: '12345',
117
+ name: 'Monopoly: 3rd Edition',
118
+ currency: 'USD'
119
+ }
120
+ ]
121
+ }
122
+ })
123
+ await refundEvent.track?.(context)
124
+
125
+ expect(mockGA4).toHaveBeenCalledWith(
126
+ expect.anything(),
127
+ expect.stringContaining('refund'),
128
+ expect.objectContaining({
129
+ currency: 'USD',
130
+ transaction_id: 12321,
131
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
132
+ value: 10,
133
+ send_to: settings.measurementID
134
+ })
135
+ )
136
+ })
137
+ test('GA4 Refund Event when send to is undefined', async () => {
71
138
  const context = new Context({
72
139
  event: 'Refund',
73
140
  type: 'track',
@@ -93,7 +160,8 @@ describe('GoogleAnalytics4Web.refund', () => {
93
160
  currency: 'USD',
94
161
  transaction_id: 12321,
95
162
  items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
96
- value: 10
163
+ value: 10,
164
+ send_to: 'default'
97
165
  })
98
166
  )
99
167
  })
@@ -18,6 +18,9 @@ const subscriptions: Subscription[] = [
18
18
  coupon: {
19
19
  '@path': '$.properties.coupon'
20
20
  },
21
+ send_to: {
22
+ '@path': '$.properties.send_to'
23
+ },
21
24
  items: [
22
25
  {
23
26
  item_name: {
@@ -64,13 +67,45 @@ describe('GoogleAnalytics4Web.removeFromCart', () => {
64
67
  await trackEventPlugin.load(Context.system(), {} as Analytics)
65
68
  })
66
69
 
67
- test('GA4 removeFromCart Event', async () => {
70
+ test('GA4 removeFromCart Event when send to is false', async () => {
71
+ const context = new Context({
72
+ event: 'Remove from Cart',
73
+ type: 'track',
74
+ properties: {
75
+ currency: 'USD',
76
+ value: 10,
77
+ send_to: false,
78
+ products: [
79
+ {
80
+ product_id: '12345',
81
+ name: 'Monopoly: 3rd Edition',
82
+ currency: 'USD'
83
+ }
84
+ ]
85
+ }
86
+ })
87
+
88
+ await removeFromCartEvent.track?.(context)
89
+
90
+ expect(mockGA4).toHaveBeenCalledWith(
91
+ expect.anything(),
92
+ expect.stringContaining('remove_from_cart'),
93
+ expect.objectContaining({
94
+ currency: 'USD',
95
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
96
+ value: 10,
97
+ send_to: 'default'
98
+ })
99
+ )
100
+ })
101
+ test('GA4 removeFromCart Event when send to is true', async () => {
68
102
  const context = new Context({
69
103
  event: 'Remove from Cart',
70
104
  type: 'track',
71
105
  properties: {
72
106
  currency: 'USD',
73
107
  value: 10,
108
+ send_to: true,
74
109
  products: [
75
110
  {
76
111
  product_id: '12345',
@@ -89,7 +124,39 @@ describe('GoogleAnalytics4Web.removeFromCart', () => {
89
124
  expect.objectContaining({
90
125
  currency: 'USD',
91
126
  items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
92
- value: 10
127
+ value: 10,
128
+ send_to: settings.measurementID
129
+ })
130
+ )
131
+ })
132
+
133
+ test('GA4 removeFromCart Event when send to is undefined', async () => {
134
+ const context = new Context({
135
+ event: 'Remove from Cart',
136
+ type: 'track',
137
+ properties: {
138
+ currency: 'USD',
139
+ value: 10,
140
+ products: [
141
+ {
142
+ product_id: '12345',
143
+ name: 'Monopoly: 3rd Edition',
144
+ currency: 'USD'
145
+ }
146
+ ]
147
+ }
148
+ })
149
+
150
+ await removeFromCartEvent.track?.(context)
151
+
152
+ expect(mockGA4).toHaveBeenCalledWith(
153
+ expect.anything(),
154
+ expect.stringContaining('remove_from_cart'),
155
+ expect.objectContaining({
156
+ currency: 'USD',
157
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
158
+ value: 10,
159
+ send_to: 'default'
93
160
  })
94
161
  )
95
162
  })
@@ -11,6 +11,9 @@ const subscriptions: Subscription[] = [
11
11
  mapping: {
12
12
  search_term: {
13
13
  '@path': '$.properties.search_term'
14
+ },
15
+ send_to: {
16
+ '@path': '$.properties.send_to'
14
17
  }
15
18
  }
16
19
  }
@@ -39,12 +42,34 @@ describe('GoogleAnalytics4Web.search', () => {
39
42
  await trackEventPlugin.load(Context.system(), {} as Analytics)
40
43
  })
41
44
 
42
- test('GA4 search Event', async () => {
45
+ test('GA4 search Event when send to is false', async () => {
43
46
  const context = new Context({
44
47
  event: 'search',
45
48
  type: 'track',
46
49
  properties: {
47
- search_term: 'Monopoly: 3rd Edition'
50
+ search_term: 'Monopoly: 3rd Edition',
51
+ send_to: false
52
+ }
53
+ })
54
+
55
+ await searchEvent.track?.(context)
56
+
57
+ expect(mockGA4).toHaveBeenCalledWith(
58
+ expect.anything(),
59
+ expect.stringContaining('search'),
60
+ expect.objectContaining({
61
+ search_term: 'Monopoly: 3rd Edition',
62
+ send_to: 'default'
63
+ })
64
+ )
65
+ })
66
+ test('GA4 search Event when send to is true', async () => {
67
+ const context = new Context({
68
+ event: 'search',
69
+ type: 'track',
70
+ properties: {
71
+ search_term: 'Monopoly: 3rd Edition',
72
+ send_to: true
48
73
  }
49
74
  })
50
75
 
@@ -54,7 +79,28 @@ describe('GoogleAnalytics4Web.search', () => {
54
79
  expect.anything(),
55
80
  expect.stringContaining('search'),
56
81
  expect.objectContaining({
82
+ search_term: 'Monopoly: 3rd Edition',
83
+ send_to: settings.measurementID
84
+ })
85
+ )
86
+ })
87
+ test('GA4 search Event when send to is undefined', async () => {
88
+ const context = new Context({
89
+ event: 'search',
90
+ type: 'track',
91
+ properties: {
57
92
  search_term: 'Monopoly: 3rd Edition'
93
+ }
94
+ })
95
+
96
+ await searchEvent.track?.(context)
97
+
98
+ expect(mockGA4).toHaveBeenCalledWith(
99
+ expect.anything(),
100
+ expect.stringContaining('search'),
101
+ expect.objectContaining({
102
+ search_term: 'Monopoly: 3rd Edition',
103
+ send_to: 'default'
58
104
  })
59
105
  )
60
106
  })
@@ -15,6 +15,9 @@ const subscriptions: Subscription[] = [
15
15
  item_list_name: {
16
16
  '@path': '$.properties.item_list_name'
17
17
  },
18
+ send_to: {
19
+ '@path': '$.properties.send_to'
20
+ },
18
21
  items: [
19
22
  {
20
23
  item_name: {
@@ -61,7 +64,70 @@ describe('GoogleAnalytics4Web.selectItem', () => {
61
64
  await trackEventPlugin.load(Context.system(), {} as Analytics)
62
65
  })
63
66
 
64
- test('GA4 selectItem Event', async () => {
67
+ test('GA4 selectItem Event when send to is false', async () => {
68
+ const context = new Context({
69
+ event: 'Select Item',
70
+ type: 'track',
71
+ properties: {
72
+ item_list_id: 12321,
73
+ item_list_name: 'Monopoly: 3rd Edition',
74
+ send_to: false,
75
+ products: [
76
+ {
77
+ product_id: '12345',
78
+ name: 'Monopoly: 3rd Edition',
79
+ currency: 'USD'
80
+ }
81
+ ]
82
+ }
83
+ })
84
+
85
+ await selectItemEvent.track?.(context)
86
+
87
+ expect(mockGA4).toHaveBeenCalledWith(
88
+ expect.anything(),
89
+ expect.stringContaining('select_item'),
90
+ expect.objectContaining({
91
+ item_list_id: 12321,
92
+ item_list_name: 'Monopoly: 3rd Edition',
93
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
94
+ send_to: 'default'
95
+ })
96
+ )
97
+ })
98
+ test('GA4 selectItem Event when send to is true', async () => {
99
+ const context = new Context({
100
+ event: 'Select Item',
101
+ type: 'track',
102
+ properties: {
103
+ item_list_id: 12321,
104
+ item_list_name: 'Monopoly: 3rd Edition',
105
+ send_to: true,
106
+ products: [
107
+ {
108
+ product_id: '12345',
109
+ name: 'Monopoly: 3rd Edition',
110
+ currency: 'USD'
111
+ }
112
+ ]
113
+ }
114
+ })
115
+
116
+ await selectItemEvent.track?.(context)
117
+
118
+ expect(mockGA4).toHaveBeenCalledWith(
119
+ expect.anything(),
120
+ expect.stringContaining('select_item'),
121
+ expect.objectContaining({
122
+ item_list_id: 12321,
123
+ item_list_name: 'Monopoly: 3rd Edition',
124
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
125
+ send_to: settings.measurementID
126
+ })
127
+ )
128
+ })
129
+
130
+ test('GA4 selectItem Event when send to is undefined', async () => {
65
131
  const context = new Context({
66
132
  event: 'Select Item',
67
133
  type: 'track',
@@ -86,7 +152,8 @@ describe('GoogleAnalytics4Web.selectItem', () => {
86
152
  expect.objectContaining({
87
153
  item_list_id: 12321,
88
154
  item_list_name: 'Monopoly: 3rd Edition',
89
- items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }]
155
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
156
+ send_to: 'default'
90
157
  })
91
158
  )
92
159
  })
@@ -24,6 +24,9 @@ const subscriptions: Subscription[] = [
24
24
  promotion_name: {
25
25
  '@path': '$.properties.promotion_name'
26
26
  },
27
+ send_to: {
28
+ '@path': '$.properties.send_to'
29
+ },
27
30
  items: [
28
31
  {
29
32
  item_name: {
@@ -70,7 +73,82 @@ describe('GoogleAnalytics4Web.selectPromotion', () => {
70
73
  await trackEventPlugin.load(Context.system(), {} as Analytics)
71
74
  })
72
75
 
73
- test('GA4 selectPromotion Event', async () => {
76
+ test('GA4 selectPromotion Event when send to is false', async () => {
77
+ const context = new Context({
78
+ event: 'Select Promotion',
79
+ type: 'track',
80
+ properties: {
81
+ creative_name: 'summer_banner2',
82
+ creative_slot: 'featured_app_1',
83
+ location_id: 'ChIJIQBpAG2ahYAR_6128GcTUEo',
84
+ promotion_id: 'P_12345',
85
+ promotion_name: 'Summer Sale',
86
+ send_to: false,
87
+ products: [
88
+ {
89
+ product_id: '12345',
90
+ name: 'Monopoly: 3rd Edition',
91
+ currency: 'USD'
92
+ }
93
+ ]
94
+ }
95
+ })
96
+
97
+ await selectPromotionEvent.track?.(context)
98
+
99
+ expect(mockGA4).toHaveBeenCalledWith(
100
+ expect.anything(),
101
+ expect.stringContaining('select_promotion'),
102
+ expect.objectContaining({
103
+ creative_name: 'summer_banner2',
104
+ creative_slot: 'featured_app_1',
105
+ location_id: 'ChIJIQBpAG2ahYAR_6128GcTUEo',
106
+ promotion_id: 'P_12345',
107
+ promotion_name: 'Summer Sale',
108
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
109
+ send_to: 'default'
110
+ })
111
+ )
112
+ })
113
+ test('GA4 selectPromotion Event when send to is true', async () => {
114
+ const context = new Context({
115
+ event: 'Select Promotion',
116
+ type: 'track',
117
+ properties: {
118
+ creative_name: 'summer_banner2',
119
+ creative_slot: 'featured_app_1',
120
+ location_id: 'ChIJIQBpAG2ahYAR_6128GcTUEo',
121
+ promotion_id: 'P_12345',
122
+ promotion_name: 'Summer Sale',
123
+ send_to: true,
124
+ products: [
125
+ {
126
+ product_id: '12345',
127
+ name: 'Monopoly: 3rd Edition',
128
+ currency: 'USD'
129
+ }
130
+ ]
131
+ }
132
+ })
133
+
134
+ await selectPromotionEvent.track?.(context)
135
+
136
+ expect(mockGA4).toHaveBeenCalledWith(
137
+ expect.anything(),
138
+ expect.stringContaining('select_promotion'),
139
+ expect.objectContaining({
140
+ creative_name: 'summer_banner2',
141
+ creative_slot: 'featured_app_1',
142
+ location_id: 'ChIJIQBpAG2ahYAR_6128GcTUEo',
143
+ promotion_id: 'P_12345',
144
+ promotion_name: 'Summer Sale',
145
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
146
+ send_to: settings.measurementID
147
+ })
148
+ )
149
+ })
150
+
151
+ test('GA4 selectPromotion Event when send to is undefined', async () => {
74
152
  const context = new Context({
75
153
  event: 'Select Promotion',
76
154
  type: 'track',
@@ -101,7 +179,8 @@ describe('GoogleAnalytics4Web.selectPromotion', () => {
101
179
  location_id: 'ChIJIQBpAG2ahYAR_6128GcTUEo',
102
180
  promotion_id: 'P_12345',
103
181
  promotion_name: 'Summer Sale',
104
- items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }]
182
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
183
+ send_to: 'default'
105
184
  })
106
185
  )
107
186
  })
@@ -11,6 +11,9 @@ const subscriptions: Subscription[] = [
11
11
  mapping: {
12
12
  method: {
13
13
  '@path': '$.properties.method'
14
+ },
15
+ send_to: {
16
+ '@path': '$.properties.send_to'
14
17
  }
15
18
  }
16
19
  }
@@ -39,7 +42,44 @@ describe('GoogleAnalytics4Web.signUp', () => {
39
42
  await trackEventPlugin.load(Context.system(), {} as Analytics)
40
43
  })
41
44
 
42
- test('GA4 signUp Event', async () => {
45
+ test('GA4 signUp Event when send to is false', async () => {
46
+ const context = new Context({
47
+ event: 'signUp',
48
+ type: 'track',
49
+ properties: {
50
+ method: 'Google',
51
+ send_to: false
52
+ }
53
+ })
54
+
55
+ await signUpEvent.track?.(context)
56
+
57
+ expect(mockGA4).toHaveBeenCalledWith(
58
+ expect.anything(),
59
+ expect.stringContaining('sign_up'),
60
+ expect.objectContaining({ method: 'Google', send_to: 'default' })
61
+ )
62
+ })
63
+ test('GA4 signUp Event when send to is true', async () => {
64
+ const context = new Context({
65
+ event: 'signUp',
66
+ type: 'track',
67
+ properties: {
68
+ method: 'Google',
69
+ send_to: true
70
+ }
71
+ })
72
+
73
+ await signUpEvent.track?.(context)
74
+
75
+ expect(mockGA4).toHaveBeenCalledWith(
76
+ expect.anything(),
77
+ expect.stringContaining('sign_up'),
78
+ expect.objectContaining({ method: 'Google', send_to: settings.measurementID })
79
+ )
80
+ })
81
+
82
+ test('GA4 signUp Event when send to is undefined', async () => {
43
83
  const context = new Context({
44
84
  event: 'signUp',
45
85
  type: 'track',
@@ -53,7 +93,7 @@ describe('GoogleAnalytics4Web.signUp', () => {
53
93
  expect(mockGA4).toHaveBeenCalledWith(
54
94
  expect.anything(),
55
95
  expect.stringContaining('sign_up'),
56
- expect.objectContaining({ method: 'Google' })
96
+ expect.objectContaining({ method: 'Google', send_to: 'default' })
57
97
  )
58
98
  })
59
99
  })
@@ -15,6 +15,9 @@ const subscriptions: Subscription[] = [
15
15
  value: {
16
16
  '@path': '$.properties.value'
17
17
  },
18
+ send_to: {
19
+ '@path': '$.properties.send_to'
20
+ },
18
21
  items: [
19
22
  {
20
23
  item_name: {
@@ -61,13 +64,45 @@ describe('GoogleAnalytics4Web.viewCart', () => {
61
64
  await trackEventPlugin.load(Context.system(), {} as Analytics)
62
65
  })
63
66
 
64
- test('GA4 viewCart Event', async () => {
67
+ test('GA4 viewCart Event when send to is false', async () => {
68
+ const context = new Context({
69
+ event: 'View Cart',
70
+ type: 'track',
71
+ properties: {
72
+ currency: 'USD',
73
+ value: 10,
74
+ send_to: false,
75
+ products: [
76
+ {
77
+ product_id: '12345',
78
+ name: 'Monopoly: 3rd Edition',
79
+ currency: 'USD'
80
+ }
81
+ ]
82
+ }
83
+ })
84
+
85
+ await viewCartEvent.track?.(context)
86
+
87
+ expect(mockGA4).toHaveBeenCalledWith(
88
+ expect.anything(),
89
+ expect.stringContaining('view_cart'),
90
+ expect.objectContaining({
91
+ currency: 'USD',
92
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
93
+ value: 10,
94
+ send_to: 'default'
95
+ })
96
+ )
97
+ })
98
+ test('GA4 viewCart Event when send to is true', async () => {
65
99
  const context = new Context({
66
100
  event: 'View Cart',
67
101
  type: 'track',
68
102
  properties: {
69
103
  currency: 'USD',
70
104
  value: 10,
105
+ send_to: true,
71
106
  products: [
72
107
  {
73
108
  product_id: '12345',
@@ -86,7 +121,39 @@ describe('GoogleAnalytics4Web.viewCart', () => {
86
121
  expect.objectContaining({
87
122
  currency: 'USD',
88
123
  items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
89
- value: 10
124
+ value: 10,
125
+ send_to: settings.measurementID
126
+ })
127
+ )
128
+ })
129
+
130
+ test('GA4 viewCart Event when send to is false', async () => {
131
+ const context = new Context({
132
+ event: 'View Cart',
133
+ type: 'track',
134
+ properties: {
135
+ currency: 'USD',
136
+ value: 10,
137
+ products: [
138
+ {
139
+ product_id: '12345',
140
+ name: 'Monopoly: 3rd Edition',
141
+ currency: 'USD'
142
+ }
143
+ ]
144
+ }
145
+ })
146
+
147
+ await viewCartEvent.track?.(context)
148
+
149
+ expect(mockGA4).toHaveBeenCalledWith(
150
+ expect.anything(),
151
+ expect.stringContaining('view_cart'),
152
+ expect.objectContaining({
153
+ currency: 'USD',
154
+ items: [{ currency: 'USD', item_id: '12345', item_name: 'Monopoly: 3rd Edition' }],
155
+ value: 10,
156
+ send_to: 'default'
90
157
  })
91
158
  )
92
159
  })