Skip to content

Instantly share code, notes, and snippets.

@cbarley10
Created November 30, 2021 16:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cbarley10/f1335a260ed30b09c63e7223f18202df to your computer and use it in GitHub Desktop.
Save cbarley10/f1335a260ed30b09c63e7223f18202df to your computer and use it in GitHub Desktop.
Serverside Container for Klaviyo Medium Blog Article
___TERMS_OF_SERVICE___
By creating or modifying this file you agree to Google Tag Manager's Community
Template Gallery Developer Terms of Service available at
https://developers.google.com/tag-manager/gallery-tos (or such other URL as
Google may provide), as modified from time to time.
___INFO___
{
"type": "TAG",
"id": "cvt_temp_public_id",
"version": 1,
"securityGroups": [],
"displayName": "Klaviyo API Wrapper Template",
"brand": {
"id": "brand_dummy",
"displayName": "",
"thumbnail": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANIAAADcCAYAAAAFk/8yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMjgwMTE3NDA3MjA2ODExODIyQUNENUU2MzJGRkMxNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MzUyMDZBOEIxMTkxMUU3QkE0MkYxRkVDNkE4MEMwMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5NkJGNEYyQUIxMTgxMUU3QkE0MkYxRkVDNkE4MEMwMSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDI4MDExNzQwNzIwNjgxMTgyMkFDRDVFNjMyRkZDMTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDI4MDExNzQwNzIwNjgxMTgyMkFDRDVFNjMyRkZDMTYiLz4gPC9yZGY6RGVzY3Jp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"
},
"description": "Klaviyo Wrapper for sending events mapped through GA4 into Klaviyo though GTM\u0027s Serverside Container technology.",
"containerContexts": [
"SERVER"
]
}
___TEMPLATE_PARAMETERS___
[
{
"type": "TEXT",
"name": "public_key",
"displayName": "Klaviyo Public API Key",
"simpleValueType": true,
"help": "Use your Public API Key from your Account Settings. To locate your Public Key, go here: https://help.klaviyo.com/hc/en-us/articles/115005062267-Manage-Your-Account-s-API-Keys#your-public-api-key-site-id2",
"valueValidators": [
{
"type": "NON_EMPTY"
}
],
"notSetText": "Public API Key cannot be blank!"
}
]
___SANDBOXED_JS_FOR_SERVER___
//////////////
// Packages //
//////////////
const JSON = require("JSON");
const log = require("logToConsole");
const parseUrl = require('parseUrl');
const toBase64 = require('toBase64');
const sendHttpRequest = require('sendHttpRequest');
const setResponseBody = require('setResponseBody');
const getAllEventData = require('getAllEventData');
const setResponseStatus = require('setResponseStatus');
const encodeUriComponent = require('encodeUriComponent');
///////////////
// Constants //
///////////////
const KL_PUBLIC_KEY = data.public_key;
const EVENT_DATA = getAllEventData();
const HEADERS = {
'user-agent': 'Klaviyo/GTM-Serverside',
'Accept': 'text/html',
'Content-Type': 'application/x-www-form-urlencoded'
};
/////////////
// Helpers //
/////////////
// Encode JSON payload to Base64 in order to send event to Klaviyo
const encodePayload = payload => encodeUriComponent(toBase64(JSON.stringify(payload)));
// Return only unique values in an array
const returnUniques = (value, index, self) => {
return self.indexOf(value) === index;
};
// pull out nested fields in "items" array of the ecommerce object, and add them as top-level fields
const flatten = event => {
const flattenedObj = event.ecommerce;
const objectKeys = [];
const ecommerceObjectItems = event.ecommerce.items;
for(let property in ecommerceObjectItems[0]){
objectKeys.push(property);
}
objectKeys.forEach(item => {
flattenedObj[item] = ecommerceObjectItems.map(i => i[item]).filter(returnUniques);
});
return flattenedObj;
};
// Normalize event names so that they look better in Klaviyo and conform to Klaviyo naming convention
const normalizeEventNames = name => {
if (name === "add_to_cart") {
return "Added To Cart";
} else if (name === "view_item") {
return "Viewed Product";
} else if (name === "begin_checkout") {
return "Started Checkout";
} else if (name === "page_view"){
return "Page Viewed";
} else if (name.indexOf("_") > -1) {
return name.split("_").map(item => item.charAt(0).toUpperCase() + item.slice(1)).join(" ");
}
return name.charAt(0).toUpperCase() + name.slice(1);
};
// Build track payload
const buildPayload = (event, user) => {
const customerProperties = {};
if (user.email) {
customerProperties["$email"] = user.email;
}
if (user.exchange_id) {
customerProperties["$exchange_id"] = user.exchange_id;
}
return {
"token": KL_PUBLIC_KEY,
"event": normalizeEventNames(eventName),
"customer_properties": customerProperties,
"properties": event.hasOwnProperty("ecommerce") ? flatten(EVENT_DATA) : EVENT_DATA
};
};
// Handle _kx and utm_email parameters
const getUser = (url, eventData) => {
const parsedUrl = parseUrl(url) || "";
const userEmail = eventData.email;
if (parsedUrl && parsedUrl.searchParams._kx){
const kx = parsedUrl.searchParams._kx;
return {
"email": "",
"exchange_id": kx
};
} else if (parsedUrl && parsedUrl.searchParams.utm_email){
const email = parsedUrl.searchParams.utm_email;
return {
"email": email,
"exchange_id": ""
};
} else if (userEmail){
return {
"email": userEmail,
"exchange_id": ""
};
} else {
return {
"email": "",
"exchange_id": ""
};
}
};
///////////////////
// API Functions //
///////////////////
const sendTrackOrIdentifyRequest = (method, payload) => {
const encodedPayload = encodePayload(payload);
const url = "https://a.klaviyo.com/api/" + method + "?data=" + encodedPayload;
return sendHttpRequest(url, (statusCode, headers, body) => {}, {headers: HEADERS, method: 'GET'});
};
///////////////
// Execution //
///////////////
log("==== STARTING SCRIPT ====");
const user = getUser(EVENT_DATA.page_location, EVENT_DATA);
const eventName = EVENT_DATA.event_name;
// if page_location contains _kx identify user and send Active On Site Metric
if (user.email || user.exchange_id){
log("_kx or email were found. Tracking an event");
const payload = buildPayload(EVENT_DATA, user);
sendTrackOrIdentifyRequest("track", payload);
} else {
log("No customer $exchange_id, $email, or $id found. Not sending Klaviyo any data...");
}
log("==== ENDING SCRIPT ====");
// Call data.gtmOnSuccess when the tag is finished.
data.gtmOnSuccess();
___SERVER_PERMISSIONS___
[
{
"instance": {
"key": {
"publicId": "logging",
"versionId": "1"
},
"param": [
{
"key": "environments",
"value": {
"type": 1,
"string": "debug"
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
},
{
"instance": {
"key": {
"publicId": "send_http",
"versionId": "1"
},
"param": [
{
"key": "allowedUrls",
"value": {
"type": 1,
"string": "any"
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
},
{
"instance": {
"key": {
"publicId": "access_response",
"versionId": "1"
},
"param": [
{
"key": "writeResponseAccess",
"value": {
"type": 1,
"string": "any"
}
},
{
"key": "writeHeaderAccess",
"value": {
"type": 1,
"string": "specific"
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
},
{
"instance": {
"key": {
"publicId": "read_event_data",
"versionId": "1"
},
"param": [
{
"key": "eventDataAccess",
"value": {
"type": 1,
"string": "any"
}
}
]
},
"clientAnnotations": {
"isEditedByUser": true
},
"isRequired": true
}
]
___TESTS___
scenarios: []
___NOTES___
Created on 11/30/2021, 11:48:09 AM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment