Skip to content

Commit 98425f5

Browse files
Update Amplitude integration to use Amplitude SDK v2
1 parent 84a6ed0 commit 98425f5

File tree

3 files changed

+60
-87
lines changed

3 files changed

+60
-87
lines changed

Integrations/Analytics/Amplitude/README.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,4 @@
22

33
## Description
44

5-
Use this integration to track your Optimizely experiments in Amplitude.
6-
7-
Please note that this integration is in beta right now, but it is already successfully in use by a few of our customers.
5+
Use this integration to track your Optimizely experiments in Amplitude.

Integrations/Analytics/Amplitude/config.json

+5-12
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
"name": "Amplitude Analytics Integration",
44
"form_schema": [
55
{
6+
"label": "User Property Prefix: A user property for your experiment will be sent in an identify call. The user property will be prefixed with this prefix.",
67
"default_value": "[Optimizely Experiment]",
78
"field_type": "text",
89
"name": "property_prefix",
9-
"label": "User Property Prefix: A user property for your experiment will be sent in an identify call. The user property will be prefixed with this prefix.",
1010
"options": null
1111
},
1212
{
13+
"label": "Send Event: Optionally send an event with campaign, experiment, and variation info",
1314
"default_value": "n",
1415
"field_type": "dropdown",
1516
"name": "send_event",
16-
"label": "Send Event: Optionally send an event with campaign, experiment, and variation info",
1717
"options": {
1818
"choices": [
1919
{
@@ -28,22 +28,15 @@
2828
}
2929
},
3030
{
31+
"label": "Event Name (optional)",
3132
"default_value": "User in Experiment",
3233
"field_type": "text",
3334
"name": "event_name",
34-
"label": "Event Name (optional)",
35-
"options": null
36-
},
37-
{
38-
"default_value": "",
39-
"field_type": "text",
40-
"name": "instance_name",
41-
"label": "Instance Name (optional): The instance name you are using in your amplitude instrumentation eg: amplitude.getInstance('my instance name'). Usually this is blank.",
4235
"options": null
4336
}
4437
],
4538
"description": "Send an identify call to amplitude identifying the experiment variation the user is seeing. Also, optionally send an event to amplitude that the user is in an experiment.\n\nSettings:",
4639
"options": {
47-
"track_layer_decision": "// VERSION 0.1.0\n// Last Updated: July 9th 2019\n\nvar dataSent = false;\nvar MAX_ATTEMPTS = 9;\nvar RETRY_DELAY_MS = 1000;\n\nfunction getCampaignInfo() {\n return window.optimizely\n .get(\"state\")\n .getDecisionObject({ campaignId: campaignId });\n}\n\nfunction logEvent() {\n var campaignInfo = getCampaignInfo();\n\n if (campaignInfo) {\n var eventProperties = {\n \"[Optimizely Campaign]\": campaignInfo.campaign,\n \"[Optimizely Experiment]\": campaignInfo.experiment,\n \"[Optimizely Variation]\": campaignInfo.variation,\n \"[Optimizely Holdback]\": campaignInfo.holdback\n };\n amplitude.getInstance(extension.instance_name).logEvent(extension.event_name, eventProperties);\n }\n}\n\nfunction identifyCall() {\n var campaignInfo = getCampaignInfo();\n\n if (campaignInfo) {\n var identify = new amplitude.Identify().set(\n extension.property_prefix + \" \" + campaignInfo.experiment,\n campaignInfo.variation\n );\n amplitude.getInstance(extension.instance_name).identify(identify);\n }\n}\n\nfunction sendData() {\n if (!dataSent) {\n identifyCall();\n if (extension.send_event === \"y\") {\n logEvent();\n }\n }\n dataSent = true;\n}\n\nfunction sendToAmplitude(call) {\n if (call >= MAX_ATTEMPTS) {\n return;\n }\n \n var instanceKey = extension.instance_name || \"$default_instance\";\n\n if (window.amplitude && window.amplitude.getInstance) {\n var instance = window.amplitude.getInstance(extension.instance_name);\n \n if (instance._isInitialized) {\n return sendData();\n } else if (instance.onInit) {\n instance.onInit(function() {\n sendData();\n });\n return;\n }\n }\n \n return setTimeout(function() {\n sendToAmplitude(call + 1);\n }, RETRY_DELAY_MS);\n}\nsendToAmplitude(0);"
40+
"track_layer_decision": "// VERSION 0.2.0\n// Last Updated: August 30th 2024\n\nconst MAX_ATTEMPTS = 9;\nconst RETRY_DELAY_MS = 1000;\n\nconst logEvent = ({campaign, experiment, variation, holdback}) => {\n\tconst eventProperties = {\n\t\t'[Optimizely Campaign]': campaign,\n\t\t'[Optimizely Experiment]': experiment,\n\t\t'[Optimizely Variation]': variation,\n\t\t'[Optimizely Holdback]': holdback\n\t};\n\n\twindow.amplitude.logEvent(extension.event_name, eventProperties);\n};\n\nconst identifyCall = ({experiment, variation, holdback}) => {\n\tif (!holdback) {\n\t\tconst identifyEvent = new window.amplitude.Identify();\n\t\tidentifyEvent.set(`${extension.property_prefix} ${experiment}`, variation);\n\n\t\twindow.amplitude.identify(identifyEvent);\n\t}\n};\n\nconst sendData = () => {\n\tconst campaignInfo = window.optimizely\n\t\t.get('state')\n\t\t.getDecisionObject({ campaignId });\n\n\tif (campaignInfo) {\n\t\t// Always send identify event\n\t\tidentifyCall(campaignInfo);\n\t\tif (extension.send_event === 'y') {\n\t\t\t// Only log event if so configured\n\t\t\tlogEvent(campaignInfo);\n\t\t}\n\t}\n};\n\nconst sendToAmplitude = (numberOfAttempts) => {\n\tif (window.amplitude) {\n\t\t// Send data to Amplitude\n\t\tsendData();\n\t} else {\n\t\t// Retry until Amplitude is initialized\n\t\tif (numberOfAttempts < MAX_ATTEMPTS) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tsendToAmplitude(numberOfAttempts + 1);\n\t\t\t}, RETRY_DELAY_MS);\n\t\t}\n\t}\n};\n\nsendToAmplitude(0);"
4841
}
49-
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,56 @@
1-
// VERSION 0.1.0
2-
// Last Updated: July 9th 2019
1+
// VERSION 0.2.0
2+
// Last Updated: August 30th 2024
3+
4+
const MAX_ATTEMPTS = 9;
5+
const RETRY_DELAY_MS = 1000;
6+
7+
const logEvent = ({campaign, experiment, variation, holdback}) => {
8+
const eventProperties = {
9+
'[Optimizely Campaign]': campaign,
10+
'[Optimizely Experiment]': experiment,
11+
'[Optimizely Variation]': variation,
12+
'[Optimizely Holdback]': holdback
13+
};
14+
15+
window.amplitude.logEvent(extension.event_name, eventProperties);
16+
};
17+
18+
const identifyCall = ({experiment, variation, holdback}) => {
19+
if (!holdback) {
20+
const identifyEvent = new window.amplitude.Identify();
21+
identifyEvent.set(`${extension.property_prefix} ${experiment}`, variation);
22+
23+
window.amplitude.identify(identifyEvent);
24+
}
25+
};
26+
27+
const sendData = () => {
28+
const campaignInfo = window.optimizely
29+
.get('state')
30+
.getDecisionObject({ campaignId });
31+
32+
if (campaignInfo) {
33+
// Always send identify event
34+
identifyCall(campaignInfo);
35+
if (extension.send_event === 'y') {
36+
// Only log event if so configured
37+
logEvent(campaignInfo);
38+
}
39+
}
40+
};
41+
42+
const sendToAmplitude = (numberOfAttempts) => {
43+
if (window.amplitude) {
44+
// Send data to Amplitude
45+
sendData();
46+
} else {
47+
// Retry until Amplitude is initialized
48+
if (numberOfAttempts < MAX_ATTEMPTS) {
49+
setTimeout(() => {
50+
sendToAmplitude(numberOfAttempts + 1);
51+
}, RETRY_DELAY_MS);
52+
}
53+
}
54+
};
355

4-
var dataSent = false;
5-
var MAX_ATTEMPTS = 9;
6-
var RETRY_DELAY_MS = 1000;
7-
8-
function getCampaignInfo() {
9-
return window.optimizely
10-
.get("state")
11-
.getDecisionObject({ campaignId: campaignId });
12-
}
13-
14-
function logEvent() {
15-
var campaignInfo = getCampaignInfo();
16-
17-
if (campaignInfo) {
18-
var eventProperties = {
19-
"[Optimizely Campaign]": campaignInfo.campaign,
20-
"[Optimizely Experiment]": campaignInfo.experiment,
21-
"[Optimizely Variation]": campaignInfo.variation,
22-
"[Optimizely Holdback]": campaignInfo.holdback
23-
};
24-
amplitude.getInstance(extension.instance_name).logEvent(extension.event_name, eventProperties);
25-
}
26-
}
27-
28-
function identifyCall() {
29-
var campaignInfo = getCampaignInfo();
30-
31-
if (campaignInfo) {
32-
var identify = new amplitude.Identify().set(
33-
extension.property_prefix + " " + campaignInfo.experiment,
34-
campaignInfo.variation
35-
);
36-
amplitude.getInstance(extension.instance_name).identify(identify);
37-
}
38-
}
39-
40-
function sendData() {
41-
if (!dataSent) {
42-
identifyCall();
43-
if (extension.send_event === "y") {
44-
logEvent();
45-
}
46-
}
47-
dataSent = true;
48-
}
49-
50-
function sendToAmplitude(call) {
51-
if (call >= MAX_ATTEMPTS) {
52-
return;
53-
}
54-
55-
var instanceKey = extension.instance_name || "$default_instance";
56-
57-
if (window.amplitude && window.amplitude.getInstance) {
58-
var instance = window.amplitude.getInstance(extension.instance_name);
59-
60-
if (instance._isInitialized) {
61-
return sendData();
62-
} else if (instance.onInit) {
63-
instance.onInit(function() {
64-
sendData();
65-
});
66-
return;
67-
}
68-
}
69-
70-
return setTimeout(function() {
71-
sendToAmplitude(call + 1);
72-
}, RETRY_DELAY_MS);
73-
}
7456
sendToAmplitude(0);

0 commit comments

Comments
 (0)