Skip to content

Commit 7eee698

Browse files
authored
feat: Add eventID to enable de-duplicating events
1 parent ed60b99 commit 7eee698

File tree

2 files changed

+77
-16
lines changed

2 files changed

+77
-16
lines changed

src/FacebookEventForwarder.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@
143143

144144
var eventName,
145145
totalValue,
146-
params = cloneEventAttributes(event);
147-
146+
params = cloneEventAttributes(event),
147+
eventID = createEventId(event);
148148
params['currency'] = event.CurrencyCode || 'USD';
149149

150150
if (event.EventName) {
@@ -234,12 +234,12 @@
234234

235235
params['value'] = totalValue;
236236

237-
fbq('trackCustom', eventName || 'customEvent', params);
237+
fbq('trackCustom', eventName || 'customEvent', params, eventID);
238238
return true;
239239
}
240240

241241
if (eventName) {
242-
fbq('track', eventName, params);
242+
fbq('track', eventName, params, eventID);
243243
}
244244
else {
245245
return false;
@@ -257,11 +257,13 @@
257257

258258
function logPageEvent(event, eventName) {
259259
var params = cloneEventAttributes(event);
260+
var eventID = createEventId(event);
261+
260262
eventName = eventName || event.EventName;
261263
if (event.EventName) {
262264
params['content_name'] = event.EventName;
263265
}
264-
fbq('trackCustom', eventName || 'customEvent', params);
266+
fbq('trackCustom', eventName || 'customEvent', params, eventID);
265267
}
266268

267269
function cloneEventAttributes(event) {
@@ -306,6 +308,13 @@
306308
return null;
307309
}
308310

311+
// https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events#event-deduplication-options
312+
function createEventId(event) {
313+
return {
314+
eventID: event.SourceMessageId || null
315+
}
316+
}
317+
309318
this.init = initForwarder;
310319
this.process = processEvent;
311320
};

test/tests.js

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,11 @@ describe('Facebook Forwarder', function () {
105105
self[attr] = true;
106106
}
107107

108-
function fbq(fnName, eventname, params) {
108+
function fbq(fnName, eventname, params, eventData) {
109109
setCalledAttributes(fnName + 'Called');
110110
self.eventName = eventname;
111111
self.params = params;
112+
self.eventData = eventData;
112113
}
113114

114115
return {
@@ -117,6 +118,7 @@ describe('Facebook Forwarder', function () {
117118
};
118119
}
119120

121+
var SOURCE_MESSAGE_ID = 'Source Message Id Test';
120122
function checkBasicProperties(fnName) {
121123
window.fbqObj.should.have.property(fnName + 'Called', true);
122124
window.fbqObj.should.have.property('eventName');
@@ -244,6 +246,20 @@ describe('Facebook Forwarder', function () {
244246
window.fbqObj.should.have.property('eventName', 'Viewed testevent');
245247
done();
246248
});
249+
250+
it('should log page view with event id when passed', function (done) {
251+
mParticle.forwarder.process({
252+
EventName: 'testevent',
253+
EventDataType: MessageType.PageView,
254+
SourceMessageId: SOURCE_MESSAGE_ID,
255+
});
256+
257+
checkBasicProperties('trackCustom');
258+
window.fbqObj.should.have.property('eventName', 'Viewed testevent');
259+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID)
260+
261+
done();
262+
});
247263
});
248264

249265
describe('Page Events', function () {
@@ -280,6 +296,17 @@ describe('Facebook Forwarder', function () {
280296
window.fbqObj.params.should.have.property('foo', 'bar');
281297
done();
282298
});
299+
300+
it('should log event id when passed properly', function (done) {
301+
mParticle.forwarder.process({
302+
EventName: 'logevent',
303+
EventDataType: MessageType.PageEvent,
304+
SourceMessageId: SOURCE_MESSAGE_ID,
305+
});
306+
307+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID)
308+
done();
309+
});
283310
});
284311

