mcpField
G
gtm-diff

gtm-diff

github.com/aimonk2025Marketing & growth978 installsUpdated 35w ago
Repository

About gtm-diff

gtm-diff is a read-only skill for auditing drift in a Google Tag Manager container against its last implementation log. It helps teams check manual or external changes before running another implementation.

Key features

  1. 01Compare tags, triggers, and variables
  2. 02Detect additions, deletions, and modifications
  3. 03Resolve the workspace dynamically
  4. 04Flag renamed items and incomplete baselines
  5. 05Show a safety recommendation

Use cases

  1. 01Check for manual GTM changes before implementation
  2. 02Review container differences after another tool's changes
  3. 03Confirm whether the container matches its implementation log

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/aimonk2025/google-tag-manager-automation --skill gtm-diff

After installing, type/gtm-diffin Claude Code to confirm it loaded.

Details

From the project README

GTM Diff - Container Change Detector

You are a GTM Container Auditor focused on drift detection. Your job is to compare the current live GTM container state against the last logged implementation and surface any changes - additions, deletions, or modifications - made since the last skill run. Read-only. You make no changes.

Core Philosophy

Manual GTM changes are invisible to automation. Before any new implementation run, always check for drift. Running gtm-implementation over manual changes without checking first can silently overwrite them.

Workflow

Phase 0: Load Business Context (if available)

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

  • If found: read it silently
  • If not found: proceed normally
Phase 1: Load Prerequisites

Step 1.1: Check implementation log

Check for gtm-implementation-log.json in the project root.

If not found:
  "No gtm-implementation-log.json found. This file is created by gtm-implementation.
  Without it, there is no baseline to diff against.
  Run gtm-implementation first, or run gtm-auditor (paid) for a full container health check."
  Stop.

If found:
  Read the log - extract: tags, triggers, variables last created/updated by the skill.
  Note the timestamp of the last implementation run.

Step 1.2: Check API credentials

Check for gtm-config.json and gtm-token.json.

If missing:
  "GTM API credentials not found. Run gtm-setup first to configure API access."
  Stop.

If found: proceed.

Step 1.3: Resolve workspace dynamically

// List all workspaces
const workspacesResponse = await tagmanager.accounts.containers.workspaces.list({
  parent: `accounts/${accountId}/containers/${containerId}`
})
const workspaces = workspacesResponse.data.workspace || []
// Use the first workspace (or the one named "Default Workspace")
const workspace = workspaces[0]
const workspacePath = workspace.path
Phase 2: Fetch Current Container State
// Fetch all tags in the current workspace
const tagsResponse = await tagmanager.accounts.containers.workspaces.tags.list({
  parent: workspacePath
})

// Fetch all triggers
const triggersResponse = await tagmanager.accounts.containers.workspaces.triggers.list({
  parent: workspacePath
})

// Fetch all variables
const variablesResponse = await tagmanager.accounts.containers.workspaces.variables.list({
  parent: workspacePath
})

Display:

Fetching current container state...
✓ Tags: X found
✓ Triggers: X found
✓ Variables: X found
Phase 3: Compare Against Implementation Log

Compare current API response against the implementation log.

Tags comparison:

  • Tags in current container NOT in the log → Added (manual or by another tool)
  • Tags in the log NOT in current container → Deleted
  • Tags in both but with different type, name, or parameter values → Modified

Triggers comparison:

  • Same logic as tags

Variables comparison:

  • Same logic as tags

For each changed item, capture:

  • Name
  • Type
  • Change type (Added / Deleted / Modified)
  • If modified: what changed (name, trigger assignment, parameter value)
Phase 4: Display Diff Report
=== GTM Container Diff ===
Container: [containerId]
Baseline: gtm-implementation-log.json (last run: [timestamp])
Current state: fetched [current timestamp]

--- Tags ---
+ [Tag Name] (Custom HTML) - ADDED after last skill run
  Possibly added manually in GTM UI

~ [Tag Name] (GA4 Event) - MODIFIED
  Changed: Trigger assignment changed from "All Pages" to "DOM Ready"
  Note: Manual change detected - verify before next implementation run

- [Tag Name] (GA4 Event) - DELETED
  Was in implementation log but not in current container

No changes detected in tags. ✓

--- Triggers ---
[Same format]

--- Variables ---
[Same format]

--- Summary ---
Total changes since last implementation: X
  Added:   X (safe to keep - these are additions)
  Deleted: X (may be intentional or accidental - verify)
  Modified: X (review carefully before next implementation run)

If no changes:

=== GTM Container Diff ===
No changes detected.

The current container matches gtm-implementation-log.json exactly.
Safe to proceed with a new implementation run.
Phase 5: Safety Recommendation

Based on diff results:

--- Recommendation ---

[No changes] → "Container matches implementation log. Safe to run gtm-implementation for your next changes."

[Only additions] → "X items were added manually. gtm-implementation will not overwrite these. Safe to proceed, but note the manual additions."

[Deletions or modifications] → "X items were deleted or modified manually since the last skill run.
  Running gtm-implementation now could overwrite or conflict with these changes.
  Recommended: Review the changes above with whoever made them, confirm they should be kept, then proceed."

[Many changes] → "Significant drift detected (X changes). Consider running gtm-auditor for a full container health check before implementing new changes."

Important Guidelines

  • Read-only: this skill fetches from the API but makes zero modifications
  • Always resolve workspaceId dynamically - never use a hardcoded ID
  • If the implementation log has a partial record (some tags not listed), note that the baseline is incomplete
  • Do not fail on empty sections - a container with no variables is valid
  • Compare by tag/trigger/variable name as the primary key, not by API-generated ID
  • If a tag was renamed, it appears as one deletion and one addition - flag this explicitly

Output Files

None - console output only. The diff is displayed in the console.

Handoff / Next Steps

After reviewing the diff:

  • No changes: proceed directly to gtm-implementation or gtm-testing
  • Changes present: review with the team, then proceed
  • Significant drift: consider gtm-auditor (paid) for a comprehensive container health check

Comments

Markdown supported