// List of UTM parameters names
var utmParametersNames = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term', 'utm_referrer'];
// Function extracts UTM parameters from window.location.search
// Returns array of URI-encoded parameters, can be replaced
function getUtmParameters() {
window.location.search.slice(1).split('&').forEach(function(parameter) {
var parameterParts = parameter.split('=');
var parameterName = parameterParts[0];
if (utmParametersNames.indexOf(parameterName) !== -1) {
utmParameters.push(parameter);
// Function adds UTM-parameters to all links lead to domain go.hightouch.ai
var utmParameters = getUtmParameters();
if (!utmParameters.length) {
var links = document.querySelectorAll('a');
var processLink = function(link) {
if (typeof link.hostname !== 'undefined') {
hostname = link.hostname;
var hostnameMatch = link.href.match(/^https?\:\/\/([^:\/?#]*)/);
hostname = hostnameMatch && hostnameMatch[1];
if (hostname === 'go.hightouch.ai') {
var hrefParts = link.href.split('?');
var processedHref = hrefParts[0];
if (hrefParts.length > 1) {
var oldParameters = hrefParts[1].split('&');
var newParametersString = utmParameters.join('&');
oldParameters.forEach(function(parameter) {
var parameterParts = parameter.split('=');
var parameterName = parameterParts[0];
if (utmParametersNames.indexOf(parameterName) === -1) {
newParametersString += '&' + parameter;
processedHref += '?' + newParametersString;
processedHref += '?' + utmParameters.join('&');
link.href = processedHref;
links.forEach(processLink);
// Run addUTM only when document is ready.
// You can replace code below using jQuery.ready(addUTM) or something similar.
function documentReady() {
document.removeEventListener('DOMContentLoaded', documentReady);
window.removeEventListener('load', documentReady);
if (document.readyState === 'complete'
|| (document.readyState !== 'loading' && !document.documentElement.doScroll)) {
document.addEventListener('DOMContentLoaded', documentReady);
window.addEventListener('load', documentReady);