The Problem
I've been working with Google Tag Manager for years, and every time I asked an AI assistant to write GTM code, the same thing happened: it would use const, arrow functions, or template literals — and GTM would reject it with compilation errors.
Error: This language feature is only supported for ECMASCRIPT_2015 mode or better: const declaration.
GTM's Custom HTML tags only support ES5 JavaScript. This isn't documented prominently, and most developers discover it the hard way.
I had to manually convert everything back to ES5, every single time. So I built a Claude Code skill to solve this problem once and for all.
The Solution
GitHub - claude-skill-gtm-javascript
This skill teaches Claude Code the GTM constraints:
| Feature | ES6+ (Prohibited) | ES5 (Required) |
|---|---|---|
| Variables | const, let | var |
| Functions | () => {} | function() {} |
| Strings | `${var}` | 'str' + var |
| Destructuring | {a, b} = obj | var a = obj.a |
| for-of | for (x of arr) | for (var i...) |
What's Included
The skill includes four comprehensive files:
- SKILL.md — Core rules and patterns for ES5 code generation
- reference.md — Complete ES6 → ES5 conversion reference
- examples.md — Production-ready code for dataLayer, ecommerce, consent
- checklist.md — Testing and debugging guide for GTM
2024-2025 Updates
The skill also includes the latest GTM/GA4 updates:
- IE11 Support Ended (July 15, 2024) — No longer need IE11 compatibility
- Consent Mode v2 Required (March 2024) — New
ad_user_data,ad_personalizationparameters - Google Ads Auto-Tag (April 10, 2025) — Containers auto-load Google tag first
- GA4 Ecommerce — Complete event schemas with items array
- Server-side GTM — 1st-party domain patterns
Installation
git clone https://github.com/ekusiadadus/claude-skill-gtm-javascript.git ~/.claude/skills/gtm-javascriptOr for project-specific installation:
mkdir -p .claude/skills
cp -r skills/gtm-javascript .claude/skills/Example: GA4 Purchase Event
Once installed, Claude Code will generate proper ES5 code:
(function() {
'use strict';
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T_12345',
value: 99.99,
currency: 'USD',
items: [{
item_id: 'SKU_001',
item_name: 'Product Name',
price: 99.99,
quantity: 1
}]
}
});
})();Example: Consent Mode v2
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('consent', 'default', {
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
analytics_storage: 'denied'
});Why This Matters
GTM runs code through Google Closure Compiler, which only supports ES5 for Custom HTML tags. This limitation isn't going away — it's been this way for years.
Every developer working with GTM faces this problem. Every AI assistant generates ES6+ code by default. This skill bridges that gap.
Feedback Welcome
I'd love to hear from anyone working with GTM or building Claude Code skills:
- Are there GTM patterns I missed?
- What other analytics tools have similar constraints?
- How can the skill be improved?