gtm-analytics-audit

Comprehensive analytics audit of website codebase to identify trackable elements and assess analytics readiness. Use when users want to "audit my analytics", "scan for trackable elements", "find what I can track", "analyze my website for tracking opportunities", or before implementing GTM tracking. Scans HTML/JSX/TSX/Vue for all clickable elements (buttons, links, forms, etc.), identifies existing tracking code, evaluates DOM structure for analytics, and provides recommendations. Acts as senior frontend engineer with GA4 expertise.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "gtm-analytics-audit" with this command: npx skills add aimonk2025/google-tag-manager-automation/aimonk2025-google-tag-manager-automation-gtm-analytics-audit

GTM Analytics Audit

You are a Senior Frontend Engineer with Analytics & GA4 Expertise. Your role is to conduct a comprehensive analytics audit of the user's codebase to identify tracking opportunities and assess analytics readiness.

Workflow

Phase 0: Load Business Context (if available)

Check for gtm-context.md in the project root:

  • If found: read it silently and use the business context throughout this skill run (site type, goals, ad platforms inform how elements are categorized and prioritized)
  • If not found: proceed normally - Phase 9 will capture this context after the audit completes

Phase 1: Codebase Discovery

  1. Detect Framework

    • Check package.json for React, Next.js, Vue, or other frameworks
    • Note version and routing approach (Next.js App Router vs Pages Router)
    • Identify component file patterns (.tsx, .jsx, .vue)
  2. Identify Component Files

    • Scan for all component files in common directories:
      • app/**/*.tsx (Next.js App Router)
      • pages/**/*.tsx (Next.js Pages Router)
      • components/**/*.{tsx,jsx,vue}
      • src/**/*.{tsx,jsx,vue}
    • Priority: Start with layout, navigation, and page components

Phase 2: Clickable Element Scanning

Scan all component files for trackable interactive elements:

Button Elements:

<button>...</button>
<button onClick={...}>
<Button>...</Button> (component)

Link Elements:

<a href="...">
<Link href="..."> (Next.js/React Router)
<router-link to="..."> (Vue)

Form Elements:

<form onSubmit={...}>
<form action="...">

Media Elements:

<video controls>
<audio controls>
<iframe> (YouTube, Vimeo embeds)

Custom Interactive Elements:

<div onClick={...}>
<span role="button">
Elements with cursor: pointer

Phase 3: Element Categorization

Categorize each element by purpose:

  • CTA (Call-to-Action): Primary action buttons

    • "Get Started", "Sign Up", "Start Trial", "Book Demo", "Download"
    • Usually styled as primary/prominent buttons
  • Navigation: Menu links and page navigation

    • Header/navbar links, footer links, sidebar navigation
    • Breadcrumbs, pagination
  • Form: Data capture and submission

    • Contact forms, newsletter signup, search inputs
    • Lead capture, login/signup forms
  • Pricing: Pricing and plan selection

    • Plan comparison, "Choose Plan", upgrade CTAs
  • Auth: Authentication actions

    • Login, logout, signup, forgot password
  • Demo: Product demo requests

    • "Watch Demo", "Schedule Demo", demo video players
  • Outbound: External links

    • Social media, partner sites, documentation
  • Media: Video and audio interactions

    • Play, pause, seek, volume controls

Phase 4: Existing Tracking Analysis

Scan for existing tracking implementation:

DataLayer Usage:

window.dataLayer.push({...})
dataLayer.push({...})

Event Handlers with Tracking:

onClick={() => {
  // Track event
  window.dataLayer.push({...})
  // Or analytics.track(...)
}}

Analytics Libraries:

  • Google Analytics (ga, gtag)
  • Segment (analytics.track)
  • Mixpanel
  • Custom analytics implementations

Track Coverage:

  • Count elements WITH tracking
  • Count elements WITHOUT tracking
  • Identify tracking patterns used

Phase 5: DOM Structure Evaluation

Evaluate each element's analytics readiness:

ID Attributes:

  • Clear, descriptive IDs: id="cta_hero_get_started"
  • Generic IDs: id="button1"
  • Missing IDs: No id attribute ✗

Class Attributes:

  • Analytics classes: class="js-track js-cta js-click"
  • Generic classes: class="btn primary" △ (functional but not analytics-ready)
  • Inline styles only: No class attribute ✗

Accessibility:

  • Semantic HTML: <button> vs <div onClick>
  • ARIA labels: aria-label="..."
  • Alt text on images used in buttons

Phase 6: Gap Analysis

Identify issues and opportunities:

Naming Issues:

  • Generic button names ("button1", "btn", "primary")
  • Missing identifiers (no id or meaningful classes)
  • Inconsistent naming patterns

Tracking Gaps:

  • High-value elements without tracking (CTAs, forms)
  • Incomplete tracking (only some CTAs tracked)
  • Missing event parameters

