gtm-manager/SKILL.md
Manage Google Tag Manager containers, tags, triggers, and variables. Use for any GTM-related task including listing, inspecting, creating, updating, or deleting GTM resources.
npx skillsauth add supercorks/agent-skills gtm-managerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Programmatically manage Google Tag Manager via the Tag Manager API v2.
googleapis and open npm packages: npm install googleapis openSet these to avoid passing credentials on every command:
export GTM_CREDENTIALS_PATH=/path/to/client_secrets.json
export GTM_TOKEN_PATH=/path/to/token.json
export GTM_ACCOUNT_ID=your_account_id
export GTM_CONTAINER_ID=your_container_id
For service account auth:
export GTM_SERVICE_KEY_PATH=/path/to/service-account.json
First-time setup opens a browser for Google login:
node scripts/auth-oauth.js --credentials ./client_secrets.json --token ./token.json
For automation (service account must have GTM permissions):
node scripts/auth-service.js --service-key ./service-account.json
All scripts output JSON to stdout. Use --help on any script for full options.
Show current authenticated user:
node scripts/whoami.js --credentials $GTM_CREDENTIALS_PATH --token $GTM_TOKEN_PATH
List accounts:
node scripts/list-accounts.js --credentials $GTM_CREDENTIALS_PATH --token $GTM_TOKEN_PATH
List containers in an account:
node scripts/list-containers.js --account 6224254648
List tags:
node scripts/list-tags.js --account 6224254648 --container 181424855
List triggers:
node scripts/list-triggers.js --account 6224254648 --container 181424855
List variables:
node scripts/list-variables.js --account 6224254648 --container 181424855
List versions:
node scripts/list-versions.js --account 6224254648 --container 181424855
Inspect tag by ID:
node scripts/inspect-tag.js --id 59 --account 6224254648 --container 181424855
Search tags by name:
node scripts/inspect-tag.js --name "Google Ads" --account 6224254648 --container 181424855
Inspect trigger:
node scripts/inspect-trigger.js --id 17 --account 6224254648 --container 181424855
Inspect variable:
node scripts/inspect-variable.js --name "Zenoti" --account 6224254648 --container 181424855
Create tag from JSON:
node scripts/create-tag.js --json ./tag-config.json --account 6224254648 --container 181424855
Create trigger from inline JSON:
node scripts/create-trigger.js --json '{"name":"My Trigger","type":"customEvent","customEventFilter":[...]}' --account 6224254648 --container 181424855
Create variable:
node scripts/create-variable.js --json ./variable-config.json --account 6224254648 --container 181424855
Update tag:
node scripts/update-tag.js --id 59 --json ./updated-tag.json --account 6224254648 --container 181424855
Update trigger:
node scripts/update-trigger.js --id 17 --json ./updated-trigger.json --account 6224254648 --container 181424855
Delete tag:
node scripts/delete-tag.js --id 59 --account 6224254648 --container 181424855
Delete trigger:
node scripts/delete-trigger.js --id 17 --account 6224254648 --container 181424855
Duplicate tag with new name and trigger:
node scripts/duplicate-tag.js --id 59 --name "Google Ads | Zenoti Booking | Dallas" --trigger 85 --account 6224254648 --container 181424855
Duplicate tag with parameter overrides:
node scripts/duplicate-tag.js --id 59 --json '{"name":"New Tag","parameter":[{"key":"conversionLabel","type":"template","value":"newLabel123"}]}' --account 6224254648 --container 181424855
| Type | Description |
| --------- | ------------------------------ |
| awct | Google Ads Conversion Tracking |
| gaawe | GA4 Event |
| googtag | Google Tag |
| html | Custom HTML |
| sp | Google Ads Remarketing |
| gclidw | Conversion Linker |
| Type | Description |
| ---------------- | ----------------------------- |
| pageview | Page View |
| customEvent | Custom Event (dataLayer.push) |
| click | Click - All Elements |
| linkClick | Click - Just Links |
| formSubmission | Form Submission |
| windowLoaded | Window Loaded |
| domReady | DOM Ready |
| init | Initialization |
Create a custom event trigger for a specific location:
// trigger-config.json
{
"name": "Zenoti | Booking | Dallas",
"type": "customEvent",
"customEventFilter": [
{
"type": "equals",
"parameter": [
{ "type": "template", "key": "arg0", "value": "{{_event}}" },
{ "type": "template", "key": "arg1", "value": "purchase" }
]
}
],
"filter": [
{
"type": "equals",
"parameter": [
{ "type": "template", "key": "arg0", "value": "{{Data Layer Send To}}" },
{ "type": "template", "key": "arg1", "value": "G-58T61GCMLL" }
]
},
{
"type": "equals",
"parameter": [
{ "type": "template", "key": "arg0", "value": "{{Ecomm | Variable | Center Name}}" },
{ "type": "template", "key": "arg1", "value": "AYA Medical Spa Dallas" }
]
}
]
}
// gads-tag-config.json
{
"name": "Google Ads | Zenoti Booking | Dallas",
"type": "awct",
"parameter": [
{ "type": "boolean", "key": "enableNewCustomerReporting", "value": "false" },
{ "type": "boolean", "key": "enableConversionLinker", "value": "true" },
{ "type": "boolean", "key": "enableProductReporting", "value": "false" },
{ "type": "template", "key": "conversionValue", "value": "{{Zenoti Purchase Total}}" },
{ "type": "template", "key": "conversionCookiePrefix", "value": "_gcl" },
{ "type": "boolean", "key": "enableShippingData", "value": "false" },
{ "type": "template", "key": "conversionId", "value": "1069545890" },
{ "type": "template", "key": "conversionLabel", "value": "51WLCJKPi-8bEKLz__0D" },
{ "type": "boolean", "key": "rdp", "value": "false" }
],
"firingTriggerId": ["85"],
"tagFiringOption": "oncePerEvent"
}
First, inspect an existing tag to use as template:
node scripts/inspect-tag.js --name "Google Ads | Zenoti" --account $GTM_ACCOUNT_ID --container $GTM_CONTAINER_ID
Create triggers for each location:
node scripts/create-trigger.js --json ./trigger-dallas.json ...
Duplicate the tag for each location with new trigger and conversion label:
node scripts/duplicate-tag.js --id 59 --name "Google Ads | Zenoti Booking | Dallas" --trigger 85 --json '{"parameter":[{"key":"conversionLabel","type":"template","value":"51WLCJKPi-8bEKLz__0D"}]}'
Verify changes:
node scripts/list-tags.js --account $GTM_ACCOUNT_ID --container $GTM_CONTAINER_ID
When ready, publish manually in GTM UI.
tools
Read local coding-agent thread/session history for Codex, Codex CLI, Copilot CLI, Copilot Chat local VS Code threads, and Claude Code. Use when asked to find, inventory, summarize, search, or inspect local agent conversations, session subjects, transcript files, or agent thread storage.
tools
Operate Google Workspace (Drive, Gmail, Calendar, Sheets, Docs, Slides, Chat, Admin, Forms, Tasks…) via the @googleworkspace/cli (`gws`) Rust CLI distributed on npm. Use for any read/write task across Workspace APIs — list/search/upload Drive files (incl. shared drives), send/read mail, manage calendar events, sheets cell ops, etc.
development
Find useful Agent Skills in curated public skill repositories for a user query. Searches official and community skill repos, ranks matching SKILL.md files, and recommends candidates with source trust notes.
tools
Use Browserbase and the browse CLI for browser automation, Fetch/Search API work, authenticated remote browsing, UI QA, debugging, tracing, and Browserbase platform or Functions workflows with multi-account support.