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
- GTM → Admin → Import Container.
- Choose
gtm-essentials-variables.jsonand select your workspace. - Pick Merge and Rename conflicting so nothing existing is overwritten.
- 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:
| Variable | Cookie | Platform |
|---|---|---|
1PC - _fbc | _fbc | Meta |
1PC - _fbp | _fbp | Meta |
1PC - fbclid | fbclid | Meta |
1PC - _gcl_aw | _gcl_aw | Google Ads |
1PC - _uetmsclkid | _uetmsclkid | Microsoft Ads |
1PC - _ttp | _ttp | TikTok |
1PC - _twclid | _twclid | Twitter / X |
1PC - li_fat_id | li_fat_id |
Session variables (Custom JS):
cJS - Traffic Source— last-touch traffic source (source).cJS - Ad Placement—utm_placement, persisted per session (source).
Event deduplication:
DLV - gtm.uniqueEventId— Data Layer Variable reading GTM's built-ingtm.uniqueEventIdkey (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 Title—document.title(source).cJS - Post Title— the page's.entry-title/h1, falling back toog:title(source).cJS - Post ID— the WordPress post/page ID from thepostid-…/page-id-…body class (source).cJS - Form ID— theidof 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
{
"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"
}
}