285312
describe('Commerce Events', function () {
@@ -311,7 +338,8 @@ describe('Facebook Forwarder', function () {
311338
TaxAmount: 40,
312339
ShippingAmount: 10
313340
},
314-
CurrencyCode: 'USD'
341+
CurrencyCode: 'USD',
342+
SourceMessageId: SOURCE_MESSAGE_ID,
315343
});
316344

317345
checkBasicProperties('track');
@@ -323,6 +351,7 @@ describe('Facebook Forwarder', function () {
323351
window.fbqObj.params.should.have.property('num_items', 1);
324352
window.fbqObj.params.should.have.property('eventAttr1', 'value1');
325353
window.fbqObj.params.should.have.property('eventAttr2', 'value2');
354+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
326355

327356
done();
328357
});
@@ -377,7 +406,8 @@ describe('Facebook Forwarder', function () {
377406
TaxAmount: 40,
378407
ShippingAmount: 10
379408
},
380-
CurrencyCode: 'USD'
409+
CurrencyCode: 'USD',
410+
SourceMessageId: SOURCE_MESSAGE_ID,
381411
});
382412

383413
checkBasicProperties('track');
@@ -389,6 +419,8 @@ describe('Facebook Forwarder', function () {
389419
window.fbqObj.params.should.have.property('content_ids', ['12345', '22', '333']);
390420
window.fbqObj.params.should.have.property('checkout_step', 1);
391421
window.fbqObj.params.should.have.property('num_items', 9);
422+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
423+
392424

393425
done();
394426
});
@@ -418,7 +450,9 @@ describe('Facebook Forwarder', function () {
418450
TaxAmount: 40,
419451
ShippingAmount: 10
420452
},
421-
CurrencyCode: 'USD'
453+
CurrencyCode: 'USD',
454+
SourceMessageId: SOURCE_MESSAGE_ID,
455+
422456
});
423457

424458
checkBasicProperties('track');
@@ -427,6 +461,8 @@ describe('Facebook Forwarder', function () {
427461
window.fbqObj.params.should.have.property('currency', 'USD');
428462
window.fbqObj.params.should.have.property('content_name', 'eCommerce - AddToCart');
429463
window.fbqObj.params.should.have.property('content_ids', ['12345']);
464+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
465+
430466
done();
431467
});
432468

@@ -473,7 +509,8 @@ describe('Facebook Forwarder', function () {
473509
TransactionId: 123,
474510
Affiliation: 'my-affiliation'
475511
},
476-
CurrencyCode: 'USD'
512+
CurrencyCode: 'USD',
513+
SourceMessageId: SOURCE_MESSAGE_ID,
477514
});
478515

479516
checkBasicProperties('track');
@@ -482,6 +519,8 @@ describe('Facebook Forwarder', function () {
482519
window.fbqObj.params.should.have.property('currency', 'USD');
483520
window.fbqObj.params.should.have.property('content_name', 'eCommerce - AddToCart');
484521
window.fbqObj.params.should.have.property('content_ids', ['12345', '888', '666']);
522+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
523+
485524
done();
486525
});
487526

@@ -511,7 +550,8 @@ describe('Facebook Forwarder', function () {
511550
ShippingAmount: 10,
512551
TotalAmount: 205
513552
},
514-
CurrencyCode: 'USD'
553+
CurrencyCode: 'USD',
554+
SourceMessageId: SOURCE_MESSAGE_ID,
515555
});
516556

517557
checkBasicProperties('trackCustom');
@@ -520,6 +560,7 @@ describe('Facebook Forwarder', function () {
520560
window.fbqObj.params.should.have.property('currency', 'USD');
521561
window.fbqObj.params.should.have.property('content_name', 'eCommerce - RemoveFromCart');
522562
window.fbqObj.params.should.have.property('content_ids', ['12345']);
563+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
523564

524565
done();
525566
});
@@ -549,7 +590,8 @@ describe('Facebook Forwarder', function () {
549590
TaxAmount: 40,
550591
ShippingAmount: 10
551592
},
552-
CurrencyCode: 'USD'
593+
CurrencyCode: 'USD',
594+
SourceMessageId: SOURCE_MESSAGE_ID,
553595
});
554596

