Compare commits

...

3 Commits

Author SHA1 Message Date
Haewon Kam be240f721b Merge branch 'claude/bold-hawking' 2026-04-13 13:11:37 +09:00
Haewon Kam 15099e8e1a feat: 뷰성형외과 실제 데이터 기반 세일즈 프로토타입 완성
- 9개 채널 실제 데이터 수집 (Firecrawl + Chrome MCP)
- mockReport.ts: 강남언니 9.5점/19,030리뷰 (TODO 해결), 채널 점수 갱신,
  Instagram 70K/14K 실제 수치, Facebook TH 페이지 발견, Naver Blog 활성화
- mockPlan.ts: Naver Blog 미확인→활성 550개, YouTube 104K 반영
- useReport: id='view-clinic' demo fallback 추가
- useMarketingPlan: id='view-clinic' demo fallback 추가
- Viewclinic Plan.md: 수집 데이터 전체 기록

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 13:11:18 +09:00
Haewon Kam 2a1a6f20fb fix: URL 파싱 에러 방어 처리 (transformReport, ClinicProfilePage)
metadata.url 또는 row.url이 null/빈 문자열일 때
new URL() 호출이 throw하던 문제를 try/catch로 방어.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 15:31:56 +09:00
7 changed files with 422 additions and 60 deletions

352
Viewclinic Plan.md Normal file
View File

