Skip to content

Commit 3da98d1

Browse files
committed
feat: call named search-insights methods and add inferQueryID support for conversions
1 parent 1dcea8e commit 3da98d1

File tree

5 files changed

+128
-113
lines changed

5 files changed

+128
-113
lines changed

src/template-parameters.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,26 @@
531531
}
532532
]
533533
},
534+
{
535+
"displayName": "Infer Query ID",
536+
"name": "inferQueryID",
537+
"help": "When enabled, the search-insights library will attempt to look up the queryID from its internal cache instead of requiring it to be passed explicitly.",
538+
"type": "CHECKBOX",
539+
"simpleValueType": true,
540+
"defaultValue": false,
541+
"enablingConditions": [
542+
{
543+
"paramName": "method",
544+
"type": "EQUALS",
545+
"paramValue": "convertedObjectIDs"
546+
},
547+
{
548+
"paramName": "method",
549+
"type": "EQUALS",
550+
"paramValue": "convertedObjectIDsAfterSearch"
551+
}
552+
]
553+
},
534554
{
535555
"displayName": "Positions",
536556
"name": "positions",

src/template.ts

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import type {
22
InsightsClient,
3-
InsightsEvent,
43
Init,
54
InsightsEventObjectData,
5+
InsightsAdditionalEventParams,
66
} from 'search-insights';
7+
import type { InsightsSearchClickEvent, InsightsClickObjectIDsEvent, InsightsClickFiltersEvent } from '../node_modules/search-insights/dist/click';
8+
import type { InsightsSearchConversionEvent, InsightsSearchConversionObjectIDsEvent, InsightsSearchConversionFiltersEvent } from '../node_modules/search-insights/dist/conversion';
9+
import type { InsightsSearchViewObjectIDsEvent, InsightsSearchViewFiltersEvent } from '../node_modules/search-insights/dist/view';
710
import { devDependencies, version } from '../package.json';
811

912
const log = require('logToConsole');
@@ -291,23 +294,21 @@ switch (data.method) {
291294
break;
292295
}
293296

294-
const payload: InsightsEvent = {
295-
eventType: 'view',
297+
const payload: InsightsSearchViewObjectIDsEvent = {
296298
eventName: data.eventName,
297299
index: data.index,
298300
objectIDs: formatValueToList(data.objectIDs),
299-
objectData: transformObjectData(data.objectData),
300301
userToken: data.userToken,
301302
authenticatedUserToken: data.authenticatedUserToken,
302303
};
303304
const chunks = chunkPayload(
304305
payload,
305-
['objectIDs', 'objectData'],
306+
['objectIDs'],
306307
MAX_OBJECT_IDS
307308
);
308309

309-
logger('sendEvents', chunks);
310-
aa('sendEvents', chunks);
310+
logger('viewedObjectIDs', chunks);
311+
chunks.forEach((chunk) => aa('viewedObjectIDs', chunk));
311312
data.gtmOnSuccess();
312313
break;
313314
}
@@ -319,25 +320,23 @@ switch (data.method) {
319320
break;
320321
}
321322

322-
const payload: InsightsEvent = {
323-
eventType: 'click',
323+
const payload: InsightsSearchClickEvent = {
324324
eventName: data.eventName,
325325
index: data.index,
326326
objectIDs: formatValueToList(data.objectIDs),
327-
objectData: transformObjectData(data.objectData),
328327
positions: formatValueToList(data.positions).map(makeInteger),
329328
queryID: data.queryID,
330329
userToken: data.userToken,
331330
authenticatedUserToken: data.authenticatedUserToken,
332331
};
333332
const chunks = chunkPayload(
334333
payload,
335-
['objectIDs', 'objectData', 'positions'],
334+
['objectIDs', 'positions'],
336335
MAX_OBJECT_IDS
337336
);
338337

339-
logger('sendEvents', chunks);
340-
aa('sendEvents', chunks);
338+
logger('clickedObjectIDsAfterSearch', chunks);
339+
chunks.forEach((chunk) => aa('clickedObjectIDsAfterSearch', chunk));
341340
data.gtmOnSuccess();
342341
break;
343342
}
@@ -349,24 +348,21 @@ switch (data.method) {
349348
break;
350349
}
351350

352-
const payload: InsightsEvent = {
353-
eventType: 'click',
351+
const payload: InsightsClickObjectIDsEvent = {
354352
eventName: data.eventName,
355353
index: data.index,
356-
queryID: data.queryID,
357354
objectIDs: formatValueToList(data.objectIDs),
358-
objectData: transformObjectData(data.objectData),
359355
userToken: data.userToken,
360356
authenticatedUserToken: data.authenticatedUserToken,
361357
};
362358
const chunks = chunkPayload(
363359
payload,
364-
['objectIDs', 'objectData'],
360+
['objectIDs'],
365361
MAX_OBJECT_IDS
366362
);
367363

368-
logger('sendEvents', chunks);
369-
aa('sendEvents', chunks);
364+
logger('clickedObjectIDs', chunks);
365+
chunks.forEach((chunk) => aa('clickedObjectIDs', chunk));
370366
data.gtmOnSuccess();
371367
break;
372368
}
@@ -378,8 +374,7 @@ switch (data.method) {
378374
break;
379375
}
380376

381-
const payload: InsightsEvent = {
382-
eventType: 'click',
377+
const payload: InsightsClickFiltersEvent = {
383378
eventName: data.eventName,
384379
filters: formatValueToList(data.filters),
385380
index: data.index,
@@ -388,8 +383,8 @@ switch (data.method) {
388383
};
389384
const chunks = chunkPayload(payload, ['filters'], MAX_FILTERS);
390385

391-
logger('sendEvents', chunks);
392-
aa('sendEvents', chunks);
386+
logger('clickedFilters', chunks);
387+
chunks.forEach((chunk) => aa('clickedFilters', chunk));
393388
data.gtmOnSuccess();
394389
break;
395390
}
@@ -401,8 +396,13 @@ switch (data.method) {
401396
break;
402397
}
403398

404-
const payload: InsightsEvent = {
405-
eventType: 'conversion',
399+
const methodName = data.eventSubtype === 'addToCart'
400+
? 'addedToCartObjectIDsAfterSearch'
401+
: data.eventSubtype === 'purchase'
402+
? 'purchasedObjectIDsAfterSearch'
403+
: 'convertedObjectIDsAfterSearch';
404+
405+
const payload: InsightsSearchConversionEvent = {
406406
eventName: data.eventName,
407407
index: data.index,
408408
objectIDs: formatValueToList(data.objectIDs),
@@ -413,17 +413,15 @@ switch (data.method) {
413413
value: data.value,
414414
currency: data.currency,
415415
};
416-
if (data.eventSubtype) {
417-
payload.eventSubtype = data.eventSubtype;
418-
}
419416
const chunks = chunkPayload(
420417
payload,
421418
['objectIDs', 'objectData'],
422419
MAX_OBJECT_IDS
423420
);
424421

425-
logger('sendEvents', chunks);
426-
aa('sendEvents', chunks);
422+
logger(methodName, chunks);
423+
const additionalParams: InsightsAdditionalEventParams = data.inferQueryID ? { inferQueryID: true } : {};
424+
chunks.forEach((chunk) => aa(methodName, chunk, additionalParams));
427425
data.gtmOnSuccess();
428426
break;
429427
}
@@ -435,8 +433,13 @@ switch (data.method) {
435433
break;
436434
}
437435

438-
const payload: InsightsEvent = {
439-
eventType: 'conversion',
436+
const methodName = data.eventSubtype === 'addToCart'
437+
? 'addedToCartObjectIDs'
438+
: data.eventSubtype === 'purchase'
439+
? 'purchasedObjectIDs'
440+
: 'convertedObjectIDs';
441+
442+
const payload: InsightsSearchConversionObjectIDsEvent = {
440443
eventName: data.eventName,
441444
index: data.index,
442445
objectIDs: formatValueToList(data.objectIDs),
@@ -446,17 +449,15 @@ switch (data.method) {
446449
value: data.value,
447450
currency: data.currency,
448451
};
449-
if (data.eventSubtype) {
450-
payload.eventSubtype = data.eventSubtype;
451-
}
452452
const chunks = chunkPayload(
453453
payload,
454454
['objectIDs', 'objectData'],
455455
MAX_OBJECT_IDS
456456
);
457457

458-
logger('sendEvents', chunks);
459-
aa('sendEvents', chunks);
458+
logger(methodName, chunks);
459+
const additionalParams: InsightsAdditionalEventParams = data.inferQueryID ? { inferQueryID: true } : {};
460+
chunks.forEach((chunk) => aa(methodName, chunk, additionalParams));
460461
data.gtmOnSuccess();
461462
break;
462463
}
@@ -468,23 +469,17 @@ switch (data.method) {
468469
break;
469470
}
470471

471-
const payload: InsightsEvent = {
472-
eventType: 'conversion',
472+
const payload: InsightsSearchConversionFiltersEvent = {
473473
eventName: data.eventName,
474474
filters: formatValueToList(data.filters),
475475
index: data.index,
476476
userToken: data.userToken,
477477
authenticatedUserToken: data.authenticatedUserToken,
478-
value: data.value,
479-
currency: data.currency,
480478
};
481-
if (data.eventSubtype) {
482-
payload.eventSubtype = data.eventSubtype;
483-
}
484479
const chunks = chunkPayload(payload, ['filters'], MAX_FILTERS);
485480

486-
logger('sendEvents', chunks);
487-
aa('sendEvents', chunks);
481+
logger('convertedFilters', chunks);
482+
chunks.forEach((chunk) => aa('convertedFilters', chunk));
488483
data.gtmOnSuccess();
489484
break;
490485
}
@@ -496,8 +491,7 @@ switch (data.method) {
496491
break;
497492
}
498493

499-
const payload: InsightsEvent = {
500-
eventType: 'view',
494+
const payload: InsightsSearchViewFiltersEvent = {
501495
eventName: data.eventName,
502496
filters: formatValueToList(data.filters),
503497
index: data.index,
@@ -506,8 +500,8 @@ switch (data.method) {
506500
};
507501
const chunks = chunkPayload(payload, ['filters'], MAX_FILTERS);
508502

509-
logger('sendEvents', chunks);
510-
aa('sendEvents', chunks);
503+
logger('viewedFilters', chunks);
504+
chunks.forEach((chunk) => aa('viewedFilters', chunk));
511505
data.gtmOnSuccess();
512506
break;
513507
}

src/tests.yaml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,15 @@ scenarios:
1818
1919
const aa = copyFromWindow('aa');
2020
21-
assertThat(aa.queue[aa.queue.length-1]).isEqualTo(['sendEvents', [{
22-
eventType: 'click',
21+
assertThat(aa.queue[aa.queue.length-1]).isEqualTo(['clickedObjectIDs', {
2322
eventName: 'click',
2423
index: 'my-index',
2524
queryID: 'my-query-id',
2625
objectIDs: ['foo','bar','baz'],
2726
objectData: [],
2827
userToken: 'my-user-token',
2928
authenticatedUserToken: 'my-authenticated-user-token'
30-
}]]);
29+
}]);
3130
- name: objectIds handles multiple ids that contain commas
3231
code: |-
3332
const copyFromWindow = require('copyFromWindow');
@@ -47,16 +46,15 @@ scenarios:
4746
4847
const aa = copyFromWindow('aa');
4948
50-
assertThat(aa.queue[aa.queue.length-1]).isEqualTo(['sendEvents', [{
51-
eventType: 'click',
49+
assertThat(aa.queue[aa.queue.length-1]).isEqualTo(['clickedObjectIDs', {
5250
eventName: 'click',
5351
index: 'my-index',
5452
queryID: 'my-query-id',
5553
objectIDs: ['foo,bar','ba\\z', 'with,multiple,commas'],
5654
objectData: [],
5755
userToken: 'my-user-token',
5856
authenticatedUserToken: 'my-authenticated-user-token'
59-
}]]);
57+
}]);
6058
setup: |-
6159
const setInWindow = require('setInWindow');
6260

src/types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,15 @@ interface GtmDataConvertedObjectIDsAfterSearch extends GtmDataEventWithObjects {
6969
eventSubtype: GtmEventSubtype;
7070
currency?: string;
7171
value?: number | string;
72+
inferQueryID?: boolean;
7273
}
7374
interface GtmDataConvertedObjectIDs extends GtmDataEventWithObjects {
7475
method: 'convertedObjectIDs';
7576
index: string;
7677
eventSubtype: GtmEventSubtype;
7778
currency?: string;
7879
value?: number | string;
80+
inferQueryID?: boolean;
7981
}
8082
interface GtmDataConvertedFilters extends GtmDataEventWithFilters {
8183
method: 'convertedFilters';

0 commit comments

Comments
 (0)