555597
checkBasicProperties('trackCustom');
@@ -558,6 +600,7 @@ describe('Facebook Forwarder', function () {
558600
window.fbqObj.params.should.have.property('currency', 'USD');
559601
window.fbqObj.params.should.have.property('content_name', 'eCommerce - RemoveFromCart');
560602
window.fbqObj.params.should.have.property('content_ids', ['12345']);
603+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
561604

562605
done();
563606
});
@@ -609,7 +652,8 @@ describe('Facebook Forwarder', function () {
609652
TransactionId: 123,
610653
Affiliation: 'my-affiliation'
611654
},
612-
CurrencyCode: 'USD'
655+
CurrencyCode: 'USD',
656+
SourceMessageId: SOURCE_MESSAGE_ID,
613657
});
614658

615659
checkBasicProperties('track');
@@ -620,6 +664,7 @@ describe('Facebook Forwarder', function () {
620664
window.fbqObj.params.should.have.property('content_ids', ['12345', '888', '666']);
621665
window.fbqObj.params.should.have.property('eventAttr1', 'value1');
622666
window.fbqObj.params.should.have.property('eventAttr2', 'value2');
667+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
623668

624669
done();
625670
});
@@ -653,7 +698,8 @@ describe('Facebook Forwarder', function () {
653698
TaxAmount: 40,
654699
ShippingAmount: 10
655700
},
656-
CurrencyCode: 'USD'
701+
CurrencyCode: 'USD',
702+
SourceMessageId: SOURCE_MESSAGE_ID,
657703
});
658704

659705
checkBasicProperties('track');
@@ -665,6 +711,7 @@ describe('Facebook Forwarder', function () {
665711
window.fbqObj.params.should.have.property('content_ids', ['12345']);
666712
window.fbqObj.params.should.have.property('eventAttr1', 'value1');
667713
window.fbqObj.params.should.have.property('eventAttr2', 'value2');
714+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
668715

669716
done();
670717
});
@@ -698,7 +745,8 @@ describe('Facebook Forwarder', function () {
698745
TaxAmount: 40,
699746
ShippingAmount: 10
700747
},
701-
CurrencyCode: 'USD'
748+
CurrencyCode: 'USD',
749+
SourceMessageId: SOURCE_MESSAGE_ID,
702750
});
703751

704752
checkBasicProperties('track');
@@ -709,6 +757,7 @@ describe('Facebook Forwarder', function () {
709757
window.fbqObj.params.should.have.property('content_ids', ['145']);
710758
window.fbqObj.params.should.have.property('eventAttr1', 'value1');
711759
window.fbqObj.params.should.have.property('eventAttr2', 'value2');
760+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
712761

713762
done();
714763
});
@@ -741,7 +790,8 @@ describe('Facebook Forwarder', function () {
741790
TaxAmount: 40,
742791
ShippingAmount: 10
743792
},
744-
CurrencyCode: 'USD'
793+
CurrencyCode: 'USD',
794+
SourceMessageId: SOURCE_MESSAGE_ID,
745795
});
746796

747797
checkBasicProperties('track');
@@ -753,6 +803,8 @@ describe('Facebook Forwarder', function () {
753803
window.fbqObj.params.should.have.property('content_ids', ['12345']);
754804
window.fbqObj.params.should.have.property('eventAttr1', 'value1');
755805
window.fbqObj.params.should.have.property('eventAttr2', 'value2');
806+
window.fbqObj.eventData.should.have.property('eventID', SOURCE_MESSAGE_ID);
807+
756808
done();
757809
});
758810

0 commit comments

Comments
 (0)