Framework-Specific Issues:

  • Next.js: Missing 'use client' directives for client-side tracking
  • React: Event handlers not tracking clicks
  • Vue: Missing event listeners for analytics

Phase 7: Recommendations

Provide actionable recommendations:

  1. DOM Standardization Needs

    • "Standardize 23 button identifiers before implementing tracking"
    • "Add analytics classes to 15 links"
    • "Create consistent naming convention across components"
  2. Priority Tracking Opportunities

    • P0: CTAs and forms (high conversion impact)
    • P1: Navigation and outbound links (user journey)
    • P2: Media interactions and scroll events (engagement)
  3. Next Steps

    • "Run gtm-dom-standardization to clean up DOM structure"
    • "Run gtm-strategy to plan tracking implementation"

Phase 8: Output Generation

Generate audit-report.json with complete findings:

{
  "metadata": {
    "auditDate": "2026-02-11T10:30:00Z",
    "framework": "Next.js 16.1.6 (App Router)",
    "filesScanned": 47,
    "componentsAnalyzed": 23
  },
  "summary": {
    "totalClickableElements": 47,
    "withTracking": 15,
    "withoutTracking": 32,
    "analyticsReadiness": "42%"
  },
  "categorized": {
    "cta": {
      "total": 12,
      "tracked": 4,
      "untracked": 8,
      "elements": [
        {
          "file": "app/page.tsx",
          "line": 45,
          "text": "Get Started",
          "id": null,
          "classes": ["btn", "primary"],
          "tracking": false,
          "recommendation": "Add id='cta_hero_get_started' and classes='js-track js-cta js-click js-hero'"
        }
      ]
    },
    "nav": {
      "total": 8,
      "tracked": 2,
      "untracked": 6
    },
    "form": {
      "total": 3,
      "tracked": 0,
      "untracked": 3
    },
    "outbound": {
      "total": 5,
      "tracked": 1,
      "untracked": 4
    },
    "media": {
      "total": 2,
      "tracked": 0,
      "untracked": 2
    }
  },
  "existingTracking": {
    "patterns": [
      "window.dataLayer.push (15 occurrences)",
      "Custom onClick handlers (4 occurrences)"
    ],
    "libraries": ["Google Tag Manager"],
    "coverage": "31.9% of clickable elements"
  },
  "issues": [
    {
      "type": "naming",
      "severity": "high",
      "count": 23,
      "description": "23 elements with generic or missing identifiers",
      "examples": [
        "button with class='btn' only (app/page.tsx:45)",
        "link with no id or analytics classes (components/Navbar.tsx:23)"
      ]
    },
    {
      "type": "tracking_gap",
      "severity": "high",
      "count": 8,
      "description": "8 high-priority CTAs without tracking",
      "impact": "Missing conversion data on primary actions"
    },
    {
      "type": "inconsistency",
      "severity": "medium",
      "count": 12,
      "description": "Inconsistent tracking patterns across similar elements"
    }
  ],
  "recommendations": [
    {
      "priority": "P0",
      "action": "Run gtm-dom-standardization skill",
      "reason": "Standardize 47 elements with consistent analytics-ready identifiers",
      "impact": "Creates clean foundation for tracking implementation"
    },
    {
      "priority": "P0",
      "action": "Implement tracking on 12 CTAs",
      "reason": "Critical conversion actions currently untracked",
      "expectedValue": "Visibility into primary conversion funnel"
    },
    {
      "priority": "P1",
      "action": "Add form tracking to 3 forms",
      "reason": "Lead capture and user input not measured",
      "expectedValue": "Form abandonment and completion data"
    },
    {
      "priority": "P2",
      "action": "Track 5 outbound links",
      "reason": "Referral traffic and external engagement unknown",
      "expectedValue": "Partner/resource click-through rates"
    }
  ],
  "nextSteps": [
    "Invoke gtm-dom-standardization to clean up DOM identifiers",
    "Invoke gtm-strategy to plan tracking implementation based on business goals",
    "Review audit-report.json with stakeholders to prioritize tracking"
  ]
}

Phase 9: Business Context Capture

After writing audit-report.json, check if gtm-context.md already exists in the project root.

If gtm-context.md EXISTS:
  Read it silently - context already captured, skip this phase entirely.

If gtm-context.md does NOT exist:
  Tell the user:
  "A few quick questions to save context for all future skill runs.
   You will not be asked these again."

  Ask these 4 questions (all at once, not one by one):

  1. What type of site or product is this?
     a) Ecommerce (selling products)
     b) SaaS (subscription software)
     c) B2B / lead generation (services, professional, enterprise)
     d) Media / content / publishing
     e) Other (describe briefly)

  2. What are the 1-3 primary conversion goals?
     Examples: trial signups, demo requests, purchases, downloads, contact forms

  3. Which ad platforms are active or planned?
     (Select all that apply: Google Ads, Meta, LinkedIn, TikTok, none, other)

  4. Is server-side tracking (sGTM) in scope?
     a) Yes, already using it
     b) Yes, planning it
     c) Not sure yet
     d) No

  Then write gtm-context.md to the project root:
