directory changes and restructuring
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
65
custom-skills/17-seo-gateway-architect/code/CLAUDE.md
Normal file
65
custom-skills/17-seo-gateway-architect/code/CLAUDE.md
Normal 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
|
||||
```
|
||||
@@ -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()
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user