@ -0,0 +1,352 @@
# 뷰성형외과 세일즈 프로토타입 — 실제 데이터 수집 & 하드코딩 계획
## Context
INFINITH의 자동 크롤링 파이프라인이 안정적으로 작동하지 않아, 세일즈 데모용으로 **뷰성형외과의 실제 데이터를 수동 수집**하여 `mockReport.ts``mockPlan.ts`에 하드코딩합니다.
## 사용 가능한 도구 (9개)
| # | 도구 | 용도 |
|---|------|------|
| 1 | **YouTube Data API v3** | YouTube 구독자/조회수/영상 정보 |
| 2 | **Apify - instagram-profile-scraper** | Instagram 프로필 (팔로워, 바이오, 최근 12개 포스트) |
| 3 | **Apify - instagram-post-scraper** | Instagram 포스트 상세 (좋아요, 댓글, 해시태그) |
| 4 | **Apify - instagram-reel-scraper** | Instagram 릴스 (조회수, 재생수, 음악 정보) |
| 5 | **Apify - facebook-pages-scraper** | Facebook 페이지 (팔로워, 좋아요, 카테고리, 평점) |
| 6 | **Firecrawl** | 웹사이트/강남언니/Naver 스크래핑 |
| 7 | **Ahrefs API** | SEO (Domain Rating, 오가닉 키워드, 백링크) |
| 8 | **Naver Search API** | 네이버 검색 (블로그, 플레이스) |
| 9 | **Claude in Chrome** | 직접 브라우저 접근 (API 실패 시 fallback + 스크린샷) |
## 뷰성형외과 채널 목록
| 채널 | URL | 수집 도구 | 상태 |
|------|-----|----------|------|
| Website | https://www.viewclinic.com | Firecrawl + Ahrefs | ✅ 수집완료 |
| YouTube | https://www.youtube.com/@ViewclinicKR | Firecrawl (YouTube API fallback) | ✅ 수집완료 |
| Instagram KR | https://www.instagram.com/viewplastic/ | **Apify** (profile+post+reel) | ⬜ 미수집 |
| Instagram EN | https://www.instagram.com/view_plastic_surgery/ | **Apify** (profile) | ⬜ 미수집 |
| Facebook KR | https://www.facebook.com/viewps1/ | **Apify** (pages-scraper) | ⬜ 미수집 |
| Facebook EN | (URL 확인 필요) | **Apify** (pages-scraper) | ⬜ 미수집 |
| 강남언니 | https://www.gangnamunni.com/hospitals/189 | Firecrawl + Chrome | ✅ 수집완료 |
| Naver Blog | https://blog.naver.com/viewclinicps | Firecrawl + Naver API | ✅ 수집완료 |
| Naver Place | https://m.place.naver.com/hospital/11709005 | Firecrawl + Chrome | ✅ 수집완료 |
---
## Phase 1: 데이터 수집 체크리스트
### WS1. YouTube (@ViewclinicKR) — Firecrawl
- [ ] 구독자 수, 총 영상 수, 총 조회수
- [ ] 최근 10개 영상: 제목, 조회수, 업로드일
- [ ] 인기 영상 Top 8: 제목, 조회수
- [ ] Shorts 탭 성과
- [ ] 채널 설명, 연결된 URL
- [ ] 업로드 빈도 (최근 30일)
### WS2. Instagram — **Apify** (3개 Actor)
**KR @viewplastic:**
- [ ] **Apify profile-scraper**: 팔로워/팔로잉/게시물 수, 바이오, 비즈니스 계정 여부, 외부 링크
- [ ] **Apify post-scraper**: 최근 20개 포스트 (좋아요, 댓글, 해시태그, 캡션, 타입)
- [ ] **Apify reel-scraper**: 최근 15개 릴스 (조회수, 재생수, 지속시간, 음악)
- [ ] 평균 좋아요/댓글 계산, 참여율 산출
**EN @view_plastic_surgery:**
- [ ] **Apify profile-scraper**: 존재 확인 + 팔로워/게시물/바이오
- [ ] Chrome fallback: Apify 실패 시 직접 접근
### WS3. Facebook — **Apify** (pages-scraper)
**KR facebook.com/viewps1:**
- [ ] **Apify pages-scraper**: 페이지명, 팔로워, 좋아요, 카테고리, 이메일, 전화, 웹사이트, 평점, 프로필사진 URL
- [ ] 최근 포스팅 빈도 확인
**EN 페이지:**
- [ ] URL 확인 (facebook.com/viewclinic 또는 viewplasticsurgery)
- [ ] **Apify pages-scraper**: 동일 데이터 수집
- [ ] Chrome fallback: URL 탐색
### WS4. Website + SEO — Ahrefs + Firecrawl
- [ ] Ahrefs Domain Rating
- [ ] Ahrefs organic keywords + traffic (KR)
- [ ] Ahrefs 백링크/참조도메인 수
- [ ] Ahrefs 상위 오가닉 키워드 20개
- [ ] Ahrefs 경쟁사 상위 3곳
- [ ] Firecrawl: 홈페이지 tracking pixel, SNS 링크, 메타태그
### WS5. 강남언니 — Firecrawl + Chrome
- [ ] 병원 평점 (TODO 해결)
- [ ] 총 리뷰 수
- [ ] 대표원장 평점 (TODO 해결)
- [ ] 의료진 수, 시술 목록, 가격 범위
- [ ] 인증 배지 목록
### WS6. Naver — Firecrawl + Naver API
- [ ] Blog: 활성 여부, 총 게시글 수, 최근 포스트 5개
- [ ] Place: 평점, 리뷰 수, 영업시간
### WS7. 스크린샷 — Claude in Chrome
- [ ] 각 채널 메인 페이지 스크린샷 (브랜드 일관성 검증용)
---
## Phase 2: 분석 & 점수 산정
- [ ] 채널 점수 6개 재계산 (실제 데이터 기반)
- [ ] 진단(Diagnosis) 재작성
- [ ] Overall Score 재계산
- [ ] KPI 기준선 검증
---
## Phase 3: 데이터 조립
### mockReport.ts 업데이트
- [ ] clinicSnapshot: TODO 2건 해결, URL 수정
- [ ] channelScores: 6개 채널 점수/headline 갱신
- [ ] youtubeAudit: 실제 데이터로 교체
- [ ] instagramAudit: 실제 데이터로 교체
- [ ] facebookAudit: 실제 데이터로 교체
- [ ] otherChannels: Naver Blog/Place 실제 상태로 변경
- [ ] websiteAudit: Ahrefs 데이터 + tracking 검증
- [ ] problemDiagnosis: 실제 데이터 기반 재작성
- [ ] roadmap: 현실적 3개월 로드맵
- [ ] kpiDashboard: current 값 실제 데이터로 교체
- [ ] transformation: 경쟁사 데이터 반영
### mockPlan.ts 업데이트
- [ ] channelStrategies Naver Blog 상태 갱신
- [ ] assetCollection 블로그 포스트 수량 갱신
- [ ] brandInconsistencies 실제 확인 결과 반영
---
## Phase 4: 검증
- [ ] TypeScript 컴파일 (npm run lint)
- [ ] /report/view-clinic 전체 렌더링 확인
- [ ] /plan/view-clinic 전체 렌더링 확인
- [ ] 데이터 정합성 교차 검증
- [ ] TODO/미확인 잔존 검사
---
## 수집된 데이터 기록
### YouTube 데이터 (2026-04-13 수집)
```
채널명: 뷰성형외과 VIEW Plastic Surgery
핸들: @ViewclinicKR
채널ID: UCQqqH3Klj2HQSHNNSVug-CQ
구독자: 104K (웹사이트 embed에서 확인)
채널설명: 💜뷰성형외과💜 VIEW가 예술이다! ✨ 19층 규모의 안전스마트 빌딩
키워드: 뷰성형외과, 성형, K-beauty, 눈성형, 코성형, 안면윤곽, 가슴성형, 지방흡입, 양악, 재수술
프로필이미지: https://yt3.googleusercontent.com/NPq6T2Vle_eq47mux1V46erujP8hG5Jz1qC5YwUKvRtJETdx_PQdtLSwT9fMk4gzpp92CjdX=s900-c-k-c0x00ffffff-no-rj
플레이리스트:
- VIEW 💜 무엇이든 물어보세요
- VIEW 💜 재수술
- VIEW 💜 가슴
- VIEW 💜 눈+코
- VIEW 💜 윤곽+양악
- VIEW 💜 지방성형
- VIEW 💜 피부+안티에이징
- VIEW랜딩 💜
- VIEW 💜 방송영상
최근 업로드 (2026년 4월 기준, 활발):
- [Dermatology] 시술 자랑 대회 (1.3K views, 3일 전)
- [Thread Lift] 실리프팅 부작용 (554 views, 8일 전)
- [Motiva Global KOL] 4년 연속 선정 (2.3K views, 5일 전)
- [Body Surgery] 볼륨 임플란트 (140 views, 12일 전)
- [Body Surgery] 가슴필러 반대 (1K views, 11일 전)
인기 영상 Top (Shorts 포함):
- 1트만에 성공하는 성형 #Shorts — 574K views (4년 전)
- 코성형+지방이식 전후 #Shorts — 532K views (4년 전)
- 쌍수+뒤밑트임 #Shorts — 392K views (4년 전)
- □→V라인 변신 #shorts — 194K views (4년 전)
- K-미녀 클라스 #shorts — 161K views (4년 전)
- 앞트임 대박 #Shorts — 159K views (2년 전)
콘텐츠 패턴: 주 2-3회 업로드, 최근 영어 자막/제목 병행, Shorts 적극 활용
```
### Instagram 데이터 (2026-04-13 Chrome MCP 수집)
```
=== Instagram KR (@viewplastic) ===
핸들: @viewplastic
이름: 뷰 성형외과 | 가슴성형 • 안면윤곽 • 눈성형 • 코성형 • 리프팅
게시물: 1,420개
팔로워: 14K (14,000)
팔로잉: 3,822
카테고리: Health/beauty
바이오: 💞신논현역 3번 출구 | 카톡 '뷰성형외과의원' | 02-539-1177
주소: 서울시 강남구 봉은사로107, 뷰성형외과병원 (논현동 201-16), Seoul, Korea
링크: litt.ly/viewplasticsurgery
Threads: @viewplastic
프로필사진: 모델 사진 (공식 깃털 로고 아님 → 브랜드 불일치!)
하이라이트: ABOUT VIEW, 수술정보, 모델 모집, VIEW EVENT, 진료안내
Reels: 0개 (탭 비어있음 → CRITICAL)
"Followed by view_plastic_surgery" 표시됨
=== Instagram EN (@view_plastic_surgery) ===
핸들: @view_plastic_surgery
이름: View Plastic Surgery Korea
게시물: 2,553개
팔로워: 70K (70,000) ← 기존 mock 68.8K에서 성장
팔로잉: 2,840
카테고리: Health/beauty
바이오: VIEW Plastic Surgery Official by 𝐕𝐈𝐄𝐖 𝐏𝐚𝐫𝐭𝐧𝐞𝐫𝐬 🇰🇷 Most Renowned Hospital in Korea
주소: 107 Bongeunsa-ro Gangnam-gu, Seoul, Korea
링크: litt.ly/viewplasticsurgeryenglish
Threads: @view_plastic_surgery
프로필사진: "VIEW" 골드 텍스트 로고 (깃털 심볼 없음 → 브랜드 불일치)
하이라이트: Katerina, Mathilde, Kyle & Spizee, Chef Rush, Thet San, Yuri, Liposuction, Why VIEW?, Diana, Anti Aging, Julie, Male, Stem Cell, Dermatology
Reels: 있음 (탭에 콘텐츠 존재)
"Followed by viewplastic" 표시됨
콘텐츠: VIEWWEIV Cosmetics 제품 홍보, 외국인 환자 후기 중심
```
### Facebook 데이터 (2026-04-13 Chrome MCP 수집)
```
=== Facebook KR (viewps1) ===
URL: https://www.facebook.com/viewps1/
페이지명: 뷰성형외과
팔로워: 253명 (팔로잉 0명)
바이오: 예쁨이 일상이 되는 순간! #뷰성형외과
카테고리: 성형외과 의사
프로필사진: 보라색+골드 깃털 로고 (공식 로고 ✅)
배너: 퍼플 배경 + "VIEW가 예술이다!" + 모델 사진
주소: 강남구 봉은사로 107, 서울 06120
링크: viewclinic.com
최근 포스트: 4일 전 (활성이나 매우 저조한 팔로워)
영업시간: 영업 중
=== Facebook EN (viewclinic) ===
URL: https://www.facebook.com/viewclinic
페이지명: View Plastic Surgery
팔로워: 8.8만명 (88,000) ← 기존 mock 88K 정확!
팔로잉: 11명
바이오: Official Account by 𝐕𝐈𝐄𝐖 𝐏𝐚𝐫𝐭𝐧𝐞𝐫𝐬
주소: 107 Bongensa-ro, Gangnam-gu, Seoul, Korea
카테고리: 건강/뷰티
프로필사진: "VIEW" 골드 텍스트 로고 (깃털 심볼 없음 → 브랜드 불일치)
링크: viewplasticsurgery.com
WhatsApp: 연동됨
리뷰: 3개
최근 포스트: 2일 전 (활발 — Katerina님 환자 후기 영상)
영업시간: 24시간 영업
=== Facebook TH (viewplasticsurgery) — 신규 발견 ===
URL: https://www.facebook.com/viewplasticsurgery
페이지명: View Plastic Surgery x makeawishdiary โรงพยาบาลศัลยกรรมเกาหลี
팔로워: 1.4만명 (14,000)
팔로잉: 0명
바이오: let me in thailand (태국 시장 파트너 페이지)
카테고리: 성형외과 의사
프로필사진: 보라색+골드 깃털 로고 (공식 로고 ✅)
리뷰: 2개
마지막 포스트: 2024년 7월 28일 (약 9개월 방치)
```
### Ahrefs/SEO 데이터
```
(Ahrefs API deferred tool — 추후 호출 필요)
현재 Website Firecrawl 데이터로 대체:
- Google site verification: ✅
- Naver site verification: ✅
- Facebook domain verification: ✅
- WordPress 5.5.3 + WPBakery
- 키워드: 가슴성형, 가슴수술, 안면윤곽수술, 눈매교정, 코성형 등
```
### 강남언니 데이터 (2026-04-13 수집)
```
병원명: 뷰성형외과의원
등급: 고객평가우수병원
평점: 9.5/10 (기존 mock 4.8/5점 → 강남언니는 10점 만점 스케일)
후기수: 19,030개 (기존 mock 18,840 → 업데이트 필요)
주소: 서울 강남구 봉은사로 107 (논현동)
위치: 신논현역 3번 출구 68m
의료진 (25명):
- 최순우 대표원장 (성형외과) — 9.4점, 후기 1,805개 → 가슴성형
- 윤창운 원장 (성형외과) — 9.6점, 후기 773개 → 안면윤곽/양악
- 김정민 원장 (성형외과) — 9.7점, 후기 884개 → 리프팅/눈성형
- 김도형 원장 (성형외과) — 9.7점, 후기 192개 → 지방성형
인증 배지 (10개):
수술실 CCTV, 마취과 전문의 상주, 분야별 공동 진료, 의료진 실명 공개,
야간진료, 여성 의사 진료, 응급 대응 체계, 시술 후 관리, 입원 시설, 전용 휴식 공간
진료항목: 눈성형, 코성형, 안면윤곽/양악, 가슴성형, 지방성형, 필러, 보톡스, 피부리프팅, 기타
진료시간:
- 월~목: 10:00-19:00
- 금: 10:00-21:00
- 토: 10:00-17:00
- 일/공휴일: 휴진
이벤트 가격 (51건):
- 가슴성형 가슴보형물: 2,650,000원 (9.6점, 870리뷰)
- 눈성형 자연유착 매몰: 440,000원 (9.6점, 617리뷰)
- 코성형 콧대코끝: 990,000원 (9.6점, 435리뷰)
- 모티바 가슴성형: 11,550,000원 (9.4점, 177리뷰)
```
### Naver Blog 데이터 (2026-04-13 수집)
```
블로그명: 뷰성형외과 공식블로그
URL: https://blog.naver.com/viewclinicps
상태: ✅ 활성 (기존 mockReport "unknown" → "active"로 변경)
총 게시글: 550개
OG description: "성형 고민은 뷰성형외과 ෆ"
최근 포스트 (상위 5개):
1. 살빼도 이중턱 안없어진다면? 갈테야테야 투턱 없애러 갈테야 (2026.4.8)
2. 피부 리셋 I 환절기 저격 스킨부스터 '리투오' (2026.3.25)
3. 무시했다 나중에 큰코 다치는 가슴성형 전후 '유방검진' (2026.3.11)
4. 혹시 나도? 이마로 눈뜨는지 확인하는 초간단 확인법! (2026.2.24)
5. 이런게 있었어? 갑자기 확 늙어보인다면 '중안면 수직 리프팅' (2026.2.4)
포스팅 빈도: 월 2-3회 (꾸준하나 빈도 낮음)
카테고리: VIEW 성형외과 (메인)
```
### Naver Place 데이터 (2026-04-13 수집)
```
이름: 뷰성형외과의원
카테고리: 성형외과
별점: 4.41/5
방문자 리뷰: 777개
블로그 리뷰: 1,480개
주소: 서울 강남구 봉은사로 107 1, 3-5, 7, 8층
교통: 9호선/신분당선 신논현역 3번 출구 68m
전화: 0507-1420-1398
홈페이지: https://www.viewclinic.com/
SNS 링크: 인스타그램, 유튜브, 블로그 (네이버 플레이스에서 연결 확인됨)
편의: 주차, 발렛파킹
예약: 네이버 예약 가능
진료과목: 성형외과, 외과, 피부과
전문의: 성형외과 14명, 외과 1명
특수장비: 엑스선촬영장치 1, 유방촬영장치 1, 초음파 2, 콘빔CT 1
```
### Website 데이터 (2026-04-13 수집)
```
URL: https://www.viewclinic.com
타이틀: 안전을 최우선하는 뷰성형외과
CMS: WordPress 5.5.3 + WPBakery Page Builder
meta description: 가슴보형물사용량1위, 보건복지부장관표창수상, 안면윤곽대상...
Site Verification:
- Google: A8vo9aOWSvGL5-yFKhbtlHPqJCkH-egNdWVqVd9gKac ✅
- Naver: a8cb4fab1fdf7277c0892eeddf457b5c939349e8 ✅
- Facebook domain: lm854gkic9948c6xk2ti76inryqk65 ✅
SNS 연결 (홈페이지에서 확인):
- 카카오톡 플러스친구: @뷰성형외과의원
- YouTube: 임베드 영상 있음 (104K 구독자)
- SNS 직접 링크 버튼: 없음 (footer/header에 소셜 아이콘 미발견)
주요 CTA: 전화상담(02-539-1177), 온라인상담, 카톡상담, 이벤트
Tracking: facebook-domain-verification 존재, Google GA 가능성 (verification 존재)
```

