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:
2025-12-31 19:59:22 +09:00
parent c6ab33726f
commit b859d0a266
22 changed files with 3214 additions and 0 deletions

View 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**: 한국 결제 수단 (카카오페이, 네이버페이, 토스) 지원

View File

@@ -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개
- 초과 시 분할 전송

View File

@@ -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
[변경 이유]
```

View 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 (필요 시)

View File

@@ -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으로 직접 삽입.

View File

@@ -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 정수

View 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 |

View 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)