feat(gtm-guardian): Reorganize skill with dual-platform structure
- Add desktop/ directory for Claude Desktop (Phase 1-5: analysis, design, docs) - Add code/ directory for Claude Code (Phase 6-7: automation, audit) - Create SKILL.md with YAML frontmatter for Desktop compatibility - Create CLAUDE.md for Code automation workflows - Organize references by platform scope with shared files duplicated - Add templates for tagging plan and event taxonomy - Include README.md with overview and usage guide 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
168
custom-skills/22-gtm-guardian/code/CLAUDE.md
Normal file
168
custom-skills/22-gtm-guardian/code/CLAUDE.md
Normal file
@@ -0,0 +1,168 @@
|
||||
# GTM Guardian (Code)
|
||||
|
||||
GTM 태깅 라이프사이클의 자동화 및 유지보수 단계를 지원하는 Claude Code 스킬.
|
||||
|
||||
**Code 범위**: Phase 6-7 (Progressive Audit, Lookup App), GTM Toolkit 연계
|
||||
|
||||
> Desktop 스킬에서 Phase 1-5 (분석, 설계, 문서화)를 수행한 후 사용.
|
||||
|
||||
## Quick Commands
|
||||
|
||||
```bash
|
||||
# D.intelligence GTM Toolkit 클론
|
||||
git clone https://github.com/ourdigital/dintel-gtm-toolkit.git
|
||||
|
||||
# GTM Container 분석
|
||||
python analyze_container.py GTM-XXXXXX.json --output report.md
|
||||
|
||||
# 버전 비교
|
||||
python diff_versions.py v1.json v2.json --output diff.md
|
||||
|
||||
# 미사용 요소 탐지
|
||||
python find_unused.py container.json --type all
|
||||
```
|
||||
|
||||
## Workflow Overview
|
||||
|
||||
| Phase | Name | Output | Tools |
|
||||
|-------|------|--------|-------|
|
||||
| 6 | Progressive Audit | 진단 리포트, 업데이트 | D.intel GTM Toolkit, Python |
|
||||
| 7 | Lookup App | 이벤트 조회 앱 | Google Apps Script |
|
||||
|
||||
## Phase 6: Progressive Audit
|
||||
|
||||
### D.intelligence GTM Toolkit Integration
|
||||
|
||||
**Repository**: https://github.com/ourdigital/dintel-gtm-toolkit
|
||||
|
||||
### Capabilities
|
||||
|
||||
| Feature | Description | Use Case |
|
||||
|---------|-------------|----------|
|
||||
| Container Analysis | JSON 파싱, 구조 분석 | 컨테이너 리뷰 |
|
||||
| Dependency Mapping | 태그↔트리거↔변수 관계 | 영향도 분석 |
|
||||
| Version Diff | 버전 간 변경사항 비교 | 변경 추적 |
|
||||
| Tag Validation | 발화 상태 자동 검증 | 정기 감사 |
|
||||
|
||||
### Audit Workflow
|
||||
|
||||
```
|
||||
1. GTM Container Export
|
||||
└── JSON 파일 다운로드 (GTM Admin > Container > Export)
|
||||
|
||||
2. D.intel Toolkit Analysis
|
||||
├── python analyze_container.py container.json
|
||||
├── Dependency graph 생성
|
||||
└── Issue detection
|
||||
|
||||
3. Report Generation
|
||||
└── Markdown/HTML 리포트
|
||||
|
||||
4. Notion 업로드
|
||||
└── MCP 또는 수동 업로드
|
||||
```
|
||||
|
||||
### Audit Schedule
|
||||
|
||||
| Frequency | Scope | Trigger |
|
||||
|-----------|-------|---------|
|
||||
| Weekly | Tag firing validation | 자동 스케줄 |
|
||||
| Monthly | Full container review | 월간 리포트 |
|
||||
| Quarterly | Architecture review | 분기 회의 |
|
||||
| Ad-hoc | Issue investigation | 이슈 발생 시 |
|
||||
|
||||
## Phase 7: Lookup App
|
||||
|
||||
Google Apps Script 기반 Event Taxonomy 조회 앱 배포.
|
||||
|
||||
### Architecture
|
||||
```
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ Google Sheets │────▶│ Apps Script │────▶│ Web App │
|
||||
│ (Taxonomy DB) │ │ (Backend) │ │ (Frontend) │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
### Quick Setup
|
||||
1. Google Sheets에서 Extensions > Apps Script
|
||||
2. `references/phase7-lookup-app.md` 코드 참조
|
||||
3. Deploy > New deployment > Web app
|
||||
|
||||
## Key References
|
||||
|
||||
- [phase6-audit.md](references/phase6-audit.md) - 진단 워크플로우, 체크리스트
|
||||
- [phase7-lookup-app.md](references/phase7-lookup-app.md) - Apps Script 코드, 배포 가이드
|
||||
|
||||
### Shared References
|
||||
- [datalayer-schema.md](references/datalayer-schema.md) - DataLayer 스키마
|
||||
- [platform-mapping.md](references/platform-mapping.md) - 플랫폼별 이벤트 매핑
|
||||
- [naming-conventions.md](references/naming-conventions.md) - 네이밍 규칙
|
||||
- [qa-checklist.md](references/qa-checklist.md) - QA 체크리스트
|
||||
|
||||
## Notion Output
|
||||
|
||||
**Database**: [GTM Knowledge Base](https://www.notion.so/dintelligence/2cf581e58a1e80c8b358f1625356e931)
|
||||
|
||||
### Report Properties
|
||||
|
||||
| Property | Type | Description |
|
||||
|----------|------|-------------|
|
||||
| Project | Title | 프로젝트명 |
|
||||
| Audit Date | Date | 감사 일자 |
|
||||
| Container ID | Rich Text | GTM-XXXXXX |
|
||||
| Status | Select | Healthy / Needs Attention / Critical |
|
||||
| Version | Number | 컨테이너 버전 |
|
||||
| Issues Count | Number | 발견 이슈 수 |
|
||||
|
||||
### Language Guidelines
|
||||
- 리포트 내용은 한국어로 작성
|
||||
- 기술 용어는 영어 유지 (GTM, dataLayer, GA4 등)
|
||||
- 코드와 URL은 변경 없이 유지
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Container 분석 실행
|
||||
```bash
|
||||
cd dintel-gtm-toolkit
|
||||
python analyze_container.py /path/to/GTM-XXXXXX.json \
|
||||
--output /path/to/report.md \
|
||||
--format markdown
|
||||
```
|
||||
|
||||
### 버전 비교
|
||||
```bash
|
||||
python diff_versions.py \
|
||||
/path/to/container_v1.json \
|
||||
/path/to/container_v2.json \
|
||||
--output diff_report.md
|
||||
```
|
||||
|
||||
### 미사용 요소 탐지
|
||||
```bash
|
||||
python find_unused.py /path/to/container.json \
|
||||
--type all \
|
||||
--output unused_elements.md
|
||||
```
|
||||
|
||||
## Update Procedures
|
||||
|
||||
### Minor Update (태그 수정)
|
||||
1. 변경 필요 태그 식별
|
||||
2. GTM Preview 모드에서 수정
|
||||
3. 테스트 완료
|
||||
4. Publish with version note
|
||||
5. Notion 문서 업데이트
|
||||
|
||||
### Major Update (신규 태그 추가)
|
||||
1. Desktop 스킬로 Phase 3-4 문서 업데이트
|
||||
2. DataLayer 요구사항 개발팀 전달
|
||||
3. GTM 태그/트리거/변수 설정
|
||||
4. QA 체크리스트 수행
|
||||
5. 단계적 배포
|
||||
|
||||
## Coding Guidelines
|
||||
|
||||
GTM Toolkit 수정 시:
|
||||
1. **Tag Destinations**: `TAG_DESTINATIONS` dict에 플랫폼 추가
|
||||
2. **Event Validation**: `GA4_EVENT_REQUIREMENTS` dict에 요구사항 추가
|
||||
3. **Korean Patterns**: 한국 결제 수단 (카카오페이, 네이버페이, 토스) 지원
|
||||
@@ -0,0 +1,193 @@
|
||||
# DataLayer Schema Reference
|
||||
|
||||
GA4 권장 이벤트 기반 DataLayer 스키마 정의.
|
||||
|
||||
## Core Principles
|
||||
|
||||
1. GTM 스니펫 이전에 dataLayer 초기화
|
||||
2. 이벤트 발생 시점에 push (사전 아님)
|
||||
3. ecommerce 객체는 push 전 clear 필수
|
||||
4. PII 데이터 직접 수집 금지
|
||||
|
||||
## Base Structure
|
||||
|
||||
### Page Load
|
||||
```javascript
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
dataLayer.push({
|
||||
'event': 'page_data',
|
||||
'page': {
|
||||
'type': 'home|category|product|cart|checkout|thankyou|content|search',
|
||||
'name': 'Page Name',
|
||||
'category': 'Category/Subcategory',
|
||||
'language': 'ko'
|
||||
},
|
||||
'user': {
|
||||
'status': 'logged_in|logged_out',
|
||||
'id': 'hashed_user_id', // SHA256, 로그인 시에만
|
||||
'type': 'new|returning|member|guest',
|
||||
'loginMethod': 'email|kakao|naver|google'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## E-commerce Events
|
||||
|
||||
### view_item
|
||||
```javascript
|
||||
dataLayer.push({ ecommerce: null });
|
||||
dataLayer.push({
|
||||
'event': 'view_item',
|
||||
'ecommerce': {
|
||||
'currency': 'KRW',
|
||||
'value': 29000,
|
||||
'items': [{
|
||||
'item_id': 'SKU_12345',
|
||||
'item_name': 'Product Name',
|
||||
'item_brand': 'Brand Name',
|
||||
'item_category': 'Category',
|
||||
'item_variant': 'Blue / Large',
|
||||
'price': 29000,
|
||||
'quantity': 1
|
||||
}]
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### add_to_cart
|
||||
```javascript
|
||||
dataLayer.push({ ecommerce: null });
|
||||
dataLayer.push({
|
||||
'event': 'add_to_cart',
|
||||
'ecommerce': {
|
||||
'currency': 'KRW',
|
||||
'value': 29000,
|
||||
'items': [{
|
||||
'item_id': 'SKU_12345',
|
||||
'item_name': 'Product Name',
|
||||
'price': 29000,
|
||||
'quantity': 1
|
||||
}]
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### begin_checkout
|
||||
```javascript
|
||||
dataLayer.push({ ecommerce: null });
|
||||
dataLayer.push({
|
||||
'event': 'begin_checkout',
|
||||
'ecommerce': {
|
||||
'currency': 'KRW',
|
||||
'value': 58000,
|
||||
'coupon': 'WELCOME10',
|
||||
'items': [/* cart items */]
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### purchase
|
||||
```javascript
|
||||
dataLayer.push({ ecommerce: null });
|
||||
dataLayer.push({
|
||||
'event': 'purchase',
|
||||
'ecommerce': {
|
||||
'transaction_id': 'T_20250115_001',
|
||||
'affiliation': 'Store Name',
|
||||
'value': 53000,
|
||||
'tax': 4818,
|
||||
'shipping': 3000,
|
||||
'currency': 'KRW',
|
||||
'coupon': 'WELCOME10',
|
||||
'items': [{
|
||||
'item_id': 'SKU_12345',
|
||||
'item_name': 'Product Name',
|
||||
'price': 29000,
|
||||
'quantity': 1
|
||||
}]
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Lead Gen Events
|
||||
|
||||
### generate_lead
|
||||
```javascript
|
||||
dataLayer.push({
|
||||
'event': 'generate_lead',
|
||||
'currency': 'KRW',
|
||||
'value': 50000,
|
||||
'lead': {
|
||||
'source': 'contact_form|landing_page',
|
||||
'type': 'inquiry|quote_request'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### form_submit
|
||||
```javascript
|
||||
dataLayer.push({
|
||||
'event': 'form_submit',
|
||||
'form': {
|
||||
'id': 'contact_form',
|
||||
'name': 'Contact Us Form',
|
||||
'type': 'contact',
|
||||
'success': true
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Engagement Events
|
||||
|
||||
### login / sign_up
|
||||
```javascript
|
||||
dataLayer.push({
|
||||
'event': 'login', // or 'sign_up'
|
||||
'method': 'email|kakao|naver|google'
|
||||
});
|
||||
```
|
||||
|
||||
### search
|
||||
```javascript
|
||||
dataLayer.push({
|
||||
'event': 'search',
|
||||
'search_term': 'user search query',
|
||||
'search': {
|
||||
'results_count': 42,
|
||||
'category': 'product|content'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Item Object Reference
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| item_id | string | Yes | SKU |
|
||||
| item_name | string | Yes | 상품명 |
|
||||
| price | number | Yes | 단가 |
|
||||
| quantity | number | Yes | 수량 |
|
||||
| item_brand | string | No | 브랜드명 |
|
||||
| item_category | string | No | 카테고리 |
|
||||
| item_category2-5 | string | No | 하위 카테고리 |
|
||||
| item_variant | string | No | 옵션 |
|
||||
| coupon | string | No | 쿠폰 코드 |
|
||||
| discount | number | No | 할인 금액 |
|
||||
| index | number | No | 목록 위치 |
|
||||
|
||||
## Validation Rules
|
||||
|
||||
```javascript
|
||||
// ✅ Correct
|
||||
'price': 29000 // number
|
||||
'quantity': 1 // number
|
||||
'currency': 'KRW' // uppercase
|
||||
|
||||
// ❌ Wrong
|
||||
'price': '29000' // string
|
||||
'currency': 'krw' // lowercase
|
||||
```
|
||||
|
||||
### Array Limits
|
||||
- items[]: 최대 200개
|
||||
- 초과 시 분할 전송
|
||||
@@ -0,0 +1,130 @@
|
||||
# GTM Naming Conventions
|
||||
|
||||
일관된 GTM 컨테이너 관리를 위한 네이밍 규칙.
|
||||
|
||||
## Tag Naming
|
||||
|
||||
### Pattern
|
||||
```
|
||||
[Platform] - [Type] - [Description]
|
||||
```
|
||||
|
||||
### Examples
|
||||
| Platform | Type | Description | Tag Name |
|
||||
|----------|------|-------------|----------|
|
||||
| GA4 | Config | Main | GA4 - Config - Main |
|
||||
| GA4 | Event | purchase | GA4 - Event - purchase |
|
||||
| GAds | Conversion | Purchase | GAds - Conversion - Purchase |
|
||||
| Meta | Event | Purchase | Meta - Event - Purchase |
|
||||
| Kakao | Event | purchase | Kakao - Event - purchase |
|
||||
|
||||
## Trigger Naming
|
||||
|
||||
### Pattern
|
||||
```
|
||||
[Type] - [Condition] - [Context]
|
||||
```
|
||||
|
||||
### Type Codes
|
||||
| Code | Type | Example |
|
||||
|------|------|---------|
|
||||
| PV | Page View | PV - All Pages |
|
||||
| DL | DataLayer Event | DL - purchase |
|
||||
| Click | Click | Click - CTA Button |
|
||||
| Form | Form Submit | Form - Contact |
|
||||
| Scroll | Scroll Depth | Scroll - 75% |
|
||||
| Vis | Element Visibility | Vis - Video Player |
|
||||
|
||||
### Examples
|
||||
```
|
||||
PV - All Pages
|
||||
PV - Thank You Page
|
||||
DL - purchase
|
||||
DL - add_to_cart
|
||||
Click - CTA Button - Hero
|
||||
Form - Contact Form
|
||||
Scroll - 90%
|
||||
```
|
||||
|
||||
## Variable Naming
|
||||
|
||||
### Pattern
|
||||
```
|
||||
[Type] - [Name/Path]
|
||||
```
|
||||
|
||||
### Type Codes
|
||||
| Code | Type | Example |
|
||||
|------|------|---------|
|
||||
| DLV | DataLayer Variable | DLV - ecommerce.value |
|
||||
| CJS | Custom JavaScript | CJS - Item IDs Array |
|
||||
| Const | Constant | Const - GA4 Measurement ID |
|
||||
| LT | Lookup Table | LT - Page Type Mapping |
|
||||
| URL | URL Variable | URL - Path |
|
||||
| DOM | DOM Element | DOM - Product Title |
|
||||
|
||||
### Examples
|
||||
```
|
||||
DLV - event
|
||||
DLV - ecommerce.transaction_id
|
||||
DLV - ecommerce.items
|
||||
CJS - Items for Meta
|
||||
CJS - Formatted Price
|
||||
Const - GA4 Measurement ID
|
||||
Const - Meta Pixel ID
|
||||
LT - Payment Method Mapping
|
||||
```
|
||||
|
||||
## Folder Structure
|
||||
|
||||
```
|
||||
📁 01. Configuration
|
||||
📁 02. GA4 Events
|
||||
📁 03. Google Ads
|
||||
📁 04. Meta Pixel
|
||||
📁 05. Kakao Pixel
|
||||
📁 06. Other Platforms
|
||||
📁 07. Utilities
|
||||
📁 99. Deprecated
|
||||
```
|
||||
|
||||
## Built-in Variables to Enable
|
||||
|
||||
```
|
||||
Pages: ✅ Page URL, Path, Hostname, Referrer
|
||||
Utilities: ✅ Event, Container ID, Random Number
|
||||
Clicks: ✅ Element, Classes, ID, URL, Text
|
||||
Forms: ✅ Element, Classes, ID, URL, Text
|
||||
History: ✅ New/Old History Fragment/State
|
||||
Videos: ✅ All YouTube variables
|
||||
Scrolling: ✅ Depth Threshold, Units, Direction
|
||||
Visibility: ✅ Percent Visible, On-Screen Duration
|
||||
```
|
||||
|
||||
## Anti-patterns
|
||||
|
||||
```
|
||||
❌ Tag 1, New Tag, Test
|
||||
❌ GA4 purchase event (일관성 없음)
|
||||
❌ G4-E-Pch (과도한 약어)
|
||||
❌ Very Long Tag Name for Purchase Complete Event (너무 김)
|
||||
|
||||
✅ GA4 - Event - purchase
|
||||
✅ DL - purchase
|
||||
✅ CJS - Items for Meta
|
||||
```
|
||||
|
||||
## Version Notes
|
||||
|
||||
```
|
||||
v[Major].[Minor] - [Description]
|
||||
예: v12.1 - Added form_submit event
|
||||
|
||||
## Changes
|
||||
- Added:
|
||||
- Modified:
|
||||
- Removed:
|
||||
|
||||
## Reason
|
||||
[변경 이유]
|
||||
```
|
||||
215
custom-skills/22-gtm-guardian/code/references/phase6-audit.md
Normal file
215
custom-skills/22-gtm-guardian/code/references/phase6-audit.md
Normal file
@@ -0,0 +1,215 @@
|
||||
# Phase 6: Progressive Audit & Update
|
||||
|
||||
설정된 GTM Container에 대한 주기적 진단, 유효성 검증, 마이너 업데이트 및 태그 추가.
|
||||
|
||||
## Objectives
|
||||
|
||||
1. GTM 컨테이너 건강 상태 점검
|
||||
2. 태그 발화 및 데이터 정합성 검증
|
||||
3. 최신 요구사항 반영 업데이트
|
||||
4. D.intelligence GTM Toolkit 연계 자동화
|
||||
|
||||
## Audit Schedule
|
||||
|
||||
| Frequency | Scope | Trigger |
|
||||
|-----------|-------|---------|
|
||||
| Weekly | Tag firing validation | 자동 스케줄 |
|
||||
| Monthly | Full container review | 월간 리포트 |
|
||||
| Quarterly | Architecture review | 분기 회의 |
|
||||
| Ad-hoc | Issue investigation | 이슈 발생 시 |
|
||||
|
||||
## Audit Checklist
|
||||
|
||||
### 1. Container Health Check
|
||||
- [ ] 버전 히스토리 확인 (최근 변경사항)
|
||||
- [ ] 미사용 태그/트리거/변수 식별
|
||||
- [ ] 명명 규칙 준수 여부
|
||||
- [ ] 폴더 구조 정리 상태
|
||||
|
||||
### 2. Tag Firing Validation
|
||||
- [ ] 모든 P1 태그 정상 발화
|
||||
- [ ] 트리거 조건 정확성
|
||||
- [ ] 변수 값 정확성
|
||||
- [ ] 차단 트리거 작동
|
||||
|
||||
### 3. Data Quality
|
||||
- [ ] GA4 Realtime 데이터 확인
|
||||
- [ ] 전환 데이터 정합성
|
||||
- [ ] 파라미터 값 검증
|
||||
- [ ] 이상치 탐지
|
||||
|
||||
### 4. Platform Sync
|
||||
- [ ] GA4 ↔ GTM 동기화
|
||||
- [ ] Google Ads 전환 데이터
|
||||
- [ ] Meta Events Manager 상태
|
||||
- [ ] Kakao Pixel 상태
|
||||
|
||||
## D.intelligence GTM Toolkit Integration
|
||||
|
||||
### Repository
|
||||
```
|
||||
https://github.com/ourdigital/dintel-gtm-toolkit
|
||||
```
|
||||
|
||||
### Capabilities
|
||||
|
||||
| Feature | Description | Use Case |
|
||||
|---------|-------------|----------|
|
||||
| Container Analysis | JSON 파싱, 구조 분석 | 컨테이너 리뷰 |
|
||||
| Dependency Mapping | 태그↔트리거↔변수 관계 | 영향도 분석 |
|
||||
| Version Diff | 버전 간 변경사항 비교 | 변경 추적 |
|
||||
| Tag Validation | 발화 상태 자동 검증 | 정기 감사 |
|
||||
|
||||
### Integration Workflow
|
||||
|
||||
```
|
||||
1. GTM Container Export
|
||||
└── JSON 파일 다운로드
|
||||
|
||||
2. D.intel Toolkit Analysis
|
||||
├── python analyze_container.py container.json
|
||||
├── Dependency graph 생성
|
||||
└── Issue detection
|
||||
|
||||
3. Report Generation
|
||||
└── Markdown/HTML 리포트
|
||||
|
||||
4. GTM Guardian Update
|
||||
└── Notion에 리포트 저장
|
||||
```
|
||||
|
||||
### Sample Toolkit Commands
|
||||
|
||||
```bash
|
||||
# Container 분석
|
||||
python analyze_container.py GTM-XXXXXX.json --output report.md
|
||||
|
||||
# 버전 비교
|
||||
python diff_versions.py v1.json v2.json --output diff.md
|
||||
|
||||
# 태그 검증
|
||||
python validate_tags.py container.json --events events.csv
|
||||
|
||||
# 미사용 요소 탐지
|
||||
python find_unused.py container.json --type all
|
||||
```
|
||||
|
||||
## Audit Report Template
|
||||
|
||||
```markdown
|
||||
# GTM Audit Report
|
||||
|
||||
## Summary
|
||||
- **Container**: GTM-XXXXXX
|
||||
- **Audit Date**: YYYY-MM-DD
|
||||
- **Version Reviewed**: XX
|
||||
- **Overall Status**: ✅ Healthy / ⚠️ Needs Attention / ❌ Critical
|
||||
|
||||
## Findings
|
||||
|
||||
### ✅ Passing
|
||||
- [항목]
|
||||
|
||||
### ⚠️ Warnings
|
||||
| Issue | Impact | Recommendation |
|
||||
|-------|--------|----------------|
|
||||
|
||||
### ❌ Critical
|
||||
| Issue | Impact | Action Required |
|
||||
|-------|--------|-----------------|
|
||||
|
||||
## Tag Firing Status
|
||||
|
||||
| Tag | Expected | Actual | Status |
|
||||
|-----|----------|--------|--------|
|
||||
| GA4 - Event - purchase | Thank You | Thank You | ✅ |
|
||||
|
||||
## Data Quality Check
|
||||
|
||||
| Metric | Expected | Actual | Variance |
|
||||
|--------|----------|--------|----------|
|
||||
| Daily Purchases | ~50 | 48 | -4% |
|
||||
|
||||
## Recommendations
|
||||
1.
|
||||
2.
|
||||
|
||||
## Next Steps
|
||||
- [ ]
|
||||
- [ ]
|
||||
|
||||
## Appendix
|
||||
- Container JSON snapshot
|
||||
- D.intel Toolkit output
|
||||
```
|
||||
|
||||
## Update Procedures
|
||||
|
||||
### Minor Update (태그 수정)
|
||||
```
|
||||
1. 변경 필요 태그 식별
|
||||
2. Preview 모드에서 수정
|
||||
3. 테스트 완료
|
||||
4. Publish with version note
|
||||
5. Notion 문서 업데이트
|
||||
```
|
||||
|
||||
### Major Update (신규 태그 추가)
|
||||
```
|
||||
1. Phase 3-4 문서 업데이트
|
||||
2. DataLayer 요구사항 개발팀 전달
|
||||
3. GTM 태그/트리거/변수 설정
|
||||
4. QA 체크리스트 수행
|
||||
5. 단계적 배포
|
||||
6. Notion 문서 업데이트
|
||||
```
|
||||
|
||||
### Emergency Fix
|
||||
```
|
||||
1. 이슈 원인 파악
|
||||
2. 최소 변경으로 수정
|
||||
3. Publish (emergency version note)
|
||||
4. 근본 원인 분석
|
||||
5. 영구 수정 계획
|
||||
```
|
||||
|
||||
## Versioning Best Practices
|
||||
|
||||
### Version Naming
|
||||
```
|
||||
v[Major].[Minor] - [Description]
|
||||
예: v12.1 - Added form_submit event
|
||||
```
|
||||
|
||||
### Version Notes Template
|
||||
```
|
||||
## Changes
|
||||
- Added: [새로 추가된 항목]
|
||||
- Modified: [수정된 항목]
|
||||
- Removed: [삭제된 항목]
|
||||
|
||||
## Reason
|
||||
[변경 이유]
|
||||
|
||||
## Testing
|
||||
- [테스트 항목 및 결과]
|
||||
|
||||
## Rollback Plan
|
||||
[롤백 필요 시 절차]
|
||||
```
|
||||
|
||||
## Monitoring Setup
|
||||
|
||||
### GA4 Alerts
|
||||
- 일일 전환 수 급감 (>30%)
|
||||
- 세션 수 급감 (>50%)
|
||||
- 이벤트 수집 오류
|
||||
|
||||
### Custom Monitoring
|
||||
- DataLayer 오류 로깅
|
||||
- Tag Manager 오류 추적
|
||||
- 서버 사이드 태그 상태 (sGTM 시)
|
||||
|
||||
## Next Phase
|
||||
|
||||
주기적 감사 완료 후 → Phase 7: Lookup App (필요 시)
|
||||
@@ -0,0 +1,283 @@
|
||||
# Phase 7: Event Lookup & Parameter Library Web App
|
||||
|
||||
Google Apps Script를 활용한 Event Taxonomy Sheet 기반 업무 지원용 앱 배포.
|
||||
|
||||
## Objectives
|
||||
|
||||
1. Event Taxonomy 데이터 조회 앱
|
||||
2. 실시간 파라미터 참조 도구
|
||||
3. 비개발자용 Self-service 도구
|
||||
4. 팀 간 일관된 이벤트 정보 공유
|
||||
|
||||
## App Architecture
|
||||
|
||||
```
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ Google Sheets │────▶│ Apps Script │────▶│ Web App │
|
||||
│ (Taxonomy DB) │ │ (Backend) │ │ (Frontend) │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
## Google Sheets Data Source
|
||||
|
||||
### Required Sheets
|
||||
- Events Master
|
||||
- Parameters Reference
|
||||
- Custom Definitions
|
||||
- Platform Mapping
|
||||
|
||||
### Column Requirements
|
||||
→ Phase 4 참조: [phase4-taxonomy.md](phase4-taxonomy.md)
|
||||
|
||||
## Apps Script Setup
|
||||
|
||||
### 1. Project Creation
|
||||
```
|
||||
1. Google Sheets 열기
|
||||
2. Extensions > Apps Script
|
||||
3. 프로젝트 이름 설정
|
||||
```
|
||||
|
||||
### 2. Core Functions
|
||||
|
||||
#### Data Retrieval
|
||||
```javascript
|
||||
function getEventsData() {
|
||||
const sheet = SpreadsheetApp.getActiveSpreadsheet()
|
||||
.getSheetByName('Events Master');
|
||||
const data = sheet.getDataRange().getValues();
|
||||
const headers = data[0];
|
||||
|
||||
return data.slice(1).map(row => {
|
||||
const obj = {};
|
||||
headers.forEach((header, i) => {
|
||||
obj[header] = row[i];
|
||||
});
|
||||
return obj;
|
||||
});
|
||||
}
|
||||
|
||||
function getParametersData() {
|
||||
const sheet = SpreadsheetApp.getActiveSpreadsheet()
|
||||
.getSheetByName('Parameters Reference');
|
||||
const data = sheet.getDataRange().getValues();
|
||||
const headers = data[0];
|
||||
|
||||
return data.slice(1).map(row => {
|
||||
const obj = {};
|
||||
headers.forEach((header, i) => {
|
||||
obj[header] = row[i];
|
||||
});
|
||||
return obj;
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### Search Function
|
||||
```javascript
|
||||
function searchEvents(query) {
|
||||
const events = getEventsData();
|
||||
const searchTerm = query.toLowerCase();
|
||||
|
||||
return events.filter(event =>
|
||||
event.event_name.toLowerCase().includes(searchTerm) ||
|
||||
event.event_category.toLowerCase().includes(searchTerm) ||
|
||||
event.notes.toLowerCase().includes(searchTerm)
|
||||
);
|
||||
}
|
||||
|
||||
function getEventDetails(eventName) {
|
||||
const events = getEventsData();
|
||||
const params = getParametersData();
|
||||
|
||||
const event = events.find(e => e.event_name === eventName);
|
||||
if (!event) return null;
|
||||
|
||||
const eventParams = event.parameters.split(',').map(p => p.trim());
|
||||
const paramDetails = params.filter(p =>
|
||||
eventParams.includes(p.parameter_name)
|
||||
);
|
||||
|
||||
return {
|
||||
event: event,
|
||||
parameters: paramDetails
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Web App Handler
|
||||
|
||||
```javascript
|
||||
function doGet(e) {
|
||||
return HtmlService.createHtmlOutputFromFile('index')
|
||||
.setTitle('GTM Event Lookup')
|
||||
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
|
||||
}
|
||||
|
||||
function doPost(e) {
|
||||
const action = e.parameter.action;
|
||||
|
||||
switch(action) {
|
||||
case 'search':
|
||||
return ContentService.createTextOutput(
|
||||
JSON.stringify(searchEvents(e.parameter.query))
|
||||
).setMimeType(ContentService.MimeType.JSON);
|
||||
|
||||
case 'details':
|
||||
return ContentService.createTextOutput(
|
||||
JSON.stringify(getEventDetails(e.parameter.eventName))
|
||||
).setMimeType(ContentService.MimeType.JSON);
|
||||
|
||||
default:
|
||||
return ContentService.createTextOutput(
|
||||
JSON.stringify({error: 'Invalid action'})
|
||||
).setMimeType(ContentService.MimeType.JSON);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. HTML Frontend (index.html)
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<base target="_top">
|
||||
<style>
|
||||
body { font-family: 'Roboto', sans-serif; padding: 20px; max-width: 800px; margin: 0 auto; }
|
||||
.search-box { width: 100%; padding: 12px; font-size: 16px; margin-bottom: 20px; }
|
||||
.event-card { border: 1px solid #ddd; padding: 16px; margin: 10px 0; border-radius: 8px; }
|
||||
.event-name { font-size: 18px; font-weight: bold; color: #1a73e8; }
|
||||
.param-badge { background: #e8f0fe; color: #1967d2; padding: 4px 8px; border-radius: 4px; margin: 2px; display: inline-block; }
|
||||
.category { color: #5f6368; font-size: 14px; }
|
||||
.priority-p1 { border-left: 4px solid #ea4335; }
|
||||
.priority-p2 { border-left: 4px solid #fbbc04; }
|
||||
.priority-p3 { border-left: 4px solid #34a853; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>🏷️ GTM Event Lookup</h1>
|
||||
<input type="text" class="search-box" id="searchInput" placeholder="이벤트명 또는 카테고리 검색...">
|
||||
<div id="results"></div>
|
||||
|
||||
<script>
|
||||
const searchInput = document.getElementById('searchInput');
|
||||
const results = document.getElementById('results');
|
||||
|
||||
searchInput.addEventListener('input', debounce(function() {
|
||||
const query = this.value;
|
||||
if (query.length < 2) {
|
||||
results.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
google.script.run
|
||||
.withSuccessHandler(displayResults)
|
||||
.searchEvents(query);
|
||||
}, 300));
|
||||
|
||||
function displayResults(events) {
|
||||
results.innerHTML = events.map(event => `
|
||||
<div class="event-card priority-${event.priority.toLowerCase()}">
|
||||
<div class="event-name">${event.event_name}</div>
|
||||
<div class="category">${event.event_category} | ${event.priority}</div>
|
||||
<div style="margin-top: 10px;">
|
||||
${event.parameters.split(',').map(p =>
|
||||
`<span class="param-badge">${p.trim()}</span>`
|
||||
).join('')}
|
||||
</div>
|
||||
<div style="margin-top: 10px; color: #5f6368;">${event.notes}</div>
|
||||
</div>
|
||||
`).join('');
|
||||
}
|
||||
|
||||
function debounce(func, wait) {
|
||||
let timeout;
|
||||
return function(...args) {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => func.apply(this, args), wait);
|
||||
};
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
## Deployment
|
||||
|
||||
### 1. Deploy as Web App
|
||||
```
|
||||
1. Deploy > New deployment
|
||||
2. Type: Web app
|
||||
3. Execute as: Me
|
||||
4. Access: Anyone within organization (또는 Anyone)
|
||||
5. Deploy
|
||||
```
|
||||
|
||||
### 2. Get Web App URL
|
||||
```
|
||||
배포 후 제공되는 URL 복사
|
||||
https://script.google.com/macros/s/[ID]/exec
|
||||
```
|
||||
|
||||
### 3. Share with Team
|
||||
- URL을 Notion/Slack에 공유
|
||||
- 북마크 권장
|
||||
|
||||
## Features Roadmap
|
||||
|
||||
### Phase 1 (MVP)
|
||||
- [x] 이벤트 검색
|
||||
- [x] 파라미터 조회
|
||||
- [x] 우선순위 필터
|
||||
|
||||
### Phase 2
|
||||
- [ ] DataLayer 코드 스니펫 복사
|
||||
- [ ] 플랫폼별 코드 예시
|
||||
- [ ] 최근 조회 히스토리
|
||||
|
||||
### Phase 3
|
||||
- [ ] 이벤트 추가/수정 폼
|
||||
- [ ] 변경 이력 추적
|
||||
- [ ] Slack 알림 연동
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Data Update
|
||||
1. Google Sheets 원본 데이터 수정
|
||||
2. Web App 자동 반영 (실시간)
|
||||
|
||||
### Code Update
|
||||
1. Apps Script 수정
|
||||
2. Deploy > Manage deployments
|
||||
3. New version 배포
|
||||
|
||||
### Backup
|
||||
- Google Sheets 자동 버전 히스토리
|
||||
- 주기적 수동 백업 권장
|
||||
|
||||
## Access Control
|
||||
|
||||
| Role | Access Level |
|
||||
|------|--------------|
|
||||
| Admin | 시트 편집 + 스크립트 수정 |
|
||||
| Editor | 시트 편집 |
|
||||
| Viewer | Web App 조회만 |
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Issue | Solution |
|
||||
|-------|----------|
|
||||
| 앱 로딩 느림 | 데이터 캐싱 구현 |
|
||||
| 검색 결과 없음 | 검색어 확인, 데이터 존재 확인 |
|
||||
| 권한 오류 | 배포 설정에서 접근 권한 확인 |
|
||||
| 데이터 미반영 | 시트 새로고침, 캐시 클리어 |
|
||||
|
||||
## Integration with Notion
|
||||
|
||||
Web App URL을 Notion에 embed:
|
||||
```
|
||||
/embed [Web App URL]
|
||||
```
|
||||
|
||||
또는 iframe으로 직접 삽입.
|
||||
@@ -0,0 +1,125 @@
|
||||
# Platform Event Mapping Reference
|
||||
|
||||
GA4, Google Ads, Meta Pixel, Kakao Pixel 간 이벤트 매핑.
|
||||
|
||||
## E-commerce Events
|
||||
|
||||
| User Action | GA4 | Meta | Kakao | Google Ads |
|
||||
|-------------|-----|------|-------|------------|
|
||||
| 상품 목록 조회 | view_item_list | ViewContent | viewContent | - |
|
||||
| 상품 상세 조회 | view_item | ViewContent | viewContent | - |
|
||||
| 상품 검색 | search | Search | search | - |
|
||||
| 장바구니 담기 | add_to_cart | AddToCart | addToCart | - |
|
||||
| 위시리스트 | add_to_wishlist | AddToWishlist | addToWishlist | - |
|
||||
| 결제 시작 | begin_checkout | InitiateCheckout | beginCheckout | - |
|
||||
| 배송정보 입력 | add_shipping_info | - | - | - |
|
||||
| 결제정보 입력 | add_payment_info | AddPaymentInfo | addPaymentInfo | - |
|
||||
| 구매 완료 | purchase | Purchase | purchase | purchase |
|
||||
|
||||
## Lead Gen Events
|
||||
|
||||
| User Action | GA4 | Meta | Kakao | Google Ads |
|
||||
|-------------|-----|------|-------|------------|
|
||||
| 회원가입 | sign_up | CompleteRegistration | completeRegistration | sign_up |
|
||||
| 로그인 | login | - | login | - |
|
||||
| 리드 생성 | generate_lead | Lead | participation | submit_lead_form |
|
||||
|
||||
## Engagement Events
|
||||
|
||||
| User Action | GA4 | Meta | Kakao | Google Ads |
|
||||
|-------------|-----|------|-------|------------|
|
||||
| 페이지 조회 | page_view | PageView | pageView | page_view |
|
||||
| 검색 | search | Search | search | - |
|
||||
| 공유 | share | - | - | - |
|
||||
|
||||
## Parameter Transformation
|
||||
|
||||
### GA4 → Meta
|
||||
```javascript
|
||||
// GA4 items[] → Meta content_ids[]
|
||||
const contentIds = items.map(item => item.item_id);
|
||||
|
||||
// Meta Purchase
|
||||
fbq('track', 'Purchase', {
|
||||
content_ids: contentIds,
|
||||
content_type: 'product',
|
||||
value: ecommerce.value,
|
||||
currency: 'KRW',
|
||||
num_items: items.length
|
||||
});
|
||||
```
|
||||
|
||||
### GA4 → Kakao
|
||||
```javascript
|
||||
// GA4 items[] → Kakao products[]
|
||||
const products = items.map(item => ({
|
||||
id: item.item_id,
|
||||
name: item.item_name,
|
||||
price: item.price,
|
||||
quantity: item.quantity
|
||||
}));
|
||||
|
||||
// Kakao purchase
|
||||
kakaoPixel('PIXEL_ID').purchase({
|
||||
total_price: ecommerce.value,
|
||||
currency: 'KRW',
|
||||
products: products
|
||||
});
|
||||
```
|
||||
|
||||
## GTM Variables
|
||||
|
||||
### CJS - Item IDs for Meta
|
||||
```javascript
|
||||
function() {
|
||||
var items = {{DLV - ecommerce.items}} || [];
|
||||
return items.map(function(item) {
|
||||
return item.item_id;
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### CJS - Products for Kakao
|
||||
```javascript
|
||||
function() {
|
||||
var items = {{DLV - ecommerce.items}} || [];
|
||||
return items.map(function(item) {
|
||||
return {
|
||||
id: item.item_id,
|
||||
name: item.item_name,
|
||||
price: item.price,
|
||||
quantity: item.quantity
|
||||
};
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
## Deduplication
|
||||
|
||||
### Event ID Pattern
|
||||
```javascript
|
||||
var eventId = 'evt_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
||||
|
||||
// Client-side
|
||||
fbq('track', 'Purchase', {...}, {eventID: eventId});
|
||||
|
||||
// Server-side (CAPI)
|
||||
// 동일한 eventId 사용 → Meta 자동 중복 제거
|
||||
```
|
||||
|
||||
## Platform-specific Notes
|
||||
|
||||
### Meta Pixel
|
||||
- content_type: 'product' (상품) / 'product_group' (변형)
|
||||
- currency: ISO 4217 필수
|
||||
- value: 숫자 (소수점 가능)
|
||||
|
||||
### Kakao Pixel
|
||||
- Server-side 미지원 (Client-only)
|
||||
- products[]: 최대 10개 권장
|
||||
- total_price: 숫자
|
||||
|
||||
### Google Ads
|
||||
- Enhanced Conversions 권장
|
||||
- transaction_id 필수 (중복 제거용)
|
||||
- value: KRW 정수
|
||||
149
custom-skills/22-gtm-guardian/code/references/qa-checklist.md
Normal file
149
custom-skills/22-gtm-guardian/code/references/qa-checklist.md
Normal file
@@ -0,0 +1,149 @@
|
||||
# GTM Implementation QA Checklist
|
||||
|
||||
태깅 구현 품질 검증 체크리스트.
|
||||
|
||||
## 1. Pre-Implementation
|
||||
|
||||
### Documentation
|
||||
- [ ] Tagging Plan 승인 완료
|
||||
- [ ] DataLayer 스키마 개발팀 공유
|
||||
- [ ] 이벤트 택소노미 합의 완료
|
||||
|
||||
### Access
|
||||
- [ ] GTM 컨테이너 접근 권한
|
||||
- [ ] GA4 속성 접근 권한
|
||||
- [ ] 광고 플랫폼 접근 권한
|
||||
|
||||
### Tools
|
||||
- [ ] GTM Preview 모드 정상
|
||||
- [ ] GA4 DebugView 활성화
|
||||
- [ ] Chrome DevTools 준비
|
||||
|
||||
## 2. DataLayer Validation
|
||||
|
||||
### Base Setup
|
||||
- [ ] GTM 스니펫 이전 dataLayer 초기화
|
||||
- [ ] 페이지 로드 시 기본 데이터 push
|
||||
- [ ] pageType, userId 등 기본 변수 존재
|
||||
|
||||
### Data Types
|
||||
- [ ] 숫자 값이 Number 타입
|
||||
- [ ] 금액에 통화 코드 포함 (KRW)
|
||||
- [ ] transaction_id 유니크
|
||||
|
||||
### E-commerce
|
||||
- [ ] ecommerce: null 선행 push
|
||||
- [ ] items[] 배열 구조 정확
|
||||
- [ ] 필수 파라미터 완비
|
||||
|
||||
### Console Check
|
||||
```javascript
|
||||
console.log(window.dataLayer);
|
||||
dataLayer.filter(e => e.event === 'purchase');
|
||||
```
|
||||
|
||||
## 3. Tag Firing
|
||||
|
||||
### GA4
|
||||
| Tag | Trigger | Status |
|
||||
|-----|---------|--------|
|
||||
| Config | All Pages | [ ] |
|
||||
| view_item | Product page | [ ] |
|
||||
| add_to_cart | Add button | [ ] |
|
||||
| begin_checkout | Checkout start | [ ] |
|
||||
| purchase | Thank you | [ ] |
|
||||
|
||||
### Google Ads
|
||||
| Conversion | Trigger | Status |
|
||||
|------------|---------|--------|
|
||||
| Purchase | DL - purchase | [ ] |
|
||||
| Lead | DL - generate_lead | [ ] |
|
||||
|
||||
### Meta Pixel
|
||||
| Event | Trigger | Status |
|
||||
|-------|---------|--------|
|
||||
| PageView | All Pages | [ ] |
|
||||
| ViewContent | Product | [ ] |
|
||||
| AddToCart | Add | [ ] |
|
||||
| Purchase | Thank you | [ ] |
|
||||
|
||||
### Kakao Pixel
|
||||
| Event | Trigger | Status |
|
||||
|-------|---------|--------|
|
||||
| pageView | All Pages | [ ] |
|
||||
| purchase | Thank you | [ ] |
|
||||
|
||||
## 4. Network Validation
|
||||
|
||||
### Endpoints
|
||||
```
|
||||
GA4: google-analytics.com/g/collect
|
||||
GAds: googleads.g.doubleclick.net/pagead/conversion/
|
||||
Meta: facebook.com/tr/
|
||||
```
|
||||
|
||||
### Check Points
|
||||
- [ ] 요청 전송됨
|
||||
- [ ] 파라미터 정확
|
||||
- [ ] 응답 성공 (200/204)
|
||||
|
||||
## 5. Cross-browser Testing
|
||||
|
||||
### Desktop
|
||||
- [ ] Chrome
|
||||
- [ ] Safari
|
||||
- [ ] Firefox
|
||||
- [ ] Edge
|
||||
|
||||
### Mobile
|
||||
- [ ] iOS Safari
|
||||
- [ ] iOS Chrome
|
||||
- [ ] Android Chrome
|
||||
|
||||
## 6. Data Validation (Platform)
|
||||
|
||||
### GA4
|
||||
- [ ] Realtime 보고서 이벤트 표시
|
||||
- [ ] 파라미터 정확히 수집
|
||||
- [ ] E-commerce 보고서 정확
|
||||
|
||||
### Google Ads
|
||||
- [ ] 전환 액션 데이터 유입
|
||||
- [ ] 전환 값 정확
|
||||
|
||||
### Meta
|
||||
- [ ] Events Manager 수신 확인
|
||||
- [ ] Event match quality 확인
|
||||
|
||||
## 7. Edge Cases
|
||||
|
||||
- [ ] 빈 장바구니 결제 시작 처리
|
||||
- [ ] 0개 구매 처리
|
||||
- [ ] 쿠폰 없는 구매
|
||||
- [ ] 게스트 체크아웃
|
||||
- [ ] 새로고침 시 중복 방지
|
||||
- [ ] 뒤로가기 시 처리
|
||||
|
||||
## 8. Performance & Privacy
|
||||
|
||||
### Performance
|
||||
- [ ] 태그 로딩이 렌더링 차단 안 함
|
||||
- [ ] 비동기 로딩
|
||||
|
||||
### Privacy
|
||||
- [ ] 동의 없이 태그 미발화 (CMP 시)
|
||||
- [ ] PII 직접 수집 없음
|
||||
|
||||
## Sign-off
|
||||
|
||||
| Role | Name | Date | ✓ |
|
||||
|------|------|------|---|
|
||||
| QA Lead | | | |
|
||||
| Analytics Lead | | | |
|
||||
| Dev Lead | | | |
|
||||
|
||||
## Issues Log
|
||||
|
||||
| # | Issue | Severity | Status |
|
||||
|---|-------|----------|--------|
|
||||
| 1 | | High/Med/Low | Open/Resolved |
|
||||
32
custom-skills/22-gtm-guardian/code/scripts/README.md
Normal file
32
custom-skills/22-gtm-guardian/code/scripts/README.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# GTM Guardian Scripts
|
||||
|
||||
이 디렉토리는 GTM Guardian Code 스킬의 자동화 스크립트 저장소입니다.
|
||||
|
||||
## D.intelligence GTM Toolkit
|
||||
|
||||
메인 분석 도구는 별도 레포지토리에서 관리됩니다:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ourdigital/dintel-gtm-toolkit.git
|
||||
```
|
||||
|
||||
## 사용법
|
||||
|
||||
GTM Toolkit 클론 후:
|
||||
|
||||
```bash
|
||||
# Container 분석
|
||||
python analyze_container.py GTM-XXXXXX.json --output report.md
|
||||
|
||||
# 버전 비교
|
||||
python diff_versions.py v1.json v2.json --output diff.md
|
||||
|
||||
# 미사용 요소 탐지
|
||||
python find_unused.py container.json --type all
|
||||
```
|
||||
|
||||
## 향후 추가 예정
|
||||
|
||||
- GTM Container Export 자동화 스크립트
|
||||
- Notion 리포트 업로드 스크립트
|
||||
- 정기 감사 자동화 (cron job)
|
||||
Reference in New Issue
Block a user