Sign in

GTM Essentials – Variables Container Export

GTM Essentials – Variables Container Export

GTM Container Export (JSON) Last updated: August 2026


Overview

gtm-essentials-variables.json is a Google Tag Manager container export that creates every GTM Essentials variable in one import — 24 variables, filed under a GTM Essentials folder, plus GTM's standard built-in variables switched on. Use it instead of building the variables one by one from the sibling folders.

The individual Custom JavaScript sources it bundles each live in their own folder under variables/ with full documentation; this export is just the fastest way to get all of them into a container at once.


How to Import

  1. GTM → Admin → Import Container.
  2. Choose gtm-essentials-variables.json and select your workspace.
  3. Pick Merge and Rename conflicting so nothing existing is overwritten.
  4. Preview, then Confirm.

Placeholder account/container IDs (0) are remapped into whatever container you import into, so the file works in any account.


What It Creates

First-party cookie readers (1st-Party Cookie variables) — one 1PC - <cookie> per platform click-ID cookie:

VariableCookiePlatform
1PC - _fbc_fbcMeta
1PC - _fbp_fbpMeta
1PC - fbclidfbclidMeta
1PC - _gcl_aw_gcl_awGoogle Ads
1PC - _uetmsclkid_uetmsclkidMicrosoft Ads
1PC - _ttp_ttpTikTok
1PC - _twclid_twclidTwitter / X
1PC - li_fat_idli_fat_idLinkedIn

Session variables (Custom JS):

  • cJS - Traffic Source — last-touch traffic source (source).
  • cJS - Ad Placementutm_placement, persisted per session (source).

Event deduplication:

  • DLV - gtm.uniqueEventId — Data Layer Variable reading GTM's built-in gtm.uniqueEventId key (page-local event counter); feeds the variable below.
  • cJS - Custom Event ID — globally unique event ID for Meta Pixel / CAPI deduplication, cached per {{DLV - gtm.uniqueEventId}} (source).

Page / post / form context (Custom JS):

  • cJS - Page Titledocument.title (source).
  • cJS - Post Title — the page's .entry-title / h1, falling back to og:title (source).
  • cJS - Post ID — the WordPress post/page ID from the postid-… / page-id-… body class (source).
  • cJS - Form ID — the id of the first <form> on the page (source).

Built-in variables enabled — Click Classes / Element / ID / Target / Text / URL, Event, Form Classes / Element / ID / Target / Text / URL, HTML ID, Page Hostname / Path / URL, and Referrer.

Analytics Client ID is intentionally left out — it has no stable container-export type, so enable it by hand in Configure if you need it (one checkbox).


Keeping It in Sync

This export and the gtm-starter-kit/ bundle both carry copies of the variables in this directory. If you add, rename, or change a variable source under variables/, re-export this file and update the Starter Kit too — otherwise the bundled copies drift from the documented sources.

The code

