{"id":"4d9d4395-e4a0-43dc-ad1e-ea69ad709292","shortId":"7uCLEF","kind":"skill","title":"gtm-setup","tagline":"GTM Event Tracking & Setup Reference — dataLayer fundamentals, trigger types, variable types, GA4 tag configuration, debug mode, and best practices","description":"# GTM Event Tracking & Setup Reference\n\nComplete reference guide to Google Tag Manager event tracking, including dataLayer fundamentals, trigger and variable types, GA4 tag configuration, debug mode, and implementation best practices.\n\nFull docs: https://cogny.com/docs/gtm-event-tracking\n\n## Usage\n\n```\n/gtm-setup                              # Full GTM reference overview\n/gtm-setup dataLayer                    # dataLayer fundamentals and syntax\n/gtm-setup purchase                     # Show purchase event dataLayer.push()\n/gtm-setup triggers                     # All trigger types explained\n/gtm-setup variables                    # All variable types explained\n/gtm-setup tags                         # GA4 tag configuration\n/gtm-setup debug                        # Debug mode and troubleshooting\n/gtm-setup best practices               # Naming conventions, organization\n/gtm-setup common mistakes              # Race conditions, missing data, duplicates\n```\n\n## Instructions\n\nYou are a Google Tag Manager expert. Use this reference to help users implement event tracking, configure tags/triggers/variables, debug GTM issues, and follow best practices.\n\nWhen the user asks a question, find the relevant section below and provide precise, actionable answers with ready-to-use code snippets.\n\nIf the user provides a specific topic as an argument, focus on that area. Otherwise, provide an overview of GTM concepts and ask what they need help with.\n\nIf Cogny GTM MCP tools are available, use them to inspect the user's actual GTM container, list their tags/triggers/variables, and provide recommendations based on their real configuration.\n\n---\n\n## dataLayer Fundamentals\n\n### What Is the dataLayer?\n\nThe `dataLayer` is a JavaScript array that acts as a message bus between your website and GTM. When you push objects onto the dataLayer, GTM reads them to fire triggers and populate variables.\n\n### Initialization\n\nDeclare the dataLayer before the GTM snippet to capture early pushes:\n\n```html\n<script>\n  window.dataLayer = window.dataLayer || [];\n</script>\n<!-- GTM snippet follows -->\n```\n\n### dataLayer.push() Syntax\n\n```javascript\n// Push data AND fire a trigger (event key is required for trigger evaluation)\ndataLayer.push({\n  'event': 'custom_event_name',\n  'key1': 'value1',\n  'key2': 'value2'\n});\n\n// Push data without firing a trigger (no 'event' key)\ndataLayer.push({\n  'user_type': 'premium',\n  'user_id': '12345'\n});\n```\n\n### Object Persistence and Merging\n\nLater pushes override earlier values. Nested objects use **shallow merge** (the entire nested object is replaced, not deep-merged):\n\n```javascript\ndataLayer.push({ 'user': { 'name': 'John', 'plan': 'free' } });\ndataLayer.push({ 'user': { 'plan': 'premium' } });\n// Result: user = { plan: 'premium' } — user.name is GONE\n```\n\n### Clearing Stale Data (Critical for E-Commerce)\n\nAlways push `null` before e-commerce events to prevent stale data contamination:\n\n```javascript\ndataLayer.push({ ecommerce: null });\ndataLayer.push({\n  'event': 'view_item',\n  'ecommerce': {\n    'items': [{ 'item_id': 'SKU-001', 'item_name': 'Blue T-Shirt', 'price': 29.99 }]\n  }\n});\n```\n\n## Common dataLayer Events\n\n### page_view\n\n```javascript\ndataLayer.push({\n  'event': 'page_view',\n  'page_location': window.location.href,\n  'page_title': document.title,\n  'page_referrer': document.referrer,\n  'content_group': 'blog'\n});\n```\n\nFor SPAs (React, Next.js, Vue), fire on route change:\n\n```javascript\nuseEffect(() => {\n  dataLayer.push({\n    'event': 'page_view',\n    'page_location': window.location.href,\n    'page_title': document.title\n  });\n}, [location.pathname]);\n```\n\n### purchase\n\n```javascript\ndataLayer.push({ ecommerce: null });\ndataLayer.push({\n  'event': 'purchase',\n  'ecommerce': {\n    'transaction_id': 'T-20250211-001',\n    'value': 149.97,\n    'tax': 12.50,\n    'shipping': 5.99,\n    'currency': 'USD',\n    'coupon': 'SUMMER20',\n    'items': [\n      {\n        'item_id': 'SKU-001',\n        'item_name': 'Blue T-Shirt',\n        'item_brand': 'BrandName',\n        'item_category': 'Apparel',\n        'item_category2': 'T-Shirts',\n        'item_variant': 'Blue',\n        'price': 29.99,\n        'quantity': 2\n      },\n      {\n        'item_id': 'SKU-045',\n        'item_name': 'Running Shoes',\n        'item_brand': 'BrandName',\n        'item_category': 'Footwear',\n        'item_variant': 'Black/Size-10',\n        'price': 89.99,\n        'quantity': 1\n      }\n    ]\n  }\n});\n```\n\n### add_to_cart\n\n```javascript\ndataLayer.push({ ecommerce: null });\ndataLayer.push({\n  'event': 'add_to_cart',\n  'ecommerce': {\n    'currency': 'USD',\n    'value': 29.99,\n    'items': [{\n      'item_id': 'SKU-001',\n      'item_name': 'Blue T-Shirt',\n      'item_brand': 'BrandName',\n      'item_category': 'Apparel',\n      'price': 29.99,\n      'quantity': 1\n    }]\n  }\n});\n```\n\n### remove_from_cart\n\n```javascript\ndataLayer.push({ ecommerce: null });\ndataLayer.push({\n  'event': 'remove_from_cart',\n  'ecommerce': {\n    'currency': 'USD',\n    'value': 29.99,\n    'items': [{\n      'item_id': 'SKU-001',\n      'item_name': 'Blue T-Shirt',\n      'price': 29.99,\n      'quantity': 1\n    }]\n  }\n});\n```\n\n### view_item\n\n```javascript\ndataLayer.push({ ecommerce: null });\ndataLayer.push({\n  'event': 'view_item',\n  'ecommerce': {\n    'currency': 'USD',\n    'value': 29.99,\n    'items': [{\n      'item_id': 'SKU-001',\n      'item_name': 'Blue T-Shirt',\n      'item_brand': 'BrandName',\n      'item_category': 'Apparel',\n      'price': 29.99\n    }]\n  }\n});\n```\n\n### view_item_list\n\n```javascript\ndataLayer.push({ ecommerce: null });\ndataLayer.push({\n  'event': 'view_item_list',\n  'ecommerce': {\n    'item_list_id': 'category_apparel',\n    'item_list_name': 'Apparel',\n    'items': [\n      { 'item_id': 'SKU-001', 'item_name': 'Blue T-Shirt', 'index': 0, 'price': 29.99 },\n      { 'item_id': 'SKU-002', 'item_name': 'Red T-Shirt', 'index': 1, 'price': 29.99 }\n    ]\n  }\n});\n```\n\n### begin_checkout\n\n```javascript\ndataLayer.push({ ecommerce: null });\ndataLayer.push({\n  'event': 'begin_checkout',\n  'ecommerce': {\n    'currency': 'USD',\n    'value': 149.97,\n    'coupon': 'SUMMER20',\n    'items': [\n      { 'item_id': 'SKU-001', 'item_name': 'Blue T-Shirt', 'price': 29.99, 'quantity': 2 },\n      { 'item_id': 'SKU-045', 'item_name': 'Running Shoes', 'price': 89.99, 'quantity': 1 }\n    ]\n  }\n});\n```\n\n### form_submit\n\n```javascript\ndataLayer.push({\n  'event': 'form_submit',\n  'form_id': 'contact_form',\n  'form_name': 'Contact Us',\n  'form_destination': '/thank-you'\n});\n```\n\n### generate_lead\n\n```javascript\ndataLayer.push({\n  'event': 'generate_lead',\n  'currency': 'USD',\n  'value': 50.00,\n  'lead_source': 'contact_form'\n});\n```\n\n### sign_up / login\n\n```javascript\ndataLayer.push({ 'event': 'sign_up', 'method': 'google' });\ndataLayer.push({ 'event': 'login', 'method': 'email' });\n```\n\n### search\n\n```javascript\ndataLayer.push({\n  'event': 'search',\n  'search_term': 'blue t-shirt',\n  'search_results_count': 42\n});\n```\n\n### scroll (custom)\n\n```javascript\ndataLayer.push({\n  'event': 'scroll',\n  'percent_scrolled': 90\n});\n```\n\n### Video events\n\n```javascript\n// video_start\ndataLayer.push({\n  'event': 'video_start',\n  'video_title': 'Product Demo',\n  'video_url': 'https://youtube.com/watch?v=abc123',\n  'video_provider': 'youtube',\n  'video_duration': 180\n});\n\n// video_progress\ndataLayer.push({\n  'event': 'video_progress',\n  'video_title': 'Product Demo',\n  'video_percent': 50,\n  'video_current_time': 90,\n  'video_duration': 180\n});\n\n// video_complete\ndataLayer.push({\n  'event': 'video_complete',\n  'video_title': 'Product Demo',\n  'video_duration': 180\n});\n```\n\n## Trigger Types\n\n### Page View Triggers\n\n| Sub-Type | Fires When | Use Case |\n|----------|------------|----------|\n| **Page View** | `gtm.js` (immediately) | GA4 config tag, consent checks |\n| **DOM Ready** | `gtm.dom` (DOM parsed) | Tags that read DOM elements |\n| **Window Loaded** | `gtm.load` (all resources loaded) | Tags depending on images/scripts |\n\nFilter by Page Path, Page Hostname, or Page URL.\n\n### Click Triggers\n\n| Sub-Type | Fires When | Use Case |\n|----------|------------|----------|\n| **All Elements** | Any element clicked | Buttons, divs, images |\n| **Just Links** | `<a>` element clicked | Outbound links, downloads |\n\nVariables available: Click Element, Click Classes, Click ID, Click Target, Click URL, Click Text.\n\n### Custom Event Trigger\n\nFires when a specific `event` value is pushed to the dataLayer. Set Event Name to match the `event` key value. Supports regex (e.g., `form_submit.*`).\n\n```javascript\ndataLayer.push({ 'event': 'form_submit' });\n// Fires trigger where Event Name = \"form_submit\"\n```\n\n### Element Visibility Trigger\n\nFires when an element enters the viewport.\n\n| Setting | Description |\n|---------|-------------|\n| Selection Method | CSS Selector or Element ID |\n| When to fire | Once per page / once per element / every time |\n| Minimum % visible | Default 50% |\n| Minimum on-screen duration | Milliseconds |\n\n### Timer Trigger\n\nFires at a set interval (milliseconds). Configure a limit to cap the number of firings.\n\n### Scroll Depth Trigger\n\nFires at specified scroll thresholds (percentages or pixels). Supports vertical and horizontal.\n\nVariables: Scroll Depth Threshold, Scroll Depth Units, Scroll Direction.\n\n### YouTube Video Trigger\n\nBuilt-in support for embedded YouTube videos. Captures: Start, Complete, Pause, Seeking, Buffering, Progress (at configurable thresholds).\n\nVariables: Video Provider, Video Status, Video URL, Video Title, Video Duration, Video Current Time, Video Percent, Video Visible.\n\n### Form Submission Trigger\n\nFires on form submit. Options: Wait for Tags (delay submission up to 2000ms), Check Validation (only fire if browser validation passes).\n\nVariables: Form Element, Form Classes, Form ID, Form Target, Form URL, Form Text.\n\n### History Change Trigger\n\nFires on URL fragment changes or `pushState`/`replaceState`. Essential for SPAs.\n\nVariables: New History Fragment, Old History Fragment, New History State, Old History State, History Source.\n\n### Trigger Groups\n\nCombine multiple triggers. Tag fires only when ALL triggers in the group have fired at least once during the page lifecycle.\n\n## Variable Types\n\n### Data Layer Variable\n\nReads a value from the dataLayer by key name. Use dot notation for nested values (e.g., `ecommerce.transaction_id`). Always use Version 2.\n\n### JavaScript Variable\n\nReads a global JS variable (e.g., `document.title`, `navigator.language`).\n\n### DOM Element Variable\n\nReads text content or an attribute from a DOM element by CSS selector or ID.\n\n### URL Variable\n\nExtracts URL components: Full URL, Protocol, Host Name, Port, Path, Query (with optional Query Key), Fragment.\n\n### Constant Variable\n\nStores a fixed value. Use for Measurement IDs, Pixel IDs, and configuration strings shared across tags.\n\n### Custom JavaScript Variable\n\nRuns an anonymous function and returns its value:\n\n```javascript\n// Get viewport width\nfunction() {\n  return window.innerWidth;\n}\n```\n\n```javascript\n// Classify page type from URL\nfunction() {\n  var path = window.location.pathname;\n  if (path === '/') return 'homepage';\n  if (path.indexOf('/product/') === 0) return 'product';\n  if (path.indexOf('/category/') === 0) return 'category';\n  if (path.indexOf('/blog/') === 0) return 'blog';\n  if (path.indexOf('/checkout') === 0) return 'checkout';\n  return 'other';\n}\n```\n\n```javascript\n// Read a cookie\nfunction() {\n  var match = document.cookie.match(new RegExp('(^| )user_segment=([^;]+)'));\n  return match ? match[2] : undefined;\n}\n```\n\n### Lookup Table Variable\n\nMaps input values (from another variable) to output values. Example: Page Path `/` maps to `Homepage`, `/pricing` to `Pricing`.\n\n### RegEx Table Variable\n\nLike Lookup Table but uses regex patterns. Example: `^/product/.*` maps to `Product Page`. Supports capture groups and case sensitivity settings.\n\n## Tag Types\n\n### GA4 Configuration Tag\n\nSets up the GA4 measurement stream. Fire on All Pages.\n\n| Setting | Description |\n|---------|-------------|\n| Measurement ID | `G-XXXXXXXXXX` (use a Constant variable) |\n| Send page_view | Auto-send page_view on load |\n| Fields to Set | `debug_mode`, `send_page_view`, `user_id` |\n| User Properties | User-scoped dimensions |\n\n### GA4 Event Tag\n\nSends a custom event to GA4.\n\n| Setting | Description |\n|---------|-------------|\n| Configuration Tag | Your GA4 Config tag |\n| Event Name | GA4 event name (e.g., `generate_lead`) |\n| Event Parameters | Key-value pairs (e.g., `transaction_id`, `value`) |\n\n### Custom HTML Tag\n\nRuns arbitrary HTML/JavaScript. Always wrap in try/catch:\n\n```html\n<script>\n  (function() {\n    try {\n      thirdPartySDK.track('event', { value: {{DLV - Value}} });\n    } catch (e) {\n      console.warn('GTM Custom HTML error:', e);\n    }\n  })();\n</script>\n```\n\n### Custom Image Tag\n\nFires a pixel request (1x1 image). Configure Image URL with tracking parameters. Enable cache busting.\n\n## Built-In Variables\n\n### Click Variables\n\nClick Element, Click Classes, Click ID, Click Target, Click URL, Click Text\n\n### Form Variables\n\nForm Element, Form Classes, Form ID, Form Target, Form URL, Form Text\n\n### Page Variables\n\nPage URL, Page Hostname, Page Path, Referrer\n\n### Scroll Variables\n\nScroll Depth Threshold, Scroll Depth Units, Scroll Direction\n\n### Video Variables\n\nVideo Provider, Video Status, Video URL, Video Title, Video Duration, Video Current Time, Video Percent, Video Visible\n\n### Utility Variables\n\nEvent, Environment Name, Container ID, Container Version, HTML ID, Random Number, Debug Mode\n\n## Debug Mode\n\n### GTM Preview/Debug\n\nClick \"Preview\" in GTM workspace. Tag Assistant opens and shows:\n- Tags Fired / Tags Not Fired per event\n- dataLayer state at each event\n- Variables and resolved values\n\n### Console Inspection\n\n```javascript\n// View entire dataLayer\nconsole.table(dataLayer);\n\n// Filter for specific events\ndataLayer.filter(function(item) { return item.event === 'purchase'; });\n\n// Watch pushes in real time\n(function() {\n  var orig = dataLayer.push;\n  dataLayer.push = function() {\n    console.log('dataLayer.push:', arguments[0]);\n    return orig.apply(dataLayer, arguments);\n  };\n})();\n```\n\n### GA4 DebugView\n\nAdd `debug_mode: true` to your GA4 Config tag fields, then view events at GA4 Admin > DebugView.\n\n### Network Tab\n\nFilter by `collect` in DevTools Network tab to see GA4 hits. Verify payload parameters.\n\n## Best Practices\n\n### Naming Conventions\n\n| Element | Convention | Example |\n|---------|-----------|---------|\n| Tags | `[Platform] - [Action] - [Detail]` | `GA4 - Event - Purchase` |\n| Triggers | `[Type] - [Condition]` | `CE - form_submit` |\n| Variables | `[Type prefix] - [Name]` | `DLV - Transaction ID` |\n| Custom Events | snake_case | `generate_lead` |\n| Folders | By platform or function | `GA4`, `Meta`, `Consent` |\n\n### Folder Organization\n\n```\nGA4/\n  GA4 - Config - All Pages\n  GA4 - Event - Purchase\n  GA4 - Event - Add to Cart\nMeta/\n  Meta - Pixel - Base Code\n  Meta - Event - Purchase\nConsent/\n  HTML - Consent Banner Init\n  HTML - Consent Mode Update\n```\n\n### Workspace Management\n\n- Use feature workspaces for each project (e.g., `Q1-2025-GA4-ecommerce`)\n- Always Preview before creating a version\n- Delete or merge unused workspaces\n\n### Version Control\n\n- Create a version before and after significant changes\n- Write descriptive version names: \"v42 - Added GA4 e-commerce checkout funnel\"\n- Roll back if issues arise post-publish\n\n### Tag Sequencing\n\nUse Tag Sequencing to ensure setup tags fire before dependent tags. Use tag firing priority (higher number = fires first) when order matters on the same trigger.\n\n### Consent Mode v2\n\n```javascript\n// Default (before user choice)\ndataLayer.push({\n  'event': 'consent_default',\n  'consent': {\n    'ad_storage': 'denied',\n    'analytics_storage': 'denied',\n    'ad_user_data': 'denied',\n    'ad_personalization': 'denied'\n  }\n});\n\n// After user grants consent\ndataLayer.push({\n  'event': 'consent_update',\n  'consent': {\n    'ad_storage': 'granted',\n    'analytics_storage': 'granted',\n    'ad_user_data': 'granted',\n    'ad_personalization': 'granted'\n  }\n});\n```\n\n## Common Mistakes\n\n### 1. Race Conditions\n\nTags fire before dataLayer contains required data. Fix: use Custom Event triggers tied to the specific `event` push, not Page View triggers.\n\n### 2. Incorrect Trigger Firing\n\nTags fire on all pages instead of specific ones. Fix: always add trigger filters (e.g., Page Path equals `/thank-you`).\n\n### 3. Missing ecommerce Null Reset\n\nStale data from previous pushes contaminates events. Fix: always `dataLayer.push({ ecommerce: null })` before ecommerce events.\n\n### 4. Duplicate Tags\n\nSame event sent multiple times. Causes: multiple triggers, conditions too broad, wrong firing option. Fix: use \"Once per Page\" or review trigger conditions.\n\n### 5. Custom HTML Breaking Pages\n\nJS errors in Custom HTML block other tags. Fix: wrap all Custom HTML in try/catch.\n\n### 6. Data Layer Variable Returns Undefined\n\nCauses: key name mismatch (case-sensitive), data pushed after trigger, wrong DLV version, incorrect dot-notation path.\n\n### 7. SPA Page Views Not Tracked\n\nRoute changes not captured. Fix: use History Change trigger or push custom `page_view` events on route change:\n\n```javascript\n// Next.js App Router\n'use client';\nimport { usePathname } from 'next/navigation';\nimport { useEffect } from 'react';\n\nexport function GTMPageView() {\n  const pathname = usePathname();\n  useEffect(() => {\n    dataLayer.push({\n      'event': 'page_view',\n      'page_location': window.location.href,\n      'page_title': document.title\n    });\n  }, [pathname]);\n  return null;\n}\n```\n\n### 8. Cross-Domain Tracking Issues\n\nUsers counted as new sessions across domains. Fix: configure cross-domain linker in GA4 Config tag or GA4 Admin > Data Streams > Configure your domains.\n\n### 9. Preview Traffic Inflating Analytics\n\nFix: add blocking trigger where Debug Mode equals true, or filter internal traffic via `traffic_type` parameter.\n\n## Resources\n\n- **GTM Developer Guide:** https://developers.google.com/tag-platform/tag-manager\n- **GA4 Event Reference:** https://developers.google.com/analytics/devguides/collection/ga4/reference/events\n- **GTM Community Gallery:** https://tagmanager.google.com/gallery\n- **Consent Mode:** https://developers.google.com/tag-platform/security/guides/consent\n- **Full Cogny Docs:** https://cogny.com/docs/gtm-event-tracking","tags":["gtm","setup","claude","code","marketing","skills","cognyai","agent-skills","ai-agents","claude-code","claude-skills","cluade-mcp"],"capabilities":["skill","source-cognyai","skill-gtm-setup","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-claude-skills","topic-cluade-mcp","topic-cursor","topic-geo","topic-growth-hacking","topic-llm","topic-marketing","topic-mcp","topic-seo"],"categories":["claude-code-marketing-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cognyai/claude-code-marketing-skills/gtm-setup","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cognyai/claude-code-marketing-skills","source_repo":"https://github.com/cognyai/claude-code-marketing-skills","install_from":"skills.sh"}},"qualityScore":"0.471","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 42 github stars · SKILL.md body (18,428 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-01T06:56:26.700Z","embedding":null,"createdAt":"2026-04-18T22:23:35.880Z","updatedAt":"2026-05-01T06:56:26.700Z","lastSeenAt":"2026-05-01T06:56:26.700Z","tsv":"'-001':387,453,468,535,573,603,644,690 '-002':658 '-045':496,704 '-2025':1775 '-20250211':452 '/analytics/devguides/collection/ga4/reference/events':2160 '/blog':1316 '/category':1310 '/checkout':1322 '/docs/gtm-event-tracking':57,2177 '/gallery':2166 '/gtm-setup':59,64,70,76,82,88,93,99,105 '/pricing':1363 '/product':1304,1377 '/tag-platform/security/guides/consent':2171 '/tag-platform/tag-manager':2154 '/thank-you':730,1945 '/watch?v=abc123'',':802 '0':652,1305,1311,1317,1323,1652 '1':513,551,583,666,712,1898 '12.50':457 '12345':310 '149.97':455,683 '180':808,828,841 '1x1':1494 '2':492,700,1205,1343,1923 '2000ms':1105 '29.99':395,490,530,549,568,581,598,617,654,668,698 '3':1946 '4':1966 '42':775 '5':1992 '5.99':459 '50':821,1003 '50.00':741 '6':2012 '7':2037 '8':2095 '89.99':511,710 '9':2126 '90':784,825 'across':1268,2106 'act':231 'action':153,1701 'actual':204 'ad':1805,1861,1867,1871,1883,1889,1893 'add':514,523,1659,1745,1938,2132 'admin':1674,2120 'alway':361,1202,1482,1779,1937,1959 'analyt':1864,1886,2130 'anonym':1275 'anoth':1352 'answer':154 'app':2063 'apparel':480,547,615,635,639 'arbitrari':1480 'area':175 'argument':171,1651,1656 'aris':1816 'array':229 'ask':142,184 'assist':1600 'attribut':1224 'auto':1419 'auto-send':1418 'avail':196,917 'back':1813 'banner':1759 'base':213,1751 'begin':669,677 'best':21,51,100,137,1692 'black/size-10':509 'block':2002,2133 'blog':417,1319 'blue':390,471,488,538,576,606,647,693,768 'brand':476,502,543,611 'brandnam':477,503,544,612 'break':1995 'broad':1979 'browser':1111 'buffer':1067 'built':1055,1506 'built-in':1054,1505 'bus':235 'bust':1504 'button':906 'cach':1503 'cap':1022 'captur':266,1062,1383,2046 'cart':516,525,554,563,1747 'case':853,900,1386,1722,2023 'case-sensit':2022 'categori':479,505,546,614,634,1313 'category2':482 'caus':1974,2018 'ce':1709 'chang':426,1128,1134,1799,2044,2050,2060 'check':862,1106 'checkout':670,678,1325,1810 'choic':1855 'class':921,1118,1514,1528 'classifi':1289 'clear':353 'click':892,905,912,918,920,922,924,926,928,1509,1511,1513,1515,1517,1519,1521,1594 'client':2066 'code':160,1752 'cogni':191,2173 'cogny.com':56,2176 'cogny.com/docs/gtm-event-tracking':55,2175 'collect':1680 'combin':1158 'commerc':360,367,1809 'common':106,396,1896 'communiti':2162 'complet':28,830,834,1064 'compon':1238 'concept':182 'condit':109,1708,1900,1977,1991 'config':859,1456,1666,1737,2116 'configur':17,46,92,130,217,1018,1070,1265,1392,1452,1496,2109,2123 'consent':861,1732,1756,1758,1762,1848,1858,1860,1877,1880,1882,2167 'consol':1620 'console.log':1649 'console.table':1626 'const':2078 'constant':1252,1413 'contact':722,726,744 'contain':206,1580,1582,1905 'contamin':373,1956 'content':415,1221 'control':1791 'convent':103,1695,1697 'cooki':1331 'count':774,2102 'coupon':462,684 'creat':1782,1792 'critic':356 'cross':2097,2111 'cross-domain':2096,2110 'css':984,1230 'currenc':460,527,565,595,680,738 'current':823,1084,1569 'custom':288,777,930,1270,1446,1476,1487,1719,1910,1993,2000,2008,2054 'data':111,274,296,355,372,1181,1869,1891,1907,1952,2013,2025,2121 'datalay':9,38,65,66,218,223,225,247,260,397,943,1189,1611,1625,1627,1655,1904 'datalayer.filter':1632 'datalayer.push':75,270,286,304,336,342,375,378,402,429,442,445,518,521,556,559,587,590,622,625,672,675,716,734,750,756,763,779,790,811,831,959,1646,1647,1650,1856,1878,1960,2082 'debug':18,47,94,95,132,1428,1588,1590,1660,2136 'debugview':1658,1675 'declar':258 'deep':333 'deep-merg':332 'default':1002,1852,1859 'delay':1101 'delet':1785 'demo':797,818,838 'deni':1863,1866,1870,1873 'depend':880,1831 'depth':1028,1044,1047,1549,1552 'descript':981,1405,1451,1801 'destin':729 'detail':1702 'develop':2150 'developers.google.com':2153,2159,2170 'developers.google.com/analytics/devguides/collection/ga4/reference/events':2158 'developers.google.com/tag-platform/security/guides/consent':2169 'developers.google.com/tag-platform/tag-manager':2152 'devtool':1682 'dimens':1440 'direct':1050,1555 'div':907 'dlv':1716,2030 'doc':54,2174 'document.cookie.match':1335 'document.referrer':414 'document.title':411,438,1214,2091 'dom':863,866,871,1216,1227 'domain':2098,2107,2112,2125 'dot':1194,2034 'dot-not':2033 'download':915 'duplic':112,1967 'durat':807,827,840,1008,1082,1567 'e':359,366,1808 'e-commerc':358,365,1807 'e.g':955,1199,1213,1463,1472,1773,1941 'earli':267 'earlier':318 'ecommerc':376,382,443,448,519,526,557,564,588,594,623,630,673,679,1778,1948,1961,1964 'ecommerce.transaction':1200 'element':872,902,904,911,919,970,976,987,997,1116,1217,1228,1512,1526,1696 'email':760 'embed':1059 'enabl':1502 'ensur':1826 'enter':977 'entir':326,1624 'environ':1578 'equal':1944,2138 'error':1998 'essenti':1138 'evalu':285 'event':5,24,35,74,128,279,287,289,302,368,379,398,403,430,446,522,560,591,626,676,717,735,751,757,764,780,786,791,812,832,931,937,945,950,960,966,1442,1447,1458,1461,1466,1577,1610,1615,1631,1671,1704,1720,1741,1744,1754,1857,1879,1911,1917,1957,1965,1970,2057,2083,2156 'everi':998 'exampl':1357,1376,1698 'expert':120 'explain':81,87 'export':2075 'extract':1236 'featur':1768 'field':1425,1668 'filter':883,1628,1678,1940,2141 'find':145 'fire':252,276,298,423,850,897,933,963,973,991,1012,1026,1030,1093,1109,1130,1162,1171,1400,1490,1605,1608,1829,1835,1839,1902,1926,1928,1981 'first':1840 'fix':1256,1908,1936,1958,1983,2005,2047,2108,2131 'focus':172 'folder':1725,1733 'follow':136 'footwear':506 'form':713,718,720,723,724,728,745,956,961,968,1090,1095,1115,1117,1119,1121,1123,1125,1523,1525,1527,1529,1531,1533,1535,1710 'fragment':1133,1144,1147,1251 'free':341 'full':53,60,1239,2172 'function':1276,1285,1294,1332,1633,1643,1648,1729,2076 'fundament':10,39,67,219 'funnel':1811 'g':1409 'g-xxxxxxxxxx':1408 'ga4':15,44,90,858,1391,1397,1441,1449,1455,1460,1657,1665,1673,1687,1703,1730,1735,1736,1740,1743,1777,1806,2115,2119,2155 'ga4-ecommerce':1776 'galleri':2163 'generat':731,736,1464,1723 'get':1282 'global':1210 'gone':352 'googl':32,117,755 'grant':1876,1885,1888,1892,1895 'group':416,1157,1169,1384 'gtm':2,4,23,61,133,181,192,205,240,248,263,1592,1597,2149,2161 'gtm-setup':1 'gtm.dom':865 'gtm.js':856 'gtm.load':875 'gtmpageview':2077 'guid':30,2151 'help':125,188 'higher':1837 'histori':1127,1143,1146,1149,1152,1154,2049 'hit':1688 'homepag':1301,1362 'horizont':1041 'host':1242 'hostnam':888,1542 'html':269,1477,1486,1584,1757,1761,1994,2001,2009 'html/javascript':1481 'id':309,385,450,466,494,533,571,601,633,642,656,688,702,721,923,988,1120,1201,1233,1261,1263,1407,1434,1474,1516,1530,1581,1585,1718 'imag':908,1488,1495,1497 'images/scripts':882 'immedi':857 'implement':50,127 'import':2067,2071 'includ':37 'incorrect':1924,2032 'index':651,665 'inflat':2129 'init':1760 'initi':257 'input':1349 'inspect':200,1621 'instead':1932 'instruct':113 'intern':2142 'interv':1016 'issu':134,1815,2100 'item':381,383,384,388,464,465,469,475,478,481,486,493,497,501,504,507,531,532,536,542,545,569,570,574,585,593,599,600,604,610,613,619,628,631,636,640,641,645,655,659,686,687,691,701,705,1634 'item.event':1636 'javascript':228,272,335,374,401,427,441,517,555,586,621,671,715,733,749,762,778,787,958,1206,1271,1281,1288,1328,1622,1851,2061 'john':339 'js':1211,1997 'key':280,303,951,1191,1250,1469,2019 'key-valu':1468 'key1':291 'key2':293 'later':315 'layer':1182,2014 'lead':732,737,742,1465,1724 'least':1173 'lifecycl':1178 'like':1369 'limit':1020 'link':910,914 'linker':2113 'list':207,620,629,632,637 'load':874,878,1424 'locat':407,434,2087 'location.pathname':439 'login':748,758 'lookup':1345,1370 'manag':34,119,1766 'map':1348,1360,1378 'match':948,1334,1341,1342 'matter':1843 'mcp':193 'measur':1260,1398,1406 'merg':314,324,334,1787 'messag':234 'meta':1731,1748,1749,1753 'method':754,759,983 'millisecond':1009,1017 'minimum':1000,1004 'mismatch':2021 'miss':110,1947 'mistak':107,1897 'mode':19,48,96,1429,1589,1591,1661,1763,1849,2137,2168 'multipl':1159,1972,1975 'name':102,290,338,389,470,498,537,575,605,638,646,660,692,706,725,946,967,1192,1243,1459,1462,1579,1694,1715,1803,2020 'navigator.language':1215 'need':187 'nest':320,327,1197 'network':1676,1683 'new':1142,1148,1336,2104 'next.js':421,2062 'next/navigation':2070 'notat':1195,2035 'null':363,377,444,520,558,589,624,674,1949,1962,2094 'number':1024,1587,1838 'object':244,311,321,328 'old':1145,1151 'on-screen':1005 'one':1935 'onto':245 'open':1601 'option':1097,1248,1982 'order':1842 'organ':104,1734 'orig':1645 'orig.apply':1654 'otherwis':176 'outbound':913 'output':1355 'overrid':317 'overview':63,179 'page':399,404,406,409,412,431,433,436,844,854,885,887,890,994,1177,1290,1358,1381,1403,1416,1421,1431,1537,1539,1541,1543,1739,1920,1931,1942,1987,1996,2039,2055,2084,2086,2089 'pair':1471 'paramet':1467,1501,1691,2147 'pars':867 'pass':1113 'path':886,1245,1296,1299,1359,1544,1943,2036 'path.indexof':1303,1309,1315,1321 'pathnam':2079,2092 'pattern':1375 'paus':1065 'payload':1690 'per':993,996,1609,1986 'percent':782,820,1087,1572 'percentag':1035 'persist':312 'person':1872,1894 'pixel':1037,1262,1492,1750 'plan':340,344,348 'platform':1700,1727 'popul':255 'port':1244 'post':1818 'post-publish':1817 'practic':22,52,101,138,1693 'precis':152 'prefix':1714 'premium':307,345,349 'prevent':370 'preview':1595,1780,2127 'preview/debug':1593 'previous':1954 'price':394,489,510,548,580,616,653,667,697,709,1365 'prioriti':1836 'product':796,817,837,1307,1380 'progress':810,814,1068 'project':1772 'properti':1436 'protocol':1241 'provid':151,165,177,211,804,1074,1559 'publish':1819 'purchas':71,73,440,447,1637,1705,1742,1755 'push':243,268,273,295,316,362,940,1639,1918,1955,2026,2053 'pushstat':1136 'q1':1774 'quantiti':491,512,550,582,699,711 'queri':1246,1249 'question':144 'race':108,1899 'random':1586 'react':420,2074 'read':249,870,1184,1208,1219,1329 'readi':157,864 'ready-to-us':156 'real':216,1641 'recommend':212 'red':661 'refer':8,27,29,62,123,2157 'referr':413,1545 'regex':954,1366,1374 'regexp':1337 'relev':147 'remov':552,561 'replac':330 'replacest':1137 'request':1493 'requir':282,1906 'reset':1950 'resolv':1618 'resourc':877,2148 'result':346,773 'return':1278,1286,1300,1306,1312,1318,1324,1326,1340,1635,1653,2016,2093 'review':1989 'roll':1812 'rout':425,2043,2059 'router':2064 'run':499,707,1273,1479 'scope':1439 'screen':1007 'scroll':776,781,783,1027,1033,1043,1046,1049,1546,1548,1551,1554 'search':761,765,766,772 'section':148 'see':1686 'seek':1066 'segment':1339 'select':982 'selector':985,1231 'send':1415,1420,1430,1444 'sensit':1387,2024 'sent':1971 'sequenc':1821,1824 'session':2105 'set':944,980,1015,1388,1394,1404,1427,1450 'setup':3,7,26,1827 'shallow':323 'share':1267 'ship':458 'shirt':393,474,485,541,579,609,650,664,696,771 'shoe':500,708 'show':72,1603 'sign':746,752 'signific':1798 'skill' 'skill-gtm-setup' 'sku':386,467,495,534,572,602,643,657,689,703 'snake':1721 'snippet':161,264 'sourc':743,1155 'source-cognyai' 'spa':2038 'spas':419,1140 'specif':167,936,1630,1916,1934 'specifi':1032 'stale':354,371,1951 'start':789,793,1063 'state':1150,1153,1612 'status':1076,1561 'storag':1862,1865,1884,1887 'store':1254 'stream':1399,2122 'string':1266 'sub':848,895 'sub-typ':847,894 'submiss':1091,1102 'submit':714,719,957,962,969,1096,1711 'summer20':463,685 'support':953,1038,1057,1382 'syntax':69,271 't-shirt':391,472,483,539,577,607,648,662,694,769 'tab':1677,1684 'tabl':1346,1367,1371 'tag':16,33,45,89,91,118,860,868,879,1100,1161,1269,1389,1393,1443,1453,1457,1478,1489,1599,1604,1606,1667,1699,1820,1823,1828,1832,1834,1901,1927,1968,2004,2117 'tagmanager.google.com':2165 'tagmanager.google.com/gallery':2164 'tags/triggers/variables':131,209 'target':925,1122,1518,1532 'tax':456 'term':767 'text':929,1126,1220,1522,1536 'threshold':1034,1045,1071,1550 'tie':1913 'time':824,999,1085,1570,1642,1973 'timer':1010 'titl':410,437,795,816,836,1080,1565,2090 'tool':194 'topic':168 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-claude-skills' 'topic-cluade-mcp' 'topic-cursor' 'topic-geo' 'topic-growth-hacking' 'topic-llm' 'topic-marketing' 'topic-mcp' 'topic-seo' 'track':6,25,36,129,1500,2042,2099 'traffic':2128,2143,2145 'transact':449,1473,1717 'trigger':11,40,77,79,253,278,284,300,842,846,893,932,964,972,1011,1029,1053,1092,1129,1156,1160,1166,1706,1847,1912,1922,1925,1939,1976,1990,2028,2051,2134 'troubleshoot':98 'true':1662,2139 'try/catch':1485,2011 'type':12,14,43,80,86,306,843,849,896,1180,1291,1390,1707,1713,2146 'undefin':1344,2017 'unit':1048,1553 'unus':1788 'updat':1764,1881 'url':799,891,927,1078,1124,1132,1234,1237,1240,1293,1498,1520,1534,1540,1563 'us':727 'usag':58 'usd':461,528,566,596,681,739 'use':121,159,197,322,852,899,1193,1203,1258,1373,1411,1767,1822,1833,1909,1984,2048,2065 'useeffect':428,2072,2081 'usepathnam':2068,2080 'user':126,141,164,202,305,308,337,343,347,1338,1433,1435,1438,1854,1868,1875,1890,2101 'user-scop':1437 'user.name':350 'util':1575 'v2':1850 'v42':1804 'valid':1107,1112 'valu':319,454,529,567,597,682,740,938,952,1186,1198,1257,1280,1350,1356,1470,1475,1619 'value1':292 'value2':294 'var':1295,1333,1644 'variabl':13,42,83,85,256,916,1042,1072,1114,1141,1179,1183,1207,1212,1218,1235,1253,1272,1347,1353,1368,1414,1508,1510,1524,1538,1547,1557,1576,1616,1712,2015 'variant':487,508 'verifi':1689 'version':1204,1583,1784,1790,1794,1802,2031 'vertic':1039 'via':2144 'video':785,788,792,794,798,803,806,809,813,815,819,822,826,829,833,835,839,1052,1061,1073,1075,1077,1079,1081,1083,1086,1088,1556,1558,1560,1562,1564,1566,1568,1571,1573 'view':380,400,405,432,584,592,618,627,845,855,1417,1422,1432,1623,1670,1921,2040,2056,2085 'viewport':979,1283 'visibl':971,1001,1089,1574 'vue':422 'wait':1098 'watch':1638 'websit':238 'width':1284 'window':873 'window.innerwidth':1287 'window.location.href':408,435,2088 'window.location.pathname':1297 'without':297 'workspac':1598,1765,1769,1789 'wrap':1483,2006 'write':1800 'wrong':1980,2029 'xxxxxxxxxx':1410 'youtub':805,1051,1060 'youtube.com':801 'youtube.com/watch?v=abc123'',':800","prices":[{"id":"c5d281df-2b51-4448-bd33-a02130f0d630","listingId":"4d9d4395-e4a0-43dc-ad1e-ea69ad709292","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cognyai","category":"claude-code-marketing-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:23:35.880Z"}],"sources":[{"listingId":"4d9d4395-e4a0-43dc-ad1e-ea69ad709292","source":"github","sourceId":"cognyai/claude-code-marketing-skills/gtm-setup","sourceUrl":"https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/gtm-setup","isPrimary":false,"firstSeenAt":"2026-04-18T22:23:35.880Z","lastSeenAt":"2026-05-01T06:56:26.700Z"}],"details":{"listingId":"4d9d4395-e4a0-43dc-ad1e-ea69ad709292","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cognyai","slug":"gtm-setup","github":{"repo":"cognyai/claude-code-marketing-skills","stars":42,"topics":["agent-skills","ai-agents","claude-code","claude-skills","cluade-mcp","cursor","geo","growth-hacking","llm","marketing","mcp","seo","vibe","windsurf"],"license":null,"html_url":"https://github.com/cognyai/claude-code-marketing-skills","pushed_at":"2026-04-29T13:43:50Z","description":"Marketing skills for Claude Code — SEO audits and implementation, ad analysis, ad optimization. Free skills need no account. $9/mo for live Search Console, Bing & LinkedIn data.","skill_md_sha":"189ddfb5330556081e8bd20b757197be94d6609a","skill_md_path":"skills/gtm-setup/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/gtm-setup"},"layout":"multi","source":"github","category":"claude-code-marketing-skills","frontmatter":{"name":"gtm-setup","description":"GTM Event Tracking & Setup Reference — dataLayer fundamentals, trigger types, variable types, GA4 tag configuration, debug mode, and best practices"},"skills_sh_url":"https://skills.sh/cognyai/claude-code-marketing-skills/gtm-setup"},"updatedAt":"2026-05-01T06:56:26.700Z"}}