thankyou-gtms-tag / tagco / client.js
client.js
Raw
// General data needed, custom per client
var data = {
  cookie_name_ead: "ty_ead",
  cookie_name_session: "ty_session",
  cookie_name_do_not_track: "ty_dnt",
  session_expiration_in_minutes: 43200, //30 Days
  campaign_expiration_in_minutes: 43200, // 30 Days
  cookie_domain: "gemo.fr",
  blacklist_domains:
    "gtm-msr.appspot.com,tagassistant.google.com,wlp-acs.com,paypal.com,americanexpress.com,lcl.fr,cic.fr,ing.com,monext.fr,rsa3dsauth.co.uk,touch.tech,n26.com,arcot.com,mycardplace.com,cm-cic.com,systempay.fr,oney.com,be2bill.com,cardinalcommerce.com,v-psp.com,vadesecure.com,ogone.com,creditmutuel.fr,worldline-solutions.com,verifiedbyvisa.com,cofidis.fr,paybox.com,getalma.eu,systempay.fr,payex.com,sogenactif.com,procurementexpress.com,revolut.com,marqeta.com,six-group.com,app.glady.com,notifpush.com,app2.abtasty.com,acs.monobank.com.ua,acs.rietumu.lv,3dsec.postfinance.ch,sas.redsys.es,secure5gw.ro,3dspayment.paylife.at,bankenauswahl.giropay.de,secure.barclaycard.co.uk,evgr-securepay.hsbc.com.vn,3d-secure.pluscard.de,visa-secure.ing.de,secureshopping.westpac.com.au,pca3ds.gbp.ma,3debspay.boc.cn,3dsp.vtb.ru,secure.dkb.de,securesuite.net,sofort.com,abnamro.nl,3ds.bov.com,acs.privatbank.ua,acs.sia.eu,acs2.3ds.modirum.com,ideal.knab.nl,touch.kaspersky.com,giropay.bw-bank.de,rabobank.nl,giropay.sparkasse-bgl.de,giropay.postbank.de,palaisdesthes-gift-fr-sandbox-buybox.net",
  whitelist_domains: "gemo.fr",
};

// Start bundle code
var COOKIE_NAME_EAD = data.cookie_name_ead;
var CAMPAIGN_EXPIRATION_IN_MINUTES = +(data.campaign_expiration_in_minutes || 43200);
var BLACKLIST_DOMAINS = data.blacklist_domains;
var COOKIE_NAME_SESSION = data.cookie_name_session;
var COOKIE_NAME_DO_NOT_TRACK = data.cookie_name_do_not_track;

var doNotTrack = getDoNotTrack();
var hasSessionCookie = !doNotTrack ? getSession() : false;
var ead = getEad();
var isNewVisitGa = calculateNewVisitGa();

var pageReferrer = document.referrer; // Can edit that for testing

if (!doNotTrack) {
  ead = updateEadCookie();
}

function isUrlInDomainsList(url) {
  var referrerObject = new URL(url);
  var foundInDomainsList = false;

  if (parseDomains(data.whitelist_domains)) {
    for (var index = 0; index < parseDomains(data.whitelist_domains).length; index++) {
      if (
        parseDomains(data.whitelist_domains)[index].domain.replace("www.", "") ===
        referrerObject.host.replace("www.", "")
      ) {
        foundInDomainsList = true;
        break;
      }
    }
  }

  return foundInDomainsList;
}

function referrerNotExcludedFromGA() {
  if (!BLACKLIST_DOMAINS) {
    return true;
  }

  var referralUrl = pageReferrer ? new URL(pageReferrer) : null;

  if (!referralUrl || !referralUrl.hostname) {
    return true;
  }

  var referrerNotExcludedFromGACondition = true;
  for (var index = 0; index < parseDomains(BLACKLIST_DOMAINS).length; index++) {
    if (
      referralUrl.host.replace("www.", "") ===
      parseDomains(BLACKLIST_DOMAINS)[index].domain.replace("www.", "")
    ) {
      referrerNotExcludedFromGACondition = false;
      break;
    }
  }
  return referrerNotExcludedFromGACondition;
}

