@sellout/utils 0.0.406 → 0.0.408

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.
@@ -1,5 +1,10 @@
1
1
  export declare enum ClientTrackingEventTypes {
2
- Purchase = "Purchase"
2
+ ViewContent = "ViewContent",
3
+ AddToCart = "AddToCart",
4
+ InitiateCheckout = "InitiateCheckout",
5
+ AddPaymentInfo = "AddPaymentInfo",
6
+ Purchase = "Purchase",
7
+ Lead = "Lead"
3
8
  }
4
9
  export interface IClientTrackingIds {
5
10
  googleAnalyticsId?: string;
@@ -1,11 +1,27 @@
1
1
  "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
2
13
  Object.defineProperty(exports, "__esModule", { value: true });
3
14
  exports.track = exports.initialize = exports.ClientTrackingEventTypes = void 0;
4
15
  const GoogleUtil = require("./GoogleUtil");
5
16
  const FacebookUtil = require("./FacebookUtil");
6
17
  var ClientTrackingEventTypes;
7
18
  (function (ClientTrackingEventTypes) {
19
+ ClientTrackingEventTypes["ViewContent"] = "ViewContent";
20
+ ClientTrackingEventTypes["AddToCart"] = "AddToCart";
21
+ ClientTrackingEventTypes["InitiateCheckout"] = "InitiateCheckout";
22
+ ClientTrackingEventTypes["AddPaymentInfo"] = "AddPaymentInfo";
8
23
  ClientTrackingEventTypes["Purchase"] = "Purchase";
24
+ ClientTrackingEventTypes["Lead"] = "Lead";
9
25
  })(ClientTrackingEventTypes = exports.ClientTrackingEventTypes || (exports.ClientTrackingEventTypes = {}));
10
26
  ;
11
27
  function initialize(clientTrackingIds) {
@@ -15,23 +31,197 @@ function initialize(clientTrackingIds) {
15
31
  exports.initialize = initialize;
16
32
  function track(type, params) {
17
33
  switch (type) {
34
+ case ClientTrackingEventTypes.ViewContent:
35
+ return trackViewContent(params);
36
+ case ClientTrackingEventTypes.AddToCart:
37
+ return trackAddToCart(params);
38
+ case ClientTrackingEventTypes.InitiateCheckout:
39
+ return trackInitiateCheckout(params);
40
+ case ClientTrackingEventTypes.AddPaymentInfo:
41
+ return trackAddPaymentInfo(params);
18
42
  case ClientTrackingEventTypes.Purchase:
19
43
  return trackPurchase(params);
44
+ case ClientTrackingEventTypes.Lead:
45
+ return trackLead(params);
20
46
  default:
21
47
  return null;
22
48
  }
23
49
  }
24
50
  exports.track = track;
25
- function trackPurchase({ order, orderTotal, channel, currency = 'USD', }) {
26
- GoogleUtil.track('event', 'purchase', {
51
+ function trackGoogleEvent(event, action, params) {
52
+ GoogleUtil.track('event', action, params);
53
+ }
54
+ function trackFacebookEvent(event, action, params) {
55
+ FacebookUtil.track('track', action, params);
56
+ }
57
+ function normalizePrice(value) {
58
+ const amount = Number(value !== null && value !== void 0 ? value : 0);
59
+ return Number.isFinite(amount) ? amount : 0;
60
+ }
61
+ function formatValue(amount) {
62
+ return amount / 100;
63
+ }
64
+ function makeTrackingItem(item, fallbackId) {
65
+ var _a;
66
+ return {
67
+ id: String((item === null || item === void 0 ? void 0 : item.ticketTypeId) || (item === null || item === void 0 ? void 0 : item.upgradeId) || (item === null || item === void 0 ? void 0 : item._id) || fallbackId),
68
+ name: String((item === null || item === void 0 ? void 0 : item.name) || 'Item'),
69
+ price: normalizePrice((_a = item === null || item === void 0 ? void 0 : item.price) !== null && _a !== void 0 ? _a : item === null || item === void 0 ? void 0 : item.values),
70
+ quantity: Number((item === null || item === void 0 ? void 0 : item.quantity) || 1),
71
+ };
72
+ }
73
+ function buildCheckoutItems(orderParams = {}) {
74
+ const tickets = Array.isArray(orderParams === null || orderParams === void 0 ? void 0 : orderParams.tickets)
75
+ ? orderParams.tickets.map((ticket, index) => makeTrackingItem(ticket, `ticket-${index}`))
76
+ : [];
77
+ const upgrades = Array.isArray(orderParams === null || orderParams === void 0 ? void 0 : orderParams.upgrades)
78
+ ? orderParams.upgrades.map((upgrade, index) => makeTrackingItem(upgrade, `upgrade-${index}`))
79
+ : [];
80
+ return [...tickets, ...upgrades];
81
+ }
82
+ function buildGoogleItems(items) {
83
+ return items.map((item) => ({
84
+ item_id: item.id,
85
+ item_name: item.name,
86
+ price: formatValue(item.price),
87
+ quantity: item.quantity,
88
+ }));
89
+ }
90
+ function buildFacebookContents(items) {
91
+ return items.map((item) => ({
92
+ id: item.id,
93
+ quantity: item.quantity,
94
+ }));
95
+ }
96
+ function buildFacebookContentIds(items) {
97
+ return items.map((item) => item.id);
98
+ }
99
+ function getTotalValue(items) {
100
+ return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
101
+ }
102
+ function getTicketDisplayName(ticketType, tier) {
103
+ if (!(ticketType === null || ticketType === void 0 ? void 0 : ticketType.name)) {
104
+ return 'Ticket';
105
+ }
106
+ return (tier === null || tier === void 0 ? void 0 : tier.name) ? `${ticketType.name} - ${tier.name}` : ticketType.name;
107
+ }
108
+ function trackViewContent({ event, currency = 'USD', }) {
109
+ const item = {
110
+ id: String((event === null || event === void 0 ? void 0 : event._id) || (event === null || event === void 0 ? void 0 : event.eventId) || 'event'),
111
+ name: String((event === null || event === void 0 ? void 0 : event.name) || 'Event'),
112
+ price: normalizePrice(event === null || event === void 0 ? void 0 : event.lowestPrice),
113
+ quantity: 1,
114
+ };
115
+ trackGoogleEvent(event, 'view_item', {
116
+ currency,
117
+ value: formatValue(item.price),
118
+ items: buildGoogleItems([item]),
119
+ });
120
+ trackFacebookEvent(event, 'ViewContent', {
121
+ content_name: item.name,
122
+ content_ids: [item.id],
123
+ content_type: 'product',
124
+ value: formatValue(item.price),
125
+ currency,
126
+ });
127
+ }
128
+ function buildAddToCartItem({ ticketType, tier, upgrade, }) {
129
+ var _a, _b;
130
+ if (upgrade) {
131
+ return {
132
+ id: String(upgrade._id || upgrade.upgradeId || 'upgrade'),
133
+ name: String(upgrade.name || 'Upgrade'),
134
+ price: normalizePrice(upgrade.price),
135
+ quantity: 1,
136
+ };
137
+ }
138
+ return {
139
+ id: String((ticketType === null || ticketType === void 0 ? void 0 : ticketType._id) || (ticketType === null || ticketType === void 0 ? void 0 : ticketType.ticketTypeId) || 'ticket'),
140
+ name: getTicketDisplayName(ticketType, tier),
141
+ price: normalizePrice((_b = (_a = tier === null || tier === void 0 ? void 0 : tier.price) !== null && _a !== void 0 ? _a : ticketType === null || ticketType === void 0 ? void 0 : ticketType.price) !== null && _b !== void 0 ? _b : ticketType === null || ticketType === void 0 ? void 0 : ticketType.values),
142
+ quantity: 1,
143
+ };
144
+ }
145
+ function trackAddToCart(_a) {
146
+ var { event, currency = 'USD' } = _a, params = __rest(_a, ["event", "currency"]);
147
+ const item = buildAddToCartItem(params);
148
+ trackGoogleEvent(event, 'add_to_cart', {
149
+ currency,
150
+ value: formatValue(item.price),
151
+ items: buildGoogleItems([item]),
152
+ });
153
+ trackFacebookEvent(event, 'AddToCart', {
154
+ content_name: String((event === null || event === void 0 ? void 0 : event.name) || item.name),
155
+ content_ids: [item.id],
156
+ content_type: 'product',
157
+ contents: buildFacebookContents([item]),
158
+ value: formatValue(item.price),
159
+ currency,
160
+ num_items: item.quantity,
161
+ });
162
+ }
163
+ function trackInitiateCheckout({ event, order, currency = 'USD', }) {
164
+ const items = buildCheckoutItems((order === null || order === void 0 ? void 0 : order.createOrderParams) || order);
165
+ const totalValue = getTotalValue(items);
166
+ trackGoogleEvent(event, 'begin_checkout', {
167
+ currency,
168
+ value: formatValue(totalValue),
169
+ items: buildGoogleItems(items),
170
+ });
171
+ trackFacebookEvent(event, 'InitiateCheckout', {
172
+ content_name: String((event === null || event === void 0 ? void 0 : event.name) || 'Checkout'),
173
+ content_ids: buildFacebookContentIds(items),
174
+ content_type: 'product',
175
+ contents: buildFacebookContents(items),
176
+ value: formatValue(totalValue),
177
+ currency,
178
+ num_items: items.reduce((sum, item) => sum + item.quantity, 0),
179
+ });
180
+ }
181
+ function trackAddPaymentInfo({ event, order, paymentSource, currency = 'USD', }) {
182
+ const items = buildCheckoutItems((order === null || order === void 0 ? void 0 : order.createOrderParams) || order);
183
+ const totalValue = getTotalValue(items);
184
+ trackGoogleEvent(event, 'add_payment_info', {
185
+ currency,
186
+ value: formatValue(totalValue),
187
+ payment_type: paymentSource,
188
+ items: buildGoogleItems(items),
189
+ });
190
+ trackFacebookEvent(event, 'AddPaymentInfo', {
191
+ content_name: String((event === null || event === void 0 ? void 0 : event.name) || 'Checkout'),
192
+ content_ids: buildFacebookContentIds(items),
193
+ content_type: 'product',
194
+ contents: buildFacebookContents(items),
195
+ value: formatValue(totalValue),
196
+ currency,
197
+ num_items: items.reduce((sum, item) => sum + item.quantity, 0),
198
+ });
199
+ }
200
+ function trackPurchase({ event, order, orderTotal, channel, currency = 'USD', }) {
201
+ const items = buildCheckoutItems(order);
202
+ trackGoogleEvent(event, 'purchase', {
27
203
  transaction_id: order._id,
28
- value: orderTotal / 100,
204
+ value: formatValue(orderTotal),
29
205
  affiliation: channel,
30
206
  currency,
207
+ items: buildGoogleItems(items),
31
208
  });
32
- FacebookUtil.track('track', 'Purchase', {
33
- value: orderTotal / 100,
209
+ trackFacebookEvent(event, 'Purchase', {
210
+ content_ids: buildFacebookContentIds(items),
211
+ content_type: 'product',
212
+ contents: buildFacebookContents(items),
213
+ value: formatValue(orderTotal),
34
214
  currency,
35
215
  });
36
216
  }
217
+ function trackLead({ event, source, }) {
218
+ trackGoogleEvent(event, 'generate_lead', {
219
+ lead_source: source,
220
+ event_name: event === null || event === void 0 ? void 0 : event.name,
221
+ });
222
+ trackFacebookEvent(event, 'Lead', {
223
+ content_name: String((event === null || event === void 0 ? void 0 : event.name) || 'Lead'),
224
+ content_category: source,
225
+ });
226
+ }
37
227
  //# sourceMappingURL=ClientTrackingUtil.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClientTrackingUtil.js","sourceRoot":"","sources":["../src/ClientTrackingUtil.ts"],"names":[],"mappings":";;;AAAA,2CAA2C;AAC3C,+CAA+C;AAE/C,IAAY,wBAEX;AAFD,WAAY,wBAAwB;IAClC,iDAAqB,CAAA;AACvB,CAAC,EAFW,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAEnC;AAAA,CAAC;AAOF,SAAgB,UAAU,CAAC,iBAAqC;IAC9D,UAAU,CAAC,UAAU,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;AAC7D,CAAC;AAHD,gCAGC;AAED,SAAgB,KAAK,CAAC,IAA8B,EAAE,MAAW;IAC/D,QAAQ,IAAI,EAAE;QACZ,KAAK,wBAAwB,CAAC,QAAQ;YACpC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/B;YACE,OAAO,IAAI,CAAC;KACf;AACH,CAAC;AAPD,sBAOC;AAED,SAAS,aAAa,CAAC,EACrB,KAAK,EACL,UAAU,EACV,OAAO,EACP,QAAQ,GAAG,KAAK,GACjB;IACC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE;QACpC,cAAc,EAAE,KAAK,CAAC,GAAG;QACzB,KAAK,EAAE,UAAU,GAAG,GAAG;QACvB,WAAW,EAAE,OAAO;QACpB,QAAQ;KACT,CAAC,CAAC;IAEH,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE;QACtC,KAAK,EAAE,UAAU,GAAG,GAAG;QACvB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"ClientTrackingUtil.js","sourceRoot":"","sources":["../src/ClientTrackingUtil.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellout/utils",
3
- "version": "0.0.406",
3
+ "version": "0.0.408",
4
4
  "description": "Sellout.io utils",
5
5
  "scripts": {
6
6
  "prepare": "npm run build",
@@ -24,5 +24,5 @@
24
24
  "nodemon": "^2.0.22",
25
25
  "typescript": "^4.4.2"
26
26
  },
27
- "gitHead": "38ee633d111155d893091cce62ff7a93b18623d6"
27
+ "gitHead": "63b40a0b2effb4a8a219b16b73af3d93c49c787d"
28
28
  }
@@ -2,7 +2,12 @@ import * as GoogleUtil from './GoogleUtil';
2
2
  import * as FacebookUtil from './FacebookUtil';
3
3
 
4
4
  export enum ClientTrackingEventTypes {
5
+ ViewContent = 'ViewContent',
6
+ AddToCart = 'AddToCart',
7
+ InitiateCheckout = 'InitiateCheckout',
8
+ AddPaymentInfo = 'AddPaymentInfo',
5
9
  Purchase = 'Purchase',
10
+ Lead = 'Lead',
6
11
  };
7
12
 
8
13
  export interface IClientTrackingIds {
@@ -10,6 +15,94 @@ export interface IClientTrackingIds {
10
15
  facebookPixelId?: string;
11
16
  }
12
17
 
18
+ type TrackingOrganization = {
19
+ facebookPixelId?: string | null;
20
+ googleAnalyticsId?: string | null;
21
+ };
22
+
23
+ type TrackingEvent = {
24
+ _id?: string;
25
+ eventId?: string;
26
+ name?: string;
27
+ lowestPrice?: number;
28
+ organization?: TrackingOrganization;
29
+ };
30
+
31
+ type TrackingUpgrade = {
32
+ _id?: string;
33
+ upgradeId?: string;
34
+ name?: string;
35
+ price?: number;
36
+ };
37
+
38
+ type TrackingTicketType = {
39
+ _id?: string;
40
+ ticketTypeId?: string;
41
+ name?: string;
42
+ price?: number;
43
+ values?: string | number;
44
+ };
45
+
46
+ type TrackingTier = {
47
+ _id?: string;
48
+ name?: string;
49
+ price?: number;
50
+ };
51
+
52
+ type TrackingOrderItem = {
53
+ _id?: string;
54
+ ticketTypeId?: string;
55
+ upgradeId?: string;
56
+ name?: string;
57
+ price?: number;
58
+ values?: string | number;
59
+ quantity?: number;
60
+ };
61
+
62
+ type TrackingOrder = {
63
+ _id?: string;
64
+ tickets?: TrackingOrderItem[];
65
+ upgrades?: TrackingOrderItem[];
66
+ createOrderParams?: {
67
+ tickets?: TrackingOrderItem[];
68
+ upgrades?: TrackingOrderItem[];
69
+ };
70
+ };
71
+
72
+ type BaseTrackingParams = {
73
+ event?: TrackingEvent | null;
74
+ currency?: string;
75
+ };
76
+
77
+ type ViewContentTrackingParams = BaseTrackingParams;
78
+
79
+ type AddToCartTrackingParams = BaseTrackingParams & {
80
+ ticketType?: TrackingTicketType;
81
+ tier?: TrackingTier;
82
+ upgrade?: TrackingUpgrade;
83
+ };
84
+
85
+ type CheckoutTrackingParams = BaseTrackingParams & {
86
+ order?: TrackingOrder;
87
+ };
88
+
89
+ type AddPaymentInfoTrackingParams = CheckoutTrackingParams & {
90
+ paymentSource?: string;
91
+ };
92
+
93
+ type PurchaseTrackingParams = {
94
+ event?: TrackingEvent | null;
95
+ order: TrackingOrder;
96
+ orderTotal: number;
97
+ channel?: string;
98
+ currency?: string;
99
+ };
100
+
101
+ type LeadTrackingParams = {
102
+ event?: TrackingEvent | null;
103
+ source?: string;
104
+ };
105
+
13
106
  export function initialize(clientTrackingIds: IClientTrackingIds) {
14
107
  GoogleUtil.initialize(clientTrackingIds.googleAnalyticsId);
15
108
  FacebookUtil.initialize(clientTrackingIds.facebookPixelId);
@@ -17,28 +110,271 @@ export function initialize(clientTrackingIds: IClientTrackingIds) {
17
110
 
18
111
  export function track(type: ClientTrackingEventTypes, params: any) {
19
112
  switch (type) {
113
+ case ClientTrackingEventTypes.ViewContent:
114
+ return trackViewContent(params);
115
+ case ClientTrackingEventTypes.AddToCart:
116
+ return trackAddToCart(params);
117
+ case ClientTrackingEventTypes.InitiateCheckout:
118
+ return trackInitiateCheckout(params);
119
+ case ClientTrackingEventTypes.AddPaymentInfo:
120
+ return trackAddPaymentInfo(params);
20
121
  case ClientTrackingEventTypes.Purchase:
21
122
  return trackPurchase(params);
123
+ case ClientTrackingEventTypes.Lead:
124
+ return trackLead(params);
22
125
  default:
23
126
  return null;
24
127
  }
25
128
  }
26
129
 
130
+ type TrackingItem = {
131
+ id: string;
132
+ name: string;
133
+ price: number;
134
+ quantity: number;
135
+ };
136
+
137
+ function trackGoogleEvent(
138
+ event: TrackingEvent | null | undefined,
139
+ action: string,
140
+ params: object
141
+ ): void {
142
+ GoogleUtil.track('event', action, params);
143
+ }
144
+
145
+ function trackFacebookEvent(
146
+ event: TrackingEvent | null | undefined,
147
+ action: string,
148
+ params: object
149
+ ): void {
150
+ FacebookUtil.track('track', action, params);
151
+ }
152
+
153
+ function normalizePrice(value: any): number {
154
+ const amount = Number(value ?? 0);
155
+ return Number.isFinite(amount) ? amount : 0;
156
+ }
157
+
158
+ function formatValue(amount: number): number {
159
+ return amount / 100;
160
+ }
161
+
162
+ function makeTrackingItem(item: any, fallbackId: string): TrackingItem {
163
+ return {
164
+ id: String(item?.ticketTypeId || item?.upgradeId || item?._id || fallbackId),
165
+ name: String(item?.name || 'Item'),
166
+ price: normalizePrice(item?.price ?? item?.values),
167
+ quantity: Number(item?.quantity || 1),
168
+ };
169
+ }
170
+
171
+ function buildCheckoutItems(orderParams: any = {}): TrackingItem[] {
172
+ const tickets = Array.isArray(orderParams?.tickets)
173
+ ? orderParams.tickets.map((ticket: any, index: number) =>
174
+ makeTrackingItem(ticket, `ticket-${index}`)
175
+ )
176
+ : [];
177
+ const upgrades = Array.isArray(orderParams?.upgrades)
178
+ ? orderParams.upgrades.map((upgrade: any, index: number) =>
179
+ makeTrackingItem(upgrade, `upgrade-${index}`)
180
+ )
181
+ : [];
182
+
183
+ return [...tickets, ...upgrades];
184
+ }
185
+
186
+ function buildGoogleItems(items: TrackingItem[]) {
187
+ return items.map((item) => ({
188
+ item_id: item.id,
189
+ item_name: item.name,
190
+ price: formatValue(item.price),
191
+ quantity: item.quantity,
192
+ }));
193
+ }
194
+
195
+ function buildFacebookContents(items: TrackingItem[]) {
196
+ return items.map((item) => ({
197
+ id: item.id,
198
+ quantity: item.quantity,
199
+ }));
200
+ }
201
+
202
+ function buildFacebookContentIds(items: TrackingItem[]) {
203
+ return items.map((item) => item.id);
204
+ }
205
+
206
+ function getTotalValue(items: TrackingItem[]): number {
207
+ return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
208
+ }
209
+
210
+ function getTicketDisplayName(ticketType: any, tier: any): string {
211
+ if (!ticketType?.name) {
212
+ return 'Ticket';
213
+ }
214
+
215
+ return tier?.name ? `${ticketType.name} - ${tier.name}` : ticketType.name;
216
+ }
217
+
218
+ function trackViewContent({
219
+ event,
220
+ currency = 'USD',
221
+ }: ViewContentTrackingParams): void {
222
+ const item: TrackingItem = {
223
+ id: String(event?._id || event?.eventId || 'event'),
224
+ name: String(event?.name || 'Event'),
225
+ price: normalizePrice(event?.lowestPrice),
226
+ quantity: 1,
227
+ };
228
+
229
+ trackGoogleEvent(event, 'view_item', {
230
+ currency,
231
+ value: formatValue(item.price),
232
+ items: buildGoogleItems([item]),
233
+ });
234
+
235
+ trackFacebookEvent(event, 'ViewContent', {
236
+ content_name: item.name,
237
+ content_ids: [item.id],
238
+ content_type: 'product',
239
+ value: formatValue(item.price),
240
+ currency,
241
+ });
242
+ }
243
+
244
+ function buildAddToCartItem({
245
+ ticketType,
246
+ tier,
247
+ upgrade,
248
+ }: AddToCartTrackingParams): TrackingItem {
249
+ if (upgrade) {
250
+ return {
251
+ id: String(upgrade._id || upgrade.upgradeId || 'upgrade'),
252
+ name: String(upgrade.name || 'Upgrade'),
253
+ price: normalizePrice(upgrade.price),
254
+ quantity: 1,
255
+ };
256
+ }
257
+
258
+ return {
259
+ id: String(ticketType?._id || ticketType?.ticketTypeId || 'ticket'),
260
+ name: getTicketDisplayName(ticketType, tier),
261
+ price: normalizePrice(tier?.price ?? ticketType?.price ?? ticketType?.values),
262
+ quantity: 1,
263
+ };
264
+ }
265
+
266
+ function trackAddToCart({
267
+ event,
268
+ currency = 'USD',
269
+ ...params
270
+ }: AddToCartTrackingParams): void {
271
+ const item = buildAddToCartItem(params);
272
+
273
+ trackGoogleEvent(event, 'add_to_cart', {
274
+ currency,
275
+ value: formatValue(item.price),
276
+ items: buildGoogleItems([item]),
277
+ });
278
+
279
+ trackFacebookEvent(event, 'AddToCart', {
280
+ content_name: String(event?.name || item.name),
281
+ content_ids: [item.id],
282
+ content_type: 'product',
283
+ contents: buildFacebookContents([item]),
284
+ value: formatValue(item.price),
285
+ currency,
286
+ num_items: item.quantity,
287
+ });
288
+ }
289
+
290
+ function trackInitiateCheckout({
291
+ event,
292
+ order,
293
+ currency = 'USD',
294
+ }: CheckoutTrackingParams): void {
295
+ const items = buildCheckoutItems(order?.createOrderParams || order);
296
+ const totalValue = getTotalValue(items);
297
+
298
+ trackGoogleEvent(event, 'begin_checkout', {
299
+ currency,
300
+ value: formatValue(totalValue),
301
+ items: buildGoogleItems(items),
302
+ });
303
+
304
+ trackFacebookEvent(event, 'InitiateCheckout', {
305
+ content_name: String(event?.name || 'Checkout'),
306
+ content_ids: buildFacebookContentIds(items),
307
+ content_type: 'product',
308
+ contents: buildFacebookContents(items),
309
+ value: formatValue(totalValue),
310
+ currency,
311
+ num_items: items.reduce((sum, item) => sum + item.quantity, 0),
312
+ });
313
+ }
314
+
315
+ function trackAddPaymentInfo({
316
+ event,
317
+ order,
318
+ paymentSource,
319
+ currency = 'USD',
320
+ }: AddPaymentInfoTrackingParams): void {
321
+ const items = buildCheckoutItems(order?.createOrderParams || order);
322
+ const totalValue = getTotalValue(items);
323
+
324
+ trackGoogleEvent(event, 'add_payment_info', {
325
+ currency,
326
+ value: formatValue(totalValue),
327
+ payment_type: paymentSource,
328
+ items: buildGoogleItems(items),
329
+ });
330
+
331
+ trackFacebookEvent(event, 'AddPaymentInfo', {
332
+ content_name: String(event?.name || 'Checkout'),
333
+ content_ids: buildFacebookContentIds(items),
334
+ content_type: 'product',
335
+ contents: buildFacebookContents(items),
336
+ value: formatValue(totalValue),
337
+ currency,
338
+ num_items: items.reduce((sum, item) => sum + item.quantity, 0),
339
+ });
340
+ }
341
+
27
342
  function trackPurchase({
343
+ event,
28
344
  order,
29
345
  orderTotal,
30
346
  channel,
31
347
  currency = 'USD',
32
- }): void {
33
- GoogleUtil.track('event', 'purchase', {
348
+ }: PurchaseTrackingParams): void {
349
+ const items = buildCheckoutItems(order);
350
+ trackGoogleEvent(event, 'purchase', {
34
351
  transaction_id: order._id,
35
- value: orderTotal / 100,
352
+ value: formatValue(orderTotal),
36
353
  affiliation: channel,
37
354
  currency,
355
+ items: buildGoogleItems(items),
38
356
  });
39
357
 
40
- FacebookUtil.track('track', 'Purchase', {
41
- value: orderTotal / 100,
358
+ trackFacebookEvent(event, 'Purchase', {
359
+ content_ids: buildFacebookContentIds(items),
360
+ content_type: 'product',
361
+ contents: buildFacebookContents(items),
362
+ value: formatValue(orderTotal),
42
363
  currency,
43
364
  });
44
365
  }
366
+
367
+ function trackLead({
368
+ event,
369
+ source,
370
+ }: LeadTrackingParams): void {
371
+ trackGoogleEvent(event, 'generate_lead', {
372
+ lead_source: source,
373
+ event_name: event?.name,
374
+ });
375
+
376
+ trackFacebookEvent(event, 'Lead', {
377
+ content_name: String(event?.name || 'Lead'),
378
+ content_category: source,
379
+ });
380
+ }