gtm-essentials-variables.json
json
{
  "exportFormatVersion": 2,
  "exportTime": "2026-08-04 00:00:00",
  "containerVersion": {
    "path": "accounts/0/containers/0/versions/0",
    "accountId": "0",
    "containerId": "0",
    "containerVersionId": "0",
    "name": "GTM Essentials",
    "container": {
      "path": "accounts/0/containers/0",
      "accountId": "0",
      "containerId": "0",
      "name": "GTM Essentials",
      "publicId": "GTM-XXXXXXX",
      "usageContext": [
        "WEB"
      ],
      "fingerprint": "0",
      "tagManagerUrl": ""
    },
    "builtInVariable": [
      {
        "accountId": "0",
        "containerId": "0",
        "type": "CLICK_CLASSES",
        "name": "Click Classes"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "CLICK_ELEMENT",
        "name": "Click Element"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "CLICK_ID",
        "name": "Click ID"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "CLICK_TARGET",
        "name": "Click Target"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "CLICK_TEXT",
        "name": "Click Text"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "CLICK_URL",
        "name": "Click URL"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "EVENT",
        "name": "Event"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "FORM_CLASSES",
        "name": "Form Classes"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "FORM_ELEMENT",
        "name": "Form Element"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "FORM_ID",
        "name": "Form ID"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "FORM_TARGET",
        "name": "Form Target"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "FORM_TEXT",
        "name": "Form Text"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "FORM_URL",
        "name": "Form URL"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "HTML_ID",
        "name": "HTML ID"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "PAGE_HOSTNAME",
        "name": "Page Hostname"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "PAGE_PATH",
        "name": "Page Path"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "PAGE_URL",
        "name": "Page URL"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "type": "REFERRER",
        "name": "Referrer"
      }
    ],
    "folder": [
      {
        "accountId": "0",
        "containerId": "0",
        "folderId": "1",
        "name": "GTM Essentials",
        "fingerprint": "0"
      }
    ],
    "variable": [
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "1",
        "name": "1PC - _fbc",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "_fbc"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "2",
        "name": "1PC - _fbp",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "_fbp"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "3",
        "name": "1PC - fbclid",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "fbclid"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "4",
        "name": "1PC - _gcl_aw",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "_gcl_aw"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "5",
        "name": "1PC - _uetmsclkid",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "_uetmsclkid"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "6",
        "name": "1PC - _ttp",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "_ttp"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "7",
        "name": "1PC - _twclid",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "_twclid"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "8",
        "name": "1PC - li_fat_id",
        "type": "k",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "li_fat_id"
          },
          {
            "type": "BOOLEAN",
            "key": "decodeCookie",
            "value": "true"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "17",
        "name": "cJS - Traffic Source",
        "type": "jsm",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "javascript",
            "value": "function() {\n  // Last-touch traffic source for both lead gen and ecommerce conversions\n  // Uses sessionStorage to persist source through multi-page funnels (checkout flows, popup forms on internal pages)\n  // Distinguishes paid Facebook from organic via UTM convention since fbclid alone is unreliable\n  \n  var urlParams = new URLSearchParams(window.location.search);\n  var referrer = document.referrer.toLowerCase();\n  \n  // Helper to safely read from sessionStorage with fallback for private browsing/blocked storage\n  function getStored(key) {\n    try { return sessionStorage.getItem(key) || ''; } catch(e) { return ''; }\n  }\n  \n  // Helper to safely write to sessionStorage\n  function setStored(key, value) {\n    try { sessionStorage.setItem(key, value); } catch(e) {}\n  }\n  \n  // STEP 1: Capture any fresh signals from current URL into sessionStorage\n  // This ensures last-touch works correctly when a user re-enters the site with a new click ID\n  \n  // Click ID capture - each platform's unique click identifier\n  if (urlParams.get('gclid')) setStored('gclid', urlParams.get('gclid'));\n  if (urlParams.get('msclkid')) setStored('msclkid', urlParams.get('msclkid'));\n  if (urlParams.get('fbclid')) setStored('fbclid', urlParams.get('fbclid'));\n  if (urlParams.get('ttclid')) setStored('ttclid', urlParams.get('ttclid'));\n  \n  // UTM capture - source and medium together let us distinguish paid social from organic social\n  if (urlParams.get('utm_source')) setStored('utm_source', urlParams.get('utm_source').toLowerCase());\n  if (urlParams.get('utm_medium')) setStored('utm_medium', urlParams.get('utm_medium').toLowerCase());\n  \n  // Capture the original referrer on first pageview so organic detection works on deep funnel pages\n  // Only set this once per session - if storage already has it, this is not the landing page\n  if (!getStored('original_referrer') && referrer && referrer.indexOf(window.location.hostname) === -1) {\n    setStored('original_referrer', referrer);\n  }\n  \n  // STEP 2: Resolve traffic source using all available signals (URL + stored)\n  \n  var utmSource = urlParams.get('utm_source') ? urlParams.get('utm_source').toLowerCase() : getStored('utm_source');\n  var utmMedium = urlParams.get('utm_medium') ? urlParams.get('utm_medium').toLowerCase() : getStored('utm_medium');\n  \n  // Paid social detection - requires explicit UTM tagging since fbclid alone catches organic posts too\n  // Convention: utm_medium=paid_social with utm_source identifying the platform\n  if (utmMedium === 'paid_social') {\n    if (utmSource === 'facebook') return 'facebook_ads';\n    if (utmSource === 'instagram') return 'instagram_ads';\n    if (utmSource === 'linkedin') return 'linkedin_ads';\n    if (utmSource === 'tiktok') return 'tiktok_ads';\n    // Fallback for any other paid social platform we haven't bucketed\n    return utmSource + '_ads';\n  }\n  \n  // Google Ads - check URL gclid, then stored gclid, then _gcl_aw cookie set by gtag auto-tagging\n  if (urlParams.get('gclid') || getStored('gclid')) return 'google_ads';\n  if (document.cookie.indexOf('_gcl_aw=') > -1) return 'google_ads';\n  \n  // Microsoft Ads - msclkid is reliable on its own\n  if (urlParams.get('msclkid') || getStored('msclkid')) return 'microsoft_ads';\n  \n  // TikTok Ads - ttclid is reliable on its own (TikTok organic posts don't append it)\n  if (urlParams.get('ttclid') || getStored('ttclid')) return 'tiktok_ads';\n  \n  // Generic UTM source fallback - catches email, partnerships, custom campaigns\n  // Combines source and medium for clarity (e.g. email_newsletter, partner_referral)\n  if (utmSource) {\n    return utmMedium ? utmSource + '_' + utmMedium : utmSource;\n  }\n  \n  // Facebook organic - fbclid present without paid_social UTM means it came from an organic post\n  if (urlParams.get('fbclid') || getStored('fbclid')) return 'facebook_organic';\n  \n  // STEP 3: Organic referrer detection - use original referrer from session storage if available\n  // This makes organic attribution survive multi-page funnels where document.referrer becomes self-referential\n  var sourceReferrer = getStored('original_referrer') || referrer;\n  \n  if (sourceReferrer.indexOf('google.') > -1) return 'google_organic';\n  if (sourceReferrer.indexOf('bing.') > -1) return 'bing_organic';\n  if (sourceReferrer.indexOf('yahoo.') > -1) return 'yahoo_organic';\n  if (sourceReferrer.indexOf('duckduckgo.') > -1) return 'duckduckgo_organic';\n  if (sourceReferrer.indexOf('facebook.') > -1 || sourceReferrer.indexOf('fb.') > -1) return 'facebook_organic';\n  if (sourceReferrer.indexOf('instagram.') > -1) return 'instagram_organic';\n  if (sourceReferrer.indexOf('linkedin.') > -1) return 'linkedin_organic';\n  if (sourceReferrer.indexOf('twitter.') > -1 || sourceReferrer.indexOf('x.com') > -1) return 'twitter_organic';\n  if (sourceReferrer.indexOf('youtube.') > -1) return 'youtube_organic';\n  if (sourceReferrer.indexOf('reddit.') > -1) return 'reddit_organic';\n  if (sourceReferrer.indexOf('pinterest.') > -1) return 'pinterest_organic';\n  if (sourceReferrer.indexOf('tiktok.') > -1) return 'tiktok_organic';\n  \n  // No referrer at all = direct (typed URL, bookmark, app, dark social, email client)\n  if (!sourceReferrer) return 'direct';\n  \n  // Same-domain referrer with no other signals = direct (internal navigation from unknown origin)\n  if (sourceReferrer.indexOf(window.location.hostname) > -1) return 'direct';\n  \n  // External referring site we don't have a specific bucket for\n  return 'referral';\n}"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "18",
        "name": "cJS - Ad Placement",
        "type": "jsm",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "javascript",
            "value": "function() {\n  // Captures utm_placement from URL on first pageview, persists via sessionStorage.\n  // Handles both Meta placements (e.g. \"Audience_Network_Native\", \"Facebook_Mobile_Feed\")\n  // and Google Ads placements (e.g. \"g_1t1\" for top-of-page search, \"gmb_\" for Business Profile,\n  // \"d_\" for Display Network). The variable doesn't care which platform set the value —\n  // utm_source already tells you that. This just captures whatever placement was passed.\n  \n  var STORAGE_KEY = 'ad_placement';\n  \n  try {\n    // First, check if utm_placement is in the current URL.\n    // If yes, this is the freshest signal — overwrite anything stored.\n    var urlParams = new URLSearchParams(window.location.search);\n    var placementFromUrl = urlParams.get('utm_placement');\n    \n    if (placementFromUrl) {\n      try { sessionStorage.setItem(STORAGE_KEY, placementFromUrl); } catch(e) {}\n      return placementFromUrl;\n    }\n    \n    // No utm_placement in current URL — fall back to whatever we stored\n    // earlier in this session (e.g. from the original landing page).\n    try {\n      var stored = sessionStorage.getItem(STORAGE_KEY);\n      if (stored) return stored;\n    } catch(e) {}\n    \n    // No URL value, no stored value — return undefined.\n    // GA4 will simply omit the parameter rather than send an empty string.\n    return undefined;\n    \n  } catch (e) {\n    // URLSearchParams unavailable (very old browsers) or other failure\n    return undefined;\n  }\n}"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "19",
        "name": "cJS - Page Title",
        "type": "jsm",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "javascript",
            "value": "function() {\n  return document.title;\n}"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "20",
        "name": "cJS - Post Title",
        "type": "jsm",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "javascript",
            "value": "function() {\n  var el = document.querySelector('.entry-title, h1.entry-title, h1');\n  if (el && el.textContent) return el.textContent.trim();\n  var og = document.querySelector('meta[property=\"og:title\"]');\n  return og ? og.getAttribute('content') : undefined;\n}"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "21",
        "name": "cJS - Post ID",
        "type": "jsm",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "javascript",
            "value": "function() {\n  var m = (document.body.className || '').match(/(?:postid|page-id)-(\\d+)/);\n  return m ? m[1] : undefined;\n}"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "22",
        "name": "cJS - Form ID",
        "type": "jsm",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "javascript",
            "value": "function() {\n  var f = document.querySelector('form[id]');\n  return f ? f.id : undefined;\n}"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "23",
        "name": "DLV - gtm.uniqueEventId",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "gtm.uniqueEventId"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      },
      {
        "accountId": "0",
        "containerId": "0",
        "variableId": "24",
        "name": "cJS - Custom Event ID",
        "type": "jsm",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "javascript",
            "value": "function() {\n  var id = {{DLV - gtm.uniqueEventId}}; // Page-local counter — the cache key\n\n  if (window.customEventIdKey !== id) {\n    window.customEventIdKey = id;\n    // Globally unique value — this is what actually goes to Meta\n    window.customEventId = (new Date()).getTime() + '.' +\n      Math.random().toString(36).substring(2, 10);\n  }\n\n  return window.customEventId;\n}"
          }
        ],
        "fingerprint": "0",
        "parentFolderId": "1"
      }
    ],
    "fingerprint": "0"
  }
}