/gtm-tracking-plan
Turn a measurement plan into a Google Tag Manager spec — tags, triggers, variables, and copy-paste dataLayer snippets for every event
$ npx -y skills add cognyai/claude-code-marketing-skills --skill gtm-tracking-plan --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/gtm-tracking-plan
Context preview
The summary Claude sees to decide when to auto-load this skill.
Turn a measurement plan into a Google Tag Manager spec — tags, triggers, variables, and copy-paste dataLayer snippets for every event
SKILL.md
gtm-tracking-plan.SKILL.mdname: gtm-tracking-plan
description: Turn a measurement plan into a Google Tag Manager spec — tags, triggers, variables, and copy-paste dataLayer snippets for every event
version: "1.0.0"
author: Cogny AI
platforms: []
user-invocable: true
argument-hint: "<site url>"
allowed-tools:
- WebFetch
- WebSearch
- Bash
- Read
- Write
GTM Tracking Plan
Give it a site URL and get back a complete Google Tag Manager build spec — every tag, trigger, and variable to create, plus the exact `dataLayer.push()` snippets a developer drops into the site. It's the implementation half of a measurement plan. No account connection required.
Best run after `/ga4-measurement-plan` — pass the same URL and this skill builds the GTM container to deliver that plan. Run alone, it derives a sensible plan first.
Usage
`/gtm-tracking-plan example.com` — full GTM build spec for the site
Steps
1. Establish the events to implement
If a GA4 measurement plan already exists in the conversation, use its event taxonomy. Otherwise, `WebFetch` the site, infer the site type and funnel, and derive the event list yourself (the same logic as `/ga4-measurement-plan`, in brief).
For each event you need: name, when it fires, its parameters, whether it's a key event.
2. Variables
List every variable to create, by type:
- **Data Layer Variables** — one per parameter pushed to the data layer
(`ecommerce`, `value`, `currency`, `transaction_id`, `lead_source`, …)
- **Built-in variables to enable** — Click Element, Click URL, Click Text, Form ID,
Page Path, Page URL, plus the relevant ones per trigger
- **Constant** — the GA4 Measurement ID (`G-XXXXXXX`)
- **Lookup / RegEx table** — only if routing or value mapping is genuinely needed
- **Consent state variables** — if Consent Mode is in scope
Present as a table: variable name, type, configuration, used by.
3. Triggers
One trigger per distinct firing condition. For each: name, type, and conditions.
- **Initialization / Consent Initialization** — for Consent Mode default state
- **Custom Event** triggers — one per dataLayer event (`event` equals `purchase`,
`generate_lead`, …) — the recommended approach for anything pushed to the dataLayer
- **DOM-based** triggers (click, form submission, element visibility) only where the
site cannot push a dataLayer event
- **History Change** — for SPA page views
Name them consistently: `CE - purchase`, `Click - CTA button`.
4. Tags
List every tag to create. For each: name, type, what fires it, and key fields.
- **GA4 Configuration tag** — exactly one, on Initialization / All Pages, with the
Measurement ID. (Calling out "exactly one" prevents the classic double-count bug.)
- **GA4 Event tags** — one per event from Step 1, referencing the config tag, with
parameters mapped from the Data Layer Variables
- **Google Ads Conversion tags** — for key events that feed Ads bidding, with
conversion ID/label placeholders
- **Consent** — Consent Mode default + update tags if in scope
Use a clear convention: `GA4 - Event - purchase`, `Ads - Conversion - Lead`.
5. dataLayer snippets
This is the developer handoff. For every event that needs site code, give a copy-paste `dataLayer.push()` snippet with realistic placeholders:
<!-- Fire on the order confirmation page, after the dataLayer is initialized -->
<script>
window.dataLayer = window.dataLayer || [];
dataLayer.push({ ecommerce: null }); // clear the previous ecommerce object
dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "{{ORDER_ID}}",
value: {{ORDER_TOTAL}},
currency: "{{CURRENCY}}",
items: [
{ item_id: "{{SKU}}", item_name: "{{NAME}}", price: {{PRICE}}, quantity: {{QTY}} }
]
}
});
</script>Include the snippet for each key event and the most important non-key events. Note the firing location (which page / which DOM event) for each.
6. Implementation order & QA
Give the build sequence: 1. Enable built-in variables and create user-defined variables 2. Create triggers 3. Create the GA4 config tag, then event tags, then Ads conversion tags 4. Add the dataLayer snippets to the site 5. QA in **GTM Preview** + **GA4 DebugView** — verify each event fires once, with parameters populated, and not before consent 6. Publish a named version
Call out the common failure modes: dataLayer pushed *after* the GTM snippet, stale `ecommerce` object not cleared, tags firing pre-consent, event-name typos.
7. Output
Deliver as one document:
GTM Tracking Plan — [site]
Container overview: X tags · X triggers · X variables
1. Variables table
2. Triggers table
3. Tags table
4. dataLayer snippets (per event, with firing location)
5. Build order
6. QA checklist
Critical rules
1. **Exactly one GA4 configuration tag.** State it explicitly — duplicate config tags are the most common GTM bug. 2. **Prefer Custom Event triggers over DOM triggers.** A dataLayer push is reliable; scraping the DOM is brittle. Use DOM triggers only when the site can't push. 3. **Every dataLayer snippet must be copy-paste ready** with clearly marked placeholders and a stated firing location. 4. **Respect Consent Mode** — analytics and Ads tags must not fire before consent in regulated regions. 5. This produces a *build spec*. To audit a live container, use `/gtm-audit` (requires Cogny MCP).
Read more
name: gtm-tracking-plan description: Turn a measurement plan into a Google Tag Manager spec — tags, triggers, variables, and copy-paste dataLayer snippets for every event version: "1.0.0" author: Cogny AI platforms: [] user-invocable: true argument-hint: "<site url>" allowed-tools: - WebFetch - WebSearch - Bash - Read - Write
GTM Tracking Plan
Give it a site URL and get back a complete Google Tag Manager build spec — every tag, trigger, and variable to create, plus the exact `dataLayer.push()` snippets a developer drops into the site. It's the implementation half of a measurement plan. No account connection required.
Best run after `/ga4-measurement-plan` — pass the same URL and this skill builds the GTM container to deliver that plan. Run alone, it derives a sensible plan first.
Usage
`/gtm-tracking-plan example.com` — full GTM build spec for the site
Steps
1. Establish the events to implement
If a GA4 measurement plan already exists in the conversation, use its event taxonomy. Otherwise, `WebFetch` the site, infer the site type and funnel, and derive the event list yourself (the same logic as `/ga4-measurement-plan`, in brief).
For each event you need: name, when it fires, its parameters, whether it's a key event.
2. Variables
List every variable to create, by type:
- **Data Layer Variables** — one per parameter pushed to the data layer
(`ecommerce`, `value`, `currency`, `transaction_id`, `lead_source`, …)
- **Built-in variables to enable** — Click Element, Click URL, Click Text, Form ID,
Page Path, Page URL, plus the relevant ones per trigger
- **Constant** — the GA4 Measurement ID (`G-XXXXXXX`)
- **Lookup / RegEx table** — only if routing or value mapping is genuinely needed
- **Consent state variables** — if Consent Mode is in scope
Present as a table: variable name, type, configuration, used by.
3. Triggers
One trigger per distinct firing condition. For each: name, type, and conditions.
- **Initialization / Consent Initialization** — for Consent Mode default state
- **Custom Event** triggers — one per dataLayer event (`event` equals `purchase`,
`generate_lead`, …) — the recommended approach for anything pushed to the dataLayer
- **DOM-based** triggers (click, form submission, element visibility) only where the
site cannot push a dataLayer event
- **History Change** — for SPA page views
Name them consistently: `CE - purchase`, `Click - CTA button`.
4. Tags
List every tag to create. For each: name, type, what fires it, and key fields.
- **GA4 Configuration tag** — exactly one, on Initialization / All Pages, with the
Measurement ID. (Calling out "exactly one" prevents the classic double-count bug.)
- **GA4 Event tags** — one per event from Step 1, referencing the config tag, with
parameters mapped from the Data Layer Variables
- **Google Ads Conversion tags** — for key events that feed Ads bidding, with
conversion ID/label placeholders
- **Consent** — Consent Mode default + update tags if in scope
Use a clear convention: `GA4 - Event - purchase`, `Ads - Conversion - Lead`.
5. dataLayer snippets
This is the developer handoff. For every event that needs site code, give a copy-paste `dataLayer.push()` snippet with realistic placeholders:
<!-- Fire on the order confirmation page, after the dataLayer is initialized -->
<script>
window.dataLayer = window.dataLayer || [];
dataLayer.push({ ecommerce: null }); // clear the previous ecommerce object
dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "{{ORDER_ID}}",
value: {{ORDER_TOTAL}},
currency: "{{CURRENCY}}",
items: [
{ item_id: "{{SKU}}", item_name: "{{NAME}}", price: {{PRICE}}, quantity: {{QTY}} }
]
}
});
</script>Include the snippet for each key event and the most important non-key events. Note the firing location (which page / which DOM event) for each.
6. Implementation order & QA
Give the build sequence: 1. Enable built-in variables and create user-defined variables 2. Create triggers 3. Create the GA4 config tag, then event tags, then Ads conversion tags 4. Add the dataLayer snippets to the site 5. QA in **GTM Preview** + **GA4 DebugView** — verify each event fires once, with parameters populated, and not before consent 6. Publish a named version
Call out the common failure modes: dataLayer pushed *after* the GTM snippet, stale `ecommerce` object not cleared, tags firing pre-consent, event-name typos.
7. Output
Deliver as one document:
GTM Tracking Plan — [site] Container overview: X tags · X triggers · X variables 1. Variables table 2. Triggers table 3. Tags table 4. dataLayer snippets (per event, with firing location) 5. Build order 6. QA checklist
Critical rules
1. **Exactly one GA4 configuration tag.** State it explicitly — duplicate config tags are the most common GTM bug. 2. **Prefer Custom Event triggers over DOM triggers.** A dataLayer push is reliable; scraping the DOM is brittle. Use DOM triggers only when the site can't push. 3. **Every dataLayer snippet must be copy-paste ready** with clearly marked placeholders and a stated firing location. 4. **Respect Consent Mode** — analytics and Ads tags must not fire before consent in regulated regions. 5. This produces a *build spec*. To audit a live container, use `/gtm-audit` (requires Cogny MCP).
AI marketing skills for Claude Code, Cursor, Windsurf, and other AI coding tools. Audit SEO, analyze ads, research competitors, qualify leads — all from your terminal. Free skills need no account. Premium skills connect your real data for $9/mo.
Repo: cognyai/claude-code-marketing-skills
Other skills on claude-code-marketing-skills.
brand-kit
Build a portable brand-kit.json for the user's product — colors, typography, voice — that other skills (video, ad creative, landing page) can consume. Multiple…
cogny
Run Cogny marketing analysis tasks — fetch scheduled tasks, analyze ad accounts via MCP, report findings
community-pulse
Weekly read on Discord community health — joins, active channels, top contributors, themes, and unanswered questions
conversion-debug
Conversion Tracking Debugger — diagnose discrepancies across GTM, GA4, Google Ads & Meta Pixel with live API access, BigQuery validation queries, and…

