@tagadapay/headless-sdk 1.14.1 → 1.16.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 (81) hide show
  1. package/dist/core/client.d.ts +7 -0
  2. package/dist/core/client.d.ts.map +1 -1
  3. package/dist/core/client.js +10 -3
  4. package/dist/core/client.js.map +1 -1
  5. package/dist/core/index.d.ts +3 -1
  6. package/dist/core/index.d.ts.map +1 -1
  7. package/dist/core/index.js +1 -0
  8. package/dist/core/index.js.map +1 -1
  9. package/dist/core/modules/checkout.d.ts +5 -1
  10. package/dist/core/modules/checkout.d.ts.map +1 -1
  11. package/dist/core/modules/checkout.js +10 -1
  12. package/dist/core/modules/checkout.js.map +1 -1
  13. package/dist/core/modules/payment.d.ts +19 -1
  14. package/dist/core/modules/payment.d.ts.map +1 -1
  15. package/dist/core/modules/payment.js +42 -3
  16. package/dist/core/modules/payment.js.map +1 -1
  17. package/dist/core/modules/rx.d.ts +32 -1
  18. package/dist/core/modules/rx.d.ts.map +1 -1
  19. package/dist/core/modules/rx.js +17 -1
  20. package/dist/core/modules/rx.js.map +1 -1
  21. package/dist/core/modules/track.d.ts +127 -0
  22. package/dist/core/modules/track.d.ts.map +1 -0
  23. package/dist/core/modules/track.js +371 -0
  24. package/dist/core/modules/track.js.map +1 -0
  25. package/dist/core/types.d.ts +2 -0
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/version.d.ts +4 -0
  28. package/dist/core/version.d.ts.map +1 -0
  29. package/dist/core/version.js +4 -0
  30. package/dist/core/version.js.map +1 -0
  31. package/dist/pixels/engine.d.ts +56 -0
  32. package/dist/pixels/engine.d.ts.map +1 -0
  33. package/dist/pixels/engine.js +263 -0
  34. package/dist/pixels/engine.js.map +1 -0
  35. package/dist/pixels/index.d.ts +10 -0
  36. package/dist/pixels/index.d.ts.map +1 -0
  37. package/dist/pixels/index.js +5 -0
  38. package/dist/pixels/index.js.map +1 -0
  39. package/dist/pixels/metaEventId.d.ts +15 -0
  40. package/dist/pixels/metaEventId.d.ts.map +1 -0
  41. package/dist/pixels/metaEventId.js +17 -0
  42. package/dist/pixels/metaEventId.js.map +1 -0
  43. package/dist/pixels/pixelIdentity.d.ts +34 -0
  44. package/dist/pixels/pixelIdentity.d.ts.map +1 -0
  45. package/dist/pixels/pixelIdentity.js +65 -0
  46. package/dist/pixels/pixelIdentity.js.map +1 -0
  47. package/dist/pixels/pixelMapping.d.ts +172 -0
  48. package/dist/pixels/pixelMapping.d.ts.map +1 -0
  49. package/dist/pixels/pixelMapping.js +574 -0
  50. package/dist/pixels/pixelMapping.js.map +1 -0
  51. package/dist/pixels/pixelTracker.d.ts +81 -0
  52. package/dist/pixels/pixelTracker.d.ts.map +1 -0
  53. package/dist/pixels/pixelTracker.js +795 -0
  54. package/dist/pixels/pixelTracker.js.map +1 -0
  55. package/dist/pixels/types.d.ts +103 -0
  56. package/dist/pixels/types.d.ts.map +1 -0
  57. package/dist/pixels/types.js +14 -0
  58. package/dist/pixels/types.js.map +1 -0
  59. package/dist/react/hooks/useStep.d.ts +7 -0
  60. package/dist/react/hooks/useStep.d.ts.map +1 -0
  61. package/dist/react/hooks/useStep.js +14 -0
  62. package/dist/react/hooks/useStep.js.map +1 -0
  63. package/dist/react/index.d.ts +1 -0
  64. package/dist/react/index.d.ts.map +1 -1
  65. package/dist/react/index.js +1 -0
  66. package/dist/react/index.js.map +1 -1
  67. package/dist/stripe/index.d.ts +3 -1
  68. package/dist/stripe/index.d.ts.map +1 -1
  69. package/dist/stripe/index.js +13 -6
  70. package/dist/stripe/index.js.map +1 -1
  71. package/dist/stripe/useStripeExpress.d.ts.map +1 -1
  72. package/dist/stripe/useStripeExpress.js +15 -1
  73. package/dist/stripe/useStripeExpress.js.map +1 -1
  74. package/dist/tagada-headless-react.min.js +2 -2
  75. package/dist/tagada-headless-react.min.js.map +4 -4
  76. package/dist/tagada-headless.js +439 -16
  77. package/dist/tagada-headless.min.js +2 -2
  78. package/dist/tagada-headless.min.js.map +4 -4
  79. package/dist/tagada-pixels.min.js +7 -0
  80. package/dist/tagada-pixels.min.js.map +7 -0
  81. package/package.json +8 -1
