Untitled
unknown
plain_text
9 months ago
19 kB
8
Indexable
function storeUTMParameters() {
let validUTMParams = {};
// UTM Slug conditions
const slugConditions = [
{ slugs: ["/blog", "/product-updates", "/newsroom"], campaign: 'blog' },
{ slugs: ["/downloads", "/case-studies"], campaign: 'content' },
{
slugs: [
"/swift-code-checker",
"/ssic-code-checker",
"/spend-calculator",
"/spend-management-calculator",
"/idr-payroll-calculator",
"/launchpad",
"/investor-list-south-east-asia",
"/currency-converter"
],
campaign: 'tools'
},
{
slugs: [
"/zh-SG",
"/id",
"/id-ID",
"/hk",
"/zh-HK",
"/zh-Hans-HK",
"/business-account",
"/expense-management",
"/corporate-card",
"/global-payments",
"/aspire-ai",
"/integrations",
"/bill-pay",
"/api",
"/cashback",
"/pricing",
"/vendor-management",
"/global-collections",
"/approval-flows",
"/manajemen-biaya",
"/budgets",
"/multi-currency-account",
"/payable-management",
"/pembayaran-internasional",
"/cash-management",
"/receivable-management",
"/insights",
"/global-account",
"/payment-gateway",
"/employee-claims",
"/invoice-management",
"/instant-payouts",
"/payment-links",
"/rekening-bisnis",
"/kartu-pembayaran-korporat",
"/bulk-payments",
"/xero",
"/harga",
"/multi-user-access",
"/expense-policy",
"/payout-api",
"/spend-limits",
"/connect-api",
"/card-issuance-api"
],
campaign: 'product'
},
{ slugs: ["/rewards", ], campaign: 'rewards' }
];
const excludedCountries = ['SG', 'ID', 'HK', 'MY', 'CN', 'TH', 'PH', 'VN'];
// Select all links with the specified data attributes
// const targetElements = document.querySelectorAll('[is-set-utm-params="true"], [data-utm-params-in-url="true"], [is-get-all-params="true"], [data-cta-position="get-started-nav"], [data-cta-position="get-started-nav-mob"], [data-cta-position="get-started-stick-nav-mob"]');
const targetElements = document.querySelectorAll('[is-set-utm-params="true"]');
// Get UTM parameters from the URL
const utmSource = getUrlParameter('utm_source');
const utmTerm = getUrlParameter('utm_term');
// Constants for known search engines
const searchEngines = [
"google", "bing", "yahoo", "duckduckgo", "yandex",
"ecosia.org", "aol", "baidu", "msn", "so.com",
"naver", "qwant.com", "startsiden", "360.cn",
"seznam", "sogou", "centrum", "chatgpt",
"amazon", "amazonaws", "connect.stripe.com", "youtube.com",
"so","qwant","360","stripe","youtube"
];
// Constants for homepage slugs
const homepageSlugs = [
"/",
"/zh-SG",
"/id",
"/id-ID",
"/hk",
"/zh-HK",
"/zh-Hans-HK",
];
// Get the current pathname
const currentPath = window.location.pathname;
// Get the base referrer domain from the document
const referrerDomain = document.referrer ? new URL(document.referrer).hostname : '';
const baseReferrerDomain = referrerDomain
? referrerDomain.split('.').slice(-2, -1)[0].toLowerCase() // Get the second-to-last segment
: ''; // Fallback to an empty string if no referrer
console.log(baseReferrerDomain ? `Base Referrer Domain: ${baseReferrerDomain}` : 'No referrer domain found.');
// Function to retrieve a URL parameter by name
function getUrlParameter(name) {
const urlParams = new URLSearchParams(window.location.search);
const value = urlParams.get(name);
// console.log(`Retrieved URL parameter: ${name} = ${value}`);
return value;
}
// Function to retrieve the country code of the visitor
function getVisitorCountryCode() {
// Get the current pathname
const currentPath = window.location.pathname;
console.log("Current Path:", currentPath);
// Mapping of path conditions to corresponding GTM IDs
const gtmMapping = {
'/id': 'GTM-MH4PDH2',
'/id-ID': 'GTM-MH4PDH2',
'/hk': 'GTM-NW7C3NMD',
'/zh-HK': 'GTM-NW7C3NMD',
'/zh-Hans-HK': 'GTM-NW7C3NMD',
'/zh-SG': 'GTM-NNQBB6W', // Added condition for /zh-SG
};
// Default GTM ID
const gtmId = gtmMapping[Object.keys(gtmMapping).find(path => currentPath.includes(path))] || 'GTM-NNQBB6W';
// Attempt to get the country code using the determined GTM ID
const countryCode = google_tag_manager?.[gtmId]?.dataLayer?.get('visitorApiCountryCode') || 'PRIVATE';
console.log('Visitor Country Code:', countryCode);
return countryCode;
}
// Function to set UTM parameters in the URL of links
function setUTMParamsInUrl() {
// Always add country
// Retrieve the visitor country code
const visitorCountryCode = getVisitorCountryCode();
// Prepare a new object for valid UTM parameters
// Check if the visitor country code is part of the allowed countries
if (excludedCountries.includes(visitorCountryCode)) {
validUTMParams.country = visitorCountryCode; // Add country parameter if valid
// console.log(`Adding country parameter: country=${visitorCountryCode}`);
}
// Check if UTM aspireapp_params cookie is set; if true, use cookie values
if (isAspireAppParamsCookieSet()) {
console.log("Using aspireapp_params from cookies.");
// Populate validUTMParams from cookies
const cookieParams = getAspireAppParamsObject();
console.log("cookieParams:", cookieParams);
// Filter out empty or null UTM parameters from cookies
Object.entries(cookieParams).forEach(([key, value]) => {
if (value) { // Only include parameters that are not null or empty
validUTMParams[key] = value;
}
});
console.log("validUTMParams:", validUTMParams)
} else {
console.log("Using aspireapp_params from CURRENT URL.");
const currentUrlParams = getAllUrlParams();
// If no cookie is set, use the current validUTMParams (these are the params from current URL)
Object.entries(currentUrlParams).forEach(([key, value]) => {
if (value) { // Only include parameters that are not null or empty
validUTMParams[key] = value;
}
});
}
// Loop through each link and set the URL parameters
targetElements.forEach(element => {
if (element.tagName.toLowerCase() === 'a') {
// If it's a link, update the href attribute
const currentUrl = new URL(element.href);
const urlParams = new URLSearchParams(currentUrl.search);
// Update or add valid UTM parameters
Object.entries(validUTMParams).forEach(([key, value]) => {
if (value) { // Only update if the value is not null or empty
urlParams.set(key, value); // This will add or update the parameter
}
});
currentUrl.search = urlParams.toString(); // Set the updated search/query part
element.href = currentUrl.toString(); // Update the href attribute
console.log(`Updated link: ${element.href}`);
}
});
}
// Function to clear UTM cookies
function clearUTMCookies() {
// List of cookie names to clear
const cookieNames = ['aspireapp_params'];
// Loop through the cookie names and set their expiration date to the past
cookieNames.forEach(name => {
document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
});
}
// Function to retrieve parameters from the URL and save them to a cookie
function saveUrlParamsToCookie() {
const urlParams = new URLSearchParams(window.location.search);
let paramArray = [];
// Update or add valid UTM parameters
Object.entries(validUTMParams).forEach(([key, value]) => {
if (value) { // Only update if the value is not null or empty
paramArray.push(`${key}=${value}`);
}
});
const paramString = paramArray.join(','); // Use ',' as the delimiter
setMultipleParamsCookie(paramString); // Set the cookie with the parameter string
}
// Function to set a cookie with multiple parameters
function setMultipleParamsCookie(paramString) {
const expires = new Date(Date.now() + (30 * 24 * 60 * 60 * 1000)).toUTCString(); // 30 days expiration
document.cookie = `aspireapp_params=${paramString}; expires=${expires}; path=/`;
console.log(`Cookie set: aspireapp_params=${paramString}, expires in 30 days.`);
}
// Function to check if the aspireapp_params cookie is set
function isAspireAppParamsCookieSet() {
const cookieValue = document.cookie.split('; ').find(row => row.startsWith('aspireapp_params='));
if (cookieValue) {
console.log("aspireapp_params cookie is present.");
return true; // Cookie is set
}
console.log("aspireapp_params cookie not found.");
return false; // Cookie is not set
}
// Function to retrieve all URL parameters and save them as an object, excluding empty ones
function getAllUrlParams() {
const urlParams = new URLSearchParams(window.location.search);
const paramsObject = {};
urlParams.forEach((value, key) => {
if (value) { // Only add to the object if the value is not empty
paramsObject[key] = value;
}
});
console.log('Extracted Parameters Object:', paramsObject);
return paramsObject; // Return the populated object
}
// Function to get the value of aspireapp_params cookie and convert it to an object
function getAspireAppParamsObject() {
const cookieValue = document.cookie.split('; ').find(row => row.startsWith('aspireapp_params='));
if (!cookieValue) {
console.log("aspireapp_params cookie not found.");
return {}; // Return an empty object if the cookie is not set
}
// Remove the "aspireapp_params=" prefix
const paramsString = cookieValue.slice(cookieValue.indexOf('=') + 1); // Get the substring after '='
// Split the parameters string into individual key-value pairs
const paramsArray = paramsString.split(',');
// Create an object to hold the key-value pairs
const paramsObject = {};
// Populate the object with key-value pairs
paramsArray.forEach(param => {
const [key, value] = param.split('=');
if (key && value) {
paramsObject[key.trim()] = value.trim(); // Trim spaces and add to the object
}
});
console.log("Extracted Parameters Object:", paramsObject); // Logging the resultant object
return paramsObject; // Return the populated object
}
// Function to check if any parameters exist in the current URL
function hasUrlParameters() {
const urlParams = new URLSearchParams(window.location.search);
// Check if there are any parameters
const hasParams = Array.from(urlParams).length > 0;
// Logging the result
if (hasParams) {
console.log("URL has parameters:", urlParams.toString());
} else {
console.log("No URL parameters found.");
}
return hasParams; // Return true if parameters exist, false otherwise
}
// Function to check if the referrer domain is in the list of search engines
function isReferrerInSearchEngines(domain) {
const isKnownSearchEngine = searchEngines.includes(domain);
console.log(`Referrer domain "${domain}" is ${isKnownSearchEngine ? '' : 'not '}in the search engines list.`);
return isKnownSearchEngine; // Returns true if the referrer domain is a known search engine, false otherwise
}
function applyConditionsOnParams(){
console.log("Scenario: User came from organic search");
// Set UTM term based on specific rules
if (homepageSlugs.includes(currentPath)) {
validUTMParams.utm_term = "homepage"; // Set UTM term to "homepage" if current path matches any in the array
console.log('Setting UTM Term to "homepage" since URL matches a specified slug.');
} else {
//if utm_term is not present in the URL
// Proceed to get the last slug for UTM term if it does not match the specified slugs
if(!utmTerm){
validUTMParams.utm_term = currentPath.split('/').pop(); // Get the last slug segment
}
}
console.log("Checking for campaign conditions based on current URL path:", currentPath);
/// Define an array of prefixes to check
const prefixSlugs = ["/zh-SG", "/id", "/id-ID", "/hk", "/zh-HK", "/zh-Hans-HK"];
// Determine if currentPath matches any prefix and set effectivePath
const isPrefixMatch = prefixSlugs.some(prefix => currentPath.startsWith(prefix));
const effectivePath = isPrefixMatch
? currentPath.replace(new RegExp(`^(${prefixSlugs.join('|')})`), '')
: currentPath;
// Check if the last segment matches any of the prefixes
const lastSegmentMatchesPrefix = prefixSlugs.some(prefix => currentPath.endsWith(prefix));
if (lastSegmentMatchesPrefix) {
validUTMParams.utm_campaign = 'product';
console.log(`Setting UTM campaign to: product (last segment matched a prefix)`);
} else {
// Check for matching campaign conditions
const matchedCondition = slugConditions.find(condition =>
condition.slugs.some(slug => effectivePath.includes(slug))
);
validUTMParams.utm_campaign = matchedCondition ? matchedCondition.campaign : 'others';
console.log(`Setting UTM campaign to: ${validUTMParams.utm_campaign}`);
}
if (isReferrerInSearchEngines(baseReferrerDomain)) {
validUTMParams.utm_source = baseReferrerDomain;
validUTMParams.utm_medium = 'organic';
} else {
validUTMParams.utm_source = 'direct';
}
}
if((!hasUrlParameters() && !isAspireAppParamsCookieSet() && !isReferrerInSearchEngines(baseReferrerDomain))){
// any parameter: 0
// baseReferrerDomain in list: 0
// cookies set: 0
// utm_source = 1 || 0
console.log("Scenario 1: User directly type url in browser")
setUTMParamsInUrl();
saveUrlParamsToCookie();
return
}
if(!hasUrlParameters()){
if((isReferrerInSearchEngines(baseReferrerDomain))){
console.log("Scenario 2: User came from VALID Searchengine with NO Params")
// any parameter: 0
// cookies set: 0
// baseReferrerDomain in list: 1
// utm_source = 1 || 0
applyConditionsOnParams();
setUTMParamsInUrl(); // Directly call the function to set UTM parameters in all applicable elements
saveUrlParamsToCookie();
return; // Exit early
}else if((!isReferrerInSearchEngines(baseReferrerDomain))){
if(isAspireAppParamsCookieSet()){
console.log("Scenario 3: User is navigating the site after 1st land")
// any parameter: 0
// cookies set: 1
// baseReferrerDomain in list: 1 || 0
// utm_source = 1 || 0
setUTMParamsInUrl(); // Directly call the function to set UTM parameters in all applicable elements
return; // Exit early
}else{
console.log("Scenario 4: User visit the site directly WITHOUT any parameters")
// any parameter: 0 Note: no need to save to cookies
// cookies set: 1
// baseReferrerDomain in list: 1 || 0
// utm_source = 1 || 0
setUTMParamsInUrl(); // Directly call the function to set UTM parameters in all applicable elements
saveUrlParamsToCookie();
return; // Exit early
}
}
}
if (hasUrlParameters()) {
if (!isReferrerInSearchEngines(baseReferrerDomain)){
console.log("Scenario 5: User came with any parameters and baseReferrerDomain NOT in the list. So use URL Params WITHOUT params conditions.")
// any parameter: 1
// baseReferrerDomain in list: 0
// cookies set: 1 || 0 (if any parameter is present, need to clear cookies)
// utm_source = 1 || 0
}else if (isReferrerInSearchEngines(baseReferrerDomain)){
if(!utmSource){
console.log("Scenario 6: User came with any parameters and baseReferrerDomain is IN the list. So use URL Params WITH params conditions.")
// any parameter: 1
// baseReferrerDomain in list: 1 (apply parameter conditions)
// cookies set: 1 || 0 (if any parameter is present, need to clear cookies)
// utm_source: 0
applyConditionsOnParams();
}
}
clearUTMCookies();
setUTMParamsInUrl();
saveUrlParamsToCookie();
return
}
}
// Call the function on page load to execute UTM parameter handling
setTimeout(function(){
// added 1.5 sec delay because sometimes google_tag_manager take some time to load.
storeUTMParameters();
},0)Editor is loading...
Leave a Comment