refactor(skills): Restructure skills to dual-platform architecture

Major refactoring of ourdigital-custom-skills with new numbering system:

## Structure Changes
- Each skill now has code/ (Claude Code) and desktop/ (Claude Desktop) versions
- New progressive numbering: 01-09 General, 10-19 SEO, 20-29 GTM, 30-39 OurDigital, 40-49 Jamie

## Skill Reorganization
- 01-notion-organizer (from 02)
- 10-18: SEO tools split into focused skills (technical, on-page, local, schema, vitals, gsc, gateway)
- 20-21: GTM audit and manager
- 30-32: OurDigital designer, research, presentation
- 40-41: Jamie brand editor and audit

## New Files
- .claude/commands/: Slash command definitions for all skills
- CLAUDE.md: Updated with new skill structure documentation
- REFACTORING_PLAN.md: Migration documentation
- COMPATIBILITY_REPORT.md, SKILLS_COMPARISON.md: Analysis docs

## Removed
- Old skill directories (02-05, 10-14, 20-21 old numbering)
- Consolidated into new structure with _archive/ for reference

🤖 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-22 01:58:24 +09:00
parent 214247ace2
commit eea49f9f8c
251 changed files with 12308 additions and 102 deletions

View File

@@ -0,0 +1,65 @@
# CLAUDE.md
## Overview
SEO gateway page strategist for Korean medical/service websites. Creates keyword strategies, content architecture, and technical SEO plans.
## Quick Start
```bash
pip install -r scripts/requirements.txt
# Keyword analysis
python scripts/keyword_analyzer.py --topic "눈 성형" --market "강남"
```
## Scripts
| Script | Purpose |
|--------|---------|
| `keyword_analyzer.py` | Analyze keywords, search volume, competitor gaps |
## Keyword Analyzer
```bash
# Basic analysis
python scripts/keyword_analyzer.py --topic "눈 성형"
# With location targeting
python scripts/keyword_analyzer.py --topic "눈 성형" --market "강남" --output strategy.json
# Competitor analysis
python scripts/keyword_analyzer.py --topic "눈 성형" --competitors url1,url2
```
## Output
Generates strategic document with:
- Primary keyword + monthly search volume
- LSI keywords (7-10)
- User intent distribution
- Competitor gap analysis
- Content architecture (H1-H3 structure)
- Technical SEO checklist
## Templates
See `templates/` for:
- `keyword-research-template.md`
- `content-architecture-template.md`
- `seo-checklist-template.md`
## Workflow
1. Run keyword analyzer for target topic
2. Review search volume and intent data
3. Use output to plan content architecture
4. Hand off to `18-seo-gateway-builder` for content generation
## Configuration
```bash
# Optional: API keys for enhanced data
GOOGLE_API_KEY=xxx
NAVER_API_KEY=xxx
```

View File