@@ -0,0 +1,574 @@
1
+ /**
2
+ * Core pixel event mapping, parameter transformation, and event gating.
3
+ *
4
+ * This module is framework-agnostic (no React, no DOM) so it can be shared
5
+ * between the React `PixelTrackingProvider` and the standalone vanilla SDK.
6
+ *
7
+ * Official event name references (verified Feb 2026 against vendor docs):
8
+ * Meta: fbq('track', 'Purchase', { value, currency }) — developers.facebook.com/docs/meta-pixel/reference
9
+ * TikTok: ttq.track('Purchase', { value, currency }) — ads.tiktok.com/help/article/standard-events-parameters (Sep 2025)
10
+ * Snapchat: snaptr('track', 'PURCHASE', { price, currency }) — developers.snap.com/api/marketing-api/Conversions-API/Parameters
11
+ * Pinterest: pintrk('track', 'checkout', { value, currency }) — help.pinterest.com/en/business/article/add-event-codes
12
+ * GTM/GA4: gtag('event', 'purchase', { value, currency, items })
13
+ * Clarity: clarity('event', 'Purchase') — learn.microsoft.com/en-us/clarity/setup-and-installation/clarity-api
14
+ */
15
+ /**
16
+ * Which key holds this entry's id: GTM stores a `containerId`, Clarity a
17
+ * `projectId`, every other provider a `pixelId`. Callers that sanitize, split
18
+ * or display an id go through here rather than testing the keys themselves,
19
+ * so a new provider with its own field name is one edit, not six.
20
+ */
21
+ export function pixelIdKeyOf(pixel) {
22
+ if (pixel && typeof pixel === 'object') {
23
+ if ('containerId' in pixel)
24
+ return 'containerId';
25
+ if ('projectId' in pixel)
26
+ return 'projectId';
27
+ }
28
+ return 'pixelId';
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // GA4-only enrichment
32
+ //
33
+ // Canonical GA4 ecommerce `purchase` data carries user identity + a nested
34
+ // `ecommerce` object that the flat Meta/TikTok payload does not. We attach it
35
+ // to the shared track() params under the reserved `_ga4` key. ONLY mapGTMEvent
36
+ // reads it; `baseTransform` strips it so it can never leak into the
37
+ // Meta/TikTok/Snapchat/Pinterest payloads (those would otherwise spread it,
38
+ // shipping unhashed PII to those pixels). All monetary fields are in MINOR
39
+ // units here — mapGTMEvent converts to major via the same currency helpers.
40
+ // ---------------------------------------------------------------------------
41
+ export const GA4_PARAM_KEY = '_ga4';
42
+ /**
43
+ * Extract the distinct coupon codes applied to an order, comma-joined.
44
+ * Returns undefined when the order carries no coded promotions (automatic
45
+ * promotions have `code: null` and are deliberately excluded — GA4's `coupon`
46
+ * dimension is for codes the shopper entered).
47
+ */
48
+ export function extractCouponCodes(order) {
49
+ const codes = (order.promotions ?? [])
50
+ .map((p) => p.code ?? p.promotion?.code)
51
+ .filter((c) => typeof c === 'string' && c.length > 0);
52
+ if (codes.length === 0)
53
+ return undefined;
54
+ return [...new Set(codes)].join(',');
55
+ }
56
+ /**
57
+ * Build the GA4-only enrichment payload (`_ga4`) from an order. Pure, defensive,
58
+ * framework-agnostic — shared by the native ThankYouPage and the Studio
59
+ * OrderConfirmation island so both emit an identical canonical GA4 purchase.
60
+ * Returns minor-unit amounts; mapGTMEvent converts them to major units.
61
+ */
62
+ export function buildGa4PurchasePayload(order) {
63
+ const sourceItems = order.items ?? [];
64
+ const coupon = extractCouponCodes(order);
65
+ const summary = order.summaries?.find((s) => s.currency === order.currency) ?? order.summaries?.[0];
66
+ const itemsSum = sourceItems.reduce((sum, i) => sum + (i.adjustedAmount ?? 0) * (i.quantity ?? 0), 0);
67
+ // GA4 requires order-level discounts to be allocated across items: `price`
68
+ // must be the post-discount unit price and `discount` the per-unit monetary
69
+ // discount. Line-level discounts are already baked into adjustedAmount; the
70
+ // order-level remainder (totalPromotionAmount minus line-level discounts,
71
+ // capped to the item subtotal — promos can also cover shipping) is spread
72
+ // proportionally by line value.
73
+ const lineLevelDiscountTotal = sourceItems.reduce((sum, i) => sum + Math.max(0, (i.amount ?? i.adjustedAmount ?? 0) - (i.adjustedAmount ?? 0)) * (i.quantity ?? 0), 0);
74
+ const orderLevelDiscount = Math.min(Math.max(0, (summary?.totalPromotionAmount ?? 0) - lineLevelDiscountTotal), itemsSum);
75
+ let remainingAllocation = orderLevelDiscount;
76
+ const items = sourceItems.map((item, index) => {
77
+ const quantity = item.quantity ?? 0;
78
+ const unitAdjusted = item.adjustedAmount ?? 0;
79
+ const lineValue = unitAdjusted * quantity;
80
+ // Last item takes the remainder so allocations sum exactly.
81
+ const lineAllocation = orderLevelDiscount === 0 || itemsSum === 0
82
+ ? 0
83
+ : index === sourceItems.length - 1
84
+ ? remainingAllocation
85
+ : Math.round((orderLevelDiscount * lineValue) / itemsSum);
86
+ remainingAllocation -= lineAllocation;
87
+ const unitAllocation = quantity > 0 ? lineAllocation / quantity : 0;
88
+ const lineLevelUnitDiscount = Math.max(0, (item.amount ?? unitAdjusted) - unitAdjusted);
89
+ const unitDiscount = lineLevelUnitDiscount + unitAllocation;
90
+ const ga4Item = {
91
+ item_id: item.productId || undefined,
92
+ // GA4 convention: item_name = product, item_variant = variant.
93
+ item_name: item.orderLineItemProduct?.name || item.orderLineItemVariant?.name || undefined,
94
+ item_variant: item.orderLineItemVariant?.name || undefined,
95
+ price: unitAdjusted - unitAllocation,
96
+ quantity: item.quantity,
97
+ };
98
+ if (unitDiscount > 0) {
99
+ ga4Item.discount = unitDiscount;
100
+ if (coupon)
101
+ ga4Item.coupon = coupon;
102
+ }
103
+ return ga4Item;
104
+ });
105
+ // Prefer the captured paid amount; fall back to the summary total, then to
106
+ // the sum of line items. Guards against the value:0 seen in the field.
107
+ const value = order.paidAmount && order.paidAmount > 0
108
+ ? order.paidAmount
109
+ : (summary?.totalAdjustedAmount ?? itemsSum);
110
+ const payload = { items, value };
111
+ if (summary?.totalTaxAmount != null)
112
+ payload.tax = summary.totalTaxAmount;
113
+ if (summary?.shippingCost != null)
114
+ payload.shipping = summary.shippingCost;
115
+ if (coupon)
116
+ payload.coupon = coupon;
117
+ if (order.customer?.id)
118
+ payload.user_id = order.customer.id;
119
+ const addr = order.billingAddress ?? order.shippingAddress;
120
+ const userData = {};
121
+ if (order.customer?.email)
122
+ userData.email_address = order.customer.email;
123
+ const phone = order.customer?.phone || addr?.phone;
124
+ if (phone)
125
+ userData.phone_number = phone;
126
+ if (addr) {
127
+ const address = {
128
+ first_name: addr.firstName || order.customer?.firstName || undefined,
129
+ last_name: addr.lastName || order.customer?.lastName || undefined,
130
+ street: addr.address1 || undefined,
131
+ city: addr.city || undefined,
132
+ region: addr.state || undefined,
133
+ postal_code: addr.postal || undefined,
134
+ country: addr.country || undefined,
135
+ };
136
+ if (Object.values(address).some((v) => v != null))
137
+ userData.address = address;
138
+ }
139
+ if (Object.keys(userData).length > 0)
140
+ payload.user_data = userData;
141
+ return payload;
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Currency conversion helper (inline, zero-dep)
145
+ // ---------------------------------------------------------------------------
146
+ /**
147
+ * Convert minor units (cents) to major units using ISO 4217 digit counts.
148
+ * Falls back to ÷100 for unknown currencies.
149
+ */
150
+ const ZERO_DECIMAL_CURRENCIES = new Set([
151
+ 'BIF', 'CLP', 'DJF', 'GNF', 'ISK', 'JPY', 'KMF', 'KRW',
152
+ 'PYG', 'RWF', 'UGX', 'VND', 'VUV', 'XAF', 'XOF', 'XPF',
153
+ ]);
154
+ const THREE_DECIMAL_CURRENCIES = new Set(['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND']);
155
+ function minorToMajor(amount, currency) {
156
+ const code = currency.toUpperCase();
157
+ if (ZERO_DECIMAL_CURRENCIES.has(code))
158
+ return amount;
159
+ if (THREE_DECIMAL_CURRENCIES.has(code))
160
+ return amount / 1000;
161
+ return amount / 100;
162
+ }
163
+ // ---------------------------------------------------------------------------
164
+ // Event gating – respects per-event toggles
165
+ // ---------------------------------------------------------------------------
166
+ /**
167
+ * Returns `true` if the given event is enabled on the pixel config.
168
+ * If the pixel has no `events` map (e.g. MetaConversionTrackingConfig) we allow all.
169
+ */
170
+ export function isEventEnabled(pixel, eventName) {
171
+ if (!('events' in pixel) || !pixel.events)
172
+ return true;
173
+ const events = pixel.events;
174
+ if (!(eventName in events))
175
+ return true; // unknown event → allow
176
+ return events[eventName] === true;
177
+ }
178
+ /**
179
+ * Filter an array of pixel configs to only those that are globally enabled
180
+ * AND have the specific event toggled on.
181
+ */
182
+ export function getEligiblePixels(pixels, eventName) {
183
+ if (!pixels)
184
+ return [];
185
+ return pixels.filter((p) => p.enabled && isEventEnabled(p, eventName));
186
+ }
187
+ // ---------------------------------------------------------------------------
188
+ // Shared parameter transforms
189
+ // ---------------------------------------------------------------------------
190
+ function ensureCurrencyUppercase(params) {
191
+ if (params.currency && typeof params.currency === 'string') {
192
+ return { ...params, currency: params.currency.toUpperCase() };
193
+ }
194
+ return { ...params };
195
+ }
196
+ function convertValueToMajor(params) {
197
+ if (params.currency && params.value != null) {
198
+ const currency = String(params.currency);
199
+ const major = minorToMajor(Number(params.value), currency);
200
+ return { ...params, value: major };
201
+ }
202
+ return params;
203
+ }
204
+ /** Convert top-level monetary fields (shipping, tax, subtotal, total_discount) from minor → major units. */
205
+ function convertMonetaryFieldsToMajor(params) {
206
+ const currency = params.currency ? String(params.currency) : null;
207
+ if (!currency)
208
+ return params;
209
+ const result = { ...params };
210
+ for (const field of ['shipping', 'tax', 'subtotal', 'total_discount']) {
211
+ if (result[field] != null) {
212
+ result[field] = minorToMajor(Number(result[field]), currency);
213
+ }
214
+ }
215
+ return result;
216
+ }
217
+ /** Convert price fields inside contents[] items from minor → major units. */
218
+ function convertContentsPricesToMajor(params) {
219
+ if (!params.contents || !Array.isArray(params.contents))
220
+ return params;
221
+ const currency = params.currency ? String(params.currency) : null;
222
+ const result = { ...params };
223
+ result.contents = params.contents.map((item) => {
224
+ const itemCurrency = item.currency ? String(item.currency) : currency;
225
+ if (!itemCurrency)
226
+ return { ...item };
227
+ const converted = { ...item };
228
+ if (converted.price != null)
229
+ converted.price = minorToMajor(Number(converted.price), itemCurrency);
230
+ if (converted.original_price != null)
231
+ converted.original_price = minorToMajor(Number(converted.original_price), itemCurrency);
232
+ return converted;
233
+ });
234
+ return result;
235
+ }
236
+ function baseTransform(params) {
237
+ let p = ensureCurrencyUppercase(params);
238
+ p = convertValueToMajor(p);
239
+ p = convertMonetaryFieldsToMajor(p);
240
+ p = convertContentsPricesToMajor(p);
241
+ // Strip GA4-only enrichment so it never reaches Meta/TikTok/Snapchat/Pinterest
242
+ // (those mappers spread all params). mapGTMEvent reads it from the raw input.
243
+ if (GA4_PARAM_KEY in p) {
244
+ p = { ...p };
245
+ delete p[GA4_PARAM_KEY];
246
+ }
247
+ return p;
248
+ }
249
+ // ---------------------------------------------------------------------------
250
+ // Meta / Facebook
251
+ // ---------------------------------------------------------------------------
252
+ const META_EVENT_MAP = {
253
+ PageView: 'PageView',
254
+ ViewContent: 'ViewContent',
255
+ AddToCart: 'AddToCart',
256
+ AddToWishlist: 'AddToWishlist',
257
+ Search: 'Search',
258
+ InitiateCheckout: 'InitiateCheckout',
259
+ AddPaymentInfo: 'AddPaymentInfo',
260
+ Purchase: 'Purchase',
261
+ Lead: 'Lead',
262
+ CompleteRegistration: 'CompleteRegistration',
263
+ };
264
+ export function mapMetaEvent(eventName, parameters) {
265
+ const name = META_EVENT_MAP[eventName] ?? eventName;
266
+ // `coupon` intentionally flows through: Meta has no standard coupon param but
267
+ // accepts custom parameters on standard events (usable in custom conversions).
268
+ const params = baseTransform(parameters);
269
+ if (params.contents && Array.isArray(params.contents)) {
270
+ params.content_ids = params.contents.map((i) => i.content_id).filter(Boolean);
271
+ params.content_type = params.content_type ?? 'product';
272
+ // Reshape contents to Meta's expected format (prices already converted by baseTransform)
273
+ params.contents = params.contents.map((item) => ({
274
+ id: item.content_id,
275
+ quantity: item.quantity != null ? Number(item.quantity) : undefined,
276
+ item_price: item.price != null ? Number(item.price) : undefined,
277
+ content_name: item.content_name,
278
+ content_category: item.content_category,
279
+ }));
280
+ }
281
+ return { name, params };
282
+ }
283
+ // ---------------------------------------------------------------------------
284
+ // TikTok
285
+ // Official: ttq.track('Purchase', { value, currency })
286
+ // Source: ads.tiktok.com/help/article/standard-events-parameters (Sep 2025)
287
+ // Standard events use PascalCase. Note: TikTok has no standard PageView event
288
+ // (page views use ttq.page()), so we pass it as-is for custom tracking.
289
+ // TikTok has no Lead event; SubmitForm is the closest standard equivalent.
290
+ // ---------------------------------------------------------------------------
291
+ const TIKTOK_EVENT_MAP = {
292
+ PageView: 'Pageview',
293
+ ViewContent: 'ViewContent',
294
+ AddToCart: 'AddToCart',
295
+ AddToWishlist: 'AddToWishlist',
296
+ Search: 'Search',
297
+ InitiateCheckout: 'InitiateCheckout',
298
+ AddPaymentInfo: 'AddPaymentInfo',
299
+ Purchase: 'Purchase',
300
+ Lead: 'SubmitForm',
301
+ CompleteRegistration: 'CompleteRegistration',
302
+ };
303
+ export function mapTikTokEvent(eventName, parameters) {
304
+ const name = TIKTOK_EVENT_MAP[eventName] ?? eventName;
305
+ const params = baseTransform(parameters);
306
+ // TikTok's event spec has no coupon/discount parameter — strip it to keep
307
+ // the payload within spec (avoids Events Manager diagnostics warnings).
308
+ delete params.coupon;
309
+ if (params.contents && Array.isArray(params.contents)) {
310
+ const ids = params.contents
311
+ .map((i) => i.content_id)
312
+ .filter(Boolean);
313
+ // TikTok requires content_id (singular) at the top level for VSA
314
+ if (!params.content_id && ids.length > 0) {
315
+ params.content_id = ids.length === 1 ? ids[0] : JSON.stringify(ids);
316
+ }
317
+ // Also keep content_ids for backwards compatibility
318
+ if (!params.content_ids) {
319
+ params.content_ids = ids;
320
+ }
321
+ // Reshape contents to TikTok's expected format (prices already converted by baseTransform)
322
+ params.contents = params.contents.map((item) => ({
323
+ content_id: item.content_id,
324
+ content_name: item.content_name,
325
+ content_type: item.content_type ?? 'product',
326
+ content_category: item.content_category,
327
+ price: item.price != null ? Number(item.price) : undefined,
328
+ original_price: item.original_price != null ? Number(item.original_price) : undefined,
329
+ quantity: item.quantity != null ? Number(item.quantity) : undefined,
330
+ description: item.description,
331
+ }));
332
+ }
333
+ // Set required fields for InitiateCheckout
334
+ if (eventName === 'InitiateCheckout') {
335
+ params.content_type = params.content_type ?? 'product';
336
+ if (!params.delivery_category) {
337
+ params.delivery_category = 'home_delivery';
338
+ }
339
+ }
340
+ return { name, params };
341
+ }
342
+ // ---------------------------------------------------------------------------
343
+ // Snapchat
344
+ // Official: snaptr('track', 'PURCHASE', { price, currency })
345
+ // Source: developers.snap.com/api/marketing-api/Conversions-API/Parameters
346
+ // All event names are UPPER_SNAKE_CASE.
347
+ // Note: Snapchat has no LEAD standard event; we pass it as-is (custom event).
348
+ // ---------------------------------------------------------------------------
349
+ const SNAPCHAT_EVENT_MAP = {
350
+ PageView: 'PAGE_VIEW',
351
+ ViewContent: 'VIEW_CONTENT',
352
+ AddToCart: 'ADD_CART',
353
+ AddToWishlist: 'ADD_TO_WISHLIST',
354
+ Search: 'SEARCH',
355
+ InitiateCheckout: 'START_CHECKOUT',
356
+ AddPaymentInfo: 'ADD_BILLING',
357
+ Purchase: 'PURCHASE',
358
+ Lead: 'LEAD',
359
+ CompleteRegistration: 'SIGN_UP',
360
+ };
361
+ export function mapSnapchatEvent(eventName, parameters) {
362
+ const name = SNAPCHAT_EVENT_MAP[eventName] ?? eventName;
363
+ let params = baseTransform(parameters);
364
+ // Snap's parameter spec has no coupon/discount field — strip it.
365
+ delete params.coupon;
366
+ // Snapchat uses `price` not `value`
367
+ if ('value' in params) {
368
+ params = { ...params, price: params.value };
369
+ delete params.value;
370
+ }
371
+ // Snapchat uses `number_items` not `num_items`
372
+ if ('num_items' in params) {
373
+ params = { ...params, number_items: params.num_items };
374
+ delete params.num_items;
375
+ }
376
+ if (params.contents && Array.isArray(params.contents)) {
377
+ params.item_ids = params.contents.map((i) => i.content_id).filter(Boolean);
378
+ }
379
+ return { name, params };
380
+ }
381
+ // ---------------------------------------------------------------------------
382
+ // Pinterest
383
+ // Official: pintrk('track', 'checkout', { value, currency, line_items })
384
+ // Event names are all lowercase.
385
+ // ---------------------------------------------------------------------------
386
+ const PINTEREST_EVENT_MAP = {
387
+ PageView: 'pagevisit',
388
+ ViewContent: 'viewcontent',
389
+ AddToCart: 'addtocart',
390
+ AddToWishlist: 'addtowishlist',
391
+ Search: 'search',
392
+ InitiateCheckout: 'initiatecheckout',
393
+ AddPaymentInfo: 'addpaymentinfo',
394
+ Purchase: 'checkout',
395
+ Lead: 'lead',
396
+ CompleteRegistration: 'signup',
397
+ };
398
+ export function mapPinterestEvent(eventName, parameters) {
399
+ const name = PINTEREST_EVENT_MAP[eventName] ?? eventName.toLowerCase();
400
+ const params = baseTransform(parameters);
401
+ // Pinterest's official field for coupon codes is `promo_code`.
402
+ if (params.coupon != null) {
403
+ params.promo_code = params.coupon;
404
+ delete params.coupon;
405
+ }
406
+ if (params.order_quantity !== undefined) {
407
+ params.order_quantity = Number(params.order_quantity);
408
+ }
409
+ if (params.contents && Array.isArray(params.contents)) {
410
+ // Reshape to Pinterest line_items format (prices already converted by baseTransform)
411
+ params.line_items = params.contents.map((item) => ({
412
+ product_id: item.content_id,
413
+ product_name: item.content_name,
414
+ product_category: item.content_category,
415
+ product_price: item.price != null ? Number(item.price) : undefined,
416
+ product_quantity: item.quantity != null ? Number(item.quantity) : undefined,
417
+ }));
418
+ }
419
+ return { name, params };
420
+ }
421
+ // ---------------------------------------------------------------------------
422
+ // GTM / GA4 / Google Ads
423
+ // Official: gtag('event', 'purchase', { value, currency, items })
424
+ // Event names are snake_case (GA4 convention).
425
+ // ---------------------------------------------------------------------------
426
+ const GTM_EVENT_MAP = {
427
+ PageView: 'page_view',
428
+ ViewContent: 'view_item',
429
+ AddToCart: 'add_to_cart',
430
+ AddToWishlist: 'add_to_wishlist',
431
+ Search: 'search',
432
+ InitiateCheckout: 'begin_checkout',
433
+ AddPaymentInfo: 'add_payment_info',
434
+ Purchase: 'purchase',
435
+ Lead: 'generate_lead',
436
+ CompleteRegistration: 'sign_up',
437
+ Conversion: 'conversion',
438
+ };
439
+ export function mapGTMEvent(eventName, parameters) {
440
+ const name = GTM_EVENT_MAP[eventName] ?? eventName.toLowerCase();
441
+ // Canonical GA4 ecommerce shape: when the caller attached `_ga4` enrichment
442
+ // (purchase from the thank-you page) emit a nested `ecommerce` object plus
443
+ // user identity instead of the legacy flat payload. baseTransform strips
444
+ // `_ga4`, so read it from the raw input first.
445
+ const ga4 = parameters[GA4_PARAM_KEY];
446
+ if (ga4) {
447
+ const currency = typeof parameters.currency === 'string' ? parameters.currency.toUpperCase() : undefined;
448
+ const toMajor = (v) => v == null || !currency ? v : minorToMajor(Number(v), currency);
449
+ const ecommerce = {
450
+ transaction_id: parameters.transaction_id,
451
+ currency,
452
+ value: toMajor(ga4.value),
453
+ };
454
+ if (ga4.tax != null)
455
+ ecommerce.tax = toMajor(ga4.tax);
456
+ if (ga4.shipping != null)
457
+ ecommerce.shipping = toMajor(ga4.shipping);
458
+ if (ga4.coupon)
459
+ ecommerce.coupon = ga4.coupon;
460
+ ecommerce.items = (ga4.items ?? []).map((item) => ({
461
+ item_id: item.item_id,
462
+ item_name: item.item_name,
463
+ item_variant: item.item_variant,
464
+ price: toMajor(item.price),
465
+ quantity: item.quantity != null ? Number(item.quantity) : undefined,
466
+ ...(item.discount != null ? { discount: toMajor(item.discount) } : {}),
467
+ ...(item.coupon ? { coupon: item.coupon } : {}),
468
+ }));
469
+ const out = { ecommerce };
470
+ if (ga4.user_id)
471
+ out.user_id = ga4.user_id;
472
+ if (ga4.user_data)
473
+ out.user_data = ga4.user_data;
474
+ return { name, params: out };
475
+ }
476
+ const params = baseTransform(parameters);
477
+ if (params.num_items !== undefined) {
478
+ params.num_items = Number(params.num_items);
479
+ }
480
+ if (params.contents && Array.isArray(params.contents)) {
481
+ // Reshape to GA4 items format (prices already converted by baseTransform)
482
+ params.items = params.contents.map((item) => ({
483
+ item_id: item.content_id,
484
+ item_name: item.content_name,
485
+ item_category: item.content_category,
486
+ price: item.price != null ? Number(item.price) : undefined,
487
+ quantity: item.quantity != null ? Number(item.quantity) : undefined,
488
+ }));
489
+ params.contents = params.contents.map((item) => ({
490
+ id: item.content_id,
491
+ name: item.content_name,
492
+ category: item.content_category,
493
+ price: item.price != null ? Number(item.price) : undefined,
494
+ quantity: item.quantity != null ? Number(item.quantity) : undefined,
495
+ }));
496
+ }
497
+ return { name, params };
498
+ }
499
+ // ---------------------------------------------------------------------------
500
+ // Microsoft Clarity
501
+ // Official: clarity('event', 'Purchase') — custom ("smart") events take a name
502
+ // and no parameters, so the mapped params are carried for the dedup guard only.
503
+ // Clarity records page views by itself; the PageView toggle still emits a named
504
+ // event so a merchant can filter recordings on it like any other funnel step.
505
+ // ---------------------------------------------------------------------------
506
+ const CLARITY_EVENT_MAP = {
507
+ PageView: 'PageView',
508
+ ViewContent: 'ViewContent',
509
+ AddToCart: 'AddToCart',
510
+ AddToWishlist: 'AddToWishlist',
511
+ Search: 'Search',
512
+ InitiateCheckout: 'InitiateCheckout',
513
+ AddPaymentInfo: 'AddPaymentInfo',
514
+ Purchase: 'Purchase',
515
+ Lead: 'Lead',
516
+ CompleteRegistration: 'CompleteRegistration',
517
+ };
518
+ export function mapClarityEvent(eventName, parameters) {
519
+ const name = CLARITY_EVENT_MAP[eventName] ?? eventName;
520
+ return { name, params: baseTransform(parameters) };
521
+ }
522
+ /**
523
+ * Append Google Ads `send_to` parameter when conversion tracking is configured.
524
+ */
525
+ export function applyGoogleAdsConversion(params, eventName, pixel) {
526
+ if ((eventName === 'Purchase' || eventName === 'Conversion') &&
527
+ pixel.googleAdsConversionId &&
528
+ pixel.googleAdsConversionLabel) {
529
+ return { ...params, send_to: `${pixel.googleAdsConversionId}/${pixel.googleAdsConversionLabel}` };
530
+ }
531
+ return params;
532
+ }
533
+ /**
534
+ * Given a PixelsConfig and an event, return per-provider mapped events
535
+ * for every eligible (enabled + event-toggled-on) pixel.
536
+ */
537
+ export function resolvePixelEvents(pixels, eventName, parameters) {
538
+ const results = [];
539
+ const fb = getEligiblePixels(pixels.facebook, eventName);
540
+ if (fb.length > 0) {
541
+ const mapped = mapMetaEvent(eventName, parameters);
542
+ fb.forEach((pixel) => results.push({ provider: 'facebook', mapped, pixel }));
543
+ }
544
+ const tt = getEligiblePixels(pixels.tiktok, eventName);
545
+ if (tt.length > 0) {
546
+ const mapped = mapTikTokEvent(eventName, parameters);
547
+ tt.forEach((pixel) => results.push({ provider: 'tiktok', mapped, pixel }));
548
+ }
549
+ const sc = getEligiblePixels(pixels.snapchat, eventName);
550
+ if (sc.length > 0) {
551
+ const mapped = mapSnapchatEvent(eventName, parameters);
552
+ sc.forEach((pixel) => results.push({ provider: 'snapchat', mapped, pixel }));
553
+ }
554
+ const pt = getEligiblePixels(pixels.pinterest, eventName);
555
+ if (pt.length > 0) {
556
+ const mapped = mapPinterestEvent(eventName, parameters);
557
+ pt.forEach((pixel) => results.push({ provider: 'pinterest', mapped, pixel }));
558
+ }
559
+ const clarity = getEligiblePixels(pixels.clarity, eventName);
560
+ if (clarity.length > 0) {
561
+ const mapped = mapClarityEvent(eventName, parameters);
562
+ clarity.forEach((pixel) => results.push({ provider: 'clarity', mapped, pixel }));
563
+ }
564
+ const gtm = getEligiblePixels(pixels.gtm, eventName);
565
+ if (gtm.length > 0) {
566
+ const mapped = mapGTMEvent(eventName, parameters);
567
+ gtm.forEach((pixel) => {
568
+ const finalParams = applyGoogleAdsConversion(mapped.params, eventName, pixel);
569
+ results.push({ provider: 'gtm', mapped: { name: mapped.name, params: finalParams }, pixel });
570
+ });
571
+ }
572
+ return results;
573
+ }
574
+ //# sourceMappingURL=pixelMapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixelMapping.js","sourceRoot":"","sources":["../../src/pixels/pixelMapping.ts"],"names":[],"mappings":"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"}