function isDirectAccess() {
  var referralUrl = pageReferrer ? new URL(pageReferrer) : null;
  var targetUrl = window.location.href ? new URL(window.location.href) : null;

  return (
    (!referralUrl || (referralUrl && isUrlInDomainsList(pageReferrer))) &&
    (!targetUrl ||
      (!targetUrl.searchParams.utm_source &&
        !targetUrl.searchParams.utm_campaign &&
        !targetUrl.searchParams.utm_keyword &&
        !targetUrl.searchParams.utm_content &&
        !targetUrl.searchParams.utm_medium &&
        !targetUrl.searchParams.at_platform &&
        !targetUrl.searchParams.at_channel &&
        !targetUrl.searchParams.at_medium &&
        !targetUrl.searchParams.at_campaign &&
        !targetUrl.searchParams.at_creation &&
        !targetUrl.searchParams.at_network &&
        !targetUrl.searchParams.at_aff_type &&
        !targetUrl.searchParams.at_variant &&
        !targetUrl.searchParams.at_source &&
        !targetUrl.searchParams.gclid &&
        !targetUrl.searchParams.fbclid &&
        !targetUrl.searchParams.msclkid))
  );
}

function calculateNewVisitGa() {
  if (
    !ead ||
    !hasSessionCookie ||
    checkSameReferrerToOrganic(ead.target, ead.referrer) ||
    checkNewReferrer(ead.referrer) ||
    checkNewUtmParameters(ead.target) ||
    checkNewClickIdentifierParameters(ead.target)
  ) {
    return true;
  }
  return false;
}

function checkNewReferrer(referrer) {
  var referralUrl = pageReferrer ? new URL(pageReferrer) : null;
  var targetUrl = window.location.href ? new URL(window.location.href) : null;
  var lastTouchpointReferrer = referrer ? new URL(referrer) : null;

  if (
    referralUrl &&
    !isUrlInDomainsList(pageReferrer) &&
    targetUrl.hostname !== referralUrl.hostname &&
    (!lastTouchpointReferrer || lastTouchpointReferrer.hostname !== referralUrl.hostname)
  ) {
    return true;
  }

  return false;
}

function checkSameReferrerToOrganic(target, referrer) {
  var referralUrl = pageReferrer ? new URL(pageReferrer) : null;
  var targetUrl = window.location.href ? new URL(window.location.href) : null;
  var lastTouchpointReferrer = referrer ? new URL(referrer) : null;
  var lastTouchpointTarget = target ? new URL(target) : null;

  if (
    referralUrl &&
    targetUrl &&
    lastTouchpointReferrer &&
    lastTouchpointTarget &&
    lastTouchpointReferrer.hostname === referralUrl.hostname &&
    !isUrlInDomainsList(pageReferrer) &&
    !isUrlInDomainsList(referrer) &&
    (lastTouchpointTarget.searchParams.utm_source ||
      lastTouchpointTarget.searchParams.utm_campaign ||
      lastTouchpointTarget.searchParams.utm_term ||
      lastTouchpointTarget.searchParams.utm_content ||
      lastTouchpointTarget.searchParams.utm_medium ||
      lastTouchpointTarget.searchParams.at_platform ||
      lastTouchpointTarget.searchParams.at_channel ||
      lastTouchpointTarget.searchParams.at_medium ||
      lastTouchpointTarget.searchParams.at_campaign ||
      lastTouchpointTarget.searchParams.at_creation ||
      lastTouchpointTarget.searchParams.at_network ||
      lastTouchpointTarget.searchParams.at_aff_type ||
      lastTouchpointTarget.searchParams.at_variant ||
      lastTouchpointTarget.searchParams.at_source ||
      lastTouchpointTarget.searchParams.gclid ||
      lastTouchpointTarget.searchParams.fbclid ||
      lastTouchpointTarget.searchParams.msclkid) &&
    !targetUrl.searchParams.utm_source &&
    !targetUrl.searchParams.utm_campaign &&
    !targetUrl.searchParams.utm_term &&
    !targetUrl.searchParams.utm_content &&
    !targetUrl.searchParams.utm_medium &&
    !targetUrl.searchParams.at_platform &&
    !targetUrl.searchParams.at_channel &&
    !targetUrl.searchParams.at_medium &&
    !targetUrl.searchParams.at_campaign &&
    !targetUrl.searchParams.at_creation &&
    !targetUrl.searchParams.at_network &&
    !targetUrl.searchParams.at_aff_type &&
    !targetUrl.searchParams.at_variant &&
    !targetUrl.searchParams.at_source &&
    !targetUrl.searchParams.gclid &&
    !targetUrl.searchParams.fbclid &&
    !targetUrl.searchParams.msclkid
  ) {
    return true;
  }

  return false;
}

