diff --git a/src/integrationCapture.ts b/src/integrationCapture.ts index 419228efc..e7fc64d9f 100644 --- a/src/integrationCapture.ts +++ b/src/integrationCapture.ts @@ -120,6 +120,12 @@ const integrationMappingExternal: IntegrationIdMapping = { mappedKey: 'SnapchatConversions.ClickId', output: IntegrationOutputs.CUSTOM_FLAGS, }, + // Snapchat + // https://developers.snap.com/api/marketing-api/Conversions-API/UsingTheAPI#sending-click-id + _scid: { + mappedKey: 'SnapchatConversions.Cookie1', + output: IntegrationOutputs.CUSTOM_FLAGS, + }, }; const integrationMappingRokt: IntegrationIdMapping = { diff --git a/test/jest/integration-capture.spec.ts b/test/jest/integration-capture.spec.ts index 875179bb2..e25cc21cf 100644 --- a/test/jest/integration-capture.spec.ts +++ b/test/jest/integration-capture.spec.ts @@ -27,7 +27,8 @@ describe('Integration Capture', () => { 'gbraid', 'wbraid', 'ttclid', - 'ScCid' + 'ScCid', + '_scid' ]); }); @@ -55,6 +56,7 @@ describe('Integration Capture', () => { 'wbraid', 'ttclid', 'ScCid', + '_scid', ]; for (const key of excludedKeys) { expect(mappings).not.toHaveProperty(key); @@ -273,6 +275,42 @@ describe('Integration Capture', () => { ScCid: '1234', }); }); + + it('should capture _scid from cookies', () => { + const url = new URL('https://www.example.com/'); + + window.document.cookie = '_scid=cookie1-from-cookie'; + window.document.cookie = '_cookie1=4567'; + window.document.cookie = 'baz=qux'; + + window.location.href = url.href; + window.location.search = url.search; + + const integrationCapture = new IntegrationCapture('all'); + integrationCapture.capture(); + + expect(integrationCapture.clickIds).toEqual({ + _scid: 'cookie1-from-cookie', + }); + }); + + it('should capture both ScCid from query params and _scid from cookies', () => { + const url = new URL('https://www.example.com/?ScCid=4567'); + + window.document.cookie = '_scid=cookie1-from-cookie'; + window.document.cookie = '_cookie1=334455'; + + window.location.href = url.href; + window.location.search = url.search; + + const integrationCapture = new IntegrationCapture('all'); + integrationCapture.capture(); + + expect(integrationCapture.clickIds).toEqual({ + ScCid: '4567', + _scid: 'cookie1-from-cookie', + }); + }); }); describe('Facebook Click Ids', () => { @@ -611,6 +649,19 @@ describe('Integration Capture', () => { }); }); + it('should capture _scid from cookies', () => { + window.document.cookie = '_cookie1=4567'; + window.document.cookie = '_scid=cookie1-from-cookie'; + window.document.cookie = 'baz=qux'; + + const integrationCapture = new IntegrationCapture('all'); + const clickIds = integrationCapture.captureCookies(); + + expect(clickIds).toEqual({ + _scid: 'cookie1-from-cookie', + }); + }); + it('should NOT capture cookies if they are not mapped', () => { window.document.cookie = '_cookie1=1234'; window.document.cookie = '_cookie2=39895811.9165333198'; @@ -665,6 +716,8 @@ describe('Integration Capture', () => { _ttp: '0823422223.23234', ttclid: '12345', gclid: '123233.23131', + ScCid: '456789', + _scid: 'cookie1-value', invalidId: '12345', }; @@ -675,6 +728,8 @@ describe('Integration Capture', () => { 'Facebook.BrowserId': '54321', 'TikTok.Callback': '12345', 'GoogleEnhancedConversions.Gclid': '123233.23131', + 'SnapchatConversions.ClickId': '456789', + 'SnapchatConversions.Cookie1': 'cookie1-value', }); }); }); diff --git a/test/src/tests-integration-capture.ts b/test/src/tests-integration-capture.ts index 829d2841b..cbd368366 100644 --- a/test/src/tests-integration-capture.ts +++ b/test/src/tests-integration-capture.ts @@ -45,6 +45,7 @@ describe('Integration Capture', () => { window.document.cookie = '_fbp=54321'; window.document.cookie = 'baz=qux'; window.document.cookie = '_ttp=45670808'; + window.document.cookie = '_scid=cookie1-value'; mParticle.init(apiKey, window.mParticle.config); await waitForCondition(hasIdentifyReturned); const integrationCapture = window.mParticle.getInstance()._IntegrationCapture; @@ -89,6 +90,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to event custom flags, prioritizing passed in custom flags', async () => { @@ -112,6 +114,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to page view custom flags', async () => { @@ -136,6 +139,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to page view custom flags, prioritizing passed in custom flags', async () => { @@ -159,6 +163,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to commerce event custom flags', async () => { @@ -197,6 +202,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to commerce event custom flags, prioritizing passed in flags', async () => { @@ -235,6 +241,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to commerce event custom flags', async () => { @@ -273,6 +280,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to commerce event custom flags, prioritizing passed in flags', async () => { @@ -311,6 +319,7 @@ describe('Integration Capture', () => { expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Gbraid'], 'Google Enhanced Conversions Gbraid').to.equal('6574'); expect(testEvent.data.custom_flags['GoogleEnhancedConversions.Wbraid'], 'Google Enhanced Conversions Wbraid').to.equal('1234111'); expect(testEvent.data.custom_flags['SnapchatConversions.ClickId'], 'Snapchat Click ID').to.equal('1234'); + expect(testEvent.data.custom_flags['SnapchatConversions.Cookie1'], 'Snapchat Cookie1').to.equal('cookie1-value'); }); it('should add captured integrations to batch as partner identities', async () => {