View File

@ -5,7 +5,7 @@ export const mockPlan: MarketingPlan = {
reportId: 'view-clinic',
clinicName: '뷰성형외과의원',
clinicNameEn: 'VIEW Plastic Surgery',
createdAt: '2026-03-22',
createdAt: '2026-04-13',
targetUrl: 'https://www.viewclinic.com',
// ─── Section 1: Brand Guide ───
@ -87,7 +87,7 @@ export const mockPlan: MarketingPlan = {
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
currentStatus: '103K 구독자, 주 1회 업로드', targetGoal: '200K 구독자, 주 3회 업로드',
currentStatus: '104K 구독자, 주 2~3회 업로드', targetGoal: '200K 구독자, 주 3회 업로드',
contentTypes: ['Shorts', 'Long-form', 'Community'],
postingFrequency: '주 3회 (롱폼 1 + Shorts 2)',
tone: '차분한 전문가 — 원장이 직접 설명하는 교육 콘텐츠',
@ -105,7 +105,7 @@ export const mockPlan: MarketingPlan = {
},
{
channelId: 'instagram_en', channelName: 'Instagram EN', icon: 'instagram',
currentStatus: '68.8K 팔로워, Reels 활발', targetGoal: '100K 팔로워',
currentStatus: '70K 팔로워, Reels 활발', targetGoal: '120K 팔로워',
contentTypes: ['Reels', 'Before/After', 'Patient Stories'],
postingFrequency: '주 5회',
tone: 'Professional & warm — medical tourism storytelling',
@ -123,7 +123,7 @@ export const mockPlan: MarketingPlan = {
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: '미확인 / 미운영', targetGoal: '월 30,000 방문자',
currentStatus: '활성 — 550개 게시글, 월 2~3회 포스팅', targetGoal: '주 2회 포스팅, 월 30,000 방문자',
contentTypes: ['SEO 블로그 포스트', '시술 가이드', '환자 후기'],
postingFrequency: '주 3회',
tone: '정보성 전문가 — 키워드 중심, 환자 고민 해결',
@ -257,7 +257,7 @@ export const mockPlan: MarketingPlan = {
{ id: 'a6', source: 'social', sourceLabel: '소셜미디어', type: 'photo', title: 'Instagram EN Before/After 사진', description: '@view_plastic_surgery 계정의 2,524개 게시물 중 B/A 사진', repurposingSuggestions: ['KR 계정 크로스포스팅', '유튜브 롱폼 삽입', 'Naver 블로그 활용'], status: 'collected' },
{ id: 'a7', source: 'social', sourceLabel: '소셜미디어', type: 'text', title: '강남언니 환자 리뷰 18,840건', description: '9.5점 평균, 시술별 실 환자 후기 텍스트', repurposingSuggestions: ['후기 기반 Carousel 시리즈', '블로그 환자 스토리', '광고 사회적 증거'], status: 'pending' },
{ id: 'a8', source: 'naver_place', sourceLabel: '네이버 플레이스', type: 'photo', title: '네이버 플레이스 사진', description: '병원 외관, 위치, 시설 사진', repurposingSuggestions: ['블로그 위치 안내 포스트', '구글 마이비즈니스 동기화'], status: 'pending' },
{ id: 'a9', source: 'blog', sourceLabel: '블로그', type: 'text', title: '네이버 블로그 기존 포스트', description: '기존 블로그 포스트 (수량 미확인)', repurposingSuggestions: ['SEO 최적화 리라이팅', '영상 스크립트 소스'], status: 'pending' },
{ id: 'a9', source: 'blog', sourceLabel: '블로그', type: 'text', title: '네이버 블로그 기존 포스트 550개', description: '기존 블로그 포스트 550개 (월 2~3회 업데이트 중)', repurposingSuggestions: ['SEO 최적화 리라이팅', '영상 스크립트 소스'], status: 'collected' },
{ id: 'a10', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '개원 20주년 기념 영상', description: '뷰성형외과 20년 역사 + 시설 소개 영상 (1:30)', repurposingSuggestions: ['브랜드 스토리 Reel', '웹사이트 히어로 영상', '신뢰 광고 소재'], status: 'collected' },
{ id: 'a11', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '시술별 전후 사진 갤러리', description: '눈, 코, 가슴, 윤곽 시술별 비포/애프터 사진', repurposingSuggestions: ['Instagram B/A 시리즈', 'Shorts 전환 소스', '상담 자료'], status: 'needs_creation' },
],

View File

@ -2,7 +2,7 @@ import type { MarketingReport } from '../types/report';
export const mockReport: MarketingReport = {
id: 'view-clinic',
createdAt: '2026-03-22',
createdAt: '2026-04-13',
targetUrl: 'https://www.viewclinic.com',
overallScore: 62,
@ -11,15 +11,15 @@ export const mockReport: MarketingReport = {
nameEn: 'VIEW Plastic Surgery',
established: '2005',
yearsInBusiness: 21,
staffCount: 28,
staffCount: 25,
leadDoctor: {
name: '최순우',
credentials: '서울대 출신, 의학박사',
rating: 4.7, // TODO: 강남언니 실제 의료진 평점 확인
reviewCount: 1809,
rating: 9.4,
reviewCount: 1805,
},
overallRating: 4.8, // TODO: 강남언니 실제 병원 평점 확인 (5.0 만점)
totalReviews: 18840,
overallRating: 9.5,
totalReviews: 19030,
priceRange: { min: '97,900', max: '13,200,000+', currency: '₩' },
certifications: [
'수술실 CCTV',
@ -36,7 +36,7 @@ export const mockReport: MarketingReport = {
mediaAppearances: ['렛미인 TV 프로그램', '보건복지부장관 표창', '안면윤곽 수상'],
medicalTourism: ['VisitKorea 등재', '강남 메디컬투어센터 협력기관', '외국인 전용 서비스'],
location: '서울시 강남구 봉은사로 107 (논현동)',
nearestStation: '9호선 신논현역 3번 출구 50m',
nearestStation: '9호선/신분당선 신논현역 3번 출구 68m',
phone: '02-539-1177',
domain: 'viewclinic.com',
source: 'registry' as const,
@ -44,8 +44,8 @@ export const mockReport: MarketingReport = {
district: '강남',
branches: '본점 1개',
brandGroup: '프리미엄',
naverPlaceUrl: 'https://map.naver.com/v5/entry/place/1234567890',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/view',
naverPlaceUrl: 'https://m.place.naver.com/hospital/11709005',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/189',
googleMapsUrl: 'https://maps.google.com/?q=뷰성형외과',
},
logoImages: {
@ -61,24 +61,24 @@ export const mockReport: MarketingReport = {
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 65, maxScore: 100, status: 'warning', headline: '103K 구독자, 조회수 하락세' },
{ channel: 'Instagram KR', icon: 'instagram', score: 35, maxScore: 100, status: 'critical', headline: '14K 팔로워, Reels 0개' },
{ channel: 'Instagram EN', icon: 'instagram', score: 55, maxScore: 100, status: 'warning', headline: '68.8K 팔로워, 활발한 편' },
{ channel: 'Facebook', icon: 'facebook', score: 40, maxScore: 100, status: 'critical', headline: '브랜드 불일치, 계정 분산' },
{ channel: '강남언니', icon: 'star', score: 95, maxScore: 100, status: 'excellent', headline: '4.8점, 18,840 리뷰' },
{ channel: 'Website', icon: 'globe', score: 50, maxScore: 100, status: 'warning', headline: 'SNS 연결 없음, 트래킹만 존재' },
{ channel: 'YouTube', icon: 'youtube', score: 68, maxScore: 100, status: 'warning', headline: '104K 구독자, 주 2-3회 업로드, 최근 조회수 하락' },
{ channel: 'Instagram KR', icon: 'instagram', score: 32, maxScore: 100, status: 'critical', headline: '14K 팔로워, Reels 0개, 모델 프사' },
{ channel: 'Instagram EN', icon: 'instagram', score: 62, maxScore: 100, status: 'warning', headline: '70K 팔로워, Reels 활발, 외국인 환자 중심' },
{ channel: 'Facebook', icon: 'facebook', score: 38, maxScore: 100, status: 'critical', headline: 'KR 253명 방치, EN 88K 활발, 3개 페이지 분산' },
{ channel: '강남언니', icon: 'star', score: 96, maxScore: 100, status: 'excellent', headline: '9.5점/10, 19,030 리뷰, 고객평가우수병원' },
{ channel: 'Website', icon: 'globe', score: 52, maxScore: 100, status: 'warning', headline: 'Google/Naver 인증 완료, SNS 직접 링크 없음' },
],
youtubeAudit: {
channelName: '뷰성형외과 VIEW Plastic Surgery',
handle: '@ViewclinicKR',
subscribers: 103000,
subscribers: 104000,
totalVideos: 1064,
totalViews: 9952722,
weeklyViewGrowth: { absolute: 67097, percentage: 4.09 },
estimatedMonthlyRevenue: { min: 499, max: 1000 },
avgVideoLength: '4.4분',
uploadFrequency: '~주 1회',
uploadFrequency: '주 2~3회',
channelCreatedDate: '2015-06-29',
subscriberRank: '#570K',
channelDescription: '💜뷰성형외과💜\nVIEW가 예술이다! ✨\n19층 규모의 안전스마트 빌딩\n환자의 관점에서 생각하고\n환자의 입장에서 아름다움의 가치를 찾습니다.',
@ -111,10 +111,10 @@ export const mockReport: MarketingReport = {
{ title: '아나운서 박은영, 가슴 할 결심을 하다', views: 127000, uploadedAgo: '9개월 전', type: 'Long', duration: '43:39' },
],
diagnosis: [
{ category: '구독자 대비 조회수 비율', detail: '영상당 평균 ~9,300회 (103K 구독자 대비 9% 도달률)', severity: 'critical', evidenceIds: ['yt-channel'] },
{ category: '구독자 대비 조회수 비율', detail: '영상당 평균 ~1,000회 (104K 구독자 대비 1% 도달률)', severity: 'critical', evidenceIds: ['yt-channel'] },
{ category: '최근 롱폼 조회수', detail: '대부분 1,000~4,000회 수준', severity: 'critical' },
{ category: 'Shorts 조회수', detail: '최근 업로드 500~1,000회 (과거 대비 급감)', severity: 'warning' },
{ category: '업로드 빈도', detail: '주 1회 — 알고리즘 노출 최소 기준 미달', severity: 'warning' },
{ category: '업로드 빈도', detail: '주 2~3회 — 적절한 빈도이나 조회수 미반영', severity: 'good' },
{ category: '콘텐츠 톤앤매너', detail: '일관성 없음 — 교육/Q&A/전후/브랜딩 혼재', severity: 'critical' },
{ category: '썸네일 디자인', detail: '통일된 브랜드 시스템 없음', severity: 'warning' },
{ category: '최고 성과 Shorts', detail: '4년 전 콘텐츠 — 최근 재현 실패', severity: 'critical' },
@ -127,27 +127,27 @@ export const mockReport: MarketingReport = {
handle: '@viewplastic',
language: 'KR',
label: '국내 (한국어)',
posts: 1409,
posts: 1420,
followers: 14000,
following: 4760,
following: 3822,
category: 'Health/beauty',
profileLink: 'litt.ly/viewplasticsurgery',
highlights: ['수술정보', 'ABOUT VIEW', '모델 모집', 'VIEW EVENT', '진료안내'],
highlights: ['ABOUT VIEW', '수술정보', '모델 모집', 'VIEW EVENT', '진료안내'],
reelsCount: 0,
contentFormat: '카드뉴스 (정보형 이미지) 100%',
profilePhoto: '모델 사진 (브랜드 로고 아님)',
bio: '뷰 성형외과 | 가슴성형 · 안면윤곽 · 눈성형 · 코성형 · 리프팅\n💕신논현역 3번 출구 | 카톡 \'뷰성형외과의원\' | 02-539-1177',
bio: '뷰 성형외과 | 가슴성형 · 안면윤곽 · 눈성형 · 코성형 · 리프팅\n💞신논현역 3번 출구 | 카톡 \'뷰성형외과의원\' | 02-539-1177',
},
{
handle: '@view_plastic_surgery',
language: 'EN',
label: '국제 (영어)',
posts: 2524,
followers: 68800,
following: 2834,
posts: 2553,
followers: 70000,
following: 2840,
category: 'Health/beauty',
profileLink: 'litt.ly/viewplasticsurgeryenglish',
highlights: ['Mathilde', 'Thet San', 'Katerina', 'Yuri', 'Liposuction', 'Why VIEW?', 'Face Contour'],
highlights: ['Katerina', 'Mathilde', 'Kyle & Spizee', 'Chef Rush', 'Thet San', 'Yuri', 'Liposuction', 'Why VIEW?', 'Diana', 'Anti Aging', 'Julie', 'Male', 'Stem Cell', 'Dermatology'],
reelsCount: 50,
contentFormat: 'Before/After + 환자 스토리 + Reels',
profilePhoto: 'VIEW 골드 로고',
@ -155,12 +155,12 @@ export const mockReport: MarketingReport = {
},
],
diagnosis: [
{ category: '계정 분리 → 팔로워 분산', detail: 'KR 14K + EN 68.8K = 합산 82.8K이지만 각각 약함', severity: 'warning' },
{ category: '계정 분리 → 팔로워 분산', detail: 'KR 14K + EN 70K = 합산 84K이지만 각각 약함', severity: 'warning' },
{ category: 'KR 계정 Reels 전무', detail: '인스타 알고리즘 핵심인 Reels 콘텐츠 0개', severity: 'critical', evidenceIds: ['ig-kr-profile'] },
{ category: '브랜드 비주얼 불일치', detail: 'KR=모델 프사, EN=VIEW 골드 로고', severity: 'warning', evidenceIds: ['ig-kr-profile', 'ig-en-profile'] },
{ category: 'KR 팔로잉 과다', detail: '4,760 팔로잉 — 팔로우백 전략 의심', severity: 'warning' },
{ category: 'KR 팔로잉 과다', detail: '3,822 팔로잉 — 팔로우백 전략 의심', severity: 'warning' },
{ category: '크로스포스팅 없음', detail: 'YouTube Shorts → Instagram Reels 연동 없음', severity: 'critical' },
{ category: '유튜브 ↔ 인스타 유입 단절', detail: '103K 구독자 → 14K 팔로워 전환 실패', severity: 'critical' },
{ category: '유튜브 ↔ 인스타 유입 단절', detail: '104K 구독자 → 14K 팔로워 전환 실패', severity: 'critical' },
],
},
@ -200,7 +200,7 @@ export const mockReport: MarketingReport = {
link: 'viewplasticsurgery.com',
linkedDomain: 'viewplasticsurgery.com (메인 도메인 viewclinic.com과 다름)',
reviews: 3,
recentPostAge: '14분 전',
recentPostAge: '2일 전',
hasWhatsApp: true,
postFrequency: '일 1~2회 (Before/After, 환자 스토리)',
topContentType: 'Before/After 사진 + 환자 여정 Reels',
@ -282,13 +282,13 @@ export const mockReport: MarketingReport = {
},
otherChannels: [
{ name: '카카오톡', status: 'active', details: '상담 전용 채널 운영', url: 'pf.kakao.com/_xbtVxjl' },
{ name: '네이버 블로그', status: 'unknown', details: 'Naver API 연동 필요' },
{ name: '네이버 플레이스', status: 'unknown', details: 'Naver API 연동 필요' },
{ name: '카카오톡', status: 'active', details: '플러스친구 @뷰성형외과의원 — 상담 전용 채널', url: 'pf.kakao.com/_xbtVxjl' },
{ name: '네이버 블로그', status: 'active', details: '공식 블로그 활성 — 총 550개 게시글, 월 2~3회 포스팅, 최근 2026.4.8 업로드', url: 'blog.naver.com/viewclinicps' },
{ name: '네이버 플레이스', status: 'active', details: '별점 4.41/5, 방문자리뷰 777개, 블로그리뷰 1,480개, 성형외과 전문의 14명', url: 'm.place.naver.com/hospital/11709005' },
{ name: 'TikTok', status: 'not_found', details: '계정 없음 또는 비활성' },
{ name: '강남언니', status: 'active', details: '4.8점, 18,840 리뷰, 28 의료진', url: 'gangnamunni.com/hospitals/189' },
{ name: '모두닥', status: 'active', details: '기본 정보 등재' },
{ name: 'Goodoc', status: 'active', details: '기본 정보 등재' },
{ name: '강남언니', status: 'active', details: '9.5점/10, 19,030 리뷰, 25 의료진, 고객평가우수병원', url: 'gangnamunni.com/hospitals/189' },
{ name: 'Threads', status: 'active', details: '@viewplastic + @view_plastic_surgery 계정 연동', url: 'threads.net/@viewplastic' },
{ name: 'Facebook TH', status: 'inactive', details: '태국 파트너 페이지 14K 팔로워, 2024.7월 이후 방치', url: 'facebook.com/viewplasticsurgery' },
{ name: '닥터나우', status: 'active', details: '기본 정보 등재' },
],
@ -321,7 +321,7 @@ export const mockReport: MarketingReport = {
},
{
category: '플랫폼 간 유입 단절',
detail: 'YouTube 103K → Instagram 14K 전환 실패, 웹사이트에 SNS 링크 0개, 강남언니 18.8K 리뷰→영상 전환 없음',
detail: 'YouTube 104K → Instagram 14K 전환 실패, 웹사이트에 SNS 직접 링크 없음, 강남언니 19K 리뷰→영상 전환 없음',
severity: 'critical',
},
],
@ -345,7 +345,7 @@ export const mockReport: MarketingReport = {
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '103K subscribers',
currentMetric: '104K subscribers',
targetMetric: '200K / 12개월',
strategies: [
{ strategy: '업로드 빈도 3배 증가', detail: '주 3회 (롱폼 1 + Shorts 2)' },
@ -362,7 +362,7 @@ export const mockReport: MarketingReport = {
strategies: [
{ strategy: 'Reels 즉시 시작', detail: 'YouTube Shorts 동시 게시 → 최소 주 5개' },
{ strategy: '프로필 사진 교체', detail: '모델 사진 → VIEW 골드 로고' },
{ strategy: '팔로잉 정리', detail: '4,760 → 300 이하로 정리' },
{ strategy: '팔로잉 정리', detail: '3,822 → 300 이하로 정리' },
{ strategy: 'Stories 활성화', detail: '일 2~3개 (상담 비하인드, 병원 일상)' },
],
},
@ -386,8 +386,8 @@ export const mockReport: MarketingReport = {
],
newChannelProposals: [
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층 도달, YouTube Shorts 동시 배포' },
{ channel: '네이버 블로그', priority: 'P0', rationale: '한국 검색 1위 플랫폼 — SEO 핵심' },
{ channel: '네이버 플레이스', priority: 'P0', rationale: '지역 검색 노출 필수' },
{ channel: '네이버 블로그 강화', priority: 'P0', rationale: '현재 550개 게시글, 월 2~3회 → 주 2회로 빈도 상향, SEO 핵심' },
{ channel: '네이버 플레이스 최적화', priority: 'P0', rationale: '4.41점/777리뷰 — 리뷰 응답률/사진 최적화 필요' },
],
},
@ -400,7 +400,7 @@ export const mockReport: MarketingReport = {
{ task: '브랜드 아이덴티티 가이드 확정 (로고, 컬러, 폰트, 톤앤매너)', completed: false },
{ task: '전 채널 프로필 사진/배너 통일 교체', completed: false },
{ task: 'Facebook KR 페이지 정리 (통합 또는 폐쇄)', completed: false },
{ task: 'Instagram KR 팔로잉 정리 (4,760 → 300)', completed: false },
{ task: 'Instagram KR 팔로잉 정리 (3,822 → 300)', completed: false },
{ task: '웹사이트에 YouTube/Instagram 링크 추가', completed: false },
{ task: '기존 YouTube 영상 100개 → AI 숏폼 추출 시작', completed: false },
{ task: '콘텐츠 캘린더 v1 수립', completed: false },
@ -435,14 +435,14 @@ export const mockReport: MarketingReport = {
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '103K', target3Month: '115K', target12Month: '200K' },
{ metric: 'YouTube 구독자', current: '104K', target3Month: '115K', target12Month: '200K' },
{ metric: 'YouTube 월 조회수', current: '~270K', target3Month: '500K', target12Month: '1.5M' },
{ metric: 'YouTube Shorts 평균 조회수', current: '500~1,000', target3Month: '5,000', target12Month: '20,000' },
{ metric: 'Instagram KR 팔로워', current: '14K', target3Month: '20K', target12Month: '50K' },
{ metric: 'Instagram KR Reels 평균 조회수', current: '0 (없음)', target3Month: '3,000', target12Month: '10,000' },
{ metric: 'Instagram EN 팔로워', current: '68.8K', target3Month: '75K', target12Month: '100K' },
{ metric: '네이버 블로그 방문자', current: '0 (없음)', target3Month: '5,000/월', target12Month: '30,000/월' },
{ metric: '웹사이트 → SNS 유입', current: '0%', target3Month: '5%', target12Month: '15%' },
{ metric: 'Instagram EN 팔로워', current: '70K', target3Month: '80K', target12Month: '120K' },
{ metric: '네이버 블로그 포스팅 빈도', current: '월 2~3회', target3Month: '주 2회', target12Month: '주 3회' },
{ metric: '네이버 플레이스 리뷰', current: '777개 (4.41점)', target3Month: '900개', target12Month: '1,200개' },
{ metric: '콘텐츠 → 상담 전환', current: '측정 불가', target3Month: 'UTM 추적 시작', target12Month: '월 50건' },
],
@ -452,7 +452,7 @@ export const mockReport: MarketingReport = {
url: '/assets/clients/view-clinic/screenshots/yt-channel.svg',
channel: 'YouTube',
capturedAt: '2026-03-22T10:00:00Z',
caption: 'YouTube 채널 메인 — 구독자 103K, 주 1회 업로드, Shorts 조회수 하락세',
caption: 'YouTube 채널 메인 — 구독자 104K, 주 2~3회 업로드, 최근 조회수 하락세',
sourceUrl: 'https://youtube.com/@ViewclinicKR',
},
{
@ -471,7 +471,7 @@ export const mockReport: MarketingReport = {
url: '/assets/clients/view-clinic/screenshots/ig-kr-profile.svg',
channel: 'Instagram',
capturedAt: '2026-03-22T10:02:00Z',
caption: 'Instagram KR (@viewplastic) — 14K 팔로워, 1,409 게시물, Reels 미활용',
caption: 'Instagram KR (@viewplastic) — 14K 팔로워, 1,420 게시물, Reels 0개',
sourceUrl: 'https://instagram.com/viewplastic',
},
{
@ -479,7 +479,7 @@ export const mockReport: MarketingReport = {
url: '/assets/clients/view-clinic/screenshots/ig-en-profile.svg',
channel: 'Instagram',
capturedAt: '2026-03-22T10:03:00Z',
caption: 'Instagram EN (@view_plastic_surgery) — 68.9K 팔로워, Reels 활발, 환자 스토리',
caption: 'Instagram EN (@view_plastic_surgery) — 70K 팔로워, 2,553 게시물, Reels 활발',
sourceUrl: 'https://instagram.com/view_plastic_surgery',
},
{

View File

@ -89,7 +89,7 @@ export function useMarketingPlan(id: string | undefined): UseMarketingPlanResult
async function loadPlan() {
try {
// ─── Dev / Demo: return mock data immediately ───
if (id === 'demo') {
if (id === 'demo' || id === 'view-clinic') {
setData(mockPlan);
setIsLoading(false);
return;

View File

@ -4,6 +4,7 @@ import type { MarketingReport } from '../types/report';
import { fetchReportById } from '../lib/supabase';
import { transformApiReport, mergeEnrichment, type EnrichmentData } from '../lib/transformReport';
import { normalizeInstagramHandle } from '../lib/normalizeHandles';
import { mockReport } from '../data/mockReport';
interface UseReportResult {
data: MarketingReport | null;
@ -67,7 +68,16 @@ export function useReport(id: string | undefined): UseReportResult {
return;
}
// Source 2: Fetch from Supabase by report ID (bookmarked/shared link)
// Source 2: Demo mode — return hardcoded mock data for sales prototype
if (id === 'view-clinic') {
setData(mockReport);
setIsEnriched(true);
setSocialHandles({ instagram: '@viewplastic', youtube: '@ViewclinicKR', facebook: 'viewps1' });
setIsLoading(false);
return;
}
// Source 3: Fetch from Supabase by report ID (bookmarked/shared link)
if (id) {
fetchReportById(id)
.then((row) => {

View File

@ -573,7 +573,7 @@ export function transformApiReport(
location: clinic.address || '',
nearestStation: '',
phone: clinic.phone || '',
domain: new URL(metadata.url).hostname,
domain: (() => { try { return new URL(metadata.url || '').hostname; } catch { return metadata.url || ''; } })(),
// Registry-sourced fields
source: metadata.source ?? 'scrape',
registryData: metadata.registryData ?? undefined,
@ -653,7 +653,7 @@ export function transformApiReport(
],
websiteAudit: {
primaryDomain: new URL(metadata.url).hostname,
primaryDomain: (() => { try { return new URL(metadata.url || '').hostname; } catch { return metadata.url || ''; } })(),
additionalDomains: (r.channelAnalysis?.website?.additionalDomains || []).map(d => ({
domain: (d as { domain?: string }).domain || '',
purpose: (d as { purpose?: string }).purpose || '',

View File

@ -137,7 +137,7 @@ export default function ClinicProfilePage() {
CLINIC.nameEn = (row.clinic_name || '').includes('의원') ? '' : row.clinic_name || '';
// Update website
const domain = new URL(row.url).hostname;
const domain = (() => { try { return new URL(row.url || '').hostname; } catch { return row.url || ''; } })();
CLINIC.websites = [{ label: '공식 홈페이지', url: domain, primary: true }];
// Update social from socialHandles