function checkNewUtmParameters(target) {
  var lastTouchpointTarget = target ? new URL(target) : null;
  var targetUrl = window.location.href ? new URL(window.location.href) : null;

  if (
    targetUrl &&
    lastTouchpointTarget &&
    (["source", "campaign", "term", "content", "medium"].some((utm) => {
      var currentUrlParam = targetUrl.searchParams["utm_" + utm];
      var lastTouchPointParam = lastTouchpointTarget.searchParams["utm_" + utm];
      return currentUrlParam && currentUrlParam !== lastTouchPointParam;
    }) ||
      [
        "platform",
        "channel",
        "medium",
        "campaign",
        "creation",
        "network",
        "aff_type",
        "variant",
        "source",
      ].some((at) => {
        var currentUrlParam = targetUrl.searchParams["at_" + at];
        var lastTouchPointParam = lastTouchpointTarget.searchParams["at_" + at];
        return currentUrlParam && currentUrlParam !== lastTouchPointParam;
      }))
  ) {
    return true;
  }

  return false;
}

function checkNewClickIdentifierParameters(target) {
  var lastTouchpointTarget = target ? new URL(target) : null;
  var targetUrl = window.location.href ? new URL(window.location.href) : null;

  if (
    targetUrl &&
    lastTouchpointTarget &&
    ["gclid", "fbclid", "msclkid"].some((tagId) => {
      var currentUrlParam = targetUrl.searchParams[tagId];
      var lastTouchPointParam = lastTouchpointTarget.searchParams[tagId];
      return currentUrlParam && currentUrlParam !== lastTouchPointParam;
    })
  ) {
    return true;
  }

  return false;
}

function getEad() {
  var ead = tC.getCookie(COOKIE_NAME_EAD) || undefined;

  if (ead) {
    ead = JSON.parse(window.atob(ead));
  }

  return ead;
}

function updateEadCookie() {
  var newEad = {
    currentCampaign: ead && ead.currentCampaign ? ead.currentCampaign : null,
  };

  if (!ead || isNewVisitGa) {
    newEad.referrer = pageReferrer;
    newEad.target = window.location.href;
  } else {
    newEad.referrer = ead.referrer;
    newEad.target = ead.target;
  }

  if (
    !ead ||
    !ead.currentCampaign ||
    !ead.currentCampaign.target ||
    !ead.currentCampaign.date ||
    (!isDirectAccess() &&
      referrerNotExcludedFromGA() &&
      (checkSameReferrerToOrganic(ead.currentCampaign.target, ead.currentCampaign.referrer) ||
        checkNewReferrer(ead.currentCampaign.referrer) ||
        checkNewUtmParameters(ead.currentCampaign.target) ||
        checkNewClickIdentifierParameters(ead.currentCampaign.target))) ||
    (isDirectAccess() && checkDelay(ead.currentCampaign.date, CAMPAIGN_EXPIRATION_IN_MINUTES))
  ) {
    newEad.currentCampaign = {
      date: Date.now(),
      referrer: pageReferrer || null,
      target: window.location.href,
    };
  }

  tC.setCookie(
    COOKIE_NAME_EAD,
    window.btoa(JSON.stringify(newEad)),
    180,
    "/",
    data.cookie_domain,
    true,
    "None"
  );

  return newEad;
}

function checkDelay(timestampInMillis, periodInMinutes) {
  var differentInMinutes = Math.abs(Math.round((Date.now() - timestampInMillis) / 60000));

  if (differentInMinutes > periodInMinutes) {
    return true;
  }

  return false;
}

function getSession() {
  var session = tC.getCookie(COOKIE_NAME_SESSION) || undefined;

  tC.setCookie(
    COOKIE_NAME_SESSION,
    "true",
    +(data.session_expiration_in_minutes || 43200) / 24 / 60,
    "/",
    data.cookie_domain,
    true,
    "None"
  );

  if (!session) {
    return false;
  }

  return true;
}

function getDoNotTrack() {
  var dnt = tC.getCookie(COOKIE_NAME_DO_NOT_TRACK) || undefined;

  if (dnt) {
    tC.setCookie(COOKIE_NAME_SESSION, "true", 182, "/", data.cookie_domain, true, "None");
    return true;
  }

  return false;
}

// No table object atm in TagCo, so replace table inputs with simple text fields that looks like "domain1,domain2"
function parseDomains(domains) {
  return domains ? domains.split(",").map((domain) => ({ domain })) : [];
}