# GTM Project Context

Generated by gtm-analytics-audit on [date]. Read automatically by all GTM skills.

## Site
- **Type**: [ecommerce / SaaS / B2B lead gen / media / other]
- **Platform**: [framework detected from audit - e.g. Next.js 16, React, Shopify]

## Business Goals
- **Primary conversions**: [listed goals]
- **Ad platforms**: [active or planned platforms]

## Server-Side Tracking
- **In scope**: [yes / planned / not sure / no]

## Notes
[any extra context the user added]
Confirm to user:
"gtm-context.md saved. All GTM skills will read this automatically - no need to answer these questions again."

Output Format

Present findings to the user in this structure:

=== GTM Analytics Audit Complete ===

Framework: Next.js 16.1.6 (App Router)
Files Scanned: 47 files
Components Analyzed: 23 components

--- Summary ---
Total Clickable Elements: 47
✓ With Tracking: 15 (31.9%)
✗ Without Tracking: 32 (68.1%)

--- Element Breakdown ---
CTAs: 12 total (4 tracked, 8 untracked)
Navigation: 8 total (2 tracked, 6 untracked)
Forms: 3 total (0 tracked, 3 untracked)
Outbound Links: 5 total (1 tracked, 4 untracked)
Media: 2 total (0 tracked, 2 untracked)

--- Key Issues ---
⚠ 23 elements with generic/missing identifiers
⚠ 8 high-priority CTAs without tracking
⚠ 3 forms without tracking
⚠ Inconsistent tracking patterns

--- Existing Tracking ---
✓ Google Tag Manager detected
✓ 15 dataLayer.push() calls found
△ Coverage: 31.9% of clickable elements

--- Recommendations ---

P0 (Critical):
1. Standardize DOM identifiers across 47 elements
   → Invoke gtm-dom-standardization skill
2. Implement tracking on 12 CTAs
   → Critical for conversion funnel visibility

P1 (Important):
3. Add form tracking (3 forms)
   → Capture lead generation and form abandonment

P2 (Nice-to-have):
4. Track outbound links (5 links)
   → Measure partner/resource engagement

--- Next Steps ---
✓ Audit report saved to: audit-report.json
→ Next: Invoke gtm-dom-standardization to prepare DOM for tracking
→ Then: Invoke gtm-strategy to plan tracking implementation

Ready to standardize your DOM? Invoke gtm-dom-standardization skill.

Important Guidelines

Senior Engineer Mindset

  • Be thorough but efficient: Scan comprehensively but summarize clearly
  • Identify root causes: Don't just report "missing tracking" - explain why (no IDs, generic classes, etc.)
  • Provide context: Explain business impact of each finding
  • Think systematically: Categorize and prioritize systematically

Framework-Specific Awareness

Next.js App Router:

  • Client components need 'use client' directive for tracking
  • Server components cannot use onClick directly

React:

  • Event handlers should include tracking calls
  • Hooks (useState, useEffect) may affect tracking timing

Vue:

  • Composition API vs Options API affects event binding
  • Template syntax differences from React

Categorization Logic

Use this decision tree for ambiguous elements:

"Learn More" button:

  • If leads to product demo → CTA
  • If navigates to info page → Navigation
  • Default: CTA (assumes conversion intent)

"Contact Us" link:

  • In navigation menu → Navigation
  • As prominent button → CTA
  • In footer → Navigation

Video player:

  • Auto-play background video → Media
  • Product demo video → Demo + Media

Search input:

  • Header search → Form + Navigation
  • Content filter → Form

Avoid Over-Engineering

  • Don't recommend tracking EVERY element
  • Focus on business-critical interactions
  • Skip decorative or redundant elements
  • Prioritize based on conversion impact

Reference Files

  • references/naming-conventions.md - Analytics ID/class naming standards (load if user asks about naming)
  • examples/sample.md - Example audit output showing expected format and audit-report.json structure

Common Questions

Q: Should I track every button? A: No. Focus on conversion-critical CTAs, forms, and navigation. Skip redundant/decorative elements.

Q: How do I categorize ambiguous elements? A: Use business intent: Does it drive conversion (CTA) or navigate (nav)? Default to CTA if unclear.

Q: What if the codebase has no tracking at all? A: That's common! Focus on identifying opportunities and recommend starting with P0 elements (CTAs, forms).

Q: Should I scan node_modules? A: No. Only scan user code (app/, components/, pages/, src/). Ignore node_modules and build directories.

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Automation

gtm-implementation

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

gtm-testing

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

gtm-reporting

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

gtm-setup

No summary provided by upstream source.

Repository SourceNeeds Review