@@ -0,0 +1,334 @@
#!/usr/bin/env python3
"""
Keyword Analyzer for SEO Gateway Pages
Analyzes keywords and generates SEO strategy recommendations
"""
import json
from typing import Dict, List, Tuple
from dataclasses import dataclass
from datetime import datetime
@dataclass
class KeywordData:
"""Data structure for keyword information"""
keyword: str
search_volume: int
difficulty: float
intent: str
cpc: float = 0.0
trend: str = "stable"
class KeywordAnalyzer:
"""Analyzes keywords for SEO gateway pages"""
def __init__(self, primary_keyword: str):
self.primary_keyword = primary_keyword
self.results = {
"primary": None,
"lsi": [],
"long_tail": [],
"questions": [],
"intent_distribution": {},
"recommendations": []
}
def analyze_primary_keyword(self) -> KeywordData:
"""
Analyzes the primary keyword
In production, this would call actual keyword research APIs
"""
# Simulated data - replace with actual API calls
keyword_data = {
"눈 성형": {"volume": 12000, "difficulty": 65, "intent": "informational", "cpc": 2500},
"이마 성형": {"volume": 5500, "difficulty": 55, "intent": "informational", "cpc": 3000},
"동안 성형": {"volume": 8000, "difficulty": 70, "intent": "comparative", "cpc": 2800},
}
data = keyword_data.get(self.primary_keyword, {
"volume": 1000,
"difficulty": 50,
"intent": "informational",
"cpc": 1000
})
self.results["primary"] = KeywordData(
keyword=self.primary_keyword,
search_volume=data["volume"],
difficulty=data["difficulty"],
intent=data["intent"],
cpc=data["cpc"]
)
return self.results["primary"]
def generate_lsi_keywords(self) -> List[KeywordData]:
"""Generates LSI (Latent Semantic Indexing) keywords"""
lsi_patterns = {
"눈 성형": [
("쌍꺼풀 수술", 8000, "transactional"),
("눈매교정", 5500, "informational"),
("앞트임", 4000, "informational"),
("뒤트임", 3500, "informational"),
("눈 성형 비용", 2000, "comparative"),
("눈 성형 부작용", 1500, "informational"),
("눈 성형 회복기간", 1800, "informational"),
("눈 성형 전후", 3000, "comparative"),
("남자 눈 성형", 2500, "informational"),
("눈 성형 잘하는곳", 2200, "comparative")
],
"이마 성형": [
("이마거상술", 3000, "informational"),
("이마축소술", 2500, "informational"),
("헤어라인교정", 4000, "transactional"),
("이마 성형 비용", 1200, "comparative"),
("이마 보톡스", 6000, "transactional"),
("M자 탈모 수술", 5000, "informational"),
("이마 필러", 4500, "transactional"),
("이마 성형 부작용", 800, "informational"),
("이마 리프팅", 3500, "comparative"),
("이마 주름 제거", 2800, "transactional")
],
"동안 성형": [
("안면 리프팅", 7000, "transactional"),
("실리프팅", 9000, "transactional"),
("보톡스 시술", 15000, "transactional"),
("필러 시술", 12000, "transactional"),
("동안 성형 비용", 2500, "comparative"),
("울쎄라", 8000, "comparative"),
("써마지", 6500, "comparative"),
("동안 시술 종류", 1800, "informational"),
("주름 제거 시술", 4000, "transactional"),
("동안 성형 추천", 2200, "comparative")
]
}
lsi_list = lsi_patterns.get(self.primary_keyword, [
(f"{self.primary_keyword} 비용", 1000, "comparative"),
(f"{self.primary_keyword} 부작용", 800, "informational"),
(f"{self.primary_keyword} 후기", 1200, "comparative"),
])
for keyword, volume, intent in lsi_list:
self.results["lsi"].append(KeywordData(
keyword=keyword,
search_volume=volume,
difficulty=45 + (volume/1000), # Simple difficulty calculation
intent=intent
))
return self.results["lsi"]
def generate_long_tail_keywords(self) -> List[str]:
"""Generates long-tail keyword variations"""
location_modifiers = ["강남", "신사", "청담", "압구정", "서울"]
action_modifiers = ["잘하는곳", "추천", "유명한", "전문", "비용"]
long_tails = []
for location in location_modifiers:
long_tails.append(f"{location} {self.primary_keyword}")
for action in action_modifiers[:2]: # Limit combinations
long_tails.append(f"{location} {self.primary_keyword} {action}")
self.results["long_tail"] = long_tails
return long_tails
def generate_question_keywords(self) -> List[str]:
"""Generates question-based keywords for featured snippets"""
question_templates = [
f"{self.primary_keyword} 비용은 얼마인가요?",
f"{self.primary_keyword} 회복기간은 얼마나 걸리나요?",
f"{self.primary_keyword} 부작용이 있나요?",
f"{self.primary_keyword} 통증이 심한가요?",
f"{self.primary_keyword} 효과는 얼마나 지속되나요?",
f"{self.primary_keyword} 나이 제한이 있나요?",
f"{self.primary_keyword} 후 주의사항은 무엇인가요?"
]
self.results["questions"] = question_templates
return question_templates
def calculate_intent_distribution(self) -> Dict[str, float]:
"""Calculates user intent distribution across keywords"""
intent_counts = {
"informational": 0,
"comparative": 0,
"transactional": 0,
"navigational": 0
}
# Count primary keyword intent
if self.results["primary"]:
intent_counts[self.results["primary"].intent] += self.results["primary"].search_volume
# Count LSI keyword intents
for kw in self.results["lsi"]:
intent_counts[kw.intent] += kw.search_volume
# Calculate percentages
total_volume = sum(intent_counts.values())
if total_volume > 0:
self.results["intent_distribution"] = {
intent: round((count/total_volume) * 100, 1)
for intent, count in intent_counts.items()
if count > 0
}
return self.results["intent_distribution"]
def generate_recommendations(self) -> List[str]:
"""Generates SEO recommendations based on analysis"""
recommendations = []
# Based on search volume
if self.results["primary"] and self.results["primary"].search_volume > 10000:
recommendations.append("High search volume detected - prioritize this page for development")
# Based on intent distribution
intent_dist = self.results["intent_distribution"]
if intent_dist.get("informational", 0) > 50:
recommendations.append("Focus on educational content and comprehensive guides")
if intent_dist.get("comparative", 0) > 30:
recommendations.append("Include comparison tables and competitive differentiators")
if intent_dist.get("transactional", 0) > 20:
recommendations.append("Optimize conversion elements and CTAs above the fold")
# Based on competition
if self.results["primary"] and self.results["primary"].difficulty > 60:
recommendations.append("High competition - invest in quality content and backlinks")
recommendations.append("Target long-tail keywords for quicker wins")
# Question keywords
if len(self.results["questions"]) > 5:
recommendations.append("Implement FAQ schema markup for featured snippets")
self.results["recommendations"] = recommendations
return recommendations
def export_analysis(self, filename: str = None) -> str:
"""Exports the analysis results to JSON"""
if not filename:
filename = f"keyword_analysis_{self.primary_keyword.replace(' ', '_')}_{datetime.now().strftime('%Y%m%d')}.json"
export_data = {
"analysis_date": datetime.now().isoformat(),
"primary_keyword": self.primary_keyword,
"primary_data": {
"keyword": self.results["primary"].keyword,
"search_volume": self.results["primary"].search_volume,
"difficulty": self.results["primary"].difficulty,
"intent": self.results["primary"].intent
} if self.results["primary"] else None,
"lsi_keywords": [
{
"keyword": kw.keyword,
"volume": kw.search_volume,
"intent": kw.intent
} for kw in self.results["lsi"]
],
"long_tail_keywords": self.results["long_tail"],
"question_keywords": self.results["questions"],
"intent_distribution": self.results["intent_distribution"],
"recommendations": self.results["recommendations"]
}
with open(filename, 'w', encoding='utf-8') as f:
json.dump(export_data, f, ensure_ascii=False, indent=2)
return filename
def generate_report(self) -> str:
"""Generates a formatted text report"""
report = f"""
# Keyword Analysis Report
Generated: {datetime.now().strftime('%Y-%m-%d %H:%M')}
## Primary Keyword: {self.primary_keyword}
- Search Volume: {self.results['primary'].search_volume:,}
- Difficulty: {self.results['primary'].difficulty}/100
- Primary Intent: {self.results['primary'].intent.capitalize()}
## LSI Keywords (Top 10)
"""
for i, kw in enumerate(self.results['lsi'][:10], 1):
report += f"{i}. {kw.keyword} - Volume: {kw.search_volume:,} ({kw.intent})\n"
report += f"\n## User Intent Distribution\n"
for intent, percentage in self.results['intent_distribution'].items():
report += f"- {intent.capitalize()}: {percentage}%\n"
report += f"\n## Long-tail Opportunities\n"
for keyword in self.results['long_tail'][:5]:
report += f"- {keyword}\n"
report += f"\n## Question Keywords (FAQ Optimization)\n"
for question in self.results['questions'][:5]:
report += f"- {question}\n"
report += f"\n## Strategic Recommendations\n"
for i, rec in enumerate(self.results['recommendations'], 1):
report += f"{i}. {rec}\n"
return report
def main():
"""Main execution function"""
import argparse
parser = argparse.ArgumentParser(
description='Analyze keywords for SEO gateway page strategy',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog='''
Examples:
python keyword_analyzer.py --topic "눈 성형"
python keyword_analyzer.py --topic "이마 성형" --market "강남"
python keyword_analyzer.py --topic "동안 성형" --output strategy.json
'''
)
parser.add_argument('--topic', '-t', required=True,
help='Primary keyword to analyze (e.g., "눈 성형")')
parser.add_argument('--market', '-m', default=None,
help='Target market/location (e.g., "강남")')
parser.add_argument('--output', '-o', default=None,
help='Output JSON file path')
parser.add_argument('--competitors', '-c', default=None,
help='Comma-separated competitor URLs for analysis')
args = parser.parse_args()
keyword = args.topic
if args.market:
keyword = f"{args.market} {args.topic}"
print(f"Analyzing keyword: {keyword}")
print("-" * 50)
analyzer = KeywordAnalyzer(keyword)
# Run analysis
analyzer.analyze_primary_keyword()
analyzer.generate_lsi_keywords()
analyzer.generate_long_tail_keywords()
analyzer.generate_question_keywords()
analyzer.calculate_intent_distribution()
analyzer.generate_recommendations()
# Generate and print report
report = analyzer.generate_report()
print(report)
# Export to JSON
filename = analyzer.export_analysis(args.output)
print(f"\nAnalysis exported to: {filename}")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,25 @@
# Python dependencies for SEO Gateway Page Strategist scripts
# Install with: pip install -r requirements.txt
# Core dependencies
requests>=2.28.0
beautifulsoup4>=4.11.0
pandas>=1.5.0
numpy>=1.23.0
# For API integrations (optional)
google-api-python-client>=2.70.0
pytrends>=4.9.0
# For data visualization (optional)
matplotlib>=3.6.0
seaborn>=0.12.0
# For export formats
openpyxl>=3.0.0
jinja2>=3.1.0
# Development tools
pytest>=7.2.0
black>=22.0.0
pylint>=2.15.0

