Created
November 30, 2021 16:49
-
-
Save cbarley10/f1335a260ed30b09c63e7223f18202df to your computer and use it in GitHub Desktop.
Serverside Container for Klaviyo Medium Blog Article
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
___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