View File

@@ -0,0 +1,160 @@
# Content Architecture Template
## Page Hierarchy Structure
```
[Page URL: /service-name]
├── H1: [Primary Keyword-Optimized Headline]
│ Example: "강남 눈 성형 전문의가 만드는 자연스러운 눈매"
│ Word Count Target: 15-25 characters
│ Keyword Placement: Primary keyword at beginning
├── Hero Section [Above Fold]
│ ├── Value Proposition (30-50 words)
│ │ └── Keywords: Primary + 1 LSI
│ ├── Trust Signals (3-5 items)
│ │ ├── Certification badges
│ │ ├── Years of experience
│ │ └── Success cases number
│ └── Primary CTA
│ └── Text: "무료 상담 신청하기"
├── H2: [Service Name] 이란? [Problem/Solution Framework]
│ Word Count: 200-300 words
│ Keywords: Primary (1x), LSI (2-3x)
│ ├── H3: 이런 고민이 있으신가요? [Pain Points]
│ │ ├── Pain point 1 (include LSI keyword)
│ │ ├── Pain point 2 (include LSI keyword)
│ │ └── Pain point 3 (include LSI keyword)
│ └── H3: [Clinic Name]의 솔루션 [Benefits]
│ ├── Benefit 1 (address pain point 1)
│ ├── Benefit 2 (address pain point 2)
│ └── Benefit 3 (address pain point 3)
├── H2: [Service Name] 종류 및 방법 [Service Categories]
│ Word Count: 400-500 words total
│ Keywords: Category-specific LSI keywords
│ ├── H3: [Sub-service 1] - [LSI Keyword Variation]
│ │ ├── Description (80-100 words)
│ │ ├── Best for (target audience)
│ │ ├── Duration & Recovery
│ │ └── CTA: "자세히 보기"
│ ├── H3: [Sub-service 2] - [LSI Keyword Variation]
│ │ └── [Same structure as above]
│ └── H3: [Sub-service 3] - [LSI Keyword Variation]
│ └── [Same structure as above]
├── H2: [Clinic Name] [Service Name]만의 차별점 [Trust & Authority]
│ Word Count: 300-400 words
│ Keywords: Brand + Primary keyword combinations
│ ├── H3: 전문 의료진 [Doctor Credentials]
│ │ ├── Doctor profile summary
│ │ ├── Specializations
│ │ └── Certifications
│ ├── H3: 검증된 시술 결과 [Success Metrics]
│ │ ├── Number statistics
│ │ ├── Success rate
│ │ └── Patient satisfaction
│ └── H3: 첨단 장비 및 시설 [Facilities]
│ ├── Equipment descriptions
│ └── Safety protocols
├── H2: [Service Name] 자주 묻는 질문 [FAQ Section]
│ Word Count: 500-700 words
│ Keywords: Long-tail question keywords
│ ├── Q1: [Long-tail keyword as question]?
│ │ └── A: [40-60 word answer, keyword in first sentence]
│ ├── Q2: [Price-related question]?
│ │ └── A: [Include "비용" LSI keyword]
│ ├── Q3: [Recovery-related question]?
│ │ └── A: [Include "회복기간" LSI keyword]
│ ├── Q4: [Side-effect question]?
│ │ └── A: [Include "부작용" LSI keyword]
│ ├── Q5: [Process question]?
│ │ └── A: [Include process-related LSI]
│ ├── Q6: [Candidacy question]?
│ │ └── A: [Include target audience keywords]
│ └── Q7: [Results duration question]?
│ └── A: [Include maintenance keywords]
├── H2: [Service Name] 시술 과정 [Process Guide]
│ Word Count: 300-400 words
│ Keywords: "과정", "단계", procedural LSI
│ ├── H3: 상담 및 검사 [Consultation]
│ ├── H3: 시술 당일 [Procedure Day]
│ ├── H3: 회복 과정 [Recovery]
│ └── H3: 사후 관리 [Aftercare]
├── H2: 실제 고객 후기 [Social Proof]
│ Word Count: 200-300 words
│ Keywords: "후기", "리뷰", satisfaction keywords
│ ├── Review snippet 1
│ ├── Review snippet 2
│ ├── Review snippet 3
│ └── Before/After gallery teaser
└── H2: 상담 예약 안내 [Conversion Section]
Word Count: 150-200 words
Keywords: CTA-related, location keywords
├── H3: 상담 예약 방법
├── H3: 오시는 길
└── H3: 문의 정보
```
## Keyword Density Map
| Section | Primary Keyword | LSI Keywords | Total Keywords |
|---------|----------------|--------------|----------------|
| Hero | 1 | 1-2 | 2-3 |
| Problem/Solution | 1 | 2-3 | 3-4 |
| Service Categories | 1-2 | 4-6 | 5-8 |
| Trust & Authority | 1 | 2-3 | 3-4 |
| FAQ | 2-3 | 5-7 | 7-10 |
| Process | 1 | 2-3 | 3-4 |
| Social Proof | 0-1 | 1-2 | 1-3 |
| Conversion | 1 | 1-2 | 2-3 |
| **Total** | **8-11** | **18-29** | **26-40** |
## Internal Linking Strategy
| From Section | To Page | Anchor Text | Purpose |
|-------------|---------|-------------|---------|
| Service Categories | Sub-service page | [Sub-service name] | Deep dive |
| FAQ | Price page | "비용 안내 페이지" | Conversion |
| Trust section | Doctor profile | "[Doctor name] 원장" | Authority |
| Process section | Consultation form | "상담 예약하기" | Conversion |
| Social proof | Gallery page | "더 많은 전후 사진" | Engagement |
## Content Length Guidelines
- **Total Page Length**: 2,000-2,500 words
- **Above Fold Content**: 100-150 words
- **Each H2 Section**: 200-500 words
- **Each H3 Subsection**: 80-150 words
- **Meta Description**: 150-160 characters
- **Image Alt Text**: 10-15 words each
## Schema Markup Requirements
```json
{
"@context": "https://schema.org",
"@type": "MedicalProcedure",
"name": "[Service Name]",
"description": "[Meta description]",
"procedureType": "Cosmetic",
"provider": {
"@type": "MedicalOrganization",
"name": "[Clinic Name]"
}
}
```
## Mobile Content Adaptation
- Reduce hero text by 30%
- Show 3 FAQs initially (expand for more)
- Simplify navigation to single-column
- Increase CTA button size
- Compress trust signals to carousel

View File

@@ -0,0 +1,95 @@
# Keyword Research Template
## Primary Keyword Analysis
| Metric | Value | Notes |
|--------|-------|-------|
| **Primary Keyword** | [KEYWORD] | Main target keyword |
| **Monthly Search Volume** | [VOLUME] | Average monthly searches |
| **Keyword Difficulty** | [0-100] | Competition score |
| **Current Ranking** | #[POSITION] | Current SERP position |
| **Search Trend** | ↑ ↓ → | Trending direction |
## LSI Keywords Matrix
| LSI Keyword | Search Volume | Intent Type | Priority |
|------------|--------------|-------------|----------|
| [keyword 1] | [volume] | Informational | High |
| [keyword 2] | [volume] | Transactional | Medium |
| [keyword 3] | [volume] | Comparative | High |
| [keyword 4] | [volume] | Informational | Medium |
| [keyword 5] | [volume] | Transactional | Low |
| [keyword 6] | [volume] | Comparative | High |
| [keyword 7] | [volume] | Informational | Medium |
| [keyword 8] | [volume] | Navigational | Low |
| [keyword 9] | [volume] | Transactional | High |
| [keyword 10] | [volume] | Informational | Medium |
## User Intent Distribution
```
Informational (Research Phase): ___%
- Common queries: "what is", "how to", "benefits of"
- Content needed: Educational guides, FAQs, process explanations
Comparative (Evaluation Phase): ___%
- Common queries: "best", "vs", "reviews", "비교"
- Content needed: Comparison tables, reviews, case studies
Transactional (Ready to Convert): ___%
- Common queries: "price", "book", "consultation", "예약"
- Content needed: CTAs, pricing, booking forms
```
## Long-tail Keyword Opportunities
### Question-based Keywords
- [질문 키워드 1]
- [질문 키워드 2]
- [질문 키워드 3]
### Location-based Keywords
- [지역] + [primary keyword]
- [지역] + [primary keyword] + 잘하는곳
- [지역] + [primary keyword] + 추천
### Modifier-based Keywords
- [primary keyword] + 비용
- [primary keyword] + 부작용
- [primary keyword] + 회복기간
- [primary keyword] + 전후
## Competitor Keyword Analysis
| Competitor | Target Keywords | Ranking Keywords | Gap Opportunities |
|------------|----------------|------------------|-------------------|
| Competitor 1 | [keywords] | [keywords] | [missing keywords] |
| Competitor 2 | [keywords] | [keywords] | [missing keywords] |
| Competitor 3 | [keywords] | [keywords] | [missing keywords] |
## Seasonal Trends
| Month | Search Volume | Events/Factors |
|-------|--------------|----------------|
| January | [volume] | New year resolutions |
| February | [volume] | [factor] |
| March | [volume] | [factor] |
| ... | ... | ... |
## Platform-Specific Keywords
### Naver-Optimized
- [네이버 specific keyword 1]
- [네이버 specific keyword 2]
### Google-Optimized
- [Google specific keyword 1]
- [Google specific keyword 2]
## Action Items
- [ ] Target primary keyword in H1 and title tag
- [ ] Include 3-5 LSI keywords naturally in content
- [ ] Create content matching user intent distribution
- [ ] Optimize for question-based featured snippets
- [ ] Add location modifiers for local SEO

View File

@@ -0,0 +1,239 @@
# SEO Technical Checklist Template
## Meta Tags Optimization
### Title Tag
- [ ] Length: 50-60 characters
- [ ] Primary keyword at beginning
- [ ] Brand name at end
- [ ] Unique for each page
- [ ] Formula: `[Primary Keyword] - [Value Proposition] | [Brand]`
**Template**: `{primary_keyword} 전문 - {unique_value} | {clinic_name}`
**Example**: `눈 성형 전문 - 자연스러운 라인 | 제이미클리닉`
### Meta Description
- [ ] Length: 150-160 characters
- [ ] Include primary keyword
- [ ] Include 1-2 LSI keywords
- [ ] Clear CTA
- [ ] Unique for each page
**Template**: `{location} {primary_keyword} 전문의가 {benefit}. {credential}. 무료상담 ☎ {phone}`
**Example**: `강남 눈 성형 전문의가 자연스러운 눈매를 디자인합니다. 15년 경력, 10,000건 시술. 무료상담 ☎ 02-1234-5678`
### Open Graph Tags
```html
<meta property="og:title" content="{page_title}">
<meta property="og:description" content="{meta_description}">
<meta property="og:image" content="{featured_image_url}">
<meta property="og:url" content="{page_url}">
<meta property="og:type" content="website">
<meta property="og:locale" content="ko_KR">
```
## Header Tags Structure
- [ ] Only one H1 per page
- [ ] H1 contains primary keyword
- [ ] H2 tags for main sections (5-7)
- [ ] H3 tags for subsections
- [ ] Logical hierarchy maintained
- [ ] Keywords distributed naturally
## Content Optimization
### Keyword Density
- [ ] Primary keyword: 2-3% (20-30 times per 1000 words)
- [ ] LSI keywords: 1-2% each
- [ ] Natural placement (no stuffing)
- [ ] Synonyms and variations used
### Content Structure
- [ ] First 100 words include primary keyword
- [ ] Short paragraphs (3-4 sentences)
- [ ] Bullet points and lists
- [ ] Bold important keywords (sparingly)
- [ ] Internal links: 5-10
- [ ] External links: 2-3 (authoritative)
## Schema Markup
### Medical Procedure Schema
```json
{
"@context": "https://schema.org",
"@type": "MedicalProcedure",
"name": "{procedure_name}",
"procedureType": "Cosmetic",
"bodyLocation": "{body_part}",
"outcome": "{expected_outcome}",
"preparation": "{preparation_required}",
"followup": "{followup_care}",
"provider": {
"@type": "MedicalOrganization",
"name": "{clinic_name}",
"address": {
"@type": "PostalAddress",
"streetAddress": "{street}",
"addressLocality": "{city}",
"addressCountry": "KR"
}
}
}
```
### FAQ Schema
```json
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "{question}",
"acceptedAnswer": {
"@type": "Answer",
"text": "{answer}"
}
}]
}
```
## Image Optimization
- [ ] Descriptive file names: `eye-surgery-before-after-case1.jpg`
- [ ] Alt text with keywords: `눈 성형 전후 사진 - 30대 여성 사례`
- [ ] Compressed file size (< 200KB)
- [ ] WebP format with fallback
- [ ] Lazy loading implemented
- [ ] Image sitemap created
## Performance Optimization
### Page Speed
- [ ] Load time < 3 seconds
- [ ] First Contentful Paint < 1.8s
- [ ] Time to Interactive < 3.8s
- [ ] Total page size < 3MB
- [ ] Requests minimized (< 50)
### Core Web Vitals
- [ ] LCP (Largest Contentful Paint) < 2.5s
- [ ] FID (First Input Delay) < 100ms
- [ ] CLS (Cumulative Layout Shift) < 0.1
## Mobile Optimization
- [ ] Mobile-responsive design
- [ ] Viewport meta tag set
- [ ] Touch-friendly buttons (44x44px minimum)
- [ ] Readable font size (16px minimum)
- [ ] No horizontal scrolling
- [ ] Mobile page speed < 3s
## URL Structure
- [ ] SEO-friendly URL: `/eye-surgery` or `/눈-성형`
- [ ] No special characters
- [ ] Lowercase only
- [ ] Hyphens for word separation
- [ ] Under 60 characters
- [ ] Include primary keyword
## Internal Linking
| From Page | To Page | Anchor Text | Purpose |
|-----------|---------|-------------|---------|
| Gateway | Service Detail | {service_name} | Deep content |
| Gateway | Doctor Profile | {doctor_name} 원장 | Authority |
| Gateway | Pricing | 비용 안내 | Conversion |
| Gateway | Gallery | 시술 전후 사진 | Engagement |
| Gateway | Contact | 상담 예약 | Conversion |
## Naver-Specific Optimization
### Naver Webmaster Tools
- [ ] Site verification complete
- [ ] XML sitemap submitted
- [ ] Robots.txt configured
- [ ] Syndication feed active
- [ ] Site optimization report reviewed
### Naver SEO Elements
- [ ] Title under 30 Korean characters
- [ ] C-Rank tags implemented
- [ ] Image-to-text ratio optimized (40:60)
- [ ] Outbound links minimized
- [ ] Brand search optimization
## Tracking & Analytics
- [ ] Google Analytics 4 installed
- [ ] Google Search Console verified
- [ ] Naver Analytics installed
- [ ] Conversion tracking configured
- [ ] Event tracking for CTAs
- [ ] Heatmap tool installed
## Security & Technical
- [ ] SSL certificate active (HTTPS)
- [ ] WWW/non-WWW redirect configured
- [ ] 404 error page customized
- [ ] XML sitemap generated
- [ ] Robots.txt optimized
- [ ] Canonical URLs set
- [ ] Hreflang tags (if multi-language)
## Quality Checks
### Content Quality
- [ ] No spelling/grammar errors
- [ ] Medical information accurate
- [ ] Legal compliance verified
- [ ] Contact information correct
- [ ] CTAs working properly
### Cross-browser Testing
- [ ] Chrome (Desktop/Mobile)
- [ ] Safari (Desktop/Mobile)
- [ ] Firefox
- [ ] Samsung Internet
- [ ] Naver Whale
## Monthly Monitoring Tasks
- [ ] Keyword ranking check
- [ ] Organic traffic analysis
- [ ] Bounce rate monitoring
- [ ] Conversion rate tracking
- [ ] Competitor analysis
- [ ] Content freshness update
- [ ] Broken link check
- [ ] Page speed test
## Priority Levels
1. **Critical (Day 1)**
- Title and meta tags
- H1 optimization
- Mobile responsiveness
- Page speed < 4s
2. **High (Week 1)**
- Schema markup
- Internal linking
- Image optimization
- Content optimization
3. **Medium (Week 2-3)**
- Naver optimization
- FAQ implementation
- Social proof elements
- Analytics setup
4. **Low (Month 2)**
- A/B testing
- Advanced schema
- Link building
- Content expansion