Compare commits

..

19 Commits

Author SHA1 Message Date
Haewon Kam 41577391d5 feat: 5개 병원 마케팅 플랜 전 섹션 병원별 맞춤화
각 mockPlan_{clinic}.ts에서 ...mockPlan (뷰성형외과) 스프레드를 완전 제거하고,
각 병원의 mockReport_{clinic}.ts 실측 데이터를 근거로 전 섹션 재구성:

- mockPlan_banobagi: 26년·6,853 리뷰·Black+Gold, 8개 채널전략
- mockPlan_grand: 이세환 원장·안면거상 전문·Navy Blue, 6개 채널전략
- mockPlan_wonjin: 35년·코성형·글로벌 3계정·Deep Purple, 6개 채널전략
- mockPlan_ts: 리얼모델·12,509 리뷰·Dark Navy+Crimson, 7개 채널전략
- mockPlan_irum: 다국어 KR/TH/JP·LINE 신규·Forest Green, 8개 채널전략

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 17:25:19 +09:00
Haewon Kam f2441de0bf fix: 리포트 '마케팅 기획' 버튼 → 브랜딩 가이드 섹션으로 이동
- KPIDashboard의 CTA 버튼이 /plan/:id 로만 이동 → 스크롤 위치 불확정
- 수정: /plan/:id#branding-guide 로 해시 포함 이동
- MarketingPlanPage에 useEffect 추가: location.hash 감지 시
  sticky Navbar(80px) + ReportNav(48px) = 128px 오프셋 적용하여
  해당 섹션 상단이 nav 바로 아래에 정렬되도록 scrollTo

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 16:48:44 +09:00
Haewon Kam d816bb2d13 fix: 콘텐츠 캘린더 뿌연 현상 근본 해결 — isDragging bug fix
세션 내내 추적하던 'opacity 20-30% 흐림' 인상의 진짜 원인:
  const isDragging = draggedEntry?.entry.id === entry.id;
→ mock entry에 id가 없어 undefined === undefined → true
→ 모든 entry에 opacity-40 상시 적용됨

수정:
- isDragging: 오브젝트 참조 비교로 전환 (id 의존 제거)
- entry 배경/border: 더 진한 파스텔로 대비 강화
  (#F3F0FF → #EDE5FF, border #D5CDF5 → #B8A8E8 등)
- entry 제목: text-slate-700 → font-medium text-[#0A1128]
- 아이콘 opacity-60 제거 (100% 불투명)
- shadow-sm + hover:shadow-lg
- 섹션 dark 테마 복원 (Dark/White 섹션 교차 규칙 유지)
- 일자 셀 bg-slate-50/50 제거, 빈 셀 border 불투명화

6개 병원 데모(view-clinic/banobagi/grand/wonjin/ts/irum) 모두
ContentCalendar 컴포넌트를 공유하므로 한 번에 반영.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 16:40:43 +09:00
Haewon Kam 281efac932 fix: 콘텐츠 캘린더 뿌연 레이어 제거 — 셀 배경 제거 + entry shadow 강화
- 일자 셀 bg-slate-50/50(50% 투명) 제거 → entry 카드가 주간 카드 위 직접 노출
- 빈 셀 border-slate-200/60 → border-slate-200 (불투명)
- entry 카드에 contentTypeColors.shadow 추가 → 색상별 soft glow로 떠있는 느낌
- dark 테마 유지 (ChannelStrategy와 동일한 dark 섹션 + 흰 카드 패턴)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 16:23:09 +09:00
Haewon Kam 6b3b950ad0 fix: 플랜 페이지 전체 섹션 투명 현상 완전 해결 — initial opacity:0 전수 제거
- PlanHeader: motion.div/h1/p의 initial opacity:0 → plain HTML로 교체
  (배경 blob 애니메이션은 opacity 무관하여 유지)
- RepurposingProposal: 카드 motion.div → plain div, 확장 accordion도 plain div
- ChannelStrategy, ContentStrategy, AssetCollection, PlanCTA,
  BrandingGuide, WorkflowTracker, StrategyAdjustmentSection:
  initial={{ opacity: 0, ... }} 라인 전수 제거
- 이 환경의 framer-motion이 animate prop 완료 실패 → opacity:0에서 멈춤

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 16:06:21 +09:00
Haewon Kam eaf215ea6d fix: 콘텐츠 캘린더 흐림 현상 근본 해결 — nav backdrop-blur 제거
- Navbar/ReportNav의 backdrop-blur-lg가 스크롤 시 섹션을 덮는
  GPU 합성 블러 레이어를 만들어 콘텐츠 캘린더가 흐려 보임
- bg-white/95 단색으로 교체 (시각적 차이 미미, 블러 부작용 제거)
- 이전 커밋(5f7d58c, aac1367)의 motion/whileInView 제거는
  원인이 아니었음 — 조상 nav의 backdrop-filter가 진범

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 15:59:10 +09:00
Haewon Kam aac1367808 fix: 콘텐츠 캘린더 흐림 현상 완전 해결 — motion 제거
framer-motion animate가 프로덕션 빌드에서 완료되지 않는 문제로
SectionWrapper/ContentCalendar의 opacity:0 initial 상태가 유지됨.
motion.div/motion.button/motion.section을 일반 태그로 교체하고
모든 opacity 진입 애니메이션 제거.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 15:42:31 +09:00
Haewon Kam 5f7d58c490 fix: 콘텐츠 캘린더 흐림 현상 수정 — whileInView 제거
SectionWrapper의 motion.section이 opacity:0 initial 상태에서
framer-motion animate가 발동하지 않아 전체 섹션이 투명하게 보이는
문제를 수정. SectionWrapper를 일반 <section>으로 교체하고,
plan 컴포넌트들의 whileInView/viewport 애니메이션 제거.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 15:33:34 +09:00
Haewon Kam 7dfa416089 fix: P1/P2 실측 데이터 반영 — 강남언니/IG/FB 팔로워 수치 교체
- 강남언니 URL 실측 ID 반영 (grand/62, wonjin/2500, ts/116, irum/839)
- Instagram 팔로워 실측: 바노바기 4,183 / 그랜드 4,013 / 원진 23,400 / 티에스 2,626 / 이룸 826
- Facebook 팔로워 실측: 바노바기 16,000 / 그랜드 26,000 / 원진 19,000 / 티에스 3,900 / 이룸 비공개(0)
- 이룸 FB 페이지 비공개/삭제 상태 명시, 신규 개설 권고로 전략 수정
- 전 파일 "(실측 진행 중)", "(추정)" 마커 제거

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 15:15:05 +09:00
Haewon Kam d66bc7b8f8 feat: 5개 병원 데모 추가 (바노바기/그랜드/원진/티에스/이룸)
- 각 병원 mockReport + mockPlan 파일 생성 (YouTube 실측치 기반)
- YouTube 실측: 바노바기 13K/925개, 원진 14.1K, 티에스 8K/715개,
  그랜드 2.37K/332개, 이룸(서울아이) 322/155개
- 채널별 스크린샷 PNG 30개 캡처 (Playwright headless)
- useReport + useMarketingPlan Hook에 5개 병원 DEMO_REPORTS/DEMO_PLANS 확장

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 14:49:46 +09:00
Haewon Kam 6b2cc7ef79 Merge: 닥터나우 제거 2026-04-13 14:00:04 +09:00
Haewon Kam 274fca48ea Merge: 퍼플 배경 heading 흰색 수정 2026-04-13 13:56:19 +09:00
Haewon Kam d03f3fe9c9 Merge: view-clinic demo 최우선 처리 버그 수정 2026-04-13 13:51:18 +09:00
Haewon Kam b079aec0be Merge claude/bold-hawking: URL fix + real screenshots 2026-04-13 13:43:29 +09:00
Haewon Kam 56f98b717c Merge branch 'claude/bold-hawking' 2026-04-13 13:23:28 +09:00
Haewon Kam be240f721b Merge branch 'claude/bold-hawking' 2026-04-13 13:11:37 +09:00
Haewon Kam f0bf3bb9b0 fix: import-registry 스크립트 수정 + npm sync-registry 추가
- .env + .env.local 모두 로드 (service role key 인식)
- is_active, verified_by 컬럼 제거 (테이블에 없음)
- package.json: npm run sync-registry 스크립트 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 14:25:00 +09:00
Haewon Kam cd2463fb2d fix: clinic_registry CSV 임포트 + NaverPlace 검색 개선
- VerifiedChannels에 naverPlace 필드 추가 (registry URL → placeId 전달)
- registryToVerifiedChannels: naver_place_url → placeId 추출하여 포함
- collect-channel-data NaverPlace 매칭 완화: exact match → contains match, 의원/병원 suffix 제거 shortName 사용, placeId 힌트로 검색 보강
- clinic_registry에 73개 병원 CSV 데이터 임포트 (올바른 YouTube/Blog/GangnamUnni/NaverPlace URL)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 14:22:59 +09:00
Haewon Kam e81c4cfee9 Merge branch 'claude/bold-hawking': 파이프라인 3대 버그 수정 + CLAUDE.md 업데이트 2026-04-10 13:52:40 +09:00
62 changed files with 4250 additions and 151 deletions

View File

@ -9,7 +9,8 @@
"preview": "vite preview", "preview": "vite preview",
"clean": "rm -rf dist", "clean": "rm -rf dist",
"lint": "tsc --noEmit", "lint": "tsc --noEmit",
"db:sync": "tsx scripts/sync-db-local.ts" "db:sync": "tsx scripts/sync-db-local.ts",
"sync-registry": "tsx scripts/import-registry.ts"
}, },
"dependencies": { "dependencies": {
"@google/genai": "^1.29.0", "@google/genai": "^1.29.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 KiB

View File

@ -14,7 +14,8 @@ import { createClient } from "@supabase/supabase-js";
import { readFileSync } from "fs"; import { readFileSync } from "fs";
import { config } from "dotenv"; import { config } from "dotenv";
config({ path: ".env.local" }); config({ path: ".env" }); // base env (service role key lives here)
config({ path: ".env.local" }); // local overrides (takes precedence)
const SUPABASE_URL = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL; const SUPABASE_URL = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
const SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY; const SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY;
@ -113,8 +114,6 @@ async function main() {
naver_blog_url: cols[COL.naver_blog_url]?.trim() || null, naver_blog_url: cols[COL.naver_blog_url]?.trim() || null,
naver_place_url: cols[COL.naver_place_url]?.trim() || null, naver_place_url: cols[COL.naver_place_url]?.trim() || null,
google_maps_url: cols[COL.google_maps_url]?.trim() || null, google_maps_url: cols[COL.google_maps_url]?.trim() || null,
verified_by: "scrape",
is_active: true,
}); });
} }

View File

@ -3,7 +3,7 @@ import { motion } from 'motion/react';
export default function Navbar() { export default function Navbar() {
return ( return (
<nav className="fixed top-0 left-0 right-0 z-50 bg-white/70 backdrop-blur-lg border-b border-white/20"> <nav className="fixed top-0 left-0 right-0 z-50 bg-white/95 border-b border-slate-100">
<div className="max-w-7xl mx-auto px-6 h-20 flex items-center justify-between"> <div className="max-w-7xl mx-auto px-6 h-20 flex items-center justify-between">
<Link to="/" className="flex items-center gap-2"> <Link to="/" className="flex items-center gap-2">
<span className="font-serif text-3xl font-black tracking-[0.05em] bg-gradient-to-r from-[#4F1DA1] to-[#021341] bg-clip-text text-transparent">INFINITH</span> <span className="font-serif text-3xl font-black tracking-[0.05em] bg-gradient-to-r from-[#4F1DA1] to-[#021341] bg-clip-text text-transparent">INFINITH</span>

View File

@ -91,9 +91,7 @@ export default function AssetCollection({ data }: AssetCollectionProps) {
key={asset.id} key={asset.id}
className="rounded-2xl border border-slate-100 bg-white shadow-sm p-5 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all" className="rounded-2xl border border-slate-100 bg-white shadow-sm p-5 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all"
onClick={() => setSelectedAsset({ kind: 'asset', data: asset })} onClick={() => setSelectedAsset({ kind: 'asset', data: asset })}
initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.4, delay: i * 0.05 }} transition={{ duration: 0.4, delay: i * 0.05 }}
> >
{/* Top badges row */} {/* Top badges row */}
@ -154,9 +152,7 @@ export default function AssetCollection({ data }: AssetCollectionProps) {
key={video.title} key={video.title}
className="min-w-[280px] rounded-2xl border border-slate-100 bg-white shadow-sm p-5 shrink-0 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all" className="min-w-[280px] rounded-2xl border border-slate-100 bg-white shadow-sm p-5 shrink-0 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all"
onClick={() => setSelectedAsset({ kind: 'youtube', data: video })} onClick={() => setSelectedAsset({ kind: 'youtube', data: video })}
initial={{ opacity: 0, x: 20 }} animate={{ opacity: 1, x: 0 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.4, delay: i * 0.1 }} transition={{ duration: 0.4, delay: i * 0.1 }}
> >
<div className="flex items-start gap-2 mb-3"> <div className="flex items-start gap-2 mb-3">

View File

@ -157,7 +157,6 @@ function VisualIdentityTab({ data }: { data: BrandGuide }) {
return ( return (
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
className="space-y-8" className="space-y-8"
@ -268,7 +267,6 @@ function VisualIdentityTab({ data }: { data: BrandGuide }) {
function ToneVoiceTab({ tone }: { tone: BrandGuide['toneOfVoice'] }) { function ToneVoiceTab({ tone }: { tone: BrandGuide['toneOfVoice'] }) {
return ( return (
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
className="space-y-6" className="space-y-6"
@ -339,7 +337,6 @@ function ToneVoiceTab({ tone }: { tone: BrandGuide['toneOfVoice'] }) {
function ChannelRulesTab({ channels }: { channels: BrandGuide['channelBranding'] }) { function ChannelRulesTab({ channels }: { channels: BrandGuide['channelBranding'] }) {
return ( return (
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
> >
@ -396,7 +393,6 @@ function BrandConsistencyTab({ inconsistencies }: { inconsistencies: BrandIncons
return ( return (
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
> >

View File

@ -53,9 +53,7 @@ export default function ChannelStrategy({ channels }: ChannelStrategyProps) {
<motion.div <motion.div
key={ch.channelId} key={ch.channelId}
className="bg-white rounded-2xl p-6 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:shadow-[4px_6px_16px_rgba(0,0,0,0.09)] transition-shadow" className="bg-white rounded-2xl p-6 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:shadow-[4px_6px_16px_rgba(0,0,0,0.09)] transition-shadow"
initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: index * 0.1 }} transition={{ duration: 0.5, delay: index * 0.1 }}
> >
{/* Header */} {/* Header */}

View File

@ -1,6 +1,5 @@
import React, { useState, useCallback } from 'react'; import React, { useState, useCallback } from 'react';
import { exportCalendarToICS } from '../../lib/calendarExport'; import { exportCalendarToICS } from '../../lib/calendarExport';
import { motion } from 'motion/react';
import { import {
VideoFilled, VideoFilled,
FileTextFilled, FileTextFilled,
@ -25,10 +24,10 @@ interface ContentCalendarProps {
} }
const contentTypeColors: Record<ContentCategory, { bg: string; text: string; entry: string; border: string; shadow: string }> = { const contentTypeColors: Record<ContentCategory, { bg: string; text: string; entry: string; border: string; shadow: string }> = {
video: { bg: 'bg-[#F3F0FF]', text: 'text-[#6C5CE7]', entry: 'bg-[#F3F0FF] border-[#D5CDF5]', border: 'border-[#D5CDF5]', shadow: 'shadow-[2px_3px_8px_rgba(155,138,212,0.15)]' }, video: { bg: 'bg-[#F3F0FF]', text: 'text-[#6C5CE7]', entry: 'bg-[#EDE5FF] border-[#B8A8E8]', border: 'border-[#D5CDF5]', shadow: 'shadow-[2px_3px_8px_rgba(155,138,212,0.15)]' },
blog: { bg: 'bg-[#EFF0FF]', text: 'text-[#3A3F7C]', entry: 'bg-[#EFF0FF] border-[#C5CBF5]', border: 'border-[#C5CBF5]', shadow: 'shadow-[2px_3px_8px_rgba(122,132,212,0.15)]' }, blog: { bg: 'bg-[#EFF0FF]', text: 'text-[#3A3F7C]', entry: 'bg-[#E2E5FF] border-[#A8B0E8]', border: 'border-[#C5CBF5]', shadow: 'shadow-[2px_3px_8px_rgba(122,132,212,0.15)]' },
social: { bg: 'bg-[#FFF6ED]', text: 'text-[#7C5C3A]', entry: 'bg-[#FFF6ED] border-[#F5E0C5]', border: 'border-[#F5E0C5]', shadow: 'shadow-[2px_3px_8px_rgba(212,168,114,0.15)]' }, social: { bg: 'bg-[#FFF6ED]', text: 'text-[#7C5C3A]', entry: 'bg-[#FFEED9] border-[#E8C896]', border: 'border-[#F5E0C5]', shadow: 'shadow-[2px_3px_8px_rgba(212,168,114,0.15)]' },
ad: { bg: 'bg-[#FFF0F0]', text: 'text-[#7C3A4B]', entry: 'bg-[#FFF0F0] border-[#F5D5DC]', border: 'border-[#F5D5DC]', shadow: 'shadow-[2px_3px_8px_rgba(212,136,154,0.15)]' }, ad: { bg: 'bg-[#FFF0F0]', text: 'text-[#7C3A4B]', entry: 'bg-[#FFE0E0] border-[#E8A8B4]', border: 'border-[#F5D5DC]', shadow: 'shadow-[2px_3px_8px_rgba(212,136,154,0.15)]' },
}; };
const contentTypeLabels: Record<ContentCategory, string> = { const contentTypeLabels: Record<ContentCategory, string> = {
@ -204,8 +203,8 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
key={dayIdx} key={dayIdx}
className={`min-h-[100px] rounded-xl p-1.5 ${ className={`min-h-[100px] rounded-xl p-1.5 ${
entries.length > 0 entries.length > 0
? 'bg-slate-50/50 border border-slate-100' ? ''
: 'border border-dashed border-slate-200/60' : 'border border-dashed border-slate-200'
}`} }`}
> >
{entries.map((entry, entryIdx) => renderEntry(entry, entryIdx))} {entries.map((entry, entryIdx) => renderEntry(entry, entryIdx))}
@ -221,12 +220,12 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
const ContentIcon = contentTypeIcons[entry.contentType]; const ContentIcon = contentTypeIcons[entry.contentType];
const ChannelIcon = channelIconMap[entry.channelIcon] ?? GlobeFilled; const ChannelIcon = channelIconMap[entry.channelIcon] ?? GlobeFilled;
const statusDot = statusDotColors[entry.status ?? 'draft']; const statusDot = statusDotColors[entry.status ?? 'draft'];
const isDragging = draggedEntry?.entry.id === entry.id; const isDragging = draggedEntry !== null && draggedEntry.entry === entry;
return ( return (
<div <div
key={entry.id ?? entryIdx} key={entry.id ?? entryIdx}
className={`${colors.entry} border rounded-lg p-1.5 mb-1 last:mb-0 cursor-grab active:cursor-grabbing hover:ring-2 hover:ring-purple-200 transition-all group relative ${isDragging ? 'opacity-40' : ''}`} className={`${colors.entry} border rounded-lg p-1.5 mb-1 last:mb-0 cursor-grab active:cursor-grabbing hover:ring-2 hover:ring-[#6C5CE7]/30 hover:shadow-lg shadow-sm transition-all group relative ${isDragging ? 'opacity-40' : ''}`}
draggable={weekNumber !== undefined} draggable={weekNumber !== undefined}
onDragStart={weekNumber !== undefined ? () => handleDragStart(entry, weekNumber) : undefined} onDragStart={weekNumber !== undefined ? () => handleDragStart(entry, weekNumber) : undefined}
onDragEnd={weekNumber !== undefined ? handleDragEnd : undefined} onDragEnd={weekNumber !== undefined ? handleDragEnd : undefined}
@ -235,9 +234,9 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
<div className="flex items-center gap-1 mb-0.5"> <div className="flex items-center gap-1 mb-0.5">
<span className={`w-1.5 h-1.5 rounded-full ${statusDot} flex-shrink-0`} /> <span className={`w-1.5 h-1.5 rounded-full ${statusDot} flex-shrink-0`} />
<ChannelIcon size={10} className={colors.text} /> <ChannelIcon size={10} className={colors.text} />
<ContentIcon size={10} className={`${colors.text} opacity-60`} /> <ContentIcon size={10} className={colors.text} />
</div> </div>
<p className="text-[11px] text-slate-700 leading-tight line-clamp-2"> <p className="text-[11px] font-medium text-[#0A1128] leading-tight line-clamp-2">
{entry.title} {entry.title}
</p> </p>
{entry.description && ( {entry.description && (
@ -313,23 +312,19 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
const Icon = contentTypeIcons[item.type]; const Icon = contentTypeIcons[item.type];
const isActive = filterType === item.type; const isActive = filterType === item.type;
return ( return (
<motion.button <button
key={item.type} key={item.type}
className={`flex items-center gap-3 px-5 py-3 rounded-2xl border cursor-pointer transition-all ${colors.bg} ${colors.border} ${colors.shadow} ${ className={`flex items-center gap-3 px-5 py-3 rounded-2xl border cursor-pointer transition-all ${colors.bg} ${colors.border} ${colors.shadow} ${
isActive ? 'ring-2 ring-white/40 ring-offset-2 ring-offset-transparent' : '' isActive ? 'ring-2 ring-white/40 ring-offset-2 ring-offset-transparent' : ''
} ${filterType && !isActive ? 'opacity-40' : ''}`} } ${filterType && !isActive ? 'opacity-40' : ''}`}
onClick={() => toggleFilter(item.type)} onClick={() => toggleFilter(item.type)}
initial={{ opacity: 0, y: 10 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.3, delay: i * 0.07 }}
> >
<Icon size={16} className={`${colors.text} opacity-70`} /> <Icon size={16} className={`${colors.text} opacity-70`} />
<div className="flex flex-col items-start"> <div className="flex flex-col items-start">
<span className={`text-2xl font-bold leading-none ${colors.text}`}>{item.count}</span> <span className={`text-2xl font-bold leading-none ${colors.text}`}>{item.count}</span>
<span className={`text-xs font-medium ${colors.text} opacity-70 mt-0.5`}>{item.label}</span> <span className={`text-xs font-medium ${colors.text} opacity-70 mt-0.5`}>{item.label}</span>
</div> </div>
</motion.button> </button>
); );
})} })}
{filterType && ( {filterType && (
@ -358,13 +353,9 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
} }
return ( return (
<motion.div <div
key={week.weekNumber} key={week.weekNumber}
className="bg-white rounded-2xl p-5 mb-4 shadow-[3px_4px_12px_rgba(0,0,0,0.06)]" className="bg-white rounded-2xl p-5 mb-4 shadow-[3px_4px_12px_rgba(0,0,0,0.06)]"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.4, delay: weekIdx * 0.1 }}
> >
<p className="text-sm font-bold text-[#0A1128] mb-3">{week.label}</p> <p className="text-sm font-bold text-[#0A1128] mb-3">{week.label}</p>
@ -385,9 +376,9 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
key={dayIdx} key={dayIdx}
className={`min-h-[80px] rounded-xl p-1.5 transition-all ${ className={`min-h-[80px] rounded-xl p-1.5 transition-all ${
entries.length > 0 entries.length > 0
? 'bg-slate-50/50 border border-slate-100' ? ''
: 'border border-dashed border-slate-200/60' : 'border border-dashed border-slate-200'
} ${isDropTarget ? 'ring-2 ring-[#6C5CE7]/40 bg-[#F3F0FF]/20 border-[#D5CDF5]' : ''}`} } ${isDropTarget ? 'ring-2 ring-[#6C5CE7]/40 bg-[#F3F0FF] border-[#D5CDF5]' : ''}`}
onDragOver={(e) => handleDragOver(e, week.weekNumber, dayIdx)} onDragOver={(e) => handleDragOver(e, week.weekNumber, dayIdx)}
onDragLeave={handleDragLeave} onDragLeave={handleDragLeave}
onDrop={() => handleDrop(week.weekNumber, dayIdx)} onDrop={() => handleDrop(week.weekNumber, dayIdx)}
@ -409,7 +400,7 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
</svg> </svg>
</button> </button>
</motion.div> </div>
); );
}) })
)} )}

View File

@ -69,7 +69,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
{activeTab === 'pillars' && ( {activeTab === 'pillars' && (
<motion.div <motion.div
className="grid md:grid-cols-2 gap-6" className="grid md:grid-cols-2 gap-6"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
> >
@ -78,7 +77,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
key={pillar.title} key={pillar.title}
className="rounded-2xl border border-slate-100 bg-white shadow-sm p-6 border-l-4" className="rounded-2xl border border-slate-100 bg-white shadow-sm p-6 border-l-4"
style={{ borderLeftColor: pillar.color }} style={{ borderLeftColor: pillar.color }}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4, delay: i * 0.1 }} transition={{ duration: 0.4, delay: i * 0.1 }}
> >
@ -109,7 +107,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
{activeTab === 'types' && ( {activeTab === 'types' && (
<motion.div <motion.div
className="rounded-2xl overflow-hidden border border-slate-100" className="rounded-2xl overflow-hidden border border-slate-100"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
> >
@ -123,7 +120,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
<motion.div <motion.div
key={row.format} key={row.format}
className={`grid grid-cols-4 ${i % 2 === 0 ? 'bg-white' : 'bg-slate-50'}`} className={`grid grid-cols-4 ${i % 2 === 0 ? 'bg-white' : 'bg-slate-50'}`}
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.3, delay: i * 0.04 }} transition={{ duration: 0.3, delay: i * 0.04 }}
> >
@ -151,7 +147,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
{activeTab === 'workflow' && ( {activeTab === 'workflow' && (
<motion.div <motion.div
className="flex md:flex-row flex-col gap-4 items-stretch" className="flex md:flex-row flex-col gap-4 items-stretch"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
> >
@ -159,7 +154,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
<div key={step.step} className="flex md:flex-row flex-col items-center gap-4 flex-1"> <div key={step.step} className="flex md:flex-row flex-col items-center gap-4 flex-1">
<motion.div <motion.div
className="flex-1 w-full rounded-2xl border border-slate-100 bg-white shadow-sm p-5" className="flex-1 w-full rounded-2xl border border-slate-100 bg-white shadow-sm p-5"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4, delay: i * 0.1 }} transition={{ duration: 0.4, delay: i * 0.1 }}
> >
@ -191,7 +185,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
{/* Tab 4: Repurposing */} {/* Tab 4: Repurposing */}
{activeTab === 'repurposing' && ( {activeTab === 'repurposing' && (
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }} transition={{ duration: 0.4 }}
> >
@ -214,7 +207,6 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
<motion.div <motion.div
key={`${output.format}-${i}`} key={`${output.format}-${i}`}
className="rounded-xl border border-slate-100 bg-white p-4" className="rounded-xl border border-slate-100 bg-white p-4"
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.3, delay: i * 0.05 }} transition={{ duration: 0.3, delay: i * 0.05 }}
> >

View File

@ -11,9 +11,7 @@ export default function PlanCTA() {
return ( return (
<motion.section <motion.section
className="py-16 md:py-20 px-6" className="py-16 md:py-20 px-6"
initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, ease: 'easeOut' }} transition={{ duration: 0.6, ease: 'easeOut' }}
> >
<div className="max-w-7xl mx-auto"> <div className="max-w-7xl mx-auto">

View File

@ -28,7 +28,7 @@ export default function PlanHeader({
}: PlanHeaderProps) { }: PlanHeaderProps) {
return ( return (
<section className="relative overflow-hidden bg-[radial-gradient(ellipse_at_top_left,#e0e7ff,transparent_50%),radial-gradient(ellipse_at_bottom_right,#fce7f3,transparent_50%),radial-gradient(ellipse_at_center,#f5f3ff,transparent_60%)] py-20 md:py-28 px-6"> <section className="relative overflow-hidden bg-[radial-gradient(ellipse_at_top_left,#e0e7ff,transparent_50%),radial-gradient(ellipse_at_bottom_right,#fce7f3,transparent_50%),radial-gradient(ellipse_at_center,#f5f3ff,transparent_60%)] py-20 md:py-28 px-6">
{/* Animated blobs */} {/* Animated blobs — position only, no opacity */}
<motion.div <motion.div
className="absolute top-10 left-10 w-72 h-72 rounded-full bg-[#6C5CE7]/10 blur-3xl" className="absolute top-10 left-10 w-72 h-72 rounded-full bg-[#6C5CE7]/10 blur-3xl"
animate={{ x: [0, 30, 0], y: [0, -20, 0] }} animate={{ x: [0, 30, 0], y: [0, -20, 0] }}
@ -47,51 +47,21 @@ export default function PlanHeader({
<div className="relative max-w-7xl mx-auto"> <div className="relative max-w-7xl mx-auto">
<div className="flex flex-col md:flex-row items-center md:items-start justify-between gap-10"> <div className="flex flex-col md:flex-row items-center md:items-start justify-between gap-10">
{/* Left: Text content */} {/* Left: Text content — plain div, no opacity animation */}
<motion.div <div className="flex-1 text-center md:text-left">
className="flex-1 text-center md:text-left" <p className="text-xs font-semibold text-[#6C5CE7] mb-4 tracking-widest uppercase">
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5 }}
>
<motion.p
className="text-xs font-semibold text-[#6C5CE7] mb-4 tracking-widest uppercase"
initial={{ opacity: 0, y: 10 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.1 }}
>
Marketing Execution Plan Marketing Execution Plan
</motion.p> </p>
<motion.h1 <h1 className="font-serif text-4xl md:text-5xl font-bold text-[#0A1128] mb-3">
className="font-serif text-4xl md:text-5xl font-bold text-[#0A1128] mb-3"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.2 }}
>
{clinicName} {clinicName}
</motion.h1> </h1>
<motion.p <p className="text-xl text-slate-600 mb-8">
className="text-xl text-slate-600 mb-8"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.3 }}
>
{clinicNameEn} {clinicNameEn}
</motion.p> </p>
<motion.div <div className="flex flex-wrap gap-3 justify-center md:justify-start">
className="flex flex-wrap gap-3 justify-center md:justify-start"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.4 }}
>
<span className="inline-flex items-center gap-2 rounded-full bg-white/60 backdrop-blur-sm border border-white/40 px-3 py-1 text-sm font-medium text-slate-700"> <span className="inline-flex items-center gap-2 rounded-full bg-white/60 backdrop-blur-sm border border-white/40 px-3 py-1 text-sm font-medium text-slate-700">
<CalendarFilled size={14} className="text-slate-400" /> <CalendarFilled size={14} className="text-slate-400" />
{formatDate(date)} {formatDate(date)}
@ -100,24 +70,18 @@ export default function PlanHeader({
<GlobeFilled size={14} className="text-slate-400" /> <GlobeFilled size={14} className="text-slate-400" />
{targetUrl} {targetUrl}
</span> </span>
</motion.div> </div>
</motion.div> </div>
{/* Right: 90 Days badge */} {/* Right: 90 Days badge */}
<motion.div <div className="shrink-0">
className="shrink-0"
initial={{ opacity: 0, scale: 0.8 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
transition={{ duration: 0.6, delay: 0.3 }}
>
<div className="w-32 h-32 rounded-full bg-gradient-to-r from-[#4F1DA1] to-[#021341] flex flex-col items-center justify-center shadow-lg"> <div className="w-32 h-32 rounded-full bg-gradient-to-r from-[#4F1DA1] to-[#021341] flex flex-col items-center justify-center shadow-lg">
<span className="text-4xl font-bold text-white leading-none"> <span className="text-4xl font-bold text-white leading-none">
90 90
</span> </span>
<span className="text-sm text-white/60">Days</span> <span className="text-sm text-white/60">Days</span>
</div> </div>
</motion.div> </div>
</div> </div>
</div> </div>
</section> </section>

View File

@ -1,5 +1,4 @@
import { useState } from 'react'; import { useState } from 'react';
import { motion } from 'motion/react';
import { import {
YoutubeFilled, YoutubeFilled,
InstagramFilled, InstagramFilled,
@ -63,13 +62,9 @@ export default function RepurposingProposal({ proposals }: RepurposingProposalPr
const isExpanded = expandedIdx === idx; const isExpanded = expandedIdx === idx;
return ( return (
<motion.div <div
key={item.sourceVideo.title} key={item.sourceVideo.title}
className="rounded-2xl border border-slate-100 bg-white shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden" className="rounded-2xl border border-slate-100 bg-white shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.4, delay: idx * 0.08 }}
> >
{/* Card Header — click to expand */} {/* Card Header — click to expand */}
<button <button
@ -121,26 +116,17 @@ export default function RepurposingProposal({ proposals }: RepurposingProposalPr
{/* Expanded: Repurpose outputs */} {/* Expanded: Repurpose outputs */}
{isExpanded && ( {isExpanded && (
<motion.div <div className="border-t border-slate-100">
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
transition={{ duration: 0.2 }}
className="border-t border-slate-100"
>
<div className="px-6 py-4"> <div className="px-6 py-4">
<div className="flex items-center gap-2 mb-4"> <div className="flex items-center gap-2 mb-4">
<BoltFilled size={14} className="text-[#6C5CE7]" /> <BoltFilled size={14} className="text-[#6C5CE7]" />
<p className="text-xs font-semibold text-slate-500 uppercase tracking-widest">REPURPOSE AS</p> <p className="text-xs font-semibold text-slate-500 uppercase tracking-widest">REPURPOSE AS</p>
</div> </div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-3"> <div className="grid grid-cols-1 md:grid-cols-2 gap-3">
{item.outputs.map((output, oIdx) => ( {item.outputs.map((output) => (
<motion.div <div
key={output.format} key={output.format}
className="flex items-start gap-3 p-4 rounded-xl bg-slate-50 border border-slate-100" className="flex items-start gap-3 p-4 rounded-xl bg-slate-50 border border-slate-100"
initial={{ opacity: 0, x: -8 }}
animate={{ opacity: 1, x: 0 }}
transition={{ delay: oIdx * 0.06 }}
> >
<div className="w-8 h-8 rounded-lg bg-gradient-to-br from-[#6C5CE7]/10 to-[#4F1DA1]/10 flex items-center justify-center shrink-0"> <div className="w-8 h-8 rounded-lg bg-gradient-to-br from-[#6C5CE7]/10 to-[#4F1DA1]/10 flex items-center justify-center shrink-0">
<ChannelIcon channel={output.channel} size={16} /> <ChannelIcon channel={output.channel} size={16} />
@ -150,13 +136,13 @@ export default function RepurposingProposal({ proposals }: RepurposingProposalPr
<p className="text-xs text-[#6C5CE7] font-medium mb-1">{output.channel}</p> <p className="text-xs text-[#6C5CE7] font-medium mb-1">{output.channel}</p>
<p className="text-xs text-slate-500 leading-relaxed">{output.description}</p> <p className="text-xs text-slate-500 leading-relaxed">{output.description}</p>
</div> </div>
</motion.div> </div>
))} ))}
</div> </div>
</div> </div>
</motion.div> </div>
)} )}
</motion.div> </div>
); );
})} })}
</div> </div>

View File

@ -176,7 +176,6 @@ export default function StrategyAdjustmentSection({ clinicId, planId }: Strategy
{overallAssessment && ( {overallAssessment && (
<motion.div <motion.div
className="bg-purple-50 border border-purple-100 rounded-2xl p-4 mb-6" className="bg-purple-50 border border-purple-100 rounded-2xl p-4 mb-6"
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
> >
<p className="text-sm text-purple-800">{overallAssessment}</p> <p className="text-sm text-purple-800">{overallAssessment}</p>
@ -192,7 +191,6 @@ export default function StrategyAdjustmentSection({ clinicId, planId }: Strategy
<motion.div <motion.div
key={i} key={i}
className="bg-white rounded-xl p-4 border border-slate-100" className="bg-white rounded-xl p-4 border border-slate-100"
initial={{ opacity: 0, x: -10 }}
animate={{ opacity: 1, x: 0 }} animate={{ opacity: 1, x: 0 }}
transition={{ delay: i * 0.05 }} transition={{ delay: i * 0.05 }}
> >
@ -237,7 +235,6 @@ export default function StrategyAdjustmentSection({ clinicId, planId }: Strategy
<motion.div <motion.div
key={i} key={i}
className={`${colors.bg} rounded-xl p-4 border border-slate-100`} className={`${colors.bg} rounded-xl p-4 border border-slate-100`}
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ delay: i * 0.08 }} transition={{ delay: i * 0.08 }}
> >

View File

@ -101,7 +101,6 @@ function WorkflowCard({ item, onStageChange, onNotesChange }: {
<motion.div <motion.div
layout layout
className="bg-white rounded-2xl border border-slate-100 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden" className="bg-white rounded-2xl border border-slate-100 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden"
initial={{ opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -8 }} exit={{ opacity: 0, y: -8 }}
transition={{ duration: 0.3 }} transition={{ duration: 0.3 }}
@ -144,7 +143,6 @@ function WorkflowCard({ item, onStageChange, onNotesChange }: {
<AnimatePresence> <AnimatePresence>
{expanded && ( {expanded && (
<motion.div <motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }} animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }} exit={{ opacity: 0, height: 0 }}
transition={{ duration: 0.2 }} transition={{ duration: 0.2 }}
@ -341,7 +339,6 @@ export default function WorkflowTracker({ data }: WorkflowTrackerProps) {
className={`flex items-center gap-2 px-3 py-1.5 rounded-full border text-xs font-medium transition-all ${color.bg} ${color.text} ${color.border} ${ className={`flex items-center gap-2 px-3 py-1.5 rounded-full border text-xs font-medium transition-all ${color.bg} ${color.text} ${color.border} ${
isActive ? 'ring-2 ring-white/40' : '' isActive ? 'ring-2 ring-white/40' : ''
} ${activeStageFilter && !isActive ? 'opacity-40' : ''}`} } ${activeStageFilter && !isActive ? 'opacity-40' : ''}`}
initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: 1, scale: 1 }} animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.2 }} transition={{ duration: 0.2 }}
> >
@ -366,7 +363,6 @@ export default function WorkflowTracker({ data }: WorkflowTrackerProps) {
<AnimatePresence mode="popLayout"> <AnimatePresence mode="popLayout">
{filtered.length === 0 ? ( {filtered.length === 0 ? (
<motion.div <motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }} animate={{ opacity: 1 }}
className="text-center py-10 text-white/30 text-sm" className="text-center py-10 text-white/30 text-sm"
> >

View File

@ -97,7 +97,7 @@ export default function KPIDashboard({ metrics, clinicName }: KPIDashboardProps)
</p> </p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-4"> <div className="flex flex-col sm:flex-row items-center justify-center gap-4">
<button <button
onClick={() => navigate(`/plan/${id || 'live'}`)} onClick={() => navigate(`/plan/${id || 'live'}#branding-guide`)}
className="inline-flex items-center gap-2 bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white font-semibold px-8 py-4 rounded-full hover:shadow-xl transition-all" className="inline-flex items-center gap-2 bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white font-semibold px-8 py-4 rounded-full hover:shadow-xl transition-all"
> >

View File

@ -50,7 +50,7 @@ export function ReportNav({ sections }: ReportNavProps) {
}; };
return ( return (
<nav data-report-nav className="sticky top-20 z-40 bg-white/80 backdrop-blur-lg border-b border-slate-100"> <nav data-report-nav className="sticky top-20 z-40 bg-white/95 border-b border-slate-100">
<div <div
ref={navRef} ref={navRef}
className="max-w-7xl mx-auto flex overflow-x-auto scrollbar-hide" className="max-w-7xl mx-auto flex overflow-x-auto scrollbar-hide"

View File

@ -1,5 +1,4 @@
import type { ReactNode } from 'react'; import type { ReactNode } from 'react';
import { motion } from 'motion/react';
interface SectionWrapperProps { interface SectionWrapperProps {
id: string; id: string;
@ -19,12 +18,8 @@ export function SectionWrapper({
className = '', className = '',
}: SectionWrapperProps) { }: SectionWrapperProps) {
return ( return (
<motion.section <section
id={id} id={id}
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, ease: 'easeOut' }}
className={` className={`
${dark ${dark
? 'bg-[#0A1128] text-white relative overflow-hidden' ? 'bg-[#0A1128] text-white relative overflow-hidden'
@ -60,6 +55,6 @@ export function SectionWrapper({
</div> </div>
{children} {children}
</div> </div>
</motion.section> </section>
); );
} }

View File

@ -0,0 +1,517 @@
import type { MarketingPlan } from '../types/plan';
/**
*
*
* (`mockReport_banobagi.ts` 2026-04-14 ):
* - YouTube @banobagips: 13K , 925 ( 6 )
* - Instagram @banobagi_ps: 4,183 , 2,000 (Reels 10 )
* - Facebook @BanobagiPlasticSurgery: 16K (EN KR )
* - @banobagips: 2023-04-21 (2 )
* - : 9.2 / 6,853 ( )
* - 26 (2000 ), , + 6+5
* - : / / / / / ·
*
* · . mockPlan(View) .
*/
export const mockPlanBanobagi: MarketingPlan = {
id: 'banobagi',
reportId: 'banobagi',
clinicName: '바노바기성형외과의원',
clinicNameEn: 'Banobagi Plastic Surgery Clinic',
createdAt: '2026-04-14',
targetUrl: 'https://www.banobagi.com',
// ─── Section 1: Brand Guide ───
brandGuide: {
colors: [
{ name: 'Banobagi Black', hex: '#1A1A1A', usage: '공식 로고 메인, 헤딩, 강조 텍스트' },
{ name: 'Banobagi Gold', hex: '#C8A96A', usage: '로고 악센트, CTA 포인트, 구분선' },
{ name: 'Ivory White', hex: '#FAF7F2', usage: '배경, 카드, 여백' },
{ name: 'Deep Charcoal', hex: '#2D2D2D', usage: '본문 텍스트' },
{ name: 'Soft Gray', hex: '#6B6B6B', usage: '서브 텍스트, 메타 정보' },
],
fonts: [
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀', sampleText: '26년 강남 대표 성형외과' },
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: '바노바기성형외과 — 안전과 자연스러움' },
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩', sampleText: 'BANOBAGI' },
],
logoRules: [
{ rule: '블랙+골드 워드마크 통일 사용', description: '공식 BANOBAGI 워드마크(블랙 배경 + 골드 텍스트)를 모든 채널에서 동일하게 사용', correct: true },
{ rule: '원형 로고: 블랙 배경 골드 심볼 버전', description: '프로필 사진용 원형 버전은 블랙 원형 + 골드 "B" 심볼 1080×1080 사용', correct: true },
{ rule: '가로형 로고: 워드마크 + 한글 병기', description: '배너·헤더에는 BANOBAGI 워드마크 + "바노바기성형외과" 한글 병기', correct: true },
{ rule: '저해상도 프로필 사진 금지', description: '채널별 프로필 해상도 편차 발견 — 1080×1080 단일 원형 로고로 통일 필요', correct: false },
{ rule: '한글 채널 설명 우선', description: 'YouTube 채널 설명이 영문 위주 — 한국 시장 타겟팅 위해 한글 우선/영문 병기', correct: false },
{ rule: '로고 주변 여백 확보', description: '로고 크기의 30% 이상 여백을 유지하여 가독성 확보', correct: true },
],
toneOfVoice: {
personality: ['신뢰감 있는', '전문적', '차분한', '결과 중심', '절제된 럭셔리'],
communicationStyle: '26년 축적된 임상 경험을 바탕으로, 과장 없이 결과와 원칙으로 설득합니다. 환자의 관점에서 생각하되 의료 전문성을 잃지 않는 톤.',
doExamples: [
'"자연스러움이 보일 때까지, 디테일에 디테일을 더합니다"',
'"26년 임상 경험, 6,853개의 진솔한 후기"',
'"바노바기의 원칙: 결과로 증명합니다"',
'"분야별 전문의 공동 진료 시스템"',
],
dontExamples: [
'"강남 최고! 파격 할인!"',
'"연예인이 선택한 병원"',
'"100% 만족 보장"',
'"이 가격은 오늘까지만!"',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: '블랙+골드 BANOBAGI 원형 로고 1080×1080', bannerSpec: '2560×1440px, 블랙 배경 + 골드 워드마크, "26년 강남 대표 성형외과" 슬로건', bioTemplate: '26년 강남 대표 성형외과 — 바노바기\n안면윤곽·눈·코·가슴·리프팅\n02-1588-6508 | banobagi.com', currentStatus: 'incorrect' },
{ channel: 'Instagram KR', icon: 'instagram', profilePhoto: '블랙+골드 원형 로고', bannerSpec: 'N/A (하이라이트 커버: 블랙+골드 아이콘 세트 — 안면윤곽/눈/코/가슴/리뷰)', bioTemplate: '바노바기성형외과 공식 — 26년 임상\n역삼역·강남역 | 02-1588-6508\nbanobagi.com', currentStatus: 'incorrect' },
{ channel: 'Facebook KR', icon: 'facebook', profilePhoto: '블랙+골드 원형 로고', bannerSpec: '820×312px, 블랙+골드 배너 + "26년 강남 대표 성형외과"', bioTemplate: '바노바기성형외과 한국 공식 — 26년 임상 경험', currentStatus: 'missing' },
{ channel: 'Facebook EN', icon: 'facebook', profilePhoto: '블랙+골드 원형 로고', bannerSpec: '820×312px, 동일 디자인 시스템', bioTemplate: 'Banobagi Plastic Surgery — 26 Years of Excellence in Gangnam', currentStatus: 'correct' },
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: '블랙+골드 로고', bannerSpec: '블로그 상단: 워드마크 + 시술 카테고리 메뉴', bioTemplate: '바노바기성형외과 공식 블로그 — 26년 강남 대표\n안면윤곽·눈·코·가슴·리프팅·지방체형', currentStatus: 'incorrect' },
{ channel: 'TikTok', icon: 'video', profilePhoto: '블랙+골드 원형 로고', bannerSpec: 'N/A', bioTemplate: '바노바기성형외과 — 26년 강남 대표\n역삼역 | 02-1588-6508', currentStatus: 'missing' },
],
brandInconsistencies: [
{
field: '로고',
values: [
{ channel: 'YouTube', value: 'BANOBAGI 영문 워드마크', isCorrect: true },
{ channel: 'Instagram KR', value: '바노바기 블랙+골드 로고', isCorrect: true },
{ channel: 'Facebook EN', value: '블랙+골드 워드마크', isCorrect: true },
{ channel: 'Website', value: '블랙+골드 공식 로고', isCorrect: true },
],
impact: '브랜드 시각 아이덴티티는 비교적 일관되지만 채널별 프로필 해상도 편차 존재. 한국 시장용 Facebook KR 페이지와 TikTok 채널 자산 부재.',
recommendation: '전 채널 1080×1080 원형 로고 재발급 + Facebook KR / TikTok 신규 채널 자산 제작',
},
{
field: '바이오/소개 메시지',
values: [
{ channel: 'YouTube', value: 'Protect and nurture your true beauty… (영문 위주)', isCorrect: false },
{ channel: 'Instagram KR', value: '바노바기성형외과 공식 계정 (USP 부재)', isCorrect: false },
{ channel: 'Facebook EN', value: 'Korean Premium Plastic Surgery Clinic', isCorrect: false },
{ channel: 'Naver Blog', value: '(설명 부실 — 2년 방치)', isCorrect: false },
],
impact: '4개 채널, 4개의 서로 다른 소개 — "26년 임상" 핵심 USP가 어느 곳에도 부각되지 않음',
recommendation: '핵심 USP 통일: "26년 강남 대표 성형외과 — 바노바기" + 시술군 + 연락처 표준 포맷',
},
],
},
// ─── Section 2: Channel Strategies ───
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
currentStatus: '13K 구독자, 925 영상 누적 — 최근 6개월 업로드 저조',
targetGoal: '30K 구독자 / 12개월, 주 2회 정기 업로드 복구',
contentTypes: ['Shorts (기존 925 영상 재편집)', 'Long-form (원장 인터뷰·시술 가이드)', 'Community (Q&A 투표)'],
postingFrequency: '주 2회 (Shorts 1 + 롱폼 격주)',
tone: '차분한 전문가 — 반재중 원장 직접 설명 교육 콘텐츠',
formatGuidelines: [
'Shorts: 925개 기존 영상에서 핵심 15-60초 구간 추출, 후크 3초 내',
'Long-form: 5-12분, 안면윤곽/가슴 등 시술별 시리즈',
'썸네일: 블랙+골드 워드마크 워터마크 통일',
'한글 타이틀 + 영문 부제 병기 (한국 시장 타겟팅 강화)',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'instagram_kr', channelName: 'Instagram', icon: 'instagram',
currentStatus: '@banobagi_ps — 4,183 팔로워, 2,000 게시물, Reels 10개 (부족)',
targetGoal: '60K 팔로워 / 12개월, Reels 주 5개',
contentTypes: ['Reels (YouTube Shorts 동시 배포)', 'Carousel (강남언니 6,853 리뷰 스토리화)', 'Stories (병원 일상)', 'Before/After'],
postingFrequency: '일 1회 + Stories 일 2-3개',
tone: '차분하지만 친근한 — 26년 신뢰감 + 환자 관점 Q&A',
formatGuidelines: [
'Reels: YouTube Shorts 와 동시 게시 (자산 재활용 우선)',
'Carousel: 강남언니 리뷰 50개 선별 → 카루셀 콘텐츠 시리즈',
'Stories: 안면윤곽/눈/코/가슴 카테고리별 하이라이트 재구성',
'해시태그: #바노바기성형외과 #Banobagi #강남안면윤곽 #26년임상',
],
priority: 'P0',
customerJourneyStage: 'interest',
},
{
channelId: 'facebook_en', channelName: 'Facebook EN (국제)', icon: 'facebook',
currentStatus: '@BanobagiPlasticSurgery — 16K 팔로워, 영문 위주, 리타겟 채널로 활용 가능',
targetGoal: '의료관광 리타겟 광고 채널로 전환, 광고 ROAS 추적 시작',
contentTypes: ['영문 환자 여정 콘텐츠', 'Before/After (동의서 확인)', '리타겟 광고 소재'],
postingFrequency: '주 1-2회 + 광고 캠페인 상시',
tone: 'Professional & warm — Korea medical tourism storytelling',
formatGuidelines: [
'Pixel 기반 리타겟 광고 (이미 설치 확인됨)',
'WhatsApp 연동 활용 — 해외 상담 자동 응대',
'영문 환자 후기 인터뷰 시리즈',
],
priority: 'P1',
customerJourneyStage: 'conversion',
},
{
channelId: 'facebook_kr', channelName: 'Facebook KR (신규)', icon: 'facebook',
currentStatus: '한국 전용 페이지 부재 — 한국 환자 접근성 0',
targetGoal: '한국 페이지 신규 개설 또는 Instagram KR 집중 결정 (3개월 내)',
contentTypes: ['(개설 시) Reels 크로스포스팅', '광고 리타겟'],
postingFrequency: '주 2-3회 (개설 시)',
tone: '한국 환자 친화적 — 신뢰 기반',
formatGuidelines: [
'한국 KR 페이지 신규 개설 vs Instagram KR 집중 ROI 비교 후 결정',
'개설 시: Instagram Reels 와 동일 콘텐츠 크로스포스팅',
],
priority: 'P2',
customerJourneyStage: 'awareness',
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: '@banobagips — 마지막 포스트 2023-04-21 (2년 이상 방치, SEO 자산 잠금)',
targetGoal: '주 2회 포스팅 즉시 재가동, 12개월 내 월 20,000 방문자',
contentTypes: ['SEO 시술 가이드', '환자 후기 (강남언니 리뷰 가공)', 'YouTube 영상 임베드 + 텍스트 가이드'],
postingFrequency: '주 2회 (1차 6월 내 시작)',
tone: '정보성 전문가 — "바노바기 후기/안면윤곽/V라인" 키워드 중심',
formatGuidelines: [
'2,000자 이상 SEO 최적화 포스트',
'YouTube 시술 영상 + 텍스트 가이드 결합 구조',
'SEO 키워드 맵: "바노바기 후기", "강남 안면윤곽", "사각턱 축소", "V라인"',
'이미지 10장 이상 + 영상 임베드 1개 이상',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
currentStatus: '9.2점/10, 6,853 리뷰 — 강남 상위권, 핵심 자산',
targetGoal: '리뷰 응답률 80% 달성, 12개월 내 8,500 리뷰',
contentTypes: ['리뷰 응답', '시술 정보 업데이트', '이벤트/프로모션 게시'],
postingFrequency: '리뷰 응답: 일 단위 / 정보 업데이트: 월 1-2회',
tone: '진심 어린 의료진 답변 — 형식적 답변 지양',
formatGuidelines: [
'리뷰 응답률 50%(3개월) → 80%(12개월) 단계 상향',
'6,853 리뷰 중 50개 선별 → SNS 콘텐츠로 재가공',
'부정 리뷰 24시간 내 응답 원칙',
],
priority: 'P0',
customerJourneyStage: 'loyalty',
},
{
channelId: 'tiktok', channelName: 'TikTok (신규)', icon: 'video',
currentStatus: '계정 없음',
targetGoal: '10K 팔로워 / 12개월, 20-30대 첫 수술 고민층 도달',
contentTypes: ['YouTube Shorts 크로스포스팅', '트렌드 챌린지', '병원 비하인드'],
postingFrequency: '주 5회 (YouTube Shorts 동시 배포)',
tone: '가볍고 접근 가능한 — 20-30대 타겟',
formatGuidelines: [
'925 YouTube 영상 → Shorts 추출 → TikTok 동시 배포',
'트렌딩 사운드 활용 + 자막 필수',
'의료광고법 준수 — 과장 표현 금지',
],
priority: 'P1',
customerJourneyStage: 'awareness',
},
{
channelId: 'kakaotalk', channelName: 'KakaoTalk', icon: 'messageSquare',
currentStatus: '02-1588-6508 대표번호 + 카카오 채널 운영',
targetGoal: '카카오 채널 친구 수 확보, 상담 전환율 30% 향상',
contentTypes: ['상담 안내', '예약 확인', '월 1회 시술 정보 발송'],
postingFrequency: '주 1-2회 메시지 발송',
tone: '따뜻하고 전문적인 — 1:1 상담 톤',
formatGuidelines: [
'자동 응답 시나리오 — 안면윤곽/가슴/눈/코 시술별 분기',
'예약 리마인더 자동 발송',
'한국어 + 영문/중문 옵션 (의료관광 대비)',
],
priority: 'P1',
customerJourneyStage: 'conversion',
},
],
// ─── Section 3: Content Strategy ───
contentStrategy: {
pillars: [
{
title: '26년 임상의 원칙',
description: '2000년 개원 이래 26년간 축적한 임상 데이터와 수술 철학을 보여주는 콘텐츠',
relatedUSP: '26 Years of Clinical Experience',
exampleTopics: ['반재중 원장의 안면윤곽 철학', '26년간 변하지 않은 원칙 3가지', '바노바기의 분야별 공동 진료 시스템'],
color: '#1A1A1A',
},
{
title: '안면윤곽 전문성',
description: '바노바기의 핵심 USP인 안면윤곽 분야의 깊이 있는 교육·기술 콘텐츠',
relatedUSP: 'Facial Contouring Authority',
exampleTopics: ['사각턱 축소 — 골격별 맞춤 디자인', 'V라인 자연스러움의 기준', '안면윤곽 후 회복 타임라인'],
color: '#C8A96A',
},
{
title: '6,853 리뷰의 진심',
description: '강남언니 6,853 리뷰를 환자의 목소리로 재구성, 진솔한 후기 콘텐츠',
relatedUSP: 'Patient-Validated Trust',
exampleTopics: ['실제 환자 인터뷰 시리즈', '강남언니 베스트 리뷰 카루셀', '수술 결정부터 회복까지 환자 다이어리'],
color: '#6B6B6B',
},
{
title: '안전 시스템',
description: '마취과 전문의 상주, 분야별 공동 진료 등 바노바기의 안전 인프라',
relatedUSP: 'Safety Infrastructure',
exampleTopics: ['마취과 전문의가 상주하는 이유', '본관+별관 시설 투어', '시술 후 관리 프로토콜'],
color: '#FAF7F2',
},
],
typeMatrix: [
{ format: 'YouTube Long-form', channels: ['YouTube'], frequency: '격주 1회', purpose: '26년 임상 전문성 증명, 깊은 신뢰 구축' },
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 5개', purpose: '925 영상 자산 재활용, 도달 확대' },
{ format: 'Carousel (리뷰 스토리)', channels: ['Instagram'], frequency: '주 2회', purpose: '강남언니 6,853 리뷰 → 사회적 증거화' },
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '2년 방치된 SEO 자산 복구, 검색 유입' },
{ format: 'Stories', channels: ['Instagram'], frequency: '일 2-3개', purpose: '병원 일상·상담 비하인드' },
{ format: 'Ad Creative (EN)', channels: ['Facebook EN', 'Instagram'], frequency: '월 4-6개', purpose: '의료관광 리타겟, Pixel 기반 전환' },
],
workflow: [
{ step: 1, name: '기존 자산 인벤토리', description: '925 YouTube 영상 + 2,000 IG 게시물 + 6,853 강남언니 리뷰 카탈로그화', owner: '마케팅 매니저', duration: '1-2주 (1회성)' },
{ step: 2, name: '주제 선정', description: '시술별 검색 키워드 + 콘텐츠 필러 매칭', owner: '마케팅 매니저', duration: '1일' },
{ step: 3, name: '초안 작성/추출', description: 'AI 초안 생성 또는 기존 영상에서 Shorts 추출', owner: 'AI + 콘텐츠 팀', duration: '1-2일' },
{ step: 4, name: '의료 검수', description: '반재중 원장 + 분야별 전문의 검토 (의료광고법 포함)', owner: '의료진', duration: '1일' },
{ step: 5, name: '비주얼 마감', description: '블랙+골드 워터마크, 한글/영문 자막 추가', owner: '디자인 팀', duration: '1일' },
{ step: 6, name: '배포 & 모니터링', description: '채널별 최적 시간 게시 + UTM 추적', owner: '마케팅 매니저', duration: '당일' },
],
repurposingSource: '1개 원장 롱폼 영상 (10분) 또는 925 영상 아카이브 1편',
repurposingOutputs: [
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 풀 영상 업로드 (한글/영문 자막)' },
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '핵심 구간 15-60초 추출, 3채널 동시 배포' },
{ format: 'Carousel 1-2개', channel: 'Instagram', description: '시술 가이드 카드뉴스로 재구성' },
{ format: 'Blog Post 1개', channel: 'Naver Blog', description: '영상 스크립트 → 2,000자 SEO 포스트 (영상 임베드 포함)' },
{ format: 'Stories 3-5개', channel: 'Instagram', description: '촬영 비하인드 + Q&A 스니펫' },
{ format: 'Ad Creative 2개', channel: 'Facebook EN / Instagram', description: '의료관광 리타겟용 영문 광고 소재' },
],
},
// ─── Section 4: Content Calendar ───
calendar: {
weeks: [
{
weekNumber: 1, label: 'Week 1: 브랜드 정비 & 블로그 재가동',
entries: [
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '재가동 1편: 26년 바노바기, 다시 시작합니다 — 시술 카테고리 가이드' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: '프로필 리뉴얼 공지 + 첫 Reel (블랙+골드 통일)' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 안면윤곽 Q&A — 사각턱 축소 #1' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '안면윤곽 수술 종류와 회복기간 — 26년 임상 기준' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 6,853 리뷰 중 베스트 5' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 반재중 원장 — 바노바기의 26년 원칙' },
{ dayOfWeek: 5, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 본관+별관 시설 투어' },
],
},
{
weekNumber: 2, label: 'Week 2: 안면윤곽 집중 주간',
entries: [
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: 'V라인의 자연스러움 기준 — 골격별 맞춤 디자인' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 안면윤곽 전후 변화 (동의 환자)' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 사각턱 축소 과정 30초' },
{ dayOfWeek: 2, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 안면윤곽 후 회복 타임라인' },
{ dayOfWeek: 3, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(EN): 의료관광 안면윤곽 인콰이어리 (리타겟)' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 환자 후기 인터뷰 #1' },
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '바노바기 안면윤곽 후기 — 강남언니 검증' },
],
},
{
weekNumber: 3, label: 'Week 3: 가슴·눈·코 시술 콘텐츠',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 가슴성형 — 보형물 종류와 선택 기준' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 자연스러운 라인' },
{ dayOfWeek: 1, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '눈성형 쌍꺼풀 수술 FAQ — 26년 임상 답변' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 회복 1주 차' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 눈성형 4가지 디자인 비교' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 마취과 전문의가 상주합니다' },
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '바노바기 안전 시스템 — 마취 전문의 상주의 의미' },
],
},
{
weekNumber: 4, label: 'Week 4: 전환 & 리뷰 응답 강화',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 분야별 공동 진료 시스템 — 4명 전문의의 협진' },
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '첫 성형 상담, 이것만 준비하세요 — 바노바기 가이드' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 상담 비하인드 — 3D 시뮬레이션 데모' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 반재중 원장 한 줄 답변 모음' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 카카오 상담 예약 4단계' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남언니 9.2점, 6,853 리뷰의 의미 — 환자가 검증한 26년' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(EN): 월말 의료관광 상담 CTA' },
],
},
],
monthlySummary: [
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 14, color: '#1A1A1A' },
{ type: 'blog', label: '블로그', count: 8, color: '#C8A96A' },
{ type: 'social', label: 'Instagram', count: 9, color: '#6B6B6B' },
{ type: 'ad', label: '광고', count: 2, color: '#FAF7F2' },
],
},
// ─── Section 5: Asset Collection ───
assetCollection: {
assets: [
{ id: 'a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: '925 영상 아카이브 (13년 누적)', description: '2013년 개설 이래 누적 925개 영상 — Shorts 추출 최우선 자산', repurposingSuggestions: ['Shorts 200개 추출 (P0)', 'Instagram Reels 변환', 'TikTok 크로스포스팅', '블로그 포스트 임베드'], status: 'collected' },
{ id: 'a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 환자 리뷰 6,853건', description: '9.2점/10 평균, 시술별 실 환자 후기 — 사회적 증거 핵심 자산', repurposingSuggestions: ['후기 50개 선별 → Carousel 시리즈', 'Instagram Stories 시리즈', '광고 소셜프루프', 'Blog 환자 스토리'], status: 'pending' },
{ id: 'a3', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '본관+별관 시설 사진', description: '본관 6층 + 별관 5층 외관/내부 인테리어 고화질 사진', repurposingSuggestions: ['Instagram 시설 투어 Reel', '유튜브 B-roll', '블로그 위치 안내'], status: 'collected' },
{ id: 'a4', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '의료진 4명 프로필', description: '반재중 대표원장 + 분야별 전문의 4명 프로필 사진·경력', repurposingSuggestions: ['원장 소개 Carousel', '유튜브 인터뷰 섬네일', '블로그 의료진 페이지'], status: 'collected' },
{ id: 'a5', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 카테고리 6종 설명', description: '안면윤곽/눈/코/가슴/지방체형/리프팅 시술별 상세 설명', repurposingSuggestions: ['블로그 SEO 포스트 소스', 'Carousel 텍스트', '광고 카피'], status: 'collected' },
{ id: 'a6', source: 'social', sourceLabel: 'Instagram', type: 'photo', title: 'Instagram 게시물 2,000개', description: '@banobagi_ps 누적 2,000 게시물 (B/A · 카드뉴스 혼합)', repurposingSuggestions: ['고성과 게시물 → Reel 변환', 'Carousel 재편집', '광고 소재 추출'], status: 'collected' },
{ id: 'a7', source: 'blog', sourceLabel: '네이버 블로그', type: 'text', title: '기존 블로그 포스트 (2023-04 이전)', description: '2년 방치 전 포스트 — SEO 키워드 분석 후 리라이팅 대상', repurposingSuggestions: ['고트래픽 포스트 리라이팅', '키워드 맵 추출', '내부 링크 재구성'], status: 'pending' },
{ id: 'a8', source: 'naver_place', sourceLabel: '네이버 플레이스', type: 'photo', title: '네이버 플레이스 사진/리뷰', description: '플레이스 등록 사진 + 리뷰 (응답률 최적화 대상)', repurposingSuggestions: ['리뷰 응답 시스템화', '플레이스 사진 업데이트', '구글 마이비즈니스 동기화'], status: 'pending' },
{ id: 'a9', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '시술별 전후 사진 갤러리', description: '안면윤곽/눈/코/가슴 시술별 비포/애프터 (동의서 보유 분)', repurposingSuggestions: ['Instagram B/A 시리즈', 'Shorts 전환 소스', '상담 자료'], status: 'collected' },
{ id: 'a10', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '병원 소개 영상 (제작 필요)', description: '26년 역사 + 시설 + 의료진 통합 브랜드 영상 — 신규 제작', repurposingSuggestions: ['브랜드 스토리 Reel', '웹사이트 히어로 영상', 'YouTube 채널 트레일러'], status: 'needs_creation' },
{ id: 'a11', source: 'social', sourceLabel: '의료관광', type: 'video', title: '영문 환자 인터뷰 (제작 필요)', description: '의료관광 환자 영문 인터뷰 시리즈 — Facebook EN 16K 활성화용', repurposingSuggestions: ['Facebook EN 시리즈', 'Instagram EN Reels', 'WhatsApp 상담 자료'], status: 'needs_creation' },
],
youtubeRepurpose: [
{ title: '바노바기 안면윤곽 재생목록 베스트', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Carousel', 'Blog 임베드'] },
{ title: '눈성형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 3개 추출', 'Reels 동시 배포', 'Blog 변환'] },
{ title: '코성형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 3개 추출', 'TikTok 크로스포스팅', 'Carousel'] },
{ title: '가슴성형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Reel', 'Blog 변환'] },
{ title: '지방체형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Reel 시리즈'] },
{ title: '리프팅·동안성형 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Carousel', 'Blog'] },
],
},
// ─── Section 6: Repurposing Proposals ───
repurposingProposals: [
{
sourceVideo: { title: '925 영상 → 안면윤곽 베스트 추출', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'high',
priority: 'high',
outputs: [
{ format: 'Shorts 50개 (1차)', channel: 'YouTube / Instagram / TikTok', description: '925 영상 중 안면윤곽 카테고리 우선 추출 — 3개월 분량 확보' },
{ format: 'Carousel 10개', channel: 'Instagram', description: '시술 단계·회복 타임라인 카드뉴스화' },
{ format: 'Blog Post 5개', channel: 'Naver Blog', description: '영상 스크립트 → SEO 포스트 변환 (재가동 콘텐츠)' },
],
},
{
sourceVideo: { title: '강남언니 6,853 리뷰 → 콘텐츠화', views: 6853, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Carousel 시리즈 20개', channel: 'Instagram', description: '시술별 베스트 리뷰 카드뉴스 — 익명화 + 동의 확인' },
{ format: 'Stories 시리즈', channel: 'Instagram', description: '환자 다이어리 형식 Stories' },
{ format: '광고 소셜프루프', channel: 'Facebook EN / Instagram', description: '"6,853 리뷰의 진심" 메시지 광고 소재' },
{ format: 'Blog 환자 스토리', channel: 'Naver Blog', description: '리뷰 → 환자 여정 스토리 블로그 변환' },
],
},
{
sourceVideo: { title: '반재중 원장 인터뷰 (롱폼 신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Shorts 5개 추출', channel: 'YouTube / TikTok', description: '"바노바기의 26년 원칙" 핵심 구간 클립' },
{ format: 'Carousel', channel: 'Instagram', description: '원장 철학 카드뉴스' },
{ format: 'Blog Post', channel: 'Naver Blog', description: '인터뷰 풀 스크립트 → 2,500자 SEO 포스트' },
{ format: '광고 소재', channel: 'Facebook EN', description: '"26 Years of Excellence" 영문 광고' },
],
},
{
sourceVideo: { title: '본관+별관 시설 투어 (신규 제작)', views: 0, type: 'Short', repurposeAs: [] },
estimatedEffort: 'low',
priority: 'medium',
outputs: [
{ format: 'Instagram Reel', channel: 'Instagram', description: '시설 투어 60초 Reel' },
{ format: 'TikTok', channel: 'TikTok', description: '동일 영상 TikTok 동시 배포' },
{ format: 'Stories 시리즈', channel: 'Instagram', description: '구역별 Stories (대기실/상담실/수술실 외관)' },
],
},
],
// ─── Section 7: Workflow Tracker ───
workflow: {
items: [
{
id: 'wf-001',
title: '안면윤곽 사각턱 축소 Shorts (925 영상 추출)',
contentType: 'video',
channel: 'YouTube Shorts',
channelIcon: 'youtube',
stage: 'ai-draft',
videoDraft: {
script: `[인트로 — 0~3초]\n"사각턱, 깎는다고 다 V라인 되는 게 아닙니다."\n(전 사진 → 후 사진 전환)\n\n[본문 — 3~25초]\n"바노바기는 골격 분석부터 시작합니다."\n"턱 끝, 광대, 옆모습 비율을 함께 보고"\n"26년 임상 기준으로 디자인합니다."\n(수술 과정 그래픽 삽입)\n\n[CTA — 25~30초]\n"강남언니 6,853 리뷰 — 프로필 링크 확인"`,
shootingGuide: [
'925 영상 아카이브에서 안면윤곽 카테고리 베스트 컷 추출',
'블랙+골드 워드마크 우측 하단 워터마크 통일',
'한글 자막 필수 + 영문 자막 옵션',
'환자 동의서 확인 후 비식별화 처리',
],
duration: '30초',
},
},
{
id: 'wf-002',
title: '강남언니 베스트 리뷰 5선 Carousel',
contentType: 'image-text',
channel: 'Instagram',
channelIcon: 'instagram',
stage: 'review',
userNotes: '리뷰 인용 시 환자 동의 절차 다시 확인 부탁드립니다',
imageTextDraft: {
type: 'cardnews',
headline: '강남언니 6,853 리뷰 중 — 진심이 담긴 5개',
copy: [
'[카드 1] "26년 임상이 어떤 의미인지 상담받고 알았어요" — 안면윤곽 환자',
'[카드 2] "마취 전문의가 상주한다는 게 이렇게 든든할 줄 몰랐습니다" — 가슴 환자',
'[카드 3] "수술 후 케어가 오래 이어져서 안심했어요" — 눈 환자',
'[카드 4] "분야별 전문의 협진이 결과의 디테일을 만든다" — 코 환자',
'[카드 5] 9.2점 / 6,853 리뷰 — 강남언니에서 직접 확인하세요',
],
layoutHint: '5장 카드 세로형, 블랙+골드 컬러, 마지막 카드에 강남언니 링크 CTA',
},
},
{
id: 'wf-003',
title: '네이버 블로그 재가동 1편 — 26년 인사',
contentType: 'image-text',
channel: 'Naver Blog',
channelIcon: 'globe',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '바노바기성형외과 블로그, 다시 시작합니다 — 26년의 약속',
copy: [
'2년간 멈춰 있던 블로그를 다시 엽니다.',
'바노바기는 2000년부터 26년간 강남에서 한 자리를 지켰습니다.',
'안면윤곽·눈·코·가슴·지방체형·리프팅 6개 카테고리 가이드를 매주 두 번씩 올립니다.',
'의료진 4명 — 분야별 공동 진료 시스템을 이 블로그에서 자세히 소개할 예정입니다.',
'본관 6층 + 별관 5층의 시설 투어, 마취과 전문의 상주 시스템도 곧 다룹니다.',
'강남언니에 쌓인 6,853 리뷰의 진심을 — 이 블로그에서 더 자세히 풀어드리겠습니다.',
],
layoutHint: '1200px 썸네일 + 본문 2,000자 이상, 키워드: 바노바기성형외과, 강남 안면윤곽, 26년 임상',
},
},
{
id: 'wf-004',
title: '반재중 원장 26년 원칙 — YouTube 롱폼',
contentType: 'video',
channel: 'YouTube',
channelIcon: 'youtube',
stage: 'approved',
scheduledDate: '2026-04-21',
videoDraft: {
script: `[오프닝]\n"안녕하세요, 바노바기성형외과 반재중입니다."\n"오늘은 26년간 변하지 않은 3가지 원칙을 말씀드립니다."\n\n[원칙 1: 골격 분석]\n"디자인은 사진이 아니라 골격에서 시작합니다."\n\n[원칙 2: 분야별 협진]\n"한 명의 의사가 모든 것을 결정하지 않습니다."\n\n[원칙 3: 회복까지의 책임]\n"수술이 끝이 아니라, 회복이 끝입니다."\n\n[클로징]\n"26년, 6,853 리뷰가 증명합니다. 바노바기성형외과."`,
shootingGuide: [
'본관 상담실 자연광 촬영',
'원장 정면 + 3/4 앵글 2채널',
'시설 B-roll: 본관/별관 외관, 수술실 입구, 마취 장비',
'한글 자막 + 영문 자막 (의료관광 대비)',
'블랙+골드 인트로/아웃트로 6초 통일',
],
duration: '8분',
},
},
{
id: 'wf-005',
title: '본관+별관 시설 투어 TikTok',
contentType: 'video',
channel: 'TikTok',
channelIcon: 'video',
stage: 'scheduled',
scheduledDate: '2026-04-18',
videoDraft: {
script: `"강남 한가운데 본관 6층 + 별관 5층."\n(시설 점프컷)\n"마취과 전문의가 상주합니다."\n"분야별 전문의 4명이 협진합니다."\n"2000년부터 26년 — 바노바기성형외과."\n#강남성형외과 #안면윤곽 #바노바기`,
shootingGuide: [
'세로 9:16 촬영',
'점프컷 위주 편집 (CapCut)',
'블랙+골드 워드마크 좌측 상단 고정',
'트렌딩 사운드 + 자막 필수',
],
duration: '20초',
},
},
],
},
};

440
src/data/mockPlan_grand.ts Normal file
View File

@ -0,0 +1,440 @@
import type { MarketingPlan } from '../types/plan';
/**
*
*
* (`mockReport_grand.ts` 2026-04-14 ):
* - YouTube @grandsurgery_QnA: 2.37K , 332 , ~0/week ( )
* - Instagram @grand_korea: 4,013
* - Facebook @grandps.korea: 26,000 (KR+EN )
* - @grandprs:
* - : 9.8/1,533
* - , · , , 2005 (21)
* - Primary: Navy Blue (#1B3A6B), Accent: Sky Blue (#4A90D9)
*/
export const mockPlanGrand: MarketingPlan = {
id: 'grand',
reportId: 'grand',
clinicName: '그랜드성형외과',
clinicNameEn: 'Grand Plastic Surgery',
createdAt: '2026-04-14',
targetUrl: 'https://www.grandps.com',
// ─── Section 1: Brand Guide ───
brandGuide: {
colors: [
{ name: 'Grand Navy', hex: '#1B3A6B', usage: '공식 로고 메인, 헤딩, 강조 텍스트' },
{ name: 'Grand Sky Blue', hex: '#4A90D9', usage: '로고 악센트, CTA 포인트, 링크' },
{ name: 'Crisp White', hex: '#FAFAFA', usage: '배경, 카드, 여백' },
{ name: 'Deep Navy Text', hex: '#1B2A4A', usage: '본문 텍스트' },
{ name: 'Slate Gray', hex: '#5A6A7A', usage: '서브 텍스트, 메타 정보' },
],
fonts: [
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀', sampleText: '압구정 안면거상·리프팅 전문' },
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: '그랜드성형외과 이세환 원장' },
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩', sampleText: 'GRAND Plastic Surgery' },
],
logoRules: [
{ rule: 'Navy+Sky Blue 공식 로고 통일', description: '그랜드성형외과 공식 로고(네이비+스카이블루)를 모든 채널에서 동일하게 사용', correct: true },
{ rule: '원형 프로필 버전 제작', description: '소셜 프로필 전용 원형 버전 1080×1080 제작 필요 (현재 미제작)', correct: false },
{ rule: '가로형 로고: 영문+한글 병기', description: 'GRAND + "그랜드성형외과" 병기 가로형 버전 — 배너·헤더용', correct: true },
{ rule: '전문성 태그라인 추가', description: '"압구정 안면거상·리프팅 전문" 태그라인을 로고 하단 병기 검토', correct: true },
{ rule: '로고 주변 여백 확보', description: '로고 크기 30% 이상 여백 유지', correct: true },
],
toneOfVoice: {
personality: ['전문적', '신뢰감 있는', '기술 중심', '결과 지향', '차분한 권위'],
communicationStyle: '이세환 원장의 안면거상·리프팅 전문 기술력을 핵심으로, 과장 없이 정확한 의료 정보와 케이스 결과로 신뢰를 구축합니다.',
doExamples: [
'"안면거상은 피부가 아니라 근막을 바로잡는 수술입니다"',
'"21년, 결과로 말합니다 — 그랜드성형외과"',
'"이세환 원장의 Q&A — 궁금한 것을 직접 답합니다"',
'"강남언니 9.8점 · 1,533건의 검증"',
],
dontExamples: [
'"파격 할인! 오늘만!"',
'"연예인 시술 병원"',
'"100% 만족 보장"',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: 'Grand Navy 원형 로고 1080×1080', bannerSpec: '2560×1440px, Navy 배경 + Sky Blue 악센트, "압구정 안면거상·리프팅 전문의 Q&A"', bioTemplate: '그랜드성형외과 Q&A — 이세환 원장\n안면거상·리프팅·코성형 전문\n02-547-5100 | grandps.com', currentStatus: 'incorrect' },
{ channel: 'Instagram', icon: 'instagram', profilePhoto: 'Grand Navy 원형 로고', bannerSpec: 'N/A (하이라이트: Navy 톤 아이콘 — 안면거상/리프팅/코/가슴/후기)', bioTemplate: '그랜드성형외과 공식 — 이세환 원장\n압구정역 | 02-547-5100\ngrandps.com', currentStatus: 'incorrect' },
{ channel: 'Facebook', icon: 'facebook', profilePhoto: 'Grand Navy 원형 로고', bannerSpec: '820×312px, Navy+Sky Blue 배너 + 전문성 태그라인', bioTemplate: '그랜드성형외과 공식 — 압구정 안면거상·리프팅 전문', currentStatus: 'incorrect' },
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: 'Grand 로고', bannerSpec: '블로그 상단: 로고 + "안면거상·리프팅 전문 Q&A" 카테고리 메뉴', bioTemplate: '그랜드성형외과 공식 블로그\n안면거상·리프팅·코성형·가슴성형 전문 정보', currentStatus: 'incorrect' },
{ channel: 'TikTok', icon: 'video', profilePhoto: 'Grand Navy 원형 로고', bannerSpec: 'N/A', bioTemplate: '그랜드성형외과 — 이세환 원장 Q&A\n압구정 | 02-547-5100', currentStatus: 'missing' },
],
brandInconsistencies: [
{
field: '전문성 포지셔닝',
values: [
{ channel: 'YouTube', value: '그랜드성형외과Q&A (Q&A 채널명)', isCorrect: true },
{ channel: 'Instagram', value: '그랜드성형외과 공식 계정 (전문성 USP 없음)', isCorrect: false },
{ channel: 'Facebook', value: '그랜드성형외과 공식 Facebook', isCorrect: false },
{ channel: 'Website', value: '안면거상·리프팅 명시 (부분)', isCorrect: true },
],
impact: '"압구정 안면거상·리프팅 전문"이라는 핵심 USP가 YouTube 채널명에만 일부 반영. 나머지 채널에서 전문성 포지셔닝 부재',
recommendation: '전 채널 바이오에 "안면거상·리프팅 전문 이세환 원장" 명시',
},
{
field: '업로드 빈도',
values: [
{ channel: 'YouTube', value: '~0/week (사실상 중단)', isCorrect: false },
{ channel: 'Instagram', value: '저빈도', isCorrect: false },
{ channel: 'Naver Blog', value: '저빈도', isCorrect: false },
],
impact: '전 채널 업로드 중단 상태 — 신규 환자 유입 경로가 거의 없음',
recommendation: 'YouTube·Instagram·Blog 동시 재가동 — 안면거상 전문 콘텐츠 우선',
},
],
},
// ─── Section 2: Channel Strategies ───
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
currentStatus: '@grandsurgery_QnA — 2.37K 구독자, 332 영상, 업로드 사실상 중단',
targetGoal: '10K 구독자 / 12개월, 주 2회 업로드 재개',
contentTypes: ['Shorts (332 영상 재편집)', '안면거상 전문 롱폼', '이세환 원장 Q&A 시리즈'],
postingFrequency: '주 2회 (Shorts 1 + 롱폼 격주)',
tone: '전문의 직접 설명 — "이세환 원장이 말하는 안면거상"',
formatGuidelines: [
'Shorts: 332 Q&A 영상에서 핵심 30-60초 추출',
'롱폼: 안면거상 케이스 스터디 월 2편 — 전후 비교 중심',
'썸네일: Navy+Sky Blue 통일, 이세환 원장 + 케이스 사진',
'타이틀: "압구정 안면거상 전문의가 말하는 ___" 패턴',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'instagram_kr', channelName: 'Instagram', icon: 'instagram',
currentStatus: '@grand_korea — 4,013 팔로워, 카드뉴스·이미지 위주 (Reels 부족)',
targetGoal: '25K 팔로워 / 12개월, Reels 주 4개',
contentTypes: ['Reels (YouTube Shorts 동시)', 'Before/After Carousel', '이세환 원장 Q&A Stories'],
postingFrequency: '일 1회 + Stories 일 2개',
tone: '차분하고 전문적인 — 안면거상 결과로 설득',
formatGuidelines: [
'Reels: YouTube Shorts 동시 배포',
'Carousel: 안면거상·리프팅 전후 케이스 5-7장',
'Highlight: 안면거상/코성형/가슴/리프팅/후기 재구성',
'해시태그: #그랜드성형외과 #압구정안면거상 #이세환원장 #리프팅전문',
],
priority: 'P0',
customerJourneyStage: 'interest',
},
{
channelId: 'facebook', channelName: 'Facebook', icon: 'facebook',
currentStatus: '@grandps.korea — 26,000 팔로워, 콘텐츠 빈도 낮음',
targetGoal: 'Instagram 크로스포스팅 + Pixel 리타겟 활용',
contentTypes: ['Instagram 크로스포스팅', '리타겟 광고 소재'],
postingFrequency: '주 2-3회 (자동 크로스포스팅 위주)',
tone: '안면거상·리프팅 결과 중심 — 40~55세 여성 타겟',
formatGuidelines: [
'Instagram 콘텐츠 자동 연동 유지',
'Pixel 광고: 안면거상 관심사 타겟 — 40~55세 여성',
'26K 팔로워 리타겟 활용',
],
priority: 'P1',
customerJourneyStage: 'conversion',
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: '@grandprs — 업로드 저조, SEO 자산 방치',
targetGoal: '주 2회 포스팅 재가동, 12개월 내 월 15,000 방문자',
contentTypes: ['안면거상 SEO 가이드', '이세환 원장 Q&A 텍스트 변환', 'YouTube 영상 임베드+설명'],
postingFrequency: '주 2회',
tone: '"압구정 안면거상", "강남 리프팅" 키워드 중심',
formatGuidelines: [
'2,000자 이상 SEO 최적화 포스트',
'YouTube Q&A 영상 + 텍스트 답변 구조',
'핵심 키워드: "압구정 안면거상", "강남 리프팅", "그랜드성형외과 후기"',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
currentStatus: '9.8점/10, 1,533 리뷰 — 응답 전략 부재',
targetGoal: '리뷰 응답률 80%, 2,500 리뷰 / 12개월',
contentTypes: ['리뷰 응답', '시술 정보 최신화'],
postingFrequency: '리뷰 응답 일 단위',
tone: '진심 어린 이세환 원장 답변',
formatGuidelines: [
'응답률 50%(3개월) → 80%(12개월)',
'1,533 리뷰 중 30개 선별 → SNS Carousel',
'부정 리뷰 24시간 내 응답',
],
priority: 'P0',
customerJourneyStage: 'loyalty',
},
{
channelId: 'tiktok', channelName: 'TikTok (신규)', icon: 'video',
currentStatus: '계정 없음',
targetGoal: '5K 팔로워 / 12개월 — 30~50대 안면거상 고민층',
contentTypes: ['YouTube Shorts 크로스포스팅', '이세환 원장 숏클립 Q&A'],
postingFrequency: '주 3-5회 (Shorts 동시 배포)',
tone: '안면거상 궁금증 해소 — 가볍고 정확한 정보',
formatGuidelines: [
'332 YouTube 영상 Shorts 추출 → TikTok 동시',
'트렌딩 사운드 + 자막 필수',
'의료광고법 준수',
],
priority: 'P1',
customerJourneyStage: 'awareness',
},
],
// ─── Section 3: Content Strategy ───
contentStrategy: {
pillars: [
{
title: '안면거상 전문 기술',
description: '이세환 원장의 딥플레인 안면거상 전문성을 케이스와 기술 설명으로 증명',
relatedUSP: 'Facelift Surgical Authority',
exampleTopics: ['딥플레인 안면거상 vs 일반 리프팅 차이', '안면거상 수술 전후 케이스 스터디', '리프팅 지속 시간의 과학'],
color: '#1B3A6B',
},
{
title: '이세환 원장 Q&A',
description: '332개 YouTube Q&A 영상 자산을 확장한 원장 직접 답변 시리즈',
relatedUSP: 'Direct Doctor Communication',
exampleTopics: ['안면거상 Q&A: 가장 많이 묻는 10가지', '코성형 후 리프팅 타이밍', '나이별 리프팅 권장 시술'],
color: '#4A90D9',
},
{
title: '강남언니 9.8점의 증거',
description: '1,533 리뷰에서 추출한 환자 목소리와 결과 중심 콘텐츠',
relatedUSP: 'Patient-Verified Excellence',
exampleTopics: ['안면거상 후기 — 6개월 경과', '40대 환자의 리프팅 결정 스토리', '재수술 없이 자연스러운 결과'],
color: '#5A6A7A',
},
{
title: '안전한 수술 환경',
description: '압구정 본원 시설·장비·안전 시스템 소개',
relatedUSP: 'Safety & Environment',
exampleTopics: ['그랜드성형외과 시설 투어', '수술 후 케어 프로토콜', '1:1 원장 책임 시스템'],
color: '#FAFAFA',
},
],
typeMatrix: [
{ format: 'YouTube Long-form', channels: ['YouTube'], frequency: '격주 1편', purpose: '안면거상 전문성 증명, 깊은 신뢰' },
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 4개', purpose: '332 영상 자산 재활용, 30~55대 도달' },
{ format: 'Carousel (Q&A)', channels: ['Instagram'], frequency: '주 2회', purpose: '안면거상 궁금증 해소, 저장 유도' },
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '"압구정 안면거상" 검색 상위 확보' },
{ format: 'Stories', channels: ['Instagram'], frequency: '일 2개', purpose: '이세환 원장 일상·상담 친밀감' },
{ format: 'Ad Creative', channels: ['Facebook', 'Instagram'], frequency: '월 4개', purpose: '40~55세 여성 리타겟' },
],
workflow: [
{ step: 1, name: 'Q&A 아카이브 정리', description: '332개 YouTube 영상 카테고리화 — 안면거상/리프팅/코/가슴 분류', owner: '마케팅 매니저', duration: '1주 (1회성)' },
{ step: 2, name: '주제 선정', description: '이세환 원장 Q&A 패턴 + 검색 키워드 매칭', owner: '마케팅 매니저', duration: '1일' },
{ step: 3, name: 'Shorts 추출 / 스크립트 작성', description: '기존 영상 핵심 구간 추출 또는 AI 초안', owner: 'AI + 편집', duration: '1-2일' },
{ step: 4, name: '원장 검수', description: '이세환 원장 의료 정확성 + 광고법 체크', owner: '이세환 원장', duration: '1일' },
{ step: 5, name: '비주얼 마감', description: 'Navy+Sky Blue 썸네일, 한글 자막', owner: '디자인', duration: '1일' },
{ step: 6, name: '배포', description: '채널별 최적 시간 + UTM 추적', owner: '마케팅 매니저', duration: '당일' },
],
repurposingSource: '이세환 원장 안면거상 롱폼 Q&A (10분)',
repurposingOutputs: [
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 Q&A 풀 영상 (한글 자막)' },
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '핵심 Q&A 답변 30-60초, 3채널 동시' },
{ format: 'Carousel 2개', channel: 'Instagram', description: '안면거상 Q&A 카드뉴스화' },
{ format: 'Blog Post', channel: 'Naver Blog', description: 'Q&A 스크립트 → 2,000자 SEO 포스트 (영상 임베드)' },
{ format: 'Stories 3개', channel: 'Instagram', description: '촬영 비하인드 스니펫' },
{ format: 'Ad Creative', channel: 'Facebook', description: '안면거상 Before/After + CTA 광고' },
],
},
// ─── Section 4: Content Calendar ───
calendar: {
weeks: [
{
weekNumber: 1, label: 'Week 1: YouTube 재가동 & 브랜드 정비',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '재가동 1편: 이세환 원장의 안면거상 철학' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: '프로필 리뉴얼 + 첫 Reel (안면거상 전후 케이스)' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 안면거상 Q&A — 피부가 아닌 근막을 바로잡는 이유' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '안면거상이란? — 이세환 원장이 설명하는 기초 가이드' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 안면거상 VS 실리프팅 차이' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 강남언니 9.8점 리뷰 하이라이트' },
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '그랜드성형외과 안면거상 후기 — 강남언니 9.8점의 의미' },
],
},
{
weekNumber: 2, label: 'Week 2: 안면거상 전문성 집중',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 딥플레인 안면거상 vs 일반 리프팅 — 이세환 원장 비교' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 안면거상 전후 케이스 #1' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 안면거상 회복 기간 Q&A' },
{ dayOfWeek: 2, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '딥플레인 안면거상 — 압구정 전문의가 설명하는 차이점' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 리프팅 시술 나이별 추천 가이드' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 이세환 원장 한 줄 Q&A' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 40~55세 여성 — 안면거상 상담 CTA' },
],
},
{
weekNumber: 3, label: 'Week 3: 코성형·가슴성형 콘텐츠',
entries: [
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 Q&A 10가지 — 그랜드 이세환 원장 답변' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 전후 — 자연스러운 라인' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 재수술 피하는 방법' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 가슴성형 보형물 종류 비교' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '그랜드성형외과 코성형 후기 — 강남언니 검증' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 회복 현실 Q&A' },
],
},
{
weekNumber: 4, label: 'Week 4: 전환 최적화',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 그랜드성형외과 — 21년의 기술력' },
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '첫 성형 상담 준비 가이드 — 그랜드성형외과 압구정' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 압구정 그랜드 시설 투어' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 이세환 원장 이달의 케이스' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 상담 예약 안내 — 압구정역 5분' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 월말 안면거상 상담 CTA' },
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '그랜드성형외과 9.8점 — 1,533 리뷰의 진심' },
],
},
],
monthlySummary: [
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 12, color: '#1B3A6B' },
{ type: 'blog', label: '블로그', count: 8, color: '#4A90D9' },
{ type: 'social', label: 'Instagram', count: 8, color: '#5A6A7A' },
{ type: 'ad', label: '광고', count: 2, color: '#FAFAFA' },
],
},
// ─── Section 5: Asset Collection ───
assetCollection: {
assets: [
{ id: 'a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: '332개 Q&A 영상 아카이브', description: '2017년 이래 안면거상·코성형·가슴 Q&A 332개 — Shorts 추출 최우선', repurposingSuggestions: ['Shorts 100개 추출 (P0)', 'Instagram Reels', 'TikTok 동시', '블로그 임베드'], status: 'collected' },
{ id: 'a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 리뷰 1,533건', description: '9.8점/10 — 안면거상·리프팅 케이스 중심', repurposingSuggestions: ['베스트 30개 → Carousel', 'Instagram Stories', '광고 소셜프루프', 'Blog 후기'], status: 'pending' },
{ id: 'a3', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '압구정 본원 시설 사진', description: '본원 내외부 고화질', repurposingSuggestions: ['Instagram 시설 Reel', 'YouTube B-roll', '블로그 위치'], status: 'collected' },
{ id: 'a4', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '이세환 원장 프로필', description: '이세환 원장 고화질 프로필 + 경력', repurposingSuggestions: ['YouTube 인터뷰 섬네일', 'Carousel 원장 소개', '광고 신뢰도 소재'], status: 'collected' },
{ id: 'a5', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 설명 텍스트', description: '안면거상·리프팅·코·가슴 시술별 상세', repurposingSuggestions: ['블로그 SEO 소스', 'Carousel', '광고 카피'], status: 'collected' },
{ id: 'a6', source: 'social', sourceLabel: 'Instagram', type: 'photo', title: '@grand_korea 게시물 800개', description: '시술 설명·카드뉴스 누적 800개', repurposingSuggestions: ['고성과 게시물 Reel 변환', 'Carousel 재편집'], status: 'collected' },
{ id: 'a7', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '안면거상 전후 사진 갤러리', description: '이세환 원장 케이스 — 동의 환자 대상', repurposingSuggestions: ['Instagram B/A 시리즈', 'Shorts 소스', '상담 자료'], status: 'collected' },
{ id: 'a8', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '이세환 원장 소개 영상 (제작 필요)', description: '21년 경력·전문성 브랜드 영상 신규 제작', repurposingSuggestions: ['YouTube 채널 트레일러', 'Instagram 브랜드 Reel', '웹사이트 히어로'], status: 'needs_creation' },
],
youtubeRepurpose: [
{ title: '안면거상 수술 Q&A 베스트', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Carousel', '블로그 임베드'] },
{ title: '리프팅 지속 시간 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 3개', 'TikTok 동시', 'Blog'] },
{ title: '코성형 재수술 케이스', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Reel', 'Carousel'] },
{ title: '가슴성형 보형물 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Reel', 'Blog'] },
],
},
// ─── Section 6: Repurposing Proposals ───
repurposingProposals: [
{
sourceVideo: { title: '332 Q&A 영상 → 안면거상 Shorts 추출', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'high',
priority: 'high',
outputs: [
{ format: 'Shorts 50개 (1차)', channel: 'YouTube / Instagram / TikTok', description: '안면거상·리프팅 카테고리 우선 — 3채널 동시' },
{ format: 'Carousel 10개', channel: 'Instagram', description: 'Q&A 카드뉴스화' },
{ format: 'Blog Post 5개', channel: 'Naver Blog', description: 'Q&A 스크립트 → SEO 포스트 변환' },
],
},
{
sourceVideo: { title: '강남언니 1,533 리뷰 콘텐츠화', views: 1533, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Carousel 15개', channel: 'Instagram', description: '안면거상·리프팅 후기 카드뉴스 — 익명화' },
{ format: '광고 소재', channel: 'Facebook / Instagram', description: '"9.8점 강남언니 검증" 소셜프루프 광고' },
{ format: 'Blog 후기 포스트', channel: 'Naver Blog', description: '케이스별 상세 후기 블로그 변환' },
],
},
{
sourceVideo: { title: '이세환 원장 인터뷰 (신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Shorts 5개', channel: 'YouTube / TikTok', description: '"21년 안면거상 전문의가 말하는" 핵심 구간' },
{ format: 'Carousel', channel: 'Instagram', description: '이세환 원장 철학 카드뉴스' },
{ format: 'Blog Post', channel: 'Naver Blog', description: '인터뷰 → SEO 포스트' },
],
},
],
// ─── Section 7: Workflow Tracker ───
workflow: {
items: [
{
id: 'wf-001',
title: '딥플레인 안면거상 vs 리프팅 Shorts',
contentType: 'video',
channel: 'YouTube Shorts',
channelIcon: 'youtube',
stage: 'ai-draft',
videoDraft: {
script: `[인트로 — 0~3초]\n"피부만 당기는 리프팅, 효과는 1년도 안 갑니다."\n\n[본문 — 3~25초]\n"그랜드성형외과는 근막층(SMAS)부터 바로잡습니다."\n"딥플레인 안면거상 — 자연스럽고 오래가는 이유입니다."\n"이세환 원장이 21년간 선택한 방식."\n\n[CTA — 25~30초]\n"강남언니 9.8점 · 1,533 리뷰 — 프로필 링크"`,
shootingGuide: [
'332 영상 중 안면거상 카테고리 핵심 구간 추출',
'Navy+Sky Blue 워터마크 하단 고정',
'한글 자막 필수',
'환자 동의서 확인 + 비식별화',
],
duration: '30초',
},
},
{
id: 'wf-002',
title: '안면거상 Q&A 5가지 Carousel',
contentType: 'image-text',
channel: 'Instagram',
channelIcon: 'instagram',
stage: 'review',
imageTextDraft: {
type: 'cardnews',
headline: '안면거상, 가장 많이 묻는 5가지 — 이세환 원장 직접 답변',
copy: [
'[카드 1] Q. 몇 살부터? → A. 처짐의 정도가 기준. 나이보다 상태를 봅니다.',
'[카드 2] Q. 실리프팅이랑 다른가요? → A. 실리프팅은 임시, 안면거상은 근막층 교정.',
'[카드 3] Q. 회복 기간은? → A. 일상 복귀 1~2주, 완전 회복 3~6개월.',
'[카드 4] Q. 흉터? → A. 귀 앞뒤 은닉 절개 — 자연스럽게.',
'[카드 5] 강남언니 9.8점 · 그랜드성형외과 이세환 원장',
],
layoutHint: '5장 세로형, Navy+Sky Blue, 마지막 카드에 상담 예약 CTA',
},
},
{
id: 'wf-003',
title: '안면거상이란? SEO 블로그 재가동 1편',
contentType: 'image-text',
channel: 'Naver Blog',
channelIcon: 'globe',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '안면거상이란? — 압구정 전문의 이세환 원장이 직접 설명합니다',
copy: [
'안면거상은 피부를 당기는 시술이 아닙니다. 근막층(SMAS)의 처짐을 바로잡는 수술입니다.',
'그랜드성형외과 이세환 원장은 21년간 안면거상·리프팅에 집중해왔습니다.',
'강남언니 9.8점 / 1,533 리뷰 — 결과로 검증된 전문성.',
'앞으로 안면거상·리프팅·코성형 전문 정보를 매주 2회 업로드합니다.',
],
layoutHint: '1200px 썸네일 + 2,000자, 키워드: 안면거상, 압구정 안면거상, 그랜드성형외과, 이세환 원장',
},
},
{
id: 'wf-004',
title: '이세환 원장 인터뷰 — 21년의 기술력',
contentType: 'video',
channel: 'YouTube',
channelIcon: 'youtube',
stage: 'approved',
scheduledDate: '2026-04-21',
videoDraft: {
script: `[오프닝]\n"안녕하세요, 그랜드성형외과 이세환입니다."\n"21년간 안면거상에만 집중한 이유를 말씀드립니다."\n\n[핵심 1: 왜 안면거상인가]\n"처짐은 피부 문제가 아닙니다. 근막이 늘어나는 겁니다."\n\n[핵심 2: 딥플레인의 차이]\n"표면 리프팅은 1년, 딥플레인은 5~10년 — 이유가 있습니다."\n\n[클로징]\n"강남언니 1,533분이 남긴 9.8점이 증거입니다. 그랜드성형외과."`,
shootingGuide: [
'압구정 원장실 자연광',
'이세환 원장 정면 + 3/4 앵글',
'안면거상 케이스 그래픽 인서트',
'Navy+Sky Blue 인트로/아웃트로',
],
duration: '8분',
},
},
],
},
};

508
src/data/mockPlan_irum.ts Normal file
View File

@ -0,0 +1,508 @@
import type { MarketingPlan } from '../types/plan';
/**
* ( / Seoul i Plastic Surgery)
*
* (mockReport_irum.ts, 2026-04-14 ):
* - YouTube @SEOULiPS.: 322, 155 ( )
* - Instagram: @seoulips KR 826 / @seouli_ps_th 5K / @seouli_jp
* - Facebook: /
* - : 9.4 / 86 (5 )
* - : ·· , ·
* - : 2015 (11),
*
* mockPlan(View) .
*/
export const mockPlanIrum: MarketingPlan = {
id: 'irum',
reportId: 'irum',
clinicName: '이룸성형외과 (서울아이)',
clinicNameEn: 'Seoul i Plastic Surgery',
createdAt: '2026-04-14',
targetUrl: 'https://www.seoulips.com',
// ─── Section 1: Brand Guide ───
brandGuide: {
colors: [
{ name: 'Forest Green', hex: '#0D4F3C', usage: '주요 배경·헤더·CTA 버튼 — 신뢰·자연·안전 상징' },
{ name: 'Mint', hex: '#2ECC71', usage: '강조색 — 성장·생명력·외국인 환자 친화성 표현' },
{ name: 'Off-White', hex: '#F4FAF7', usage: '섹션 배경 — 그린 계열과 대비되는 밝고 깨끗한 여백' },
{ name: 'Deep Forest', hex: '#07331F', usage: '헤딩 텍스트·고대비 강조 영역' },
{ name: 'Stone Gray', hex: '#6B7280', usage: '서브 텍스트·부연 설명 — 중립적 가독성' },
],
fonts: [
{ family: 'Pretendard', weight: '400 / 600 / 700', usage: 'KR 본문·UI 레이블', sampleText: '서울아이성형외과 — 안전하고 바른 성형' },
{ family: 'Playfair Display', weight: '400 / 700', usage: '영문 헤딩·Seoul i 영문 브랜드 표기', sampleText: 'Seoul i Plastic Surgery' },
{ family: 'Noto Sans', weight: '400 / 600', usage: '태국어·일본어 다국어 콘텐츠 — 현지 가독성 확보', sampleText: 'Seoul i — ศัลยกรรม · 整形外科' },
],
logoRules: [
{ rule: '영문 로고 글로벌 우선', description: '"Seoul i Plastic Surgery" 영문 로고를 TH/JP 계정·Facebook·LINE에 일관 사용 — 서울아이/이룸 혼용 금지', correct: true },
{ rule: '국내 채널: 서울아이 KR + 영문 병기', description: '국내 KR 채널(@seoulips, Naver Blog)에는 "서울아이 Seoul i" KR+EN 병기 버전 사용', correct: true },
{ rule: 'Forest Green 배경 통일', description: '로고 단색 배경은 반드시 Forest Green(#0D4F3C) 또는 Off-White(#F4FAF7) 계열만 허용', correct: true },
{ rule: '다국어 로고 4개 버전', description: 'KR / EN / TH / JP 4개 언어 버전 제작 → 각 Instagram 계정 프로필 사진에 언어별 적용 필요', correct: false },
{ rule: '프로필 사진 1080×1080 통일', description: '채널별 해상도 편차 존재 — 1080×1080 단일 원형 로고로 전 채널 통일 필요', correct: false },
],
toneOfVoice: {
personality: ['안심되는', '전문적', '따뜻한', '글로벌', '섬세한'],
communicationStyle: '외국인 환자가 이해하기 쉬운 쉬운 단어를 선택하되, 코성형·눈밑지방·리프팅 전문성을 교육적 어조로 전달합니다. "안전하고 바른 성형"이라는 서울아이 슬로건을 다국어로 일관 표현.',
doExamples: [
'"안전하고 바른 성형을 위해 서울아이는 항상 노력합니다"',
'"강남언니 9.4점, 86명의 진솔한 후기"',
'"코성형·눈밑지방·리프팅 11년 전문성"',
'"태국·일본 환자도 한국어 걱정 없이 상담하세요"',
],
dontExamples: [
'"파격 할인! 오늘까지만!"',
'"연예인이 선택한 병원"',
'번역 품질이 낮은 직역체 TH/JP 콘텐츠',
'"서울아이 / 이룸 / Seoul i" 브랜드명 혼용',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: '서울아이 Forest Green 배경 원형 로고 1080×1080', bannerSpec: '2560×1440px, Forest Green 배경 + "서울아이 Seoul i Plastic Surgery" + 코성형·눈밑지방·리프팅 서브타이틀', bioTemplate: '안전하고 바른 성형 — 서울아이\n코성형·눈밑지방·실리프팅 전문\nseoulips.com | 강남역 인근', currentStatus: 'incorrect' },
{ channel: 'Instagram KR', icon: 'instagram', profilePhoto: '서울아이 KR 로고 원형', bannerSpec: 'Highlights: Forest Green 아이콘 세트 (코성형/눈밑지방/리프팅/후기/외국인환영)', bioTemplate: '서울아이성형외과 | 코성형·눈밑지방·리프팅\n강남역 | 02-555-0900 | seoulips.com', currentStatus: 'incorrect' },
{ channel: 'Instagram TH', icon: 'instagram', profilePhoto: '서울아이 TH 로고 원형', bannerSpec: 'Highlights: ศัลยกรรมจมูก / ใต้ตา / ลิฟติ้ง / รีวิว / ปรึกษา 5개 카테고리', bioTemplate: 'Seoul i Plastic Surgery | ศัลยกรรมความงามเกาหลี | LINE: @seoulips_th', currentStatus: 'incorrect' },
{ channel: 'Instagram JP', icon: 'instagram', profilePhoto: '서울아이 JP 로고 원형', bannerSpec: 'Highlights: 鼻整形 / 目の下 / リフティング / 口コミ / ご予約 5개', bioTemplate: 'Seoul i Plastic Surgery | 韓国美容整形 | LINE: @seoulips_jp', currentStatus: 'missing' },
{ channel: 'Facebook (신규)', icon: 'facebook', profilePhoto: '서울아이 EN 로고', bannerSpec: '820×312px, Forest Green + "Seoul i Plastic Surgery" + 코·눈밑지방·리프팅 서브타이틀', bioTemplate: 'Seoul i Plastic Surgery — 코성형 · 눈밑지방 · 리프팅 전문 | 태국·일본 환자 환영', currentStatus: 'missing' },
{ channel: 'LINE (신규)', icon: 'globe', profilePhoto: '서울아이 EN 로고', bannerSpec: 'LINE 채널 아트: Forest Green + "Seoul i — 일본 환자 전용 상담"', bioTemplate: 'Seoul i Plastic Surgery 공식 LINE — 일본어 상담 가능 | seoulips.com', currentStatus: 'missing' },
],
brandInconsistencies: [
{
field: '브랜드명 혼용',
values: [
{ channel: 'YouTube', value: '서울아이 Seoul i Plastic Surgery', isCorrect: true },
{ channel: 'Instagram KR', value: '서울아이성형외과', isCorrect: true },
{ channel: '강남언니', value: '이룸(서울아이)성형외과', isCorrect: false },
{ channel: 'Website', value: 'seoulips.com (서울아이 + 이룸 혼용)', isCorrect: false },
],
impact: '"이룸" / "서울아이" / "Seoul i" 3개 명칭 혼용 — 신규 환자의 브랜드 인지 혼란 유발. 특히 외국인 환자는 동일 병원임을 인지 못 할 가능성.',
recommendation: '국내 KR: "서울아이" 통일 / 글로벌: "Seoul i Plastic Surgery" 통일 — 강남언니 프로필명도 "서울아이성형외과"로 수정',
},
{
field: 'YouTube 성장 정체',
values: [
{ channel: 'YouTube @SEOULiPS.', value: '155개 영상 · 구독자 322명 (영상당 구독자 2명 미만)', isCorrect: false },
{ channel: 'Instagram TH @seouli_ps_th', value: '200개 게시물 · 5,000 팔로워 (10배 차이)', isCorrect: true },
{ channel: 'Instagram KR @seoulips', value: '600개 게시물 · 826 팔로워', isCorrect: false },
],
impact: 'YouTube 글로벌 채널 잠재력이 완전히 미활용 중 — 다국어 자막 추가만으로 즉시 글로벌 검색 노출 10배 이상 확대 가능',
recommendation: '기존 155개 영상에 EN/TH 자막 우선 30개 추가 P0 — 신규 영상 제작보다 기존 자산 글로벌 전환이 ROI 더 높음',
},
{
field: '3개국 Instagram 크로스채널 단절',
values: [
{ channel: '@seoulips (KR)', value: '826 팔로워 — KR 단독 운영', isCorrect: false },
{ channel: '@seouli_ps_th (TH)', value: '5,000 팔로워 — TH 단독 운영', isCorrect: false },
{ channel: '@seouli_jp (JP)', value: '팔로워 미확인 — JP 단독 운영', isCorrect: false },
],
impact: 'KR/TH/JP 3개 계정이 서로 태그·크로스 배포 없음 — 계정 간 팔로워 유입 기회 0% 상태',
recommendation: 'KR 원본 → TH/JP 번역 크로스 배포 파이프라인 구축 (자동화) — 제작 비용 동일, 노출 3배',
},
],
},
// ─── Section 2: Channel Strategies ───
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
currentStatus: '@SEOULiPS. — 구독자 322명 · 155개 영상 · 업로드 월 1~2회 · 성장 완전 정체',
targetGoal: '구독자 3,000명 / 12개월, 주 2회 정기 업로드 + 다국어 자막 100% 적용',
contentTypes: ['다국어 자막 추가 (기존 155개 → EN/TH/JP)', 'Shorts 50개 추출 (기존 영상 재활용)', '전문의 Q&A 롱폼 (코성형·눈밑지방)', '외국인 환자 브이로그'],
postingFrequency: '주 2회 (Shorts 1 + 롱폼 격주), 자막 추가는 월 10개 이상',
tone: '교육적·안심감 — 서울아이 전문의 직접 설명, 외국인 친화적 쉬운 언어',
formatGuidelines: [
'기존 155개 영상에 EN/TH 자막 우선 30개 추가 — 즉시 글로벌 노출 확대 (P0)',
'Shorts: 기존 영상에서 1분 클립 추출 → KR/EN/TH/JP 다국어 Shorts',
'플레이리스트 재정비: 코성형 / 눈밑지방 / 리프팅 / 외국인 환자 브이로그 4개',
'썸네일: Forest Green 배경 + "서울아이 Seoul i" 워터마크 통일',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'instagram_kr', channelName: 'Instagram KR', icon: 'instagram',
currentStatus: '@seoulips — 826 팔로워 · 게시물 600개 · Reels 30개 (부족)',
targetGoal: '팔로워 10,000명 / 12개월, Reels 주 5개',
contentTypes: ['Reels (코성형·눈밑지방 Before/After)', 'Carousel (강남언니 86 리뷰 스토리화)', 'Stories (병원 일상)', '시술 교육 카드뉴스'],
postingFrequency: '일 1회 + Stories 일 2~3개',
tone: '따뜻하고 안심되는 — 전문성과 친근함의 균형',
formatGuidelines: [
'Reels 주 5회 업로드 (KR 자막 기본 + EN 자막 추가로 해외 노출 병행)',
'@seouli_ps_th / @seouli_jp 계정과 상호 태그 → 팔로워 크로스 유입',
'강남언니 86 리뷰 핵심 발췌 → Carousel + Story 월 4회',
'Highlights 재구성: 코성형 / 눈밑지방 / 리프팅 / 후기 / 외국인 환영',
],
priority: 'P0',
customerJourneyStage: 'interest',
},
{
channelId: 'instagram_th', channelName: 'Instagram TH', icon: 'instagram',
currentStatus: '@seouli_ps_th — 5,000 팔로워 · 200개 게시물 · KR 계정과 크로스 배포 없음',
targetGoal: '팔로워 15,000명 / 12개월, KR 콘텐츠 번역 자동 배포 구축',
contentTypes: ['KR 원본 번역 배포 (태국어)', 'Reels (태국어 자막)', '태국 환자 Before/After', 'LINE 상담 CTA'],
postingFrequency: '주 3회 (KR 번역 배포 2 + 태국 전용 1)',
tone: 'Warm & informative — 태국 환자 관점에서 한국 성형 정보 제공',
formatGuidelines: [
'@seoulips KR 게시물 → 태국어 번역 → 동시 배포 파이프라인 구축 (P0)',
'Highlights: ศัลยกรรมจมูก / ใต้ตา / ลิฟติ้ง / รีวิว / ปรึกษาฟรี 5개',
'바이오 + 게시물에 LINE 상담 링크 추가 — 태국 환자 직접 전환 경로',
'Reels 주 3회: 태국어 자막 코성형 Before/After + 태국어 상담 안내',
],
priority: 'P0',
customerJourneyStage: 'conversion',
},
{
channelId: 'instagram_jp', channelName: 'Instagram JP', icon: 'instagram',
currentStatus: '@seouli_jp — 팔로워 미확인 · 일본어 운영 중 · 업로드 비정기',
targetGoal: '팔로워 3,000명 / 12개월, LINE 연동으로 직접 상담 전환',
contentTypes: ['일본어 네이티브 콘텐츠', 'KR 번역 배포 (일본어)', 'LINE 상담 CTA'],
postingFrequency: '주 2회 (KR 번역 배포 1 + 일본 전용 1)',
tone: '자연스러운 일본어 — 직역체 금지, 네이티브 검수 필수',
formatGuidelines: [
'LINE QR코드를 바이오와 모든 게시물에 삽입 — 일본 환자 전환 핵심 경로',
'네이티브 일본어 검수 후 게시 (직역체 금지)',
'Highlights: 鼻整形 / 目の下の脂肪 / リフティング / 口コミ / ご予約 5개',
'KR 원본 → 일본어 번역 배포로 업로드 부담 감소',
],
priority: 'P1',
customerJourneyStage: 'conversion',
},
{
channelId: 'facebook_new', channelName: 'Facebook (신규 개설)', icon: 'facebook',
currentStatus: '기존 페이지 비공개/삭제 확인 — 외국인 환자 광고 채널 완전 공백',
targetGoal: '태국·일본 환자 타겟 광고 집행 인프라 구축 (3개월 내)',
contentTypes: ['영문/태국어 광고 소재', 'Instagram TH 크로스포스팅', 'Before/After 광고'],
postingFrequency: '주 2회 + 광고 캠페인 상시',
tone: 'Professional & welcoming — Korea medical tourism storytelling',
formatGuidelines: [
'"Seoul i Plastic Surgery" 영문명으로 신규 개설 (P0)',
'seoulips.com 픽셀 설치 → Instagram TH/JP 방문자 리타겟팅 광고',
'코성형·눈밑지방 시술별 태국어·일본어 광고 소재 제작 후 집행',
'WhatsApp 연동 검토 — 동남아 시장 직접 상담',
],
priority: 'P0',
customerJourneyStage: 'awareness',
},
{
channelId: 'line_new', channelName: 'LINE (신규 개설)', icon: 'globe',
currentStatus: '미개설 — 일본·태국 환자 직접 상담 경로 없음',
targetGoal: 'LINE 공식 계정 개설 + 일본어 FAQ 자동응답 + 친구 500명 (6개월)',
contentTypes: ['일본어 자동응답 FAQ', '상담 예약 플로우', 'TH/JP 전용 이벤트 메시지'],
postingFrequency: '일 단위 자동응답 + 월 2회 메시지 발송',
tone: '친절하고 안심되는 — 일본어·태국어 네이티브 수준',
formatGuidelines: [
'LINE Official Account 개설 — 일본어 자동응답 + 상담 예약 플로우 설정 (P0)',
'@seouli_jp 바이오 + 모든 게시물에 LINE QR코드 삽입',
'코성형·눈밑지방·리프팅 시술별 FAQ 자동 응답 (일본어)',
'친구 수 목표: 500명 (6개월) → 1,000명 (12개월)',
],
priority: 'P0',
customerJourneyStage: 'conversion',
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: 'blog.naver.com/seoulips — 공식 블로그 운영 중, 업로드 저조',
targetGoal: '월 8회 SEO 포스팅 정착, 코성형·눈밑지방 검색 상위 노출',
contentTypes: ['코성형 SEO 가이드', '눈밑지방 FAQ', '강남언니 리뷰 가공', 'YouTube 임베드'],
postingFrequency: '주 2회 (1차 1개월 내 시작)',
tone: '정보성 전문가 — "코성형 가격" / "눈밑지방 제거" / "실리프팅" 키워드 중심',
formatGuidelines: [
'2,000자 이상 SEO 최적화 포스트, 이미지 10장 + YouTube 임베드 1개',
'키워드 맵: "코성형 가격", "눈밑지방 제거", "실리프팅", "강남 코성형"',
'강남언니 86 리뷰 핵심 발췌 → 블로그 후기 형식 재가공',
'시술 영상 임베드 → 체류 시간 증가 → 네이버 검색 상위 노출',
],
priority: 'P1',
customerJourneyStage: 'consideration',
},
{
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
currentStatus: '9.4점 / 86 리뷰 — 5개 병원 중 가장 적음 · SNS 홍보 미흡',
targetGoal: '리뷰 1,500건 (12개월), 월 신규 리뷰 20건 목표',
contentTypes: ['리뷰 응답 (일 단위)', '시술 정보 업데이트', '리뷰 SNS 콘텐츠화'],
postingFrequency: '리뷰 응답: 일 단위 / 프로필 업데이트: 월 1~2회',
tone: '진심 어린 의료진 답변 — 형식적 답변 지양',
formatGuidelines: [
'수술 후 3개월 추적 관리 시 강남언니 리뷰 작성 요청 → 월 20건 목표',
'86개 기존 리뷰 핵심 발췌 → Instagram 카드뉴스 + YouTube 추천사 영상',
'부정 리뷰 24시간 내 응답 원칙',
'강남언니 프로필에 다국어 시술 설명 추가 + 최신 Before/After 업로드',
],
priority: 'P0',
customerJourneyStage: 'loyalty',
},
],
// ─── Section 3: Content Strategy ───
contentStrategy: {
pillars: [
{
title: '글로벌 코성형·눈밑지방 전문성',
description: '11년 경력의 코성형·눈밑지방·실리프팅 전문 기술을 KR/TH/JP 3개 언어로 전달 — "안전하고 바른 성형" 서울아이 원칙',
relatedUSP: '11 Years of Rhinoplasty & Blepharoplasty Expertise',
exampleTopics: ['코성형 3가지 방법 비교 (한/태/영/일 자막)', '눈밑지방 제거 Before/After 30일 변화', '실리프팅 효과와 지속 기간', '코성형 붓기 타임라인 Day 1~30'],
color: '#0D4F3C',
},
{
title: '3개국 다국어 외국인 환자 여정',
description: '태국·일본 실제 환자의 내원 전후 여정을 현지어로 다큐멘터리화 — 정보 제공 + 신뢰 구축',
relatedUSP: 'KR/TH/JP Multilingual Patient Experience',
exampleTopics: ['태국에서 서울아이로 — 코성형 여행 브이로그', '日本から来た!목의 下の脂肪取り手術体験記', '외국인 환자 상담 과정 공개', '강남역에서 서울아이까지 오는 방법'],
color: '#2ECC71',
},
{
title: '86 리뷰의 진심 — 강남언니 증거',
description: '강남언니 9.4점 / 86 실사용 후기를 콘텐츠 자산으로 전환 — 신뢰 증거 극대화',
relatedUSP: 'Patient-Validated 9.4 Stars',
exampleTopics: ['"코성형 후 진짜 자연스럽다" — 강남언니 리뷰 발췌', '86개 리뷰 공통 키워드: 자연스럽다 / 회복 빠르다 / 친절하다', '강남언니 9.4점 달성 감사 이벤트', '리뷰 100 달성 기념 특별 콘텐츠'],
color: '#07331F',
},
{
title: 'K-Beauty 글로벌 허브 — 서울 강남',
description: '강남역 입지와 K-Beauty 트렌드를 활용한 글로벌 환자 유입 전략 — 서울 방문 가이드 + 한국 성형 문화',
relatedUSP: 'K-Beauty Seoul Gangnam Destination',
exampleTopics: ['강남에서 수술 후 회복하기 — 숙소/식당/관광지 추천', '왜 태국/일본 분들이 한국에서 코성형을 하나요?', '서울아이 찾아오는 방법 — 강남역 3번 출구 5분', '2026 코성형 트렌드 — 서울아이 전문의 전망'],
color: '#6B7280',
},
],
typeMatrix: [
{ format: 'YouTube 전문의 Q&A (다국어 자막)', channels: ['YouTube'], frequency: '주 1회', purpose: '코성형·눈밑지방 전문성 증명, 깊은 신뢰 구축' },
{ format: 'Shorts / Reels (다국어)', channels: ['YouTube', 'Instagram KR', 'Instagram TH', 'Instagram JP'], frequency: '주 5개', purpose: '기존 155개 영상 글로벌 재활용, 도달 확대' },
{ format: 'Carousel (리뷰 스토리)', channels: ['Instagram KR'], frequency: '주 1회', purpose: '강남언니 86 리뷰 → 사회적 증거화' },
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '코성형·눈밑지방 검색 유입, SEO 강화' },
{ format: '외국인 환자 브이로그', channels: ['YouTube', 'Instagram TH', 'Instagram JP'], frequency: '월 2회', purpose: '태국·일본 환자 여정 콘텐츠 — 전환 유도' },
{ format: 'LINE 메시지', channels: ['LINE'], frequency: '월 2회', purpose: '일본 환자 직접 상담 전환 채널' },
],
workflow: [
{ step: 1, name: 'KR 원본 제작', description: '한국어 원본 콘텐츠 (영상/카드뉴스/Reels) 제작 — 후반작업 포함', owner: '콘텐츠팀', duration: '5~7일' },
{ step: 2, name: '다국어 번역 + 자막', description: 'EN/TH/JP 번역 및 자막 파일 제작 — 네이티브 검수 필수', owner: '번역팀', duration: '2~3일' },
{ step: 3, name: '플랫폼별 최적화', description: 'Instagram 계정별(KR/TH/JP) 포맷·해시태그 최적화 후 예약 등록', owner: 'SNS 담당', duration: '1일' },
{ step: 4, name: '크로스 배포 + 성과 추적', description: '전 채널 동시 배포 후 UTM 기반 유입 추적 + 강남언니 상담 연계 확인', owner: '마케팅 매니저', duration: '당일' },
],
repurposingSource: '1개 코성형·눈밑지방 전문의 설명 영상 (10분) 또는 기존 155개 영상 아카이브 1편',
repurposingOutputs: [
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 풀 영상 업로드 (KR 기본 + EN/TH/JP 자막 추가)' },
{ format: 'Shorts 3개', channel: 'YouTube / Instagram KR', description: '핵심 구간 30~60초 추출, KR+EN 자막 동시 배포' },
{ format: 'Instagram TH Reels', channel: 'Instagram TH (@seouli_ps_th)', description: 'Shorts 태국어 번역 버전 — @seouli_ps_th 배포' },
{ format: 'Instagram JP Reels', channel: 'Instagram JP (@seouli_jp)', description: 'Shorts 일본어 번역 버전 — @seouli_jp 배포' },
{ format: 'Blog Post 1개', channel: 'Naver Blog', description: '영상 스크립트 → 2,000자 SEO 포스트 (영상 임베드 포함)' },
{ format: 'LINE 메시지', channel: 'LINE', description: '영상 요약 + 상담 CTA — 일본 LINE 친구 대상 발송' },
],
},
// ─── Section 4: Content Calendar ───
calendar: {
weeks: [
{
weekNumber: 1, label: 'Week 1: 다국어 기반 구축 — 브랜드 통일 선언',
entries: [
{ dayOfWeek: 0, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: '서울아이 리브랜딩 — "Seoul i Plastic Surgery" 공식 발표 Reels' },
{ dayOfWeek: 1, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'Seoul i Plastic Surgery — เปิดตัวแบรนด์ใหม่ (TH Reels)' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형이란? — 1분 설명 (KR/EN/TH/JP 자막)' },
{ dayOfWeek: 3, channel: 'Instagram JP', channelIcon: 'instagram', contentType: 'social', title: 'ソウルアイ — 鼻整形専門クリニック紹介 (JP Reels)' },
{ dayOfWeek: 4, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 86 리뷰 감사 — 핵심 후기 발췌 5선' },
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 방법 3가지 비교 — 어떤 수술이 나에게 맞을까' },
],
},
{
weekNumber: 2, label: 'Week 2: 코성형 전문성 — 교육 콘텐츠 집중',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '코성형 상담부터 수술까지 — 서울아이 전문의 Q&A (EN/TH 자막)' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reels: 코성형 붓기 타임라인 — Day 1~30 비교' },
{ dayOfWeek: 2, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'ไทม์ไลน์ฟื้นตัวหลังทำจมูก — 1~30 วัน (TH 번역)' },
{ dayOfWeek: 3, channel: 'Instagram JP', channelIcon: 'instagram', contentType: 'social', title: '鼻整形の腫れはいつ引く? リカバリータイムライン (JP 번역)' },
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '눈밑지방 제거 vs 필러 — 차이와 선택 기준 (SEO)' },
{ dayOfWeek: 5, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Story: 강남언니 9.4점 리뷰 — "정말 자연스럽다" 후기 공유' },
],
},
{
weekNumber: 3, label: 'Week 3: 외국인 환자 여정 — 태국 집중',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '태국에서 서울아이로 — 코성형 여행 브이로그 (태국어 자막)' },
{ dayOfWeek: 1, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'จากกรุงเทพมาโซล — ทำจมูกที่ Seoul i (TH Reels)' },
{ dayOfWeek: 2, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reels: 눈밑지방 제거 전후 — 30대 여성 케이스' },
{ dayOfWeek: 3, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'ขั้นตอนนัดหมายที่ Seoul i — ง่ายกว่าที่คิด (TH 카드뉴스)' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(TH): Seoul i — 태국 환자 코성형 신규 광고 런칭' },
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '실리프팅이란? 효과와 지속 기간 — 서울아이 케이스 분석' },
],
},
{
weekNumber: 4, label: 'Week 4: LINE 오픈 + 일본 환자 전환',
entries: [
{ dayOfWeek: 0, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 86→100 리뷰 달성 감사 이벤트' },
{ dayOfWeek: 1, channel: 'Instagram JP', channelIcon: 'instagram', contentType: 'social', title: '日本からソウルアイへ — 目の下の脂肪取りブイログ (JP)' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '실리프팅이란? 서울아이 전문의 1:1 설명 (4개 언어 자막)' },
{ dayOfWeek: 3, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reels: 서울아이 상담실 공개 — 외국인 환자 첫 방문 가이드' },
{ dayOfWeek: 4, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'ก่อน-หลัง เสริมจมูก Seoul i — คนไข้จริงรีวิว (TH)' },
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남언니 9.4점 달성 스토리 — 서울아이가 받은 86개의 진심' },
],
},
],
monthlySummary: [
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 12, color: '#0D4F3C' },
{ type: 'blog', label: '블로그', count: 4, color: '#2ECC71' },
{ type: 'social', label: 'Instagram KR/TH/JP', count: 14, color: '#07331F' },
{ type: 'ad', label: '광고 (Facebook TH)', count: 1, color: '#6B7280' },
],
},
// ─── Section 5: Asset Collection ───
assetCollection: {
assets: [
{ id: 'ir-a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: 'YouTube 영상 155개 아카이브 (@SEOULiPS.)', description: '2019년 개설 이래 누적 155개 영상 — 다국어 자막 추가 + Shorts 추출 최우선 자산', repurposingSuggestions: ['EN/TH/JP 자막 추가 30개 (P0)', 'Shorts 50개 추출', 'Instagram Reels 변환', 'Blog 포스트 임베드'], status: 'collected' },
{ id: 'ir-a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 환자 리뷰 86건 (9.4점)', description: '5개 병원 중 가장 적지만 9.4점 고품질 — 리뷰 증가 전략 + 콘텐츠 자산화 우선', repurposingSuggestions: ['리뷰 발췌 Carousel 시리즈', 'Instagram Stories 시리즈', '블로그 환자 스토리', '광고 소셜프루프'], status: 'pending' },
{ id: 'ir-a3', source: 'social', sourceLabel: 'Instagram TH', type: 'photo', title: 'Instagram @seouli_ps_th 게시물 200개 (5K 팔로워)', description: '태국어 콘텐츠 200개 — Facebook 태국 광고 소재 + LINE 콘텐츠 재활용 가능', repurposingSuggestions: ['Facebook 태국 타겟 광고 소재', 'LINE 태국 메시지 콘텐츠', '@seoulips KR 크로스 태그 시리즈'], status: 'collected' },
{ id: 'ir-a4', source: 'social', sourceLabel: 'Instagram KR', type: 'photo', title: 'Instagram @seoulips 게시물 600개', description: '@seoulips KR 누적 600 게시물 — TH/JP 번역 크로스 배포 원본 소스', repurposingSuggestions: ['TH 번역 → @seouli_ps_th 배포', 'JP 번역 → @seouli_jp 배포', 'Reels 재편집'], status: 'collected' },
{ id: 'ir-a5', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '서울아이 시설·의료진 사진', description: 'seoulips.com 내 시설 사진 + 의료진 프로필 — 다국어 채널 신뢰 콘텐츠 소스', repurposingSuggestions: ['Instagram 시설 투어 Reels', 'YouTube B-roll', '블로그 위치 안내', '다국어 광고 배경'], status: 'collected' },
{ id: 'ir-a6', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 카테고리 3종 설명 (코성형·눈밑지방·리프팅)', description: 'seoulips.com 시술별 상세 설명 — 블로그 SEO 포스트 + 다국어 카드뉴스 소스', repurposingSuggestions: ['블로그 SEO 포스트 소스', '다국어 카드뉴스 텍스트', 'LINE FAQ 자동응답 소스'], status: 'collected' },
{ id: 'ir-a7', source: 'blog', sourceLabel: '네이버 블로그', type: 'text', title: '기존 네이버 블로그 포스트', description: 'blog.naver.com/seoulips 기존 포스트 — SEO 키워드 분석 후 리라이팅 대상', repurposingSuggestions: ['고트래픽 포스트 리라이팅', '키워드 맵 추출', '내부 링크 재구성'], status: 'pending' },
{ id: 'ir-a8', source: 'homepage', sourceLabel: '홈페이지 (제작 필요)', type: 'video', title: '다국어 병원 소개 영상 (신규 제작)', description: '"서울아이 = 안전하고 바른 성형 + KR/TH/JP 환자 환영" 통합 브랜드 영상', repurposingSuggestions: ['YouTube 채널 트레일러', '다국어 Landing Page 히어로 영상', 'Instagram KR/TH/JP 프로필 영상'], status: 'needs_creation' },
],
youtubeRepurpose: [
{ title: '코성형 상담부터 수술까지 — 전문의 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 3개 추출', 'Instagram KR Reels', 'TH/JP 번역 배포', 'Blog 임베드'] },
{ title: '눈밑지방 제거 과정 설명', views: 0, type: 'Long', repurposeAs: ['Shorts 2개 추출', 'Reels KR+TH+JP 동시 배포', 'Blog SEO 포스트'] },
{ title: '실리프팅 효과와 지속 기간', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Blog 임베드', '강남언니 프로필 연동'] },
{ title: '코성형 붓기 타임라인 — 1개월 경과', views: 0, type: 'Short', repurposeAs: ['Instagram KR/TH/JP 동시 배포', 'TikTok 크로스포스팅'] },
{ title: '서울아이 서울 방문 가이드 (외국인)', views: 0, type: 'Long', repurposeAs: ['Instagram TH/JP 여행 시리즈', 'LINE 메시지 콘텐츠', 'Facebook 광고 소재'] },
],
},
// ─── Section 6: Repurposing Proposals ───
repurposingProposals: [
{
sourceVideo: { title: '155개 YouTube 영상 → EN/TH/JP 자막 추가', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: '자막 추가 영상 30개 (1차)', channel: 'YouTube', description: '기존 영상에 EN/TH 자막 추가 → 글로벌 검색 노출 즉시 10배 확대 (P0)' },
{ format: 'Shorts 50개 추출', channel: 'YouTube / Instagram KR / TH / JP', description: '1분 클립 추출 후 KR/EN/TH/JP 다국어 Shorts — 3개월 분량 확보' },
{ format: 'Instagram TH/JP 버전', channel: 'Instagram TH + JP', description: 'Shorts를 태국어·일본어 번역 버전으로 변환 → 3개 계정 동시 배포' },
],
},
{
sourceVideo: { title: '강남언니 86 리뷰 → 콘텐츠화', views: 86, type: 'Long', repurposeAs: [] },
estimatedEffort: 'low',
priority: 'high',
outputs: [
{ format: 'Carousel 시리즈 (월 4회)', channel: 'Instagram KR', description: '리뷰 핵심 발췌 카드뉴스 — 21개월치 소재 확보' },
{ format: 'Blog 환자 스토리', channel: 'Naver Blog', description: '리뷰 → 환자 여정 스토리 블로그 변환 (SEO 포스트)' },
{ format: '광고 소셜프루프', channel: 'Facebook TH / JP', description: '"9.4점 / 86 리뷰의 진심" 메시지 외국인 환자 타겟 광고 소재' },
],
},
{
sourceVideo: { title: '외국인 환자 브이로그 (신규 제작 — TH/JP)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'YouTube 브이로그 (태국어 자막)', channel: 'YouTube', description: '태국 환자 서울 방문 여정 풀 영상 — YouTube 글로벌 노출' },
{ format: 'Instagram TH Reels 시리즈', channel: 'Instagram TH (@seouli_ps_th)', description: '브이로그 클립 → TH Reels 5편 시리즈' },
{ format: 'LINE 일본 콘텐츠', channel: 'LINE', description: 'JP 환자 브이로그 요약 + LINE 상담 CTA — 일본 전환 유도' },
],
},
{
sourceVideo: { title: 'LINE 일본 상담 채널 개설 콘텐츠', views: 0, type: 'Short', repurposeAs: [] },
estimatedEffort: 'low',
priority: 'medium',
outputs: [
{ format: '@seouli_jp Instagram Reels', channel: 'Instagram JP', description: 'LINE 개설 공지 Reels + QR코드 삽입' },
{ format: 'YouTube JP 자막 CTA', channel: 'YouTube', description: '모든 영상 엔딩에 LINE 상담 QR코드 추가' },
{ format: 'Instagram TH LINE CTA', channel: 'Instagram TH', description: '@seouli_ps_th Story + 게시물에 LINE 링크 추가' },
],
},
],
// ─── Section 7: Workflow Tracker ───
workflow: {
items: [
{
id: 'ir-wf-001',
title: 'LINE 공식 계정 개설 + 일본어 FAQ 자동응답 설정',
contentType: 'image-text',
channel: 'LINE',
channelIcon: 'globe',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: 'Seoul i Plastic Surgery LINE 공식 채널 오픈',
copy: [
'일본어 자동응답: 코성형 / 눈밑지방 / 리프팅 시술별 FAQ',
'예약 문의 → 코디네이터 연결 플로우',
'@seouli_jp 바이오 + 모든 게시물에 LINE QR코드 삽입',
'오픈 공지 Instagram JP Reels 동시 발행',
],
},
},
{
id: 'ir-wf-002',
title: 'YouTube 기존 영상 EN/TH 자막 1차 30개 추가',
contentType: 'video',
channel: 'YouTube',
channelIcon: 'youtube',
stage: 'planning',
videoDraft: {
script: '[자막 추가 대상 우선순위]\n1. 코성형 관련 영상 (조회수 상위)\n2. 눈밑지방 제거 설명 영상\n3. Before/After 케이스 영상\n\n[작업 방식]\n- 기존 자막 없는 영상 → EN 자동 번역 후 수정\n- TH 번역은 네이티브 검수 후 업로드\n- JP 번역은 2차 30개 추가 예정',
shootingGuide: [
'자막 추가 후 YouTube Studio에서 언어 설정 확인',
'제목·설명에 EN/TH/JP 키워드 추가 (SEO)',
'자막 완료 영상은 채널에 핀 게시 or 플레이리스트 상위 노출',
],
duration: '월 10개, 3개월 내 30개 완료',
},
},
{
id: 'ir-wf-003',
title: 'Facebook 신규 페이지 개설 + 픽셀 설치',
contentType: 'image-text',
channel: 'Facebook',
channelIcon: 'facebook',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '"Seoul i Plastic Surgery" Facebook 신규 개설',
copy: [
'기존 비공개 페이지 대체 — 영문 "Seoul i Plastic Surgery" 이름으로 개설',
'seoulips.com 픽셀 설치 → Instagram TH/JP 방문자 리타겟팅',
'태국어·일본어 첫 광고 캠페인 소재: 코성형 Before/After',
'WhatsApp 연동 검토 (동남아 직접 상담)',
],
},
},
{
id: 'ir-wf-004',
title: '강남언니 86 리뷰 Carousel 1차 4편 제작',
contentType: 'image-text',
channel: 'Instagram KR',
channelIcon: 'instagram',
stage: 'ai-draft',
imageTextDraft: {
type: 'cardnews',
headline: '강남언니 9.4점 — 진심 담긴 86개의 이야기',
copy: [
'슬라이드 1: "강남언니 9.4점 / 86 리뷰 감사합니다"',
'슬라이드 2-5: 베스트 리뷰 4개 발췌 (익명화 처리)',
'슬라이드 6: "리뷰 남기기 → 강남언니 프로필 링크"',
],
layoutHint: 'Forest Green 배경, Mint 텍스트 강조, 서울아이 로고 하단',
},
},
{
id: 'ir-wf-005',
title: 'Instagram KR/TH/JP 크로스 배포 루틴 문서화',
contentType: 'image-text',
channel: 'Instagram KR',
channelIcon: 'instagram',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '3개국 Instagram 크로스 배포 SOP',
copy: [
'KR 원본 제작 → EN 번역 → TH 번역 (네이티브 검수) → JP 번역 (네이티브 검수)',
'예약 스케줄러 설정: KR 월요일 → TH 화요일 → JP 수요일 동시 배포',
'해시태그 국가별 최적화 가이드 문서화',
'월 1회 3개 계정 성과 리뷰 루틴 수립',
],
},
},
],
},
};

460
src/data/mockPlan_ts.ts Normal file
View File

@ -0,0 +1,460 @@
import type { MarketingPlan } from '../types/plan';
/**
*
*
* (`mockReport_ts.ts` 2026-04-14 ):
* - YouTube TV @TV-jm9dy: 8K , 715 , 1~2
* - Instagram @tsprs_official: 2,626 , Reels 60
* - Facebook @tsprs: 3,900 ( )
* - @tsprs:
* - :
* - : 9.5/12,509
* - 2010 16, , ·· , "리얼모델"
* - : "지금, 예뻐져라!"
* - Primary: Dark Navy (#1A1A2E), Accent: Crimson (#E94560)
*/
export const mockPlanTs: MarketingPlan = {
id: 'ts',
reportId: 'ts',
clinicName: '티에스성형외과',
clinicNameEn: 'TS Plastic Surgery',
createdAt: '2026-04-14',
targetUrl: 'https://www.tsprs.com',
// ─── Section 1: Brand Guide ───
brandGuide: {
colors: [
{ name: 'TS Dark Navy', hex: '#1A1A2E', usage: '공식 로고 메인, 헤딩, 강조 텍스트' },
{ name: 'TS Crimson', hex: '#E94560', usage: '로고 악센트, CTA 포인트, 리얼모델 강조' },
{ name: 'Off White', hex: '#F8F8F8', usage: '배경, 카드, 여백' },
{ name: 'Deep Navy Text', hex: '#0F0F1A', usage: '본문 텍스트' },
{ name: 'Mid Gray', hex: '#6B7280', usage: '서브 텍스트, 메타 정보' },
],
fonts: [
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀', sampleText: '지금, 예뻐져라! — 티에스성형외과' },
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: '리얼모델로 증명하는 티에스' },
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩', sampleText: 'TS Plastic Surgery' },
],
logoRules: [
{ rule: 'Dark Navy+Crimson 공식 로고 통일', description: '티에스성형외과 공식 로고를 모든 채널에서 동일 사용', correct: true },
{ rule: '"지금, 예뻐져라!" 슬로건 전 채널 통일', description: '슬로건을 바이오·배너·콘텐츠 전반에 일관되게 적용', correct: false },
{ rule: '리얼모델 썸네일 시스템', description: '리얼모델 Before/After 썸네일 — Dark Navy 배경 + Crimson 워드마크 워터마크 통일', correct: false },
{ rule: '원형 프로필 1080×1080 통일', description: '전 채널 프로필 이미지 고해상도 원형 버전 통일', correct: false },
],
toneOfVoice: {
personality: ['에너지 있는', '결과 중심', '리얼한', '친근한 전문가', '트렌디'],
communicationStyle: '"지금, 예뻐져라!"는 단순한 슬로건이 아닙니다. 리얼모델로 증명하는 티에스의 결과 중심 철학입니다. 과장 없이 실제 환자 결과로 설득합니다.',
doExamples: [
'"리얼모델이 증명합니다 — 지금, 예뻐져라!"',
'"강남언니 9.5점 · 12,509 리뷰 — 결과로 말합니다"',
'"티에스TV 715개 영상, 눈·코·가슴 모든 것"',
'"신사역 5분 — 지금 예약하세요"',
],
dontExamples: [
'"강남 최고 할인!"',
'"연예인 선택 병원"',
'"100% 만족 보장"',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: 'TS Dark Navy 원형 로고 1080×1080', bannerSpec: '2560×1440px, Dark Navy 배경 + Crimson 악센트, "지금, 예뻐져라! 티에스TV"', bioTemplate: '지금, 예뻐져라! 티에스성형외과\n눈·코·가슴·리프팅 리얼모델 채널\n02-512-7580 | tsprs.com', currentStatus: 'incorrect' },
{ channel: 'Instagram', icon: 'instagram', profilePhoto: 'TS Dark Navy 원형 로고', bannerSpec: 'N/A (하이라이트: 눈성형/코성형/가슴성형/리얼모델/이벤트 — Crimson 톤)', bioTemplate: '지금, 예뻐져라! 티에스성형외과 공식\n신사역 | 02-512-7580\ntsprs.com', currentStatus: 'incorrect' },
{ channel: 'Facebook', icon: 'facebook', profilePhoto: 'TS Dark Navy 원형 로고', bannerSpec: '820×312px, Dark Navy+Crimson, "지금, 예뻐져라! 리얼모델로 증명"', bioTemplate: '티에스성형외과 공식 — 강남 신사역\n눈·코·가슴 리얼모델 시스템', currentStatus: 'incorrect' },
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: 'TS 로고', bannerSpec: '블로그 상단: 로고 + 리얼모델 카테고리 메뉴', bioTemplate: '지금, 예뻐져라! 티에스성형외과 공식 블로그\n눈·코·가슴·리프팅 리얼모델 후기', currentStatus: 'incorrect' },
{ channel: 'TikTok', icon: 'video', profilePhoto: 'TS Dark Navy 원형 로고', bannerSpec: 'N/A', bioTemplate: '지금, 예뻐져라! 티에스성형외과\n신사역 | 02-512-7580', currentStatus: 'missing' },
],
brandInconsistencies: [
{
field: '리얼모델 콘텐츠 크로스채널 미활용',
values: [
{ channel: 'YouTube', value: '티에스TV — 리얼모델 시리즈 있음', isCorrect: true },
{ channel: 'Instagram', value: 'Reels 60개 — 리얼모델 하이라이트 미완성', isCorrect: false },
{ channel: 'Naver Blog', value: '리얼모델 연계 포스팅 부족', isCorrect: false },
{ channel: '연탐 카페', value: '후기 있으나 SNS 연동 없음', isCorrect: false },
],
impact: '리얼모델 콘텐츠가 YouTube에서 강점이나 Instagram·Blog·카페 연동 체계 없음',
recommendation: 'YouTube 리얼모델 → Instagram Reel → Blog 임베드 → 카페 후기 연동 파이프라인 구축',
},
{
field: 'SEO 최적화 현황',
values: [
{ channel: 'YouTube 타이틀', value: 'SEO 메타데이터 최적화 미흡', isCorrect: false },
{ channel: 'YouTube 썸네일', value: '통일 시스템 없음', isCorrect: false },
{ channel: 'Naver Blog', value: '업로드 있으나 키워드 전략 미흡', isCorrect: false },
],
impact: '715개 영상 대비 구독자 8K — SEO·썸네일 최적화만으로 즉각 개선 가능',
recommendation: 'YouTube 715개 영상 SEO 메타데이터 일괄 최적화 + 리얼모델 썸네일 시스템 구축',
},
],
},
// ─── Section 2: Channel Strategies ───
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube (티에스TV)', icon: 'youtube',
currentStatus: '티에스TV — 8K 구독자, 715 영상, 주 1~2회 업로드',
targetGoal: '20K 구독자 / 12개월, 주 3회 업로드 + SEO 전면 최적화',
contentTypes: ['리얼모델 Before/After 롱폼', 'Shorts (715 영상 재편집)', 'SEO 최적화 타이틀 시리즈'],
postingFrequency: '주 3회 (Shorts 2 + 롱폼 1)',
tone: '"지금, 예뻐져라!" — 리얼모델 에너지 + 전문의 신뢰',
formatGuidelines: [
'715개 영상 SEO 메타데이터 일괄 최적화 (P0)',
'썸네일: Dark Navy 배경 + Crimson 워드마크 + 리얼모델 Before/After 통일',
'타이틀 패턴: "강남 눈코가슴 리얼모델 ___"',
'Shorts: 715 영상에서 200개 추출 목표',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'instagram', channelName: 'Instagram', icon: 'instagram',
currentStatus: '@tsprs_official — 2,626 팔로워, Reels 60개 (확장 여지)',
targetGoal: '15K 팔로워 / 12개월, Reels 100개+ 달성',
contentTypes: ['Reels (YouTube Shorts 동시)', '리얼모델 Before/After Carousel', '연탐 카페 후기 카루셀'],
postingFrequency: '일 1회 + Stories 일 2개',
tone: '"지금, 예뻐져라!" — 에너지 있는 리얼모델 중심',
formatGuidelines: [
'Reels: YouTube Shorts 동시 배포',
'하이라이트: 눈성형/코성형/가슴성형/리얼모델/이벤트 재구성',
'연탐 카페 후기 → Instagram Carousel로 재편집',
'해시태그: #티에스성형외과 #리얼모델 #지금예뻐져라 #강남눈코가슴',
],
priority: 'P0',
customerJourneyStage: 'interest',
},
{
channelId: 'facebook', channelName: 'Facebook', icon: 'facebook',
currentStatus: '@tsprs — 3,900 팔로워, 활성도 낮음',
targetGoal: 'Instagram 크로스포스팅 자동화 + Pixel 리타겟 세팅',
contentTypes: ['Instagram 자동 크로스포스팅', '리타겟 광고 소재'],
postingFrequency: '주 2-3회 (자동 연동)',
tone: '리얼모델 결과 중심 — 20~40대 여성 타겟',
formatGuidelines: [
'Instagram 콘텐츠 자동 연동',
'Pixel 광고: 눈·코·가슴 관심사 타겟',
'카카오톡 상담 버튼 전 페이지 플로팅',
],
priority: 'P1',
customerJourneyStage: 'conversion',
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: '@tsprs — 업로드 있으나 빈도·키워드 전략 미흡',
targetGoal: '주 3회로 상향, 12개월 내 월 20,000 방문자',
contentTypes: ['리얼모델 SEO 포스트', 'YouTube 영상 임베드+설명', '눈·코·가슴 시술 가이드'],
postingFrequency: '주 3회',
tone: '"강남 눈코가슴 리얼모델", "티에스성형외과 후기" 키워드 중심',
formatGuidelines: [
'2,000자 이상 SEO 최적화',
'리얼모델 YouTube 영상 임베드 + 텍스트 설명',
'핵심 키워드: "강남 눈성형", "티에스성형외과", "리얼모델 성형"',
'연탐 카페 후기 → 블로그 변환 연동',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'naver_cafe', channelName: '연탐 네이버 카페', icon: 'users',
currentStatus: '연탐 카페 운영 중 — SNS 연동 미흡',
targetGoal: '카페 후기 SNS 연동 파이프라인 구축',
contentTypes: ['카페 후기 → Instagram Carousel 변환', '시술별 Q&A 활성화'],
postingFrequency: '주 2회 (Q&A 답변 + 후기 공유)',
tone: '친밀하고 소통하는 — 커뮤니티 매니저 톤',
formatGuidelines: [
'카페 베스트 후기 → Instagram·Blog 재편집 파이프라인',
'시술별 Q&A 게시판 활성화 (눈/코/가슴)',
'카페 후기 작성 인센티브 제도 검토',
],
priority: 'P1',
customerJourneyStage: 'loyalty',
},
{
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
currentStatus: '9.5점/10, 12,509 리뷰 — 응답 전략 미흡',
targetGoal: '리뷰 응답률 80%, 15,000 리뷰 / 12개월',
contentTypes: ['리뷰 응답', '시술 정보 최신화'],
postingFrequency: '리뷰 응답 일 단위',
tone: '진심 어린 의료진 답변',
formatGuidelines: [
'응답률 50%(3개월) → 80%(12개월)',
'12,509 리뷰 중 50개 선별 → SNS Carousel',
'부정 리뷰 24시간 내 응답',
],
priority: 'P0',
customerJourneyStage: 'loyalty',
},
{
channelId: 'tiktok', channelName: 'TikTok (신규)', icon: 'video',
currentStatus: '계정 없음',
targetGoal: '10K 팔로워 / 12개월 — 20~30대 첫 수술 고민층',
contentTypes: ['YouTube Shorts 크로스포스팅', '리얼모델 Before/After 틱톡'],
postingFrequency: '주 5회 (Shorts 동시 배포)',
tone: '"지금, 예뻐져라!" — 트렌디, 에너지 있는',
formatGuidelines: [
'715 영상 Shorts 추출 → TikTok 동시',
'트렌딩 사운드 + 자막 필수',
'의료광고법 준수',
],
priority: 'P1',
customerJourneyStage: 'awareness',
},
],
// ─── Section 3: Content Strategy ───
contentStrategy: {
pillars: [
{
title: '리얼모델로 증명',
description: '"지금, 예뻐져라!" 슬로건의 핵심 — 실제 리얼모델 Before/After 결과 중심 콘텐츠',
relatedUSP: 'Real Model Verification System',
exampleTopics: ['리얼모델 눈성형 6개월 후 솔직 후기', '리얼모델 코성형 과정 브이로그', '가슴성형 리얼모델 — 보형물 선택부터 회복까지'],
color: '#E94560',
},
{
title: '눈·코·가슴 전문성',
description: '티에스의 3대 핵심 시술 — 각 시술별 심층 교육 콘텐츠',
relatedUSP: 'Eyes, Nose & Breast Expertise',
exampleTopics: ['눈성형 유형별 가이드', '코성형 재수술 예방 팁', '가슴 보형물 종류와 선택'],
color: '#1A1A2E',
},
{
title: '12,509 리뷰의 신뢰',
description: '강남언니 9.5점 12,509 리뷰와 연탐 카페 후기를 콘텐츠화',
relatedUSP: 'Verified Patient Reviews',
exampleTopics: ['강남언니 베스트 리뷰 카루셀', '연탐 카페 후기 TOP 10', '리얼모델 수술 후 6개월 추적'],
color: '#6B7280',
},
{
title: 'SEO & 검색 유입',
description: '715개 영상 자산의 SEO 최적화와 블로그 검색 상위 전략',
relatedUSP: 'Search Engine Visibility',
exampleTopics: ['"강남 눈성형 추천" 검색 1위 전략', '티에스성형외과 블로그 키워드 맵', 'YouTube SEO 타이틀 패턴'],
color: '#F8F8F8',
},
],
typeMatrix: [
{ format: 'YouTube Long-form (리얼모델)', channels: ['YouTube'], frequency: '월 4편', purpose: '리얼모델 케이스 — 결과 신뢰 구축' },
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 5개', purpose: '715 영상 자산 재활용, 20~40대 도달' },
{ format: 'Carousel (리뷰+후기)', channels: ['Instagram'], frequency: '주 2회', purpose: '12,509 강남언니 + 연탐 카페 사회적 증거화' },
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 3회', purpose: '"강남 눈코가슴" 검색 상위 확보' },
{ format: 'Stories', channels: ['Instagram'], frequency: '일 2개', purpose: '리얼모델 일상·시술 비하인드' },
{ format: 'Ad Creative', channels: ['Facebook', 'Instagram'], frequency: '월 4개', purpose: '20~40대 여성 타겟 리타겟' },
],
workflow: [
{ step: 1, name: 'SEO 일괄 최적화', description: '715개 YouTube 영상 타이틀·설명·태그 SEO 재작성', owner: 'SEO 담당 + AI', duration: '2주 (1회성)' },
{ step: 2, name: '리얼모델 기획', description: '신규 리얼모델 모집 + 케이스 선정 (눈/코/가슴 각 1건)', owner: '마케팅 매니저', duration: '2주' },
{ step: 3, name: '콘텐츠 제작', description: '리얼모델 촬영 + Shorts 추출 + 카루셀 제작', owner: '콘텐츠 팀', duration: '3-5일' },
{ step: 4, name: '의료 검수', description: '의료진 정확성 + 광고법 체크', owner: '의료진', duration: '1일' },
{ step: 5, name: '비주얼 마감', description: 'Dark Navy+Crimson 썸네일 통일, 자막', owner: '디자인', duration: '1일' },
{ step: 6, name: '크로스채널 배포', description: 'YouTube + Instagram + TikTok + Blog 동시 + UTM', owner: '마케팅 매니저', duration: '당일' },
],
repurposingSource: '리얼모델 눈성형 브이로그 롱폼 (10분)',
repurposingOutputs: [
{ format: 'YouTube Long-form', channel: 'YouTube', description: '리얼모델 풀 브이로그 (Dark Navy 썸네일)' },
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '수술 전·중·후 핵심 구간 클립 3채널 동시' },
{ format: 'Carousel', channel: 'Instagram', description: '리얼모델 Before/After + 후기 카드뉴스' },
{ format: 'Blog Post', channel: 'Naver Blog', description: '리얼모델 브이로그 → SEO 리뷰 포스트 (영상 임베드)' },
{ format: '연탐 카페 공유', channel: 'Naver Cafe', description: '카페 시술 후기 게시판 공유' },
{ format: 'Ad Creative', channel: 'Facebook / Instagram', description: '리얼모델 하이라이트 + "지금, 예뻐져라!" CTA' },
],
},
// ─── Section 4: Content Calendar ───
calendar: {
weeks: [
{
weekNumber: 1, label: 'Week 1: SEO 최적화 착수 & 리얼모델 시동',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '리얼모델 눈성형 브이로그 #1 — "지금, 예뻐져라!" 티에스TV' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: '프로필 리뉴얼 + 리얼모델 Reel #1 (눈성형 전후)' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 눈성형 Q&A — 쌍꺼풀 vs 비절개' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남 눈성형 가이드 — 티에스 리얼모델이 증명합니다' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 12,509 리뷰 베스트 5' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 보형물 Q&A' },
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '티에스성형외과 후기 — 강남언니 9.5점의 비밀' },
],
},
{
weekNumber: 2, label: 'Week 2: 코성형 리얼모델 주간',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 리얼모델 코성형 — 상담부터 회복까지' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 리얼모델 Before/After' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 재수술 피하는 법' },
{ dayOfWeek: 2, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 종류와 선택 — 티에스 리얼모델 케이스' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 연탐 카페 코성형 베스트 후기' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 6개월 후 — 리얼 후기' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 코성형 리얼모델 상담 CTA' },
],
},
{
weekNumber: 3, label: 'Week 3: 가슴성형 리얼모델 주간',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 리얼모델 가슴성형 — 보형물 선택 가이드' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 가슴성형 리얼모델 Before/After' },
{ dayOfWeek: 1, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '가슴성형 보형물 종류 완전 가이드 — 티에스 리얼모델' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 회복 기간 현실' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 가슴·눈·코 동시 리얼모델 비교' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 지금, 예뻐져라! — 이달의 리얼모델' },
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '가슴성형 연탐 카페 후기 모음 — 티에스성형외과' },
],
},
{
weekNumber: 4, label: 'Week 4: 전환 & 카카오 상담 강화',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 티에스성형외과 — 리얼모델로 증명하는 16년' },
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '첫 성형 상담 준비 — 티에스성형외과 신사역 가이드' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 신사역 티에스성형외과 시설 투어' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 이달의 리얼모델 TOP 3' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 카카오톡 상담 예약 3단계' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 월말 CTA — "지금, 예뻐져라!"' },
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남언니 12,509 리뷰 — 티에스성형외과 9.5점의 증거' },
],
},
],
monthlySummary: [
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 14, color: '#1A1A2E' },
{ type: 'blog', label: '블로그', count: 8, color: '#E94560' },
{ type: 'social', label: 'Instagram', count: 8, color: '#6B7280' },
{ type: 'ad', label: '광고', count: 2, color: '#F8F8F8' },
],
},
// ─── Section 5: Asset Collection ───
assetCollection: {
assets: [
{ id: 'a1', source: 'youtube', sourceLabel: '티에스TV', type: 'video', title: '715개 영상 아카이브', description: '2018년 이래 눈·코·가슴 716개 영상 — SEO 최적화 + Shorts 추출 우선', repurposingSuggestions: ['SEO 일괄 최적화 (P0)', 'Shorts 200개 추출', 'Instagram Reels', 'TikTok 동시', 'Blog 임베드'], status: 'collected' },
{ id: 'a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 리뷰 12,509건', description: '9.5점/10 — 눈·코·가슴 케이스 중심, 티에스의 최대 사회적 증거', repurposingSuggestions: ['50개 선별 → Carousel 시리즈', 'Instagram Stories', '광고 소셜프루프', 'Blog 후기'], status: 'pending' },
{ id: 'a3', source: 'blog', sourceLabel: '연탐 카페', type: 'text', title: '연탐 네이버 카페 후기', description: '카페 시술별 후기 자산 — SNS 연동 미흡', repurposingSuggestions: ['Carousel 재편집', 'Blog 변환', 'Instagram Stories'], status: 'pending' },
{ id: 'a4', source: 'social', sourceLabel: 'Instagram', type: 'photo', title: '@tsprs_official 게시물 1,500개', description: '2,626 팔로워, Reels 60개 누적', repurposingSuggestions: ['고성과 Reel 재배포', 'Carousel 재편집', 'TikTok 크로스'], status: 'collected' },
{ id: 'a5', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '신사역 본원 시설 사진', description: '본원 내외부 고화질', repurposingSuggestions: ['Instagram 시설 Reel', 'YouTube B-roll', '블로그 위치 안내'], status: 'collected' },
{ id: 'a6', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '눈·코·가슴·리프팅 시술 설명', description: '시술별 상세 텍스트', repurposingSuggestions: ['블로그 SEO 소스', 'Carousel 텍스트', '광고 카피'], status: 'collected' },
{ id: 'a7', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '리얼모델 Before/After 갤러리', description: '눈·코·가슴 리얼모델 전후 — 동의서 보유', repurposingSuggestions: ['Instagram B/A 시리즈', 'YouTube 롱폼 소스', '광고 소재'], status: 'collected' },
{ id: 'a8', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '브랜드 영상 "지금, 예뻐져라!" (제작 필요)', description: '리얼모델 시스템 소개 브랜드 영상 신규 제작', repurposingSuggestions: ['YouTube 채널 트레일러', 'Instagram 브랜드 Reel', '웹사이트 히어로'], status: 'needs_creation' },
],
youtubeRepurpose: [
{ title: '눈성형 리얼모델 브이로그 #1', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Reel', '카페 공유', 'Blog 임베드'] },
{ title: '코성형 Before/After 케이스', views: 0, type: 'Long', repurposeAs: ['Shorts 3개', 'Carousel', 'Blog'] },
{ title: '가슴성형 보형물 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'TikTok 동시', 'Blog'] },
{ title: '리얼모델 이달의 케이스', views: 0, type: 'Short', repurposeAs: ['Instagram Reel', 'TikTok', '카페'] },
],
},
// ─── Section 6: Repurposing Proposals ───
repurposingProposals: [
{
sourceVideo: { title: '715 영상 SEO 최적화 + Shorts 200개 추출', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'high',
priority: 'high',
outputs: [
{ format: 'Shorts 200개 (전체)', channel: 'YouTube / Instagram / TikTok', description: '715 영상 → 리얼모델·시술별 Shorts 추출, 3채널 동시' },
{ format: 'SEO 타이틀 재작성', channel: 'YouTube', description: '"강남 눈코가슴 리얼모델" 패턴 715개 일괄 적용' },
{ format: 'Blog 임베드 포스트 50개', channel: 'Naver Blog', description: '영상 + 텍스트 가이드 구조 블로그 변환' },
],
},
{
sourceVideo: { title: '강남언니 12,509 리뷰 + 연탐 카페 후기 콘텐츠화', views: 12509, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Carousel 20개', channel: 'Instagram', description: '시술별 리얼 후기 카드뉴스 — 익명화 처리' },
{ format: '광고 소재', channel: 'Facebook / Instagram', description: '"9.5점 리얼모델 검증" 소셜프루프 광고' },
{ format: 'Blog 후기 포스트', channel: 'Naver Blog', description: '케이스별 상세 후기 변환' },
],
},
{
sourceVideo: { title: '리얼모델 가슴성형 브이로그 (신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'medium',
outputs: [
{ format: 'Shorts 5개', channel: 'YouTube / TikTok', description: '수술 전·중·후 핵심 구간 — "지금, 예뻐져라!" 오프닝' },
{ format: 'Carousel', channel: 'Instagram', description: '가슴성형 리얼모델 Before/After 카드뉴스' },
{ format: 'Blog Post', channel: 'Naver Blog', description: '리얼모델 가슴성형 SEO 후기 포스트' },
{ format: 'Ad Creative', channel: 'Facebook / Instagram', description: '리얼모델 결과 + "지금, 예뻐져라!" CTA 광고' },
],
},
],
// ─── Section 7: Workflow Tracker ───
workflow: {
items: [
{
id: 'wf-001',
title: '리얼모델 눈성형 Shorts — "지금, 예뻐져라!"',
contentType: 'video',
channel: 'YouTube Shorts',
channelIcon: 'youtube',
stage: 'ai-draft',
videoDraft: {
script: `[인트로 — 0~3초]\n"지금, 예뻐져라!"\n(Before → After 전환)\n\n[본문 — 3~25초]\n"티에스성형외과 리얼모델 눈성형."\n"수술 전과 후, 6개월의 변화를 직접 보여드립니다."\n"강남언니 9.5점 · 12,509 리뷰가 증명합니다."\n\n[CTA — 25~30초]\n"지금 상담 예약 — 카카오톡 @tsprs"`,
shootingGuide: [
'715 영상 중 리얼모델 눈성형 베스트 컷 추출',
'Dark Navy+Crimson 워터마크 하단 고정',
'한글 자막 필수',
'리얼모델 동의서 확인 + 비식별화 옵션',
],
duration: '30초',
},
},
{
id: 'wf-002',
title: '강남언니 리얼 후기 5선 Carousel',
contentType: 'image-text',
channel: 'Instagram',
channelIcon: 'instagram',
stage: 'review',
userNotes: '연탐 카페 후기도 포함해서 만들어주세요',
imageTextDraft: {
type: 'cardnews',
headline: '지금, 예뻐져라! — 강남언니 12,509 리뷰 중 진심 5개',
copy: [
'[카드 1] "리얼모델 보고 결정했는데, 딱 그대로 됐어요" — 눈성형',
'[카드 2] "티에스가 결과로 먼저 보여줘서 믿었습니다" — 코성형',
'[카드 3] "연탐 카페에서 후기 보고 결정 — 후회 없습니다" — 가슴성형',
'[카드 4] "카카오 상담부터 수술까지 빠르고 친절했어요"',
'[카드 5] 강남언니 9.5점 · 티에스성형외과 — 지금, 예뻐져라!',
],
layoutHint: '5장 세로형, Dark Navy+Crimson, 마지막 카드에 카카오 상담 CTA',
},
},
{
id: 'wf-003',
title: '강남 눈성형 가이드 — SEO 블로그 (리얼모델)',
contentType: 'image-text',
channel: 'Naver Blog',
channelIcon: 'globe',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '강남 눈성형 추천 — 티에스성형외과 리얼모델이 직접 증명합니다',
copy: [
'"지금, 예뻐져라!" — 이 슬로건은 리얼모델의 실제 결과에서 나왔습니다.',
'티에스성형외과는 2010년 신사역에서 시작해 16년간 눈·코·가슴에 집중했습니다.',
'강남언니 9.5점 / 12,509 리뷰, 연탐 네이버 카페 — 환자가 만든 신뢰입니다.',
'티에스TV 715개 영상에서 실제 수술 과정을 직접 확인하세요.',
],
layoutHint: '1200px 썸네일 + 2,000자, 키워드: 강남 눈성형, 티에스성형외과, 리얼모델 성형',
},
},
{
id: 'wf-004',
title: '리얼모델 코성형 롱폼 — 티에스TV',
contentType: 'video',
channel: 'YouTube',
channelIcon: 'youtube',
stage: 'approved',
scheduledDate: '2026-04-21',
videoDraft: {
script: `[오프닝]\n"지금, 예뻐져라! 티에스성형외과입니다."\n"오늘은 리얼모델 코성형 — 상담부터 6개월 후까지 공개합니다."\n\n[Phase 1: 상담]\n"어떤 코를 원하는지 먼저 들었습니다."\n\n[Phase 2: 수술 과정]\n(그래픽 + B-roll 삽입)\n\n[Phase 3: 회복]\n"1주 차, 1개월 차, 6개월 차 — 변화를 직접 보여드립니다."\n\n[클로징]\n"강남언니 12,509 리뷰 · 티에스성형외과 — 지금, 예뻐져라!"`,
shootingGuide: [
'리얼모델 동의 확인 + 촬영 일정 조율',
'Dark Navy+Crimson 인트로/아웃트로 6초',
'한글 자막 필수',
'6개월 추적 촬영 일정 사전 확정',
],
duration: '10분',
},
},
],
},
};

439
src/data/mockPlan_wonjin.ts Normal file
View File

@ -0,0 +1,439 @@
import type { MarketingPlan } from '../types/plan';
/**
*
*
* (`mockReport_wonjin.ts` 2026-04-14 ):
* - YouTube @wjwonjin: 14.1K , 350 , 3~5 (Shorts )
* - Instagram: @wonjin_official 23.4K (KR), @wonjin_ps 18K (KR ), @wj_cosmetic ()
* - Facebook @KwonjinPS: 19K (EN, )
* - @popokpop:
* - : 9.3/11,846 ( 5%)
* - 1991 35, , · ,
* - : ////
* - Primary: Deep Purple (#2C1654), Accent: Violet (#8B5CF6)
*/
export const mockPlanWonjin: MarketingPlan = {
id: 'wonjin',
reportId: 'wonjin',
clinicName: '원진성형외과',
clinicNameEn: 'Wonjin Plastic Surgery',
createdAt: '2026-04-14',
targetUrl: 'https://www.wonjin.com',
// ─── Section 1: Brand Guide ───
brandGuide: {
colors: [
{ name: 'Wonjin Deep Purple', hex: '#2C1654', usage: '공식 로고 메인, 헤딩, 강조 텍스트' },
{ name: 'Wonjin Violet', hex: '#8B5CF6', usage: '로고 악센트, CTA 포인트, 강조 요소' },
{ name: 'Pure White', hex: '#FFFFFF', usage: '배경, 카드, 여백' },
{ name: 'Purple Text', hex: '#1E1038', usage: '본문 텍스트' },
{ name: 'Muted Lavender', hex: '#A08CC0', usage: '서브 텍스트, 메타 정보' },
],
fonts: [
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀', sampleText: '35년 강남 코성형 전문 · 국제 환자 1위' },
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: '원진성형외과 권진 원장' },
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩', sampleText: 'WONJIN Plastic Surgery' },
],
logoRules: [
{ rule: 'Deep Purple+Violet 공식 로고 통일', description: '원진성형외과 공식 로고를 모든 채널에서 동일 사용', correct: true },
{ rule: '다국어 로고 버전 제작', description: 'KR / EN / CN / JP / TH 5개 언어 로고 버전 제작 — 국제 채널용', correct: false },
{ rule: '3개 Instagram 계정 프로필 통일', description: '@wonjin_official / @wj_cosmetic 계정 프로필 로고 고해상도 1080×1080 통일', correct: false },
{ rule: '채널별 언어 역할 명확화', description: '@wonjin_official KR 메인, @wj_cosmetic 글로벌 전용으로 역할 분리', correct: true },
],
toneOfVoice: {
personality: ['글로벌 전문가', '신뢰감 있는', '35년 역사', '국제적', '환자 중심'],
communicationStyle: '35년 축적된 코성형·눈성형 임상 경험과 강남언니 11,846 리뷰를 근거로, 국내외 환자 모두에게 신뢰를 전달합니다. 다국어 소통으로 글로벌 환자를 환영하는 따뜻한 전문성.',
doExamples: [
'"35년 코성형 전문 — 원진성형외과"',
'"강남언니 11,846 리뷰 · 9.3점이 증명합니다"',
'"한/영/중/일/태 — 어느 언어로도 상담드립니다"',
'"권진 원장의 코성형 원칙: 자연스러움이 기준입니다"',
],
dontExamples: [
'"강남 최고! 파격 할인!"',
'"100% 만족 보장"',
'"연예인 시술 병원"',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: 'Wonjin 원형 로고 1080×1080', bannerSpec: '2560×1440px, Deep Purple 배경 + Violet 악센트, "35년 강남 코성형 전문"', bioTemplate: 'WJ원진성형외과 — 코성형·눈성형 전문\n35년 임상 · 강남역 | 02-544-0404\nwonjin.com', currentStatus: 'incorrect' },
{ channel: 'Instagram KR (@wonjin_official)', icon: 'instagram', profilePhoto: 'Wonjin Deep Purple 원형 로고', bannerSpec: 'N/A (하이라이트: 코성형/눈성형/후기/이벤트/글로벌 — Purple 톤)', bioTemplate: '원진성형외과 KR 공식 — 35년 임상\n강남역 | 02-544-0404 | wonjin.com', currentStatus: 'incorrect' },
{ channel: 'Instagram Global (@wj_cosmetic)', icon: 'instagram', profilePhoto: 'Wonjin 영문 원형 로고', bannerSpec: 'N/A (Global highlights: nose/eyes/before-after/reviews)', bioTemplate: 'Wonjin Plastic Surgery — 35 Years of Excellence\nGangnam Seoul | wonjin.com', currentStatus: 'incorrect' },
{ channel: 'Facebook EN (@KwonjinPS)', icon: 'facebook', profilePhoto: 'Wonjin 공식 로고', bannerSpec: '820×312px, Deep Purple + Violet, "International Patients Welcome"', bioTemplate: 'Wonjin Plastic Surgery — 35 Years · 5 Languages\nGangnam Seoul | wonjin.com', currentStatus: 'incorrect' },
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: 'Wonjin 로고', bannerSpec: '블로그 상단: 로고 + 코성형·눈성형 카테고리 메뉴', bioTemplate: '원진성형외과 공식 블로그 — 35년 코성형 전문\n강남역 | wonjin.com', currentStatus: 'incorrect' },
],
brandInconsistencies: [
{
field: 'Instagram 3개 계정 역할 혼선',
values: [
{ channel: '@wonjin_official', value: 'KR 공식 (23.4K) — 역할 불명확', isCorrect: false },
{ channel: '@wonjin_ps', value: 'KR 서브 (18K) — 역할 중복', isCorrect: false },
{ channel: '@wj_cosmetic', value: '글로벌 (팔로워 미확인) — 저활용', isCorrect: false },
],
impact: '3개 계정 분산으로 팔로워 합산 대비 실제 도달 낮음. 콘텐츠 파편화로 브랜드 파워 희석',
recommendation: '@wonjin_official KR 메인 집중, @wj_cosmetic 글로벌 전용, @wonjin_ps 통합 또는 휴면 전환',
},
{
field: '다국어 포지셔닝 미반영',
values: [
{ channel: 'YouTube', value: 'WJ원진성형외과 (한국어 위주)', isCorrect: false },
{ channel: 'Facebook EN', value: 'International Patients Welcome (양호)', isCorrect: true },
{ channel: 'Website', value: '다국어 지원 (양호)', isCorrect: true },
{ channel: 'Instagram KR', value: '한국어 전용 바이오 (국제 환자 접근 어려움)', isCorrect: false },
],
impact: '5개 언어 상담 지원이라는 핵심 USP가 Instagram KR·YouTube에 미반영',
recommendation: '전 채널 바이오에 "한/영/중/일/태 상담 가능" 명시 + YouTube 다국어 자막 추가',
},
],
},
// ─── Section 2: Channel Strategies ───
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
currentStatus: '@wjwonjin — 14.1K 구독자, 350 영상, Shorts 활발 (롱폼 부족)',
targetGoal: '30K 구독자 / 12개월, 롱폼 Before/After 월 4편 추가',
contentTypes: ['롱폼 코성형 케이스 (Before/After)', '외국인 환자 브이로그 (다국어 자막)', '권진 원장 전문의 해설 시리즈'],
postingFrequency: '주 4-5회 (Shorts 3 + 롱폼 1)',
tone: '"35년 코성형 전문의가 말하는" — 국내외 환자 모두 대상',
formatGuidelines: [
'롱폼: 코성형·눈성형 케이스 스터디 — 권진 원장 직접 해설',
'외국인 환자 브이로그: EN/CN/JP/TH 자막 추가',
'썸네일: Deep Purple+Violet 통일, 코 Before/After 병치',
'타이틀: "35년 코성형 전문의가 알려주는 ___" 패턴',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'instagram_kr', channelName: 'Instagram KR (@wonjin_official)', icon: 'instagram',
currentStatus: '@wonjin_official — 23.4K 팔로워, Reels 80개 (양호, 확장 여지)',
targetGoal: '60K 팔로워 / 12개월, Reels 주 5개',
contentTypes: ['Reels (YouTube Shorts 동시)', 'Carousel (11,846 리뷰 스토리화)', 'Before/After 시리즈'],
postingFrequency: '일 1회 + Stories 일 2-3개',
tone: '차분하고 전문적인 KR 네이티브 — 코성형 전문 병원',
formatGuidelines: [
'Reels: YouTube Shorts 동시 배포',
'Carousel: 강남언니 11,846 리뷰 중 50개 선별 → 카루셀',
'Stories: 권진 원장 일상, 시술 비하인드',
'해시태그: #원진성형외과 #강남코성형 #권진원장 #35년임상',
],
priority: 'P0',
customerJourneyStage: 'interest',
},
{
channelId: 'instagram_global', channelName: 'Instagram 글로벌 (@wj_cosmetic)', icon: 'instagram',
currentStatus: '@wj_cosmetic — 글로벌 전용, 현재 저활용',
targetGoal: '글로벌 계정 역할 명확화 + 외국인 환자 유입 채널화',
contentTypes: ['EN/CN/JP/TH 다국어 Reels', 'Patient Journey (외국인 환자 브이로그)', 'Before/After (영문 설명)'],
postingFrequency: '주 3-4회',
tone: 'Professional & welcoming — global medical tourism',
formatGuidelines: [
'KR 원본 → 다국어 캡션 번역 배포 자동화',
'YouTube 외국인 환자 브이로그 → IG 클립',
'WhatsApp/LINE 상담 연결 CTA',
],
priority: 'P1',
customerJourneyStage: 'awareness',
},
{
channelId: 'facebook_en', channelName: 'Facebook EN (@KwonjinPS)', icon: 'facebook',
currentStatus: '@KwonjinPS — 19K, 주 2~4회 업로드, 국제 환자 전용',
targetGoal: '글로벌 리타겟 광고 채널 강화, 의료관광 전환 추적',
contentTypes: ['외국인 환자 후기 시리즈', '리타겟 광고 소재', 'Before/After (동의서 확인)'],
postingFrequency: '주 3회 + 광고 상시',
tone: 'Professional & warm — Korea medical tourism storytelling',
formatGuidelines: [
'Facebook Pixel + WhatsApp 연동 — 해외 상담 자동 응대',
'국가별 리타겟 광고: 태국·일본·중국·동남아',
'다국어 환자 후기 영상 시리즈',
],
priority: 'P1',
customerJourneyStage: 'conversion',
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: '@popokpop — 업로드 저조, SEO 방치',
targetGoal: '주 2회 재가동, 12개월 내 월 20,000 방문자',
contentTypes: ['코성형 SEO 가이드', '권진 원장 Q&A 텍스트 변환', 'YouTube 영상 임베드'],
postingFrequency: '주 2회',
tone: '"강남 코성형", "35년 원진" 키워드 중심',
formatGuidelines: [
'2,000자 이상 SEO 포스트',
'YouTube 코성형 케이스 영상 임베드',
'핵심 키워드: "강남 코성형", "원진성형외과 후기", "코성형 추천"',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
currentStatus: '9.3점/10, 11,846 리뷰 — 강남 상위 5%, 리마케팅 미활용',
targetGoal: '리뷰 응답률 80%, 15,000 리뷰 / 12개월',
contentTypes: ['리뷰 응답', '시술 정보 최신화'],
postingFrequency: '리뷰 응답 일 단위',
tone: '진심 어린 의료진 답변',
formatGuidelines: [
'응답률 50%(3개월) → 80%(12개월)',
'11,846 리뷰 중 50개 선별 → SNS 콘텐츠',
'외국인 환자 리뷰 영문/중문 답변 병기',
],
priority: 'P0',
customerJourneyStage: 'loyalty',
},
],
// ─── Section 3: Content Strategy ───
contentStrategy: {
pillars: [
{
title: '35년 코성형 전문성',
description: '1991년 개원 이래 35년 축적된 코성형·눈성형 케이스와 기술',
relatedUSP: '35 Years Rhinoplasty Authority',
exampleTopics: ['권진 원장의 코성형 디자인 철학', '35년 케이스에서 배운 재수술 예방법', '자연스러운 코 라인의 기준'],
color: '#2C1654',
},
{
title: '글로벌 환자 여정',
description: '5개 언어 상담 지원 · 외국인 환자 브이로그 · 국제 의료관광 스토리',
relatedUSP: 'Global Medical Tourism Leader',
exampleTopics: ['태국인 환자의 원진성형외과 여정', '일본어로 상담 — 원진 Q&A', '중국인 환자 Before/After 스토리'],
color: '#8B5CF6',
},
{
title: '11,846 리뷰의 증거',
description: '강남언니 상위 5% — 11,846 리뷰를 환자 목소리로 재구성',
relatedUSP: 'Patient-Verified Excellence',
exampleTopics: ['강남언니 9.3점의 의미 — 코성형 후기', '재수술 없이 자연스러운 결과', '코성형 결정 전 알아야 할 것'],
color: '#A08CC0',
},
{
title: 'Instagram 다계정 전략',
description: 'KR 메인(@wonjin_official) + 글로벌(@wj_cosmetic) 역할 분리 및 연계',
relatedUSP: 'Dual-Track Content Strategy',
exampleTopics: ['KR 코성형 Reels 시리즈', 'Global Before/After (EN/CN/JP/TH)', '국내+해외 환자 동시 타겟팅'],
color: '#FFFFFF',
},
],
typeMatrix: [
{ format: 'YouTube Long-form', channels: ['YouTube'], frequency: '월 4편', purpose: '35년 코성형 전문성 증명, 깊은 신뢰' },
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 5개', purpose: '도달 확대, Shorts 균형 유지' },
{ format: 'Carousel (리뷰 스토리)', channels: ['Instagram KR'], frequency: '주 2회', purpose: '11,846 리뷰 사회적 증거화' },
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '"강남 코성형" 검색 상위 확보' },
{ format: 'Global Content (EN/CN/JP/TH)', channels: ['Instagram Global', 'Facebook EN'], frequency: '주 3회', purpose: '국제 환자 유입, 다국어 도달' },
{ format: 'Ad Creative (글로벌)', channels: ['Facebook EN', 'Instagram Global'], frequency: '월 6개', purpose: '태국·일본·중국 리타겟 광고' },
],
workflow: [
{ step: 1, name: '계정 역할 재정의', description: '@wonjin_official KR / @wj_cosmetic 글로벌 분리 실행', owner: '마케팅 매니저', duration: '1주 (1회성)' },
{ step: 2, name: '주제 선정', description: 'KR 코성형 키워드 + 글로벌 국가별 관심사 매칭', owner: '마케팅 매니저', duration: '1일' },
{ step: 3, name: '콘텐츠 제작', description: 'KR 원본 제작 + 다국어 번역 배포 파이프라인', owner: 'AI + 편집 + 번역', duration: '2-3일' },
{ step: 4, name: '권진 원장 검수', description: '의료 정확성 + 광고법 체크', owner: '권진 원장', duration: '1일' },
{ step: 5, name: '다국어 마감', description: 'EN/CN/JP/TH 자막·캡션 추가', owner: '번역 팀', duration: '1일' },
{ step: 6, name: '채널별 배포', description: 'KR / 글로벌 채널 동시 배포 + UTM', owner: '마케팅 매니저', duration: '당일' },
],
repurposingSource: '권진 원장 코성형 케이스 스터디 롱폼 (10분)',
repurposingOutputs: [
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 + EN/CN 자막 병기' },
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '핵심 구간 다국어 자막 동시 배포' },
{ format: 'Carousel (KR)', channel: 'Instagram KR', description: '코성형 가이드 카드뉴스' },
{ format: 'Global Reel (EN)', channel: 'Instagram Global', description: '영문 캡션 + 글로벌 해시태그' },
{ format: 'Blog Post', channel: 'Naver Blog', description: 'SEO 포스트 (영상 임베드)' },
{ format: 'Ad Creative (글로벌)', channel: 'Facebook EN', description: '태국·일본 리타겟 광고 소재' },
],
},
// ─── Section 4: Content Calendar ───
calendar: {
weeks: [
{
weekNumber: 1, label: 'Week 1: Instagram 계정 정리 & 글로벌 시작',
entries: [
{ dayOfWeek: 0, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: '@wonjin_official KR 리뉴얼 공지 + 역할 재정의 Reel' },
{ dayOfWeek: 1, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 권진 원장의 35년 코성형 원칙' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 자연스러운 라인 Q&A' },
{ dayOfWeek: 2, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '원진성형외과 블로그 재가동 — 35년 코성형 가이드 1편' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 11,846 리뷰 베스트 5' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 태국인 환자 브이로그 (TH 자막)' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(EN): 코성형 의료관광 인콰이어리 (태국/일본 타겟)' },
],
},
{
weekNumber: 2, label: 'Week 2: 코성형 전문성 집중',
entries: [
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 재수술 피하는 법 — 35년 임상 기준' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 Before/After — 자연스러운 라인' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 코성형 타입별 비교 — 권진 원장 케이스 스터디' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel (글로벌 @wj_cosmetic): Rhinoplasty Guide EN/CN' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '원진성형외과 코성형 후기 — 강남언니 9.3점의 의미' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 후 회복 기간 Q&A' },
],
},
{
weekNumber: 3, label: 'Week 3: 눈성형 + 글로벌 환자 콘텐츠',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 눈성형 유형별 비교 — 권진 원장 해설' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 눈성형 전후 — 자연스러운 라인' },
{ dayOfWeek: 1, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '눈성형 Q&A 10가지 — 원진성형외과 전문의 답변' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 일본인 환자 브이로그 (JP 자막)' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 코+눈 동시 수술 가이드' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 재수술 케이스 — 권진 원장 해설' },
],
},
{
weekNumber: 4, label: 'Week 4: 전환 & UTM 추적 강화',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 원진성형외과 — 35년, 11,846 리뷰의 이야기' },
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '첫 코성형 상담 준비 가이드 — 원진성형외과' },
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 강남역 원진성형외과 시설 투어' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 권진 원장 이달의 코성형 케이스' },
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 다국어 상담 안내 — 한/영/중/일/태' },
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '원진성형외과 11,846 리뷰 — 강남언니 검증' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(글로벌): 월말 코성형 상담 CTA — 5개 언어' },
],
},
],
monthlySummary: [
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 14, color: '#2C1654' },
{ type: 'blog', label: '블로그', count: 8, color: '#8B5CF6' },
{ type: 'social', label: 'Instagram (KR+글로벌)', count: 9, color: '#A08CC0' },
{ type: 'ad', label: '글로벌 광고', count: 2, color: '#FFFFFF' },
],
},
// ─── Section 5: Asset Collection ───
assetCollection: {
assets: [
{ id: 'a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: '350개 영상 아카이브 (Shorts 위주)', description: '주 3~5회 Shorts 업로드 지속 중 — 롱폼 추가 필요', repurposingSuggestions: ['롱폼 → Shorts 5개 추출', 'Instagram KR+글로벌 동시', 'TikTok 다국어 배포'], status: 'collected' },
{ id: 'a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 리뷰 11,846건', description: '9.3점/10 — 강남 상위 5%, 코성형 중심 리뷰 최대 자산', repurposingSuggestions: ['50개 선별 → Carousel 시리즈', 'Instagram Stories', '광고 소셜프루프 (국내+글로벌)', 'Blog 후기'], status: 'pending' },
{ id: 'a3', source: 'social', sourceLabel: 'Instagram KR', type: 'photo', title: '@wonjin_official 게시물 1,200개', description: '23.4K 팔로워, 코성형·눈성형 Reels+B/A', repurposingSuggestions: ['고성과 Reel 글로벌 계정 크로스포스팅', 'Carousel 재편집'], status: 'collected' },
{ id: 'a4', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '권진 원장 + 의료진 10명 프로필', description: '권진 원장 + 전문의 10명 고화질 프로필', repurposingSuggestions: ['원장 인터뷰 섬네일', 'Carousel 의료진 소개', '광고 신뢰도 소재'], status: 'collected' },
{ id: 'a5', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '5개 언어 시술 설명 텍스트', description: '한/영/중/일/태 시술별 상세 텍스트 — 글로벌 콘텐츠 소스', repurposingSuggestions: ['글로벌 Instagram 캡션 소스', 'Facebook EN 광고 카피', '다국어 블로그'], status: 'collected' },
{ id: 'a6', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '코성형·눈성형 전후 갤러리', description: '권진 원장 코성형 케이스 — 동의서 보유', repurposingSuggestions: ['Instagram B/A 시리즈 (KR+글로벌)', 'YouTube 케이스 롱폼 소스', '광고 소재'], status: 'collected' },
{ id: 'a7', source: 'social', sourceLabel: 'Instagram Global', type: 'video', title: '외국인 환자 브이로그 자산 (제작 필요)', description: '태국·일본·중국 환자 브이로그 시리즈 — 신규 제작 필요', repurposingSuggestions: ['YouTube 다국어 자막 롱폼', '@wj_cosmetic 글로벌 Reel', 'Facebook EN 시리즈'], status: 'needs_creation' },
],
youtubeRepurpose: [
{ title: '코성형 타입별 비교 케이스', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'IG KR+글로벌 동시', 'Blog 임베드'] },
{ title: '눈성형 유형별 비교', views: 0, type: 'Long', repurposeAs: ['Shorts 3개', 'Carousel', 'Blog'] },
{ title: '코+눈 동시 수술 케이스', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Global Reel', 'Blog'] },
{ title: '재수술 예방 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'KR Carousel', 'Blog'] },
],
},
// ─── Section 6: Repurposing Proposals ───
repurposingProposals: [
{
sourceVideo: { title: '코성형 케이스 스터디 롱폼 (신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Shorts 5개', channel: 'YouTube / Instagram KR / TikTok', description: '코성형 핵심 구간 — 국내 배포' },
{ format: 'Global Reel (EN/CN)', channel: '@wj_cosmetic', description: '영문·중문 자막 추가 후 글로벌 계정 배포' },
{ format: 'Carousel (KR)', channel: 'Instagram KR', description: '코성형 전후 카드뉴스' },
{ format: 'Blog Post', channel: 'Naver Blog', description: 'SEO 코성형 가이드 포스트' },
],
},
{
sourceVideo: { title: '강남언니 11,846 리뷰 콘텐츠화', views: 11846, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Carousel 20개 (KR)', channel: 'Instagram KR', description: '코성형·눈성형 후기 카드뉴스' },
{ format: '글로벌 광고 소재', channel: 'Facebook EN / Instagram Global', description: '"9.3점 강남 상위 5%" 글로벌 소셜프루프' },
{ format: 'Blog 후기 포스트', channel: 'Naver Blog', description: '케이스별 상세 후기 변환' },
],
},
{
sourceVideo: { title: '외국인 환자 브이로그 — 태국 편 (신규)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'YouTube 롱폼 (TH 자막)', channel: 'YouTube', description: '태국어 자막 → 태국 검색 유입' },
{ format: '@wj_cosmetic Reel', channel: 'Instagram Global', description: '태국어 캡션 + 태국 해시태그' },
{ format: 'Facebook EN 광고', channel: 'Facebook EN', description: '태국 국가 타겟 리타겟 광고' },
],
},
],
// ─── Section 7: Workflow Tracker ───
workflow: {
items: [
{
id: 'wf-001',
title: '코성형 Before/After Shorts — @wonjin_official + @wj_cosmetic 동시',
contentType: 'video',
channel: 'YouTube Shorts',
channelIcon: 'youtube',
stage: 'ai-draft',
videoDraft: {
script: `[인트로 — 0~3초]\n"코가 달라지면 인상 전체가 달라집니다."\n(전 → 후 전환)\n\n[본문 — 3~25초]\n"원진성형외과, 35년 코성형 전문."\n"권진 원장의 원칙: 자연스러움이 기준입니다."\n"강남언니 9.3점 / 11,846 리뷰가 증명합니다."\n\n[CTA — 25~30초]\n"한/영/중/일/태 상담 가능 — 프로필 링크"`,
shootingGuide: [
'Deep Purple+Violet 워터마크 하단 고정',
'한글 자막 필수 + EN/CN 자막 버전 별도',
'KR 배포: @wonjin_official / 글로벌 배포: @wj_cosmetic',
'환자 동의서 확인 + 비식별화',
],
duration: '30초',
},
},
{
id: 'wf-002',
title: '강남언니 리뷰 5선 Carousel — KR 버전',
contentType: 'image-text',
channel: 'Instagram',
channelIcon: 'instagram',
stage: 'review',
imageTextDraft: {
type: 'cardnews',
headline: '강남언니 11,846 리뷰 중 — 코성형 진심 5개',
copy: [
'[카드 1] "35년 노하우가 뭔지 수술 결과로 처음 알았습니다" — 코성형 환자',
'[카드 2] "재수술 걱정 없이 결정한 이유 — 원진의 원칙이 달랐습니다"',
'[카드 3] "일본에서 왔는데 일어로 상담해주셔서 너무 편했어요"',
'[카드 4] "권진 원장님이 직접 케이스를 설명해주셨습니다"',
'[카드 5] 강남언니 9.3점 · 원진성형외과 — 프로필 링크에서 확인',
],
layoutHint: '5장 세로형, Deep Purple+Violet, 마지막 카드에 다국어 상담 CTA',
},
},
{
id: 'wf-003',
title: '원진성형외과 블로그 재가동 — 35년 코성형',
contentType: 'image-text',
channel: 'Naver Blog',
channelIcon: 'globe',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '원진성형외과 35년 — 코성형 전문의가 직접 씁니다',
copy: [
'1991년 개원, 35년간 강남역에서 코성형·눈성형을 전문으로 해왔습니다.',
'강남언니 11,846 리뷰 / 9.3점 — 환자 여러분이 만든 기록입니다.',
'한/영/중/일/태 5개 언어로 상담 가능한 병원, 세계 각국 환자를 모십니다.',
'매주 2회, 코성형·눈성형 전문 정보를 이 블로그에서 공유합니다.',
],
layoutHint: '1200px 썸네일 + 2,000자, 키워드: 강남 코성형, 원진성형외과, 코성형 추천, 35년',
},
},
{
id: 'wf-004',
title: '권진 원장 코성형 35년 인터뷰 — YouTube 롱폼',
contentType: 'video',
channel: 'YouTube',
channelIcon: 'youtube',
stage: 'approved',
scheduledDate: '2026-04-21',
videoDraft: {
script: `[오프닝]\n"안녕하세요, 원진성형외과 권진입니다."\n"35년간 코성형에만 집중한 이유를 말씀드립니다."\n\n[원칙 1: 자연스러움]\n"코성형의 결과는 티가 나지 않는 것이 최고입니다."\n\n[원칙 2: 재수술 예방]\n"좋은 코성형은 10년 후에도 유지됩니다."\n\n[글로벌 메시지]\n"어떤 언어로도 상담드립니다 — 원진성형외과."\n\n[클로징]\n"11,846 리뷰, 35년 — 결과로 증명합니다."`,
shootingGuide: [
'강남역 원진 원장실 자연광',
'권진 원장 정면 + 3/4 앵글',
'한글 + EN + CN 자막 3가지 버전',
'Deep Purple+Violet 인트로/아웃트로',
],
duration: '8분',
},
},
],
},
};

View File

@ -0,0 +1,384 @@
import type { MarketingReport } from '../types/report';
import { mockReport } from './mockReport';
/**
*
*
* (2026-04-14):
* - : 9.2/10, 6,853 , 4, 2000 (https://www.gangnamunni.com/hospitals/23)
* - YouTube @banobagips (UC2lzYQ5kXBK0gkVDe5StZzQ): 13K, 925
* - Naver Blog @banobagips: 2023-04-21 ( )
* - : 517
*
* Instagram @banobagi_ps · Facebook @BanobagiPlasticSurgery Firecrawl
* ( ). Chrome MCP .
*/
export const mockReportBanobagi: MarketingReport = {
...mockReport,
id: 'banobagi',
createdAt: '2026-04-14',
targetUrl: 'https://www.banobagi.com',
overallScore: 58,
clinicSnapshot: {
...mockReport.clinicSnapshot,
name: '바노바기성형외과의원',
nameEn: 'Banobagi Plastic Surgery Clinic',
established: '2000',
yearsInBusiness: 26,
staffCount: 4,
leadDoctor: {
name: '반재중',
credentials: '바노바기성형외과 대표원장',
rating: 9.2,
reviewCount: 6853,
},
overallRating: 9.2,
totalReviews: 6853,
priceRange: { min: '150,000', max: '12,000,000+', currency: '₩' },
certifications: [
'마취과 전문의 상주',
'여성 의사 진료',
'분야별 공동 진료',
'시술 후 관리',
'의료진 실명 공개',
'본관 6층 + 별관 5층 규모',
],
mediaAppearances: ['강남언니 6,853 리뷰', '안면윤곽 전문센터'],
medicalTourism: ['외국인 전용 서비스', '영문/중문 상담 지원'],
location: '서울 강남구 논현로 517 (역삼동) 바노바기',
nearestStation: '2호선 역삼역 · 강남역',
phone: '02-1588-6508',
domain: 'banobagi.com',
source: 'registry' as const,
registryData: {
district: '강남',
branches: '본점 1개 (본관+별관)',
brandGroup: '종합 성형외과',
naverPlaceUrl: 'https://m.place.naver.com/hospital/11655270',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/23',
googleMapsUrl: 'https://maps.google.com/?q=바노바기성형외과',
},
logoImages: {
circle: '/assets/clients/banobagi/logo-circle.png',
horizontal: '/assets/clients/banobagi/logo-horizontal.png',
korean: '/assets/clients/banobagi/logo-korean.png',
},
brandColors: {
primary: '#1A1A1A',
accent: '#C8A96A',
text: '#1A1A1A',
},
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 45, maxScore: 100, status: 'critical', headline: '구독자 13K, 영상 925개 누적됐으나 최근 조회수 저조' },
{ channel: 'Instagram', icon: 'instagram', score: 55, maxScore: 100, status: 'warning', headline: '@banobagi_ps — 4,183 팔로워, 게시물 꾸준' },
{ channel: 'Facebook', icon: 'facebook', score: 35, maxScore: 100, status: 'critical', headline: '@BanobagiPlasticSurgery — 16,000 팔로워, KR 활성도 낮음' },
{ channel: '강남언니', icon: 'star', score: 88, maxScore: 100, status: 'excellent', headline: '9.2점/10, 6,853 리뷰, 강남 상위권 — 리뷰 반응 전략 필요' },
{ channel: 'Website', icon: 'globe', score: 60, maxScore: 100, status: 'warning', headline: 'banobagi.com 운영 양호, Footer SNS 연결 존재 — 트래킹 고도화 필요' },
{ channel: '네이버 블로그', icon: 'globe', score: 25, maxScore: 100, status: 'critical', headline: '마지막 포스트 2023-04-21 — 2년 이상 방치' },
],
youtubeAudit: {
...mockReport.youtubeAudit,
channelName: 'BANOBAGI PLASTIC SURGERY',
handle: '@banobagips',
subscribers: 13000,
totalVideos: 925,
totalViews: 4200000,
weeklyViewGrowth: { absolute: 1200, percentage: 0.3 },
estimatedMonthlyRevenue: { min: 50, max: 180 },
avgVideoLength: '3.2분',
uploadFrequency: '비정기 (최근 6개월 저조)',
channelCreatedDate: '2013-08-15',
subscriberRank: '',
channelDescription: 'Protect and nurture your true beauty. Banobagi Plastic Surgery — Board Certified Plastic Surgeon, 517 Nonhyeon-ro, Gangnam-gu, Seoul.',
linkedUrls: [
{ label: '바노바기 홈페이지', url: 'banobagi.com' },
],
playlists: [
'안면윤곽',
'눈성형',
'코성형',
'가슴성형',
'지방체형',
'리프팅/동안성형',
],
topVideos: [],
diagnosis: [
{ category: '영상 대비 구독자 전환율 낮음', detail: '925개 영상 누적됐으나 구독자 13K — 영상당 구독자 전환 매우 저조', severity: 'critical', evidenceIds: ['yt-channel'] },
{ category: '업로드 빈도 저하', detail: '최근 6개월 업로드 빈도 급감 — 알고리즘 노출 감소', severity: 'critical' },
{ category: '영문 브랜딩', detail: '채널 설명이 영문 위주 — 한국 시장 타겟팅 약함', severity: 'warning' },
{ category: '콘텐츠 카테고리화', detail: '재생목록 기본 구성 있음 — 썸네일/메타데이터 최적화 시 개선 여지', severity: 'warning' },
],
},
instagramAudit: {
accounts: [
{
handle: '@banobagi_ps',
language: 'KR',
label: '공식 계정',
posts: 2000,
followers: 4183,
following: 150,
category: 'Health/beauty',
profileLink: 'banobagi.com',
highlights: ['안면윤곽', '눈성형', '코성형', '가슴성형', '리뷰'],
reelsCount: 10,
contentFormat: 'Before/After + 카드뉴스 혼합',
profilePhoto: '바노바기 블랙+골드 로고',
bio: '바노바기성형외과 공식 계정 · 02-1588-6508 · banobagi.com (실측치 수집 진행 중)',
},
],
diagnosis: [
{ category: 'Reels 활용 저조', detail: 'Reels 수가 카드뉴스 대비 현저히 적음 — 알고리즘 노출 불이익', severity: 'critical' },
{ category: 'YouTube ↔ Instagram 연동 부재', detail: 'YouTube 925개 영상 자산이 Instagram Reels 로 재활용되지 않음', severity: 'critical' },
{ category: '실측 데이터 수집 차단', detail: 'Firecrawl/공개 스크래핑 차단 — Chrome MCP 로 실측 교체 예정', severity: 'warning' },
],
},
facebookAudit: {
pages: [
{
url: 'facebook.com/BanobagiPlasticSurgery',
pageName: 'Banobagi Plastic Surgery',
language: 'EN',
label: '국제 공식',
followers: 16000,
following: 0,
category: '성형외과 의사',
bio: 'Banobagi Plastic Surgery — Korean Premium Plastic Surgery Clinic',
logo: '공식 (블랙+골드)',
logoDescription: '블랙 배경 + 골드 "BANOBAGI" 워드마크 로고 — 공식 브랜드 자산',
link: 'banobagi.com',
linkedDomain: 'banobagi.com',
reviews: 0,
recentPostAge: '추정 1주 이내',
hasWhatsApp: true,
postFrequency: '월 2~4회',
topContentType: 'Before/After + 영문 시술 정보',
engagement: '게시물당 좋아요 10~80개 (추정)',
},
],
diagnosis: [
{ category: 'KR 네이티브 페이지 부재', detail: '국제 페이지만 운영 — 한국 사용자 접근성 낮음', severity: 'critical' },
{ category: '브랜드 콘텐츠 단조', detail: 'Before/After 위주 — 환자 여정/스토리/FAQ 콘텐츠 부족', severity: 'warning' },
{ category: '실측 데이터 수집 차단', detail: 'Firecrawl 차단 — Chrome MCP 로 실측 교체 예정', severity: 'warning' },
],
brandInconsistencies: [
{
field: '로고',
values: [
{ channel: 'YouTube', value: 'BANOBAGI 영문 워드마크', isCorrect: true },
{ channel: 'Instagram', value: '바노바기 블랙+골드 로고', isCorrect: true },
{ channel: 'Facebook', value: '블랙+골드 워드마크', isCorrect: true },
{ channel: 'Website', value: '블랙+골드 공식 로고', isCorrect: true },
],
impact: '브랜드 시각 아이덴티티는 상대적으로 일관됨 — 컬러/폰트 가이드 강화 여지',
recommendation: '채널별 프로필 이미지 해상도 재검증 + 가로형/원형 버전 통일',
},
],
consolidationRecommendation: 'Facebook 국제 페이지(16K 실측) 유지하되, 한국 시장 전용 페이지 신규 개설 또는 Instagram KR 집중으로 전환 권장. 현재 상태는 한국 환자 유입 채널로 기능 안 함.',
},
otherChannels: [
{ name: '네이버 블로그', status: 'inactive', details: '공식 블로그 — 마지막 포스트 2023-04-21 (2년 이상 방치)', url: 'https://blog.naver.com/banobagips' },
{ name: '강남언니', status: 'active', details: '9.2점/10, 6,853 리뷰, 의료진 4명, 2000년 설립', url: 'https://www.gangnamunni.com/hospitals/23' },
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중 — 리뷰 응답률 최적화 필요', url: 'https://m.place.naver.com/hospital/11655270' },
{ name: 'TikTok', status: 'not_found', details: '계정 없음 또는 비활성' },
{ name: '카카오톡', status: 'active', details: '대표번호 02-1588-6508 연동', url: 'https://banobagi.com' },
],
websiteAudit: {
primaryDomain: 'banobagi.com',
additionalDomains: [],
snsLinksOnSite: true,
snsLinksDetail: [
{ platform: 'YouTube', url: 'https://www.youtube.com/c/banobagips', location: 'Footer' },
{ platform: 'Instagram', url: 'https://www.instagram.com/banobagi_ps/', location: 'Footer' },
{ platform: 'Facebook', url: 'https://www.facebook.com/BanobagiPlasticSurgery', location: 'Footer' },
{ platform: 'Naver Blog', url: 'https://blog.naver.com/banobagips', location: 'Footer' },
],
trackingPixels: [
{ name: 'Facebook Pixel', installed: true, details: '설치 확인' },
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
{ name: 'Naver Site Verification', installed: true },
],
mainCTA: '전화 상담 + 온라인 예약',
},
problemDiagnosis: [
{
category: '콘텐츠 자산의 저활용',
detail: 'YouTube 925개 영상 · Instagram 2,000개 게시물 자산이 축적됐으나 채널 간 크로스포스팅·재활용 체계 부재. 영상당 평균 조회수가 구독자 대비 현저히 낮음.',
severity: 'critical',
},
{
category: '네이버 블로그 2년 이상 방치',
detail: '마지막 포스트 2023-04-21 — SEO 자산이 완전히 잠자고 있음. 강남언니 유입 환자가 "바노바기 후기" 검색 시 공식 블로그가 노출되지 않음.',
severity: 'critical',
},
{
category: '한국 시장용 SNS 채널 약화',
detail: 'Facebook 이 국제 페이지 위주, YouTube/Instagram 의 한국어 네이티브 콘텐츠 부족. 강남언니 6,853 리뷰 규모 대비 SNS 존재감이 비례하지 않음.',
severity: 'critical',
},
],
transformation: {
...mockReport.transformation,
brandIdentity: [
{ area: '로고', asIs: '블랙+골드 워드마크 (대체로 일관)', toBe: '가로형/원형 버전 규격화 + 고해상도 재발급' },
{ area: '컬러 팔레트', asIs: '블랙+골드 기조', toBe: 'Primary: Deep Black (#1A1A1A) + Accent Gold (#C8A96A) 체계 명문화' },
{ area: '프로필 사진', asIs: '채널별 해상도 편차', toBe: '모든 채널 동일 원형 로고 1080x1080 사용' },
{ area: '바이오 메시지', asIs: '영문 위주', toBe: '"26년 강남 대표 성형외과 — 바노바기" 한/영 통일' },
{ area: '해시태그', asIs: '비체계적', toBe: '#바노바기성형외과 #Banobagi #강남성형외과 #안면윤곽전문' },
],
platformStrategies: [
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '13K subscribers · 925 videos',
targetMetric: '30K / 12개월',
strategies: [
{ strategy: 'Shorts 대량 재편집', detail: '925개 기존 영상에서 Shorts 200개 추출' },
{ strategy: '업로드 빈도 복구', detail: '주 2회 고정 (Shorts 1 + 롱폼 격주)' },
{ strategy: '썸네일 시스템화', detail: '블랙+골드 워드마크 워터마크 통일' },
{ strategy: '한글 타이틀 A/B 테스트', detail: '영문 설명 → 한글 + 영문 병기' },
],
},
{
platform: 'Instagram',
icon: 'instagram',
currentMetric: '4,183 followers',
targetMetric: '60K / 12개월',
strategies: [
{ strategy: 'Reels 주 5개', detail: 'YouTube Shorts 와 동시 배포' },
{ strategy: '리뷰 스토리화', detail: '강남언니 6,853 리뷰 중 선별 → 카루셀 콘텐츠' },
{ strategy: 'Before/After 체계화', detail: '시술별 카테고리 하이라이트 재구성' },
],
},
{
platform: '네이버 블로그',
icon: 'globe',
currentMetric: '마지막 포스트 2023-04-21',
targetMetric: '주 2회 게시',
strategies: [
{ strategy: '즉시 재가동', detail: '6월 내 주 2회 정기 포스팅 시작' },
{ strategy: 'YouTube 영상 블로그 임베드', detail: '시술별 영상 + 텍스트 가이드 구조' },
{ strategy: 'SEO 키워드 맵', detail: '"바노바기 후기/안면윤곽/V라인" 검색 상위 전략' },
],
},
],
websiteImprovements: [
{ area: 'SNS 링크', asIs: 'Footer 만 존재', toBe: 'Header 에도 주요 SNS 아이콘 추가' },
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 관련 영상 임베드' },
{ area: '블로그 허브', asIs: '웹사이트 ↔ 네이버블로그 연결 약함', toBe: '홈페이지에 블로그 최신 글 피드 배치' },
],
newChannelProposals: [
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층 도달, YouTube Shorts 동시 배포' },
{ channel: '네이버 블로그 재가동', priority: 'P0', rationale: '2년 이상 방치 자산 — SEO 복구 최우선' },
],
},
roadmap: [
{
month: 1,
title: 'Foundation',
subtitle: '기반 복구',
tasks: [
{ task: '브랜드 로고/컬러 가이드 명문화 (블랙+골드)', completed: false },
{ task: '전 채널 프로필/배너 고해상도 재발급', completed: false },
{ task: '네이버 블로그 재가동 — 6월 내 주 2회 시작', completed: false },
{ task: '925개 YouTube 영상 → Shorts 추출 작업 착수', completed: false },
{ task: '강남언니 리뷰 6,853개 중 50개 선별 → SNS 콘텐츠화', completed: false },
],
},
{
month: 2,
title: 'Content Engine',
subtitle: '콘텐츠 엔진 가동',
tasks: [
{ task: 'YouTube Shorts 주 2회 업로드 시작', completed: false },
{ task: 'Instagram Reels 주 5회 업로드 시작', completed: false },
{ task: '네이버 블로그 시술 가이드 10편 게시', completed: false },
{ task: 'TikTok 계정 개설 + Shorts 동시 배포', completed: false },
],
},
{
month: 3,
title: 'Optimization',
subtitle: '최적화 & 광고',
tasks: [
{ task: '콘텐츠 성과 분석 리포트 v1', completed: false },
{ task: '고성과 콘텐츠 기반 Instagram/Facebook 광고 세팅', completed: false },
{ task: '네이버 플레이스 리뷰 응답률 최적화', completed: false },
{ task: 'KPI 리뷰: 구독자/팔로워 성장률, 상담 전환 추적', completed: false },
],
},
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '13K', target3Month: '16K', target12Month: '30K' },
{ metric: 'YouTube Shorts 업로드', current: '비정기', target3Month: '주 2회', target12Month: '주 3회' },
{ metric: 'Instagram 팔로워', current: '4,183', target3Month: '38K', target12Month: '60K' },
{ metric: 'Instagram Reels 평균 조회수', current: '낮음', target3Month: '5,000', target12Month: '20,000' },
{ metric: '네이버 블로그 포스팅 빈도', current: '방치 (2023-04)', target3Month: '주 2회', target12Month: '주 3회' },
{ metric: '강남언니 리뷰', current: '6,853', target3Month: '7,200', target12Month: '8,500' },
{ metric: '강남언니 리뷰 응답률', current: '미측정', target3Month: '50%', target12Month: '80%' },
{ metric: '콘텐츠 → 상담 전환', current: '측정 불가', target3Month: 'UTM 추적 시작', target12Month: '월 30건' },
],
screenshots: [
{
id: 'yt-channel',
url: '/assets/clients/banobagi/screenshots/yt-channel.png',
channel: 'YouTube',
capturedAt: '2026-04-14T10:00:00Z',
caption: 'YouTube @banobagips — 구독자 13K, 영상 925개 누적',
sourceUrl: 'https://www.youtube.com/c/banobagips',
},
{
id: 'ig-profile',
url: '/assets/clients/banobagi/screenshots/ig-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-14T10:02:00Z',
caption: 'Instagram @banobagi_ps — 공식 계정 (실측 수집 진행 중)',
sourceUrl: 'https://www.instagram.com/banobagi_ps/',
},
{
id: 'fb-page',
url: '/assets/clients/banobagi/screenshots/fb-page.png',
channel: 'Facebook',
capturedAt: '2026-04-14T10:03:00Z',
caption: 'Facebook @BanobagiPlasticSurgery — 국제 공식 페이지 (실측 수집 진행 중)',
sourceUrl: 'https://www.facebook.com/BanobagiPlasticSurgery',
},
{
id: 'gangnamunni',
url: '/assets/clients/banobagi/screenshots/gangnamunni.png',
channel: '강남언니',
capturedAt: '2026-04-14T10:04:00Z',
caption: '강남언니 — 9.2점/10, 6,853 리뷰, 의료진 4명, 2000년 설립',
sourceUrl: 'https://www.gangnamunni.com/hospitals/23',
},
{
id: 'website-homepage',
url: '/assets/clients/banobagi/screenshots/website-homepage.png',
channel: 'Website',
capturedAt: '2026-04-14T10:05:00Z',
caption: 'banobagi.com — 공식 홈페이지',
sourceUrl: 'https://www.banobagi.com',
},
{
id: 'naver-blog',
url: '/assets/clients/banobagi/screenshots/naver-blog.png',
channel: '네이버 블로그',
capturedAt: '2026-04-14T10:06:00Z',
caption: '네이버 블로그 @banobagips — 마지막 포스트 2023-04-21 (2년 이상 방치)',
sourceUrl: 'https://blog.naver.com/banobagips',
},
],
};

View File

@ -0,0 +1,339 @@
import type { MarketingReport } from '../types/report';
import { mockReport } from './mockReport';
/**
*
*
* (2026-04-14):
* - YouTube @grandsurgery_QnA: 2.37K, 332, ~0/week
* - : ·· Q&A ,
* - ()
* - Instagram @grand_korea · Facebook @grandps.korea · Blog grandprs
* - /
*/
export const mockReportGrand: MarketingReport = {
...mockReport,
id: 'grand',
createdAt: '2026-04-14',
targetUrl: 'https://www.grandsurgery.com',
overallScore: 42,
clinicSnapshot: {
...mockReport.clinicSnapshot,
name: '그랜드성형외과',
nameEn: 'Grand Plastic Surgery',
established: '2005',
yearsInBusiness: 21,
staffCount: 3,
leadDoctor: {
name: '이세환',
credentials: '그랜드성형외과 대표원장 · 안면거상 전문',
rating: 9.8,
reviewCount: 1533,
},
overallRating: 9.8,
totalReviews: 1533,
priceRange: { min: '200,000', max: '15,000,000+', currency: '₩' },
certifications: [
'성형외과 전문의',
'안면거상·리프팅 전문센터',
'분야별 집중 수술',
],
mediaAppearances: ['강남언니 1,533 리뷰', '유튜브 Q&A 전문 채널'],
medicalTourism: ['외국인 상담 지원'],
location: '서울 강남구 압구정로 (압구정역)',
nearestStation: '3호선 압구정역',
phone: '02-547-5100',
domain: 'grandps.com',
source: 'registry' as const,
registryData: {
district: '강남',
branches: '본점 1개',
brandGroup: '안면거상·리프팅 전문',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/62',
googleMapsUrl: 'https://maps.google.com/?q=그랜드성형외과',
},
logoImages: {
circle: '/assets/clients/grand/logo-circle.png',
horizontal: '/assets/clients/grand/logo-horizontal.png',
korean: '/assets/clients/grand/logo-korean.png',
},
brandColors: {
primary: '#1B3A6B',
accent: '#4A90D9',
text: '#1B3A6B',
},
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 28, maxScore: 100, status: 'critical', headline: '구독자 2.37K — 332개 영상 대비 전환율 매우 저조, 업로드 사실상 중단' },
{ channel: 'Instagram', icon: 'instagram', score: 40, maxScore: 100, status: 'critical', headline: '@grand_korea — 4,013 팔로워, Reels 활용 미흡' },
{ channel: 'Facebook', icon: 'facebook', score: 30, maxScore: 100, status: 'critical', headline: '@grandps.korea — 26,000 팔로워, 활성도 낮음' },
{ channel: '강남언니', icon: 'star', score: 72, maxScore: 100, status: 'warning', headline: '9.8점/10, 1,533 리뷰 — 응답 전략 부재' },
{ channel: 'Website', icon: 'globe', score: 55, maxScore: 100, status: 'warning', headline: 'grandps.com 운영 중 — SNS 연동·트래킹 고도화 필요' },
{ channel: '네이버 블로그', icon: 'globe', score: 35, maxScore: 100, status: 'critical', headline: 'blog.naver.com/grandprs — 최근 업로드 저조' },
],
youtubeAudit: {
...mockReport.youtubeAudit,
channelName: '그랜드성형외과Q&A',
handle: '@grandsurgery_QnA',
subscribers: 2370,
totalVideos: 332,
totalViews: 850000,
weeklyViewGrowth: { absolute: 400, percentage: 0.1 },
estimatedMonthlyRevenue: { min: 5, max: 25 },
avgVideoLength: '3.6분',
uploadFrequency: '~0/week (사실상 중단)',
channelCreatedDate: '2017-03-01',
subscriberRank: '',
channelDescription: '그랜드성형외과 Q&A 채널 — 안면거상·코성형·가슴성형 전문 의료 콘텐츠',
linkedUrls: [{ label: '그랜드성형외과', url: 'grandps.com' }],
playlists: ['그랜드 성형Q&A', '그랜드한 성형 정보', '성형 브이로그', '수술 후 주의사항'],
topVideos: [],
diagnosis: [
{ category: '구독자 전환율 극히 낮음', detail: '332개 영상 누적, 구독자 2.37K — 영상 1개당 평균 구독자 7명 수준', severity: 'critical', evidenceIds: ['yt-channel'] },
{ category: '업로드 사실상 중단', detail: '최근 업로드 빈도 주 0회 — YouTube 알고리즘 완전 이탈', severity: 'critical' },
{ category: 'Q&A 포맷 과다', detail: '짧은 Q&A 위주로 Shorts·Before/After 포맷 전환 필요', severity: 'warning' },
],
},
instagramAudit: {
accounts: [
{
handle: '@grand_korea',
language: 'KR',
label: '공식 계정',
posts: 800,
followers: 4013,
following: 200,
category: 'Health/beauty',
profileLink: 'grandps.com',
highlights: ['안면거상', '코성형', '가슴성형', '눈성형', '후기'],
reelsCount: 20,
contentFormat: '시술 설명 + Q&A 카드뉴스',
profilePhoto: '그랜드성형외과 공식 로고',
bio: '그랜드성형외과 공식 계정 · 압구정 · grandps.com',
},
],
diagnosis: [
{ category: 'Reels 비중 낮음', detail: '카드뉴스·이미지 위주 — Reels 알고리즘 혜택 미활용', severity: 'critical' },
{ category: 'YouTube 자산 미활용', detail: '332개 영상이 Instagram Reels로 재편집되지 않음', severity: 'critical' },
],
},
facebookAudit: {
pages: [
{
url: 'facebook.com/grandps.korea',
pageName: 'Grand Plastic Surgery',
language: 'KR',
label: '공식',
followers: 26000,
following: 0,
category: '성형외과',
bio: '그랜드성형외과 공식 Facebook',
logo: '공식 로고',
logoDescription: '그랜드성형외과 공식 로고',
link: 'grandps.com',
linkedDomain: 'grandps.com',
reviews: 0,
recentPostAge: '추정 수주 이내',
hasWhatsApp: false,
postFrequency: '월 2~4회',
topContentType: '시술 정보 + 이벤트',
engagement: '게시물당 좋아요 5~30개 (추정)',
},
],
diagnosis: [
{ category: 'Facebook 콘텐츠 빈도 저하', detail: '팔로워 26,000명 — 유의미한 규모이나 콘텐츠 업로드 빈도 낮음', severity: 'warning' },
],
brandInconsistencies: [],
consolidationRecommendation: 'Facebook을 유지하되 YouTube·Instagram 우선 집중 권장.',
},
otherChannels: [
{ name: '네이버 블로그', status: 'unknown', details: '공식 블로그 운영 중 — 최근 업로드 저조', url: 'https://blog.naver.com/grandprs' },
{ name: '강남언니', status: 'active', details: '9.8점/10, 1,533 리뷰 · 안면거상 전문병원', url: 'https://www.gangnamunni.com/hospitals/62' },
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중', url: 'https://map.naver.com/v5/search/그랜드성형외과' },
{ name: 'TikTok', status: 'not_found', details: '계정 없음 또는 비활성' },
],
websiteAudit: {
primaryDomain: 'grandps.com',
additionalDomains: [],
snsLinksOnSite: true,
snsLinksDetail: [
{ platform: 'YouTube', url: 'https://www.youtube.com/channel/UCU2o_aHqsNFuqwtdzVM3xbQ', location: 'Footer' },
{ platform: 'Instagram', url: 'https://www.instagram.com/grand_korea', location: 'Footer' },
{ platform: 'Facebook', url: 'https://www.facebook.com/grandps.korea', location: 'Footer' },
{ platform: 'Naver Blog', url: 'https://blog.naver.com/grandprs', location: 'Footer' },
],
trackingPixels: [
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
{ name: 'Naver Site Verification', installed: true },
],
mainCTA: '전화 상담 + 온라인 예약',
},
problemDiagnosis: [
{
category: 'YouTube 332개 영상 자산 완전 방치',
detail: '6년간 누적된 332개 Q&A 영상이 구독자 2.37K에 그침. 업로드 중단 상태로 알고리즘 완전 이탈. Shorts 재편집 시 즉시 노출 회복 가능성.',
severity: 'critical',
},
{
category: '전 채널 콘텐츠 빈도 급감',
detail: 'YouTube·Instagram·Blog 모두 업로드 빈도가 현저히 줄어 신규 환자 유입 경로가 거의 없는 상태.',
severity: 'critical',
},
{
category: '안면거상 전문성이 SNS에 미반영',
detail: '이세환 원장의 안면거상 전문성은 오프라인에서 입증됐으나 SNS/YouTube에서 전문가 포지셔닝 콘텐츠가 부족.',
severity: 'critical',
},
],
transformation: {
...mockReport.transformation,
brandIdentity: [
{ area: '로고', asIs: '공식 로고 존재', toBe: '가로형/원형 고해상도 버전 표준화' },
{ area: '컬러', asIs: '블루 계열', toBe: 'Primary: Navy Blue (#1B3A6B) + Accent: Sky Blue (#4A90D9) 명문화' },
{ area: '전문성 포지셔닝', asIs: '일반 성형외과', toBe: '"압구정 안면거상·리프팅 전문" 명확화' },
],
platformStrategies: [
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '2.37K subscribers · 332 videos',
targetMetric: '10K / 12개월',
strategies: [
{ strategy: 'Shorts 재편집 즉시 시작', detail: '332개 영상에서 Shorts 100개 추출 · 안면거상 특화' },
{ strategy: '주 2회 업로드 재개', detail: 'Q&A Shorts + 롱폼 안면거상 케이스 교차' },
{ strategy: '이세환 원장 전문가 시리즈', detail: '"압구정 안면거상 전문의가 말하는" 브랜디드 시리즈' },
],
},
{
platform: 'Instagram',
icon: 'instagram',
currentMetric: '4,013 followers',
targetMetric: '25K / 12개월',
strategies: [
{ strategy: 'Before/After Reels 주 4회', detail: 'YouTube Shorts와 동시 배포' },
{ strategy: '강남언니 리뷰 스토리화', detail: '1,533 리뷰 중 선별 → 카루셀' },
],
},
{
platform: '네이버 블로그',
icon: 'globe',
currentMetric: '업로드 저조',
targetMetric: '주 2회 게시',
strategies: [
{ strategy: '안면거상 SEO 전략', detail: '"압구정 안면거상", "딥플레인 거상" 키워드 집중' },
{ strategy: 'YouTube 임베드 블로그', detail: '영상 + 텍스트 설명 구조' },
],
},
],
websiteImprovements: [
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 관련 Q&A 영상 임베드' },
{ area: 'SNS 링크', asIs: 'Footer만', toBe: 'Header에 YouTube 아이콘 추가' },
],
newChannelProposals: [
{ channel: 'TikTok', priority: 'P1', rationale: '30~40대 안면거상 고민층, YouTube Shorts 동시 배포' },
],
},
roadmap: [
{
month: 1,
title: 'Foundation',
subtitle: '채널 재가동',
tasks: [
{ task: 'YouTube Shorts 재편집 착수 (332개 → Shorts 50개)', completed: false },
{ task: '이세환 원장 전문가 시리즈 기획', completed: false },
{ task: 'Instagram Reels 주 3회 업로드 시작', completed: false },
{ task: '네이버 블로그 주 2회 재가동', completed: false },
],
},
{
month: 2,
title: 'Content Engine',
subtitle: '콘텐츠 엔진',
tasks: [
{ task: 'YouTube Shorts 주 3회 업로드', completed: false },
{ task: '안면거상 Before/After 시리즈 10편', completed: false },
{ task: '강남언니 리뷰 응답률 50% 달성', completed: false },
],
},
{
month: 3,
title: 'Optimization',
subtitle: '최적화',
tasks: [
{ task: '성과 리포트 v1 — 구독자·팔로워 성장률 측정', completed: false },
{ task: 'Instagram·Facebook 유료 광고 세팅', completed: false },
{ task: 'KPI 리뷰 및 전략 조정', completed: false },
],
},
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '2.37K', target3Month: '4K', target12Month: '10K' },
{ metric: 'YouTube Shorts 업로드', current: '사실상 0/week', target3Month: '주 3회', target12Month: '주 4회' },
{ metric: 'Instagram 팔로워', current: '4,013', target3Month: '8K', target12Month: '20K' },
{ metric: '네이버 블로그 포스팅', current: '저조', target3Month: '주 2회', target12Month: '주 3회' },
{ metric: '강남언니 리뷰', current: '1,533', target3Month: '1,700', target12Month: '2,500' },
{ metric: '강남언니 리뷰 응답률', current: '미측정', target3Month: '50%', target12Month: '80%' },
],
screenshots: [
{
id: 'yt-channel',
url: '/assets/clients/grand/screenshots/yt-channel.png',
channel: 'YouTube',
capturedAt: '2026-04-14T10:00:00Z',
caption: '그랜드성형외과Q&A @grandsurgery_QnA — 구독자 2.37K, 영상 332개, 업로드 ~0/week',
sourceUrl: 'https://www.youtube.com/channel/UCU2o_aHqsNFuqwtdzVM3xbQ',
},
{
id: 'ig-profile',
url: '/assets/clients/grand/screenshots/ig-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-14T10:02:00Z',
caption: 'Instagram @grand_korea — 4,013 팔로워',
sourceUrl: 'https://www.instagram.com/grand_korea/',
},
{
id: 'fb-page',
url: '/assets/clients/grand/screenshots/fb-page.png',
channel: 'Facebook',
capturedAt: '2026-04-14T10:03:00Z',
caption: 'Facebook @grandps.korea — 26,000 팔로워',
sourceUrl: 'https://www.facebook.com/grandps.korea',
},
{
id: 'gangnamunni',
url: '/assets/clients/grand/screenshots/gangnamunni.png',
channel: '강남언니',
capturedAt: '2026-04-14T10:04:00Z',
caption: '강남언니 — 그랜드성형외과 9.8점, 1,533 리뷰',
sourceUrl: 'https://www.gangnamunni.com/hospitals/62',
},
{
id: 'website-homepage',
url: '/assets/clients/grand/screenshots/website-homepage.png',
channel: 'Website',
capturedAt: '2026-04-14T10:05:00Z',
caption: 'grandps.com — 공식 홈페이지',
sourceUrl: 'https://www.grandps.com',
},
{
id: 'naver-blog',
url: '/assets/clients/grand/screenshots/naver-blog.png',
channel: '네이버 블로그',
capturedAt: '2026-04-14T10:06:00Z',
caption: '네이버 블로그 @grandprs — 최근 업로드 저조',
sourceUrl: 'https://blog.naver.com/grandprs',
},
],
};

347
src/data/mockReport_irum.ts Normal file
View File

@ -0,0 +1,347 @@
import type { MarketingReport } from '../types/report';
import { mockReport } from './mockReport';
/**
* ()
*
* (2026-04-14):
* - YouTube @SEOULiPS. ( Seoul i Plastic Surgery): 322, 155
* - Instagram: @seoulips (KR) · @seouli_ps_th () · @seouli_jp ()
* - Facebook:
* - Blog: blog.naver.com/seoulips · : cafe.naver.com/seoulips
* - : seoulips.com (seoulipsmedical.com )
* - : ·· , KR/TH/JP 3
*/
export const mockReportIrum: MarketingReport = {
...mockReport,
id: 'irum',
createdAt: '2026-04-14',
targetUrl: 'https://www.seoulips.com',
overallScore: 35,
clinicSnapshot: {
...mockReport.clinicSnapshot,
name: '이룸성형외과 (서울아이)',
nameEn: 'Seoul i Plastic Surgery',
established: '2015',
yearsInBusiness: 11,
staffCount: 3,
leadDoctor: {
name: '서울아이 의료진',
credentials: '서울아이성형외과 · 코성형·눈밑지방·리프팅 전문',
rating: 9.4,
reviewCount: 86,
},
overallRating: 9.4,
totalReviews: 86,
priceRange: { min: '100,000', max: '8,000,000+', currency: '₩' },
certifications: [
'성형외과 전문의',
'코성형·눈밑지방 전문',
'한·태·일 다국어 상담',
'리팟레이저 도입',
],
mediaAppearances: ['강남언니 86 리뷰', '태국·일본 외국인 환자 특화'],
medicalTourism: ['태국어·일본어 Instagram 계정 운영', '외국인 전용 코디네이터'],
location: '서울 강남구 (강남역 인근)',
nearestStation: '2호선 강남역',
phone: '02-555-0900',
domain: 'seoulips.com',
source: 'registry' as const,
registryData: {
district: '강남',
branches: '본점 1개',
brandGroup: '코성형·외국인 환자 특화',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/839',
googleMapsUrl: 'https://maps.google.com/?q=서울아이성형외과',
},
logoImages: {
circle: '/assets/clients/irum/logo-circle.png',
horizontal: '/assets/clients/irum/logo-horizontal.png',
korean: '/assets/clients/irum/logo-korean.png',
},
brandColors: {
primary: '#0D4F3C',
accent: '#2ECC71',
text: '#0D4F3C',
},
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 18, maxScore: 100, status: 'critical', headline: '@SEOULiPS. — 구독자 322명 · 155개 영상 · 성장 정체' },
{ channel: 'Instagram', icon: 'instagram', score: 52, maxScore: 100, status: 'warning', headline: '3개국 계정 운영 (KR/TH/JP) — 강점, 채널간 연계 전략 부재' },
{ channel: 'Facebook', icon: 'facebook', score: 10, maxScore: 100, status: 'critical', headline: '서울아이성형외과 페이지 — 비공개/삭제 상태 확인됨' },
{ channel: '강남언니', icon: 'star', score: 65, maxScore: 100, status: 'warning', headline: '9.4점/10, 86 리뷰 — 리뷰 응답·마케팅 활용 미흡' },
{ channel: 'Website', icon: 'globe', score: 45, maxScore: 100, status: 'warning', headline: 'seoulips.com 운영 — 다국어 랜딩 최적화 필요' },
{ channel: '네이버 블로그', icon: 'globe', score: 38, maxScore: 100, status: 'critical', headline: 'blog.naver.com/seoulips — 업로드 저조' },
],
youtubeAudit: {
...mockReport.youtubeAudit,
channelName: '서울아이 Seoul i Plastic Surgery',
handle: '@SEOULiPS.',
subscribers: 322,
totalVideos: 155,
totalViews: 180000,
weeklyViewGrowth: { absolute: 200, percentage: 0.1 },
estimatedMonthlyRevenue: { min: 0, max: 10 },
avgVideoLength: '4.5분',
uploadFrequency: '비정기 (월 1~2회)',
channelCreatedDate: '2019-06-01',
subscriberRank: '',
channelDescription: '안전하고 바른 성형을 위해 서울아이는 항상 노력합니다. — 코성형·눈밑지방·실리프팅',
linkedUrls: [{ label: '서울아이성형외과', url: 'seoulipsmedical.com' }],
playlists: ['Before & After', '리얼모델', '1분 지식', '전문의가 알려주는 성형'],
topVideos: [],
diagnosis: [
{ category: 'YouTube 성장 사실상 정체', detail: '155개 영상, 구독자 322명 — 영상당 평균 구독자 2명 미만. YouTube 전략 전면 재설계 필요', severity: 'critical', evidenceIds: ['yt-channel'] },
{ category: '다국어 YouTube 콘텐츠 부재', detail: '태국·일본 Instagram 계정 운영 중이나 YouTube에는 다국어 자막/콘텐츠 없음', severity: 'critical' },
{ category: '전문의 Q&A 콘텐츠 발굴 필요', detail: '코성형·눈밑지방 전문성을 YouTube에서 전달하는 교육 콘텐츠 부재', severity: 'warning' },
],
},
instagramAudit: {
accounts: [
{
handle: '@seoulips',
language: 'KR',
label: 'KR 공식',
posts: 600,
followers: 826,
following: 200,
category: 'Health/beauty',
profileLink: 'seoulips.com',
highlights: ['코성형', '눈밑지방', '리프팅', '후기', '이벤트'],
reelsCount: 30,
contentFormat: 'Before/After + 시술 설명',
profilePhoto: '서울아이 공식 로고',
bio: '서울아이성형외과 KR 공식',
},
{
handle: '@seouli_ps_th',
language: 'EN',
label: '태국',
posts: 200,
followers: 5000,
following: 100,
category: 'Health/beauty',
profileLink: 'seoulips.com',
highlights: [],
reelsCount: 15,
contentFormat: '태국어 시술 정보',
profilePhoto: '서울아이 로고',
bio: '서울아이성형외과 태국 채널',
},
],
diagnosis: [
{ category: 'Instagram 다국어 강점 미최적화', detail: 'KR/TH/JP 3개 계정 운영은 강점이나 채널 간 콘텐츠 공유 체계 없음', severity: 'warning' },
{ category: 'Reels 부족', detail: '국제 계정에서 Reels 활용이 낮아 알고리즘 노출 손실', severity: 'critical' },
],
},
facebookAudit: {
pages: [
{
url: 'facebook.com/서울아이성형외과-105199207892670',
pageName: '서울아이성형외과',
language: 'KR',
label: '공식',
followers: 0,
following: 0,
category: '성형외과',
bio: '서울아이성형외과 Facebook (비공개/삭제 상태)',
logo: '공식 로고',
logoDescription: '서울아이성형외과 로고',
link: 'seoulips.com',
linkedDomain: 'seoulips.com',
reviews: 0,
recentPostAge: '추정 수주 이내',
hasWhatsApp: false,
postFrequency: '월 1~3회',
topContentType: '시술 정보',
engagement: '게시물당 좋아요 5~20개 (추정)',
},
],
diagnosis: [
{ category: 'Facebook 채널 비공개/삭제', detail: '공식 페이지 접근 불가 확인 — 외국인 환자 FB 채널 신규 개설 필요', severity: 'critical' },
],
brandInconsistencies: [],
consolidationRecommendation: 'Facebook 공식 페이지 비공개/삭제 확인 — 외국인 환자 광고 채널로 신규 페이지 개설 후 태국·일본어 타겟 광고 세팅 필요.',
},
otherChannels: [
{ name: '네이버 블로그', status: 'unknown', details: '공식 블로그 운영 중 — 업로드 저조', url: 'https://blog.naver.com/seoulips' },
{ name: '네이버 카페', status: 'active', details: '서울아이 카페 운영 중', url: 'https://cafe.naver.com/seoulips' },
{ name: '강남언니', status: 'active', details: '9.4점/10, 86 리뷰', url: 'https://www.gangnamunni.com/hospitals/839' },
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중', url: 'https://map.naver.com/v5/search/서울아이성형외과' },
],
websiteAudit: {
primaryDomain: 'seoulips.com',
additionalDomains: [{ domain: 'seoulipsmedical.com', purpose: '영문 홈페이지' }],
snsLinksOnSite: true,
snsLinksDetail: [
{ platform: 'YouTube', url: 'https://www.youtube.com/channel/UCYcssdFunRLmD8b376Y6ykg', location: 'Footer' },
{ platform: 'Instagram', url: 'https://www.instagram.com/seoulips/', location: 'Footer' },
{ platform: 'Facebook', url: 'https://www.facebook.com/서울아이성형외과-105199207892670/', location: 'Footer' },
{ platform: 'Naver Blog', url: 'https://blog.naver.com/seoulips', location: 'Footer' },
],
trackingPixels: [
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
],
mainCTA: '전화 상담 + 카카오톡',
},
problemDiagnosis: [
{
category: 'YouTube 성장 완전 정체 — 즉각적 전략 재설계 필요',
detail: '155개 영상 누적, 구독자 322명. 태국·일본 인스타그램 계정을 운영하는 글로벌 강점이 YouTube에 전혀 반영 안 됨. 다국어 자막 추가만으로도 즉시 도달 확장 가능.',
severity: 'critical',
},
{
category: '다국어 SNS 강점의 크로스채널 미연계',
detail: 'KR·TH·JP 3개 Instagram 계정이라는 희귀한 강점이 있으나 YouTube·Blog·강남언니와 연동 없음. 채널 간 시너지 0% 상태.',
severity: 'critical',
},
{
category: '외국인 환자 디지털 전환 경로 부재',
detail: '태국·일본 계정 팔로워가 있으나 예약·상담으로 이어지는 랜딩 경로가 다국어로 준비되지 않음. 유입 대비 전환 극히 낮을 것으로 추정.',
severity: 'critical',
},
],
transformation: {
...mockReport.transformation,
brandIdentity: [
{ area: '브랜드 아이덴티티', asIs: '서울아이 / 이룸 혼용', toBe: '"Seoul i Plastic Surgery" 영문 브랜드 통일 + 다국어 로고 버전 제작' },
{ area: '컬러', asIs: '미확인', toBe: 'Primary: Forest Green (#0D4F3C) + Accent: Mint (#2ECC71) 명문화' },
{ area: '글로벌 포지셔닝', asIs: '국내 위주', toBe: '"서울 강남 K-Beauty 전문 — 태국·일본 환자 환영"' },
],
platformStrategies: [
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '322 subscribers · 155 videos',
targetMetric: '3K / 12개월',
strategies: [
{ strategy: '다국어 자막 추가', detail: '기존 155개 영상에 EN/TH/JP 자막 추가 → 즉시 글로벌 노출' },
{ strategy: '주 2회 업로드 정착', detail: '코성형·눈밑지방 전문의 Q&A + 외국인 환자 브이로그' },
{ strategy: 'Shorts 전환', detail: '기존 영상에서 Shorts 50개 추출' },
],
},
{
platform: 'Instagram',
icon: 'instagram',
currentMetric: 'KR @seoulips 826명 (실측) · TH/JP 계정 운영 중',
targetMetric: '@seoulips KR 30K / 12개월',
strategies: [
{ strategy: '계정 간 콘텐츠 연계 자동화', detail: 'KR → TH/JP 번역 배포 파이프라인 구축' },
{ strategy: 'Reels 주 5회 (전 계정)', detail: 'YouTube Shorts 동시 다국어 배포' },
{ strategy: '86 리뷰 콘텐츠화', detail: '강남언니 리뷰 → Instagram Story' },
],
},
],
websiteImprovements: [
{ area: '다국어 랜딩페이지', asIs: '한국어 위주', toBe: 'TH·JP 전용 랜딩페이지 제작' },
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 다국어 자막 영상 임베드' },
],
newChannelProposals: [
{ channel: 'LINE (일본)', priority: 'P0', rationale: '일본 환자 전환 채널 — 현재 일본 인스타는 있으나 직접 상담 경로 없음' },
{ channel: 'TikTok', priority: 'P1', rationale: '태국/동남아 10~20대 도달, Shorts 동시 배포' },
],
},
roadmap: [
{
month: 1,
title: 'Foundation',
subtitle: '다국어 기반',
tasks: [
{ task: '브랜드 아이덴티티 통일 (Seoul i 영문 브랜드)', completed: false },
{ task: '기존 YouTube 영상 EN/TH 자막 추가 (우선 30개)', completed: false },
{ task: 'Instagram KR/TH/JP 크로스 배포 루틴 구축', completed: false },
{ task: '강남언니 86 리뷰 SNS 콘텐츠화', completed: false },
],
},
{
month: 2,
title: 'Content Engine',
subtitle: '글로벌 노출',
tasks: [
{ task: 'YouTube 주 2회 업로드 정착 (다국어 자막 포함)', completed: false },
{ task: 'TikTok 계정 개설 + Shorts 동시 배포', completed: false },
{ task: '태국·일본어 랜딩페이지 v1 제작', completed: false },
],
},
{
month: 3,
title: 'Optimization',
subtitle: '전환 추적',
tasks: [
{ task: '국가별 환자 유입·전환율 분석', completed: false },
{ task: 'Facebook 태국·일본 광고 캠페인 시작', completed: false },
{ task: 'KPI 리뷰', completed: false },
],
},
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '322', target3Month: '800', target12Month: '3,000' },
{ metric: 'YouTube 업로드 빈도', current: '월 1~2회', target3Month: '주 2회', target12Month: '주 3회' },
{ metric: 'Instagram @seoulips 팔로워', current: '826', target3Month: '3K', target12Month: '10K' },
{ metric: 'Instagram 태국(@seouli_ps_th) 팔로워', current: '~5K', target3Month: '8K', target12Month: '15K' },
{ metric: '강남언니 리뷰', current: '86', target3Month: '1,000', target12Month: '1,500' },
{ metric: '외국인 환자 전환', current: '측정 불가', target3Month: '랜딩 UTM 시작', target12Month: '월 15건' },
],
screenshots: [
{
id: 'yt-channel',
url: '/assets/clients/irum/screenshots/yt-channel.png',
channel: 'YouTube',
capturedAt: '2026-04-14T10:00:00Z',
caption: '서울아이 Seoul i @SEOULiPS. — 구독자 322명, 영상 155개',
sourceUrl: 'https://www.youtube.com/channel/UCYcssdFunRLmD8b376Y6ykg',
},
{
id: 'ig-profile',
url: '/assets/clients/irum/screenshots/ig-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-14T10:02:00Z',
caption: 'Instagram @seoulips — 826 팔로워 (KR 공식)',
sourceUrl: 'https://www.instagram.com/seoulips/',
},
{
id: 'fb-page',
url: '/assets/clients/irum/screenshots/fb-page.png',
channel: 'Facebook',
capturedAt: '2026-04-14T10:03:00Z',
caption: 'Facebook 서울아이성형외과 — 페이지 비공개/삭제 확인',
sourceUrl: 'https://www.facebook.com/서울아이성형외과-105199207892670/',
},
{
id: 'gangnamunni',
url: '/assets/clients/irum/screenshots/gangnamunni.png',
channel: '강남언니',
capturedAt: '2026-04-14T10:04:00Z',
caption: '강남언니 — 이룸(서울아이)성형외과 9.4점, 86 리뷰',
sourceUrl: 'https://www.gangnamunni.com/hospitals/839',
},
{
id: 'website-homepage',
url: '/assets/clients/irum/screenshots/website-homepage.png',
channel: 'Website',
capturedAt: '2026-04-14T10:05:00Z',
caption: 'seoulips.com — 공식 홈페이지',
sourceUrl: 'https://www.seoulips.com',
},
{
id: 'naver-blog',
url: '/assets/clients/irum/screenshots/naver-blog.png',
channel: '네이버 블로그',
capturedAt: '2026-04-14T10:06:00Z',
caption: '네이버 블로그 @seoulips — 업로드 저조',
sourceUrl: 'https://blog.naver.com/seoulips',
},
],
};

331
src/data/mockReport_ts.ts Normal file
View File

@ -0,0 +1,331 @@
import type { MarketingReport } from '../types/report';
import { mockReport } from './mockReport';
/**
*
*
* (2026-04-14):
* - YouTube TV (@TV-jm9dy): 8K, 715, 1~2
* - : ·· ,
* - Instagram: @tsprs_official · Facebook: @tsprs
* - Blog: blog.naver.com/tsprs
* - : tsprs.com (tsprs.co.kr tsprs.com URL)
* - : /
*/
export const mockReportTs: MarketingReport = {
...mockReport,
id: 'ts',
createdAt: '2026-04-14',
targetUrl: 'https://www.tsprs.com',
overallScore: 55,
clinicSnapshot: {
...mockReport.clinicSnapshot,
name: '티에스성형외과',
nameEn: 'TS Plastic Surgery',
established: '2010',
yearsInBusiness: 16,
staffCount: 5,
leadDoctor: {
name: 'TS 성형팀',
credentials: '티에스성형외과 의료진 · 눈·코·가슴 종합',
rating: 9.5,
reviewCount: 12509,
},
overallRating: 9.5,
totalReviews: 12509,
priceRange: { min: '100,000', max: '10,000,000+', currency: '₩' },
certifications: [
'성형외과 전문의',
'눈·코·가슴 종합 성형',
'리얼모델 시스템',
],
mediaAppearances: ['강남언니 12,509 리뷰', '유튜브 리얼모델 콘텐츠'],
medicalTourism: ['외국인 상담 지원 (인도네시아 인플루언서 방문 기록)'],
location: '서울 강남구 신사동 (신사역)',
nearestStation: '3호선 신사역',
phone: '02-512-7580',
domain: 'tsprs.com',
source: 'registry' as const,
registryData: {
district: '강남',
branches: '본점 1개',
brandGroup: '눈·코·가슴 종합 성형',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/116',
googleMapsUrl: 'https://maps.google.com/?q=티에스성형외과',
},
logoImages: {
circle: '/assets/clients/ts/logo-circle.png',
horizontal: '/assets/clients/ts/logo-horizontal.png',
korean: '/assets/clients/ts/logo-korean.png',
},
brandColors: {
primary: '#1A1A2E',
accent: '#E94560',
text: '#1A1A2E',
},
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 58, maxScore: 100, status: 'warning', headline: '티에스TV 구독자 8K · 715개 영상 — 활발하나 전환율 개선 필요' },
{ channel: 'Instagram', icon: 'instagram', score: 62, maxScore: 100, status: 'warning', headline: '@tsprs_official — 리얼모델 콘텐츠 강점, Reels 빈도 증대 필요' },
{ channel: 'Facebook', icon: 'facebook', score: 38, maxScore: 100, status: 'critical', headline: '@tsprs — 3,900 팔로워, 활성도 낮음' },
{ channel: '강남언니', icon: 'star', score: 78, maxScore: 100, status: 'warning', headline: '9.5점/10, 12,509 리뷰 — 응답 전략 강화 필요' },
{ channel: 'Website', icon: 'globe', score: 60, maxScore: 100, status: 'warning', headline: 'tsprs.com 운영 — SNS 연동 및 트래킹 개선 여지' },
{ channel: '네이버 블로그', icon: 'globe', score: 45, maxScore: 100, status: 'warning', headline: 'blog.naver.com/tsprs — 업로드 있으나 빈도 보완 필요' },
],
youtubeAudit: {
...mockReport.youtubeAudit,
channelName: '티에스TV',
handle: '@TV-jm9dy',
subscribers: 8000,
totalVideos: 715,
totalViews: 5200000,
weeklyViewGrowth: { absolute: 3000, percentage: 0.6 },
estimatedMonthlyRevenue: { min: 40, max: 150 },
avgVideoLength: '3.2분',
uploadFrequency: '주 1~2회',
channelCreatedDate: '2018-01-01',
subscriberRank: '',
channelDescription: '지금, 예뻐져라! 티에스성형외과 — 눈·코·가슴·리프팅 전문',
linkedUrls: [{ label: '티에스성형외과', url: 'tsprs.com' }],
playlists: ['티에스 Real Model', '티에스 Lab', '티에스 Play', '티에스 소개'],
topVideos: [],
diagnosis: [
{ category: '구독자 전환율 낮음', detail: '715개 영상 대비 구독자 8K — Shorts와 롱폼 균형 재조정 필요', severity: 'warning', evidenceIds: ['yt-channel'] },
{ category: '리얼모델 콘텐츠 강점 활용 미흡', detail: '리얼모델 시리즈가 강점이나 검색 최적화·썸네일 시스템화가 부족', severity: 'warning' },
{ category: '업로드 일관성 유지', detail: '주 1~2회 업로드 — 주 3회로 상향 시 알고리즘 노출 증가 기대', severity: 'warning' },
],
},
instagramAudit: {
accounts: [
{
handle: '@tsprs_official',
language: 'KR',
label: '공식 계정',
posts: 1500,
followers: 2626,
following: 250,
category: 'Health/beauty',
profileLink: 'tsprs.com',
highlights: ['눈성형', '코성형', '가슴성형', '리얼모델', '이벤트'],
reelsCount: 60,
contentFormat: 'Reels + 리얼모델 Before/After',
profilePhoto: '티에스성형외과 공식 로고',
bio: '지금, 예뻐져라! 티에스성형외과 @tsprs_official',
},
],
diagnosis: [
{ category: 'Reels 비중 확대 여지', detail: '60개 Reels — 목표 100개+ 달성 시 알고리즘 노출 2배 기대', severity: 'warning' },
{ category: '리얼모델 계정 연계', detail: 'YouTube 리얼모델 브이로그 → Instagram 하이라이트 연계 미흡', severity: 'warning' },
],
},
facebookAudit: {
pages: [
{
url: 'facebook.com/tsprs',
pageName: 'TS Plastic Surgery',
language: 'KR',
label: '공식',
followers: 3900,
following: 0,
category: '성형외과',
bio: '티에스성형외과 공식 Facebook — 강남 신사역',
logo: '공식 로고',
logoDescription: '티에스성형외과 공식 로고',
link: 'tsprs.com',
linkedDomain: 'tsprs.com',
reviews: 0,
recentPostAge: '추정 수주 이내',
hasWhatsApp: false,
postFrequency: '월 2~4회',
topContentType: '이벤트 + 시술 정보',
engagement: '게시물당 좋아요 10~50개 (추정)',
},
],
diagnosis: [
{ category: 'Facebook 활성도 낮음', detail: 'Instagram에 집중된 콘텐츠 전략 — Facebook 공동 배포 검토', severity: 'warning' },
],
brandInconsistencies: [],
consolidationRecommendation: 'Facebook은 Instagram 콘텐츠 자동 연동으로 최소 유지, 주력은 YouTube·Instagram 집중.',
},
otherChannels: [
{ name: '네이버 블로그', status: 'active', details: '공식 블로그 운영 중 — 빈도 보완 필요', url: 'https://blog.naver.com/tsprs' },
{ name: '강남언니', status: 'active', details: '9.5점/10, 12,509 리뷰', url: 'https://www.gangnamunni.com/hospitals/116' },
{ name: '네이버 까페', status: 'active', details: '연탐 네이버 카페 운영', url: 'https://cafe.naver.com/yeuntalk' },
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중', url: 'https://map.naver.com/v5/search/티에스성형외과' },
],
websiteAudit: {
primaryDomain: 'tsprs.com',
additionalDomains: [],
snsLinksOnSite: true,
snsLinksDetail: [
{ platform: 'YouTube', url: 'https://www.youtube.com/@TV-jm9dy', location: 'Footer' },
{ platform: 'Instagram', url: 'https://www.instagram.com/tsprs_official/', location: 'Footer' },
{ platform: 'Facebook', url: 'https://www.facebook.com/tsprs', location: 'Footer' },
{ platform: 'Naver Blog', url: 'https://blog.naver.com/tsprs', location: 'Footer' },
],
trackingPixels: [
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
{ name: 'Naver Site Verification', installed: true },
],
mainCTA: '전화 상담 + 카카오톡 상담',
},
problemDiagnosis: [
{
category: '715개 영상 대비 구독자 전환율 낮음',
detail: 'YouTube 715개 영상 누적, 구독자 8K — 영상당 평균 구독자 11명 수준. SEO 최적화·썸네일 시스템화로 즉시 개선 가능.',
severity: 'critical',
},
{
category: '리얼모델 콘텐츠 강점의 크로스채널 미활용',
detail: '리얼모델 브이로그가 YouTube에서 강점이나 Instagram·Blog·강남언니 리뷰 연동이 체계화되지 않아 콘텐츠 파급 효과가 제한됨.',
severity: 'critical',
},
{
category: '네이버 카페 자산 미활용',
detail: '연탐 네이버 카페 운영 중이나 공식 채널과 연동 미흡 — 카페 리뷰/후기를 SNS 콘텐츠로 재활용하는 체계 부재.',
severity: 'warning',
},
],
transformation: {
...mockReport.transformation,
brandIdentity: [
{ area: '브랜드 슬로건', asIs: '"지금, 예뻐져라!"', toBe: '슬로건 유지 + 채널 통일 적용' },
{ area: '컬러', asIs: '다크 계열', toBe: 'Primary: Dark Navy (#1A1A2E) + Accent: Crimson (#E94560) 명문화' },
{ area: '리얼모델 포지셔닝', asIs: '일부 콘텐츠', toBe: '"리얼모델로 증명하는 티에스" 채널 전략 중심화' },
],
platformStrategies: [
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '8K subscribers · 715 videos',
targetMetric: '20K / 12개월',
strategies: [
{ strategy: 'Shorts 재편집 가속', detail: '715개 영상에서 Shorts 200개 추출' },
{ strategy: '썸네일 시스템화', detail: '리얼모델 비포/애프터 통일 썸네일' },
{ strategy: 'SEO 메타데이터 일괄 최적화', detail: '"강남 눈코가슴" 타이틀 패턴 적용' },
],
},
{
platform: 'Instagram',
icon: 'instagram',
currentMetric: '2,626 followers',
targetMetric: '60K / 12개월',
strategies: [
{ strategy: 'Reels 주 5회', detail: 'YouTube Shorts 동시 배포' },
{ strategy: '리얼모델 하이라이트 강화', detail: '시술별 Before/After 하이라이트 재구성' },
{ strategy: '카페 후기 → Instagram 재편집', detail: '연탐 카페 후기 → 카루셀 콘텐츠' },
],
},
],
websiteImprovements: [
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 리얼모델 영상 임베드' },
{ area: '카카오톡 상담 버튼', asIs: '일부 페이지', toBe: '전 페이지 플로팅 버튼' },
],
newChannelProposals: [
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층, Shorts 동시 배포' },
],
},
roadmap: [
{
month: 1,
title: 'Foundation',
subtitle: 'SEO & 썸네일',
tasks: [
{ task: 'YouTube 715개 영상 SEO 메타데이터 일괄 최적화', completed: false },
{ task: '리얼모델 썸네일 통일 디자인 시스템 구축', completed: false },
{ task: 'Instagram Reels 주 5회 업로드 시작', completed: false },
{ task: '연탐 카페 후기 SNS 콘텐츠화 착수', completed: false },
],
},
{
month: 2,
title: 'Content Engine',
subtitle: '리얼모델 확장',
tasks: [
{ task: 'YouTube Shorts 200개 추출 완료', completed: false },
{ task: 'Instagram 리얼모델 Before/After 하이라이트 재구성', completed: false },
{ task: '강남언니 리뷰 응답률 50% 달성', completed: false },
],
},
{
month: 3,
title: 'Optimization',
subtitle: '광고 & 전환',
tasks: [
{ task: '고성과 리얼모델 콘텐츠 유료 광고 세팅', completed: false },
{ task: '전환 추적 체계 구축 (UTM + GA4)', completed: false },
{ task: 'KPI 리뷰', completed: false },
],
},
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '8K', target3Month: '12K', target12Month: '20K' },
{ metric: 'YouTube Shorts 업로드', current: '주 1~2회', target3Month: '주 3회', target12Month: '주 5회' },
{ metric: 'Instagram 팔로워', current: '2,626', target3Month: '6K', target12Month: '15K' },
{ metric: 'Instagram Reels 평균 조회수', current: '낮음', target3Month: '8,000', target12Month: '25,000' },
{ metric: '강남언니 리뷰', current: '12,509', target3Month: '2,500', target12Month: '3,500' },
{ metric: '카카오톡 상담 전환', current: '측정 불가', target3Month: 'UTM 시작', target12Month: '월 50건' },
],
screenshots: [
{
id: 'yt-channel',
url: '/assets/clients/ts/screenshots/yt-channel.png',
channel: 'YouTube',
capturedAt: '2026-04-14T10:00:00Z',
caption: '티에스TV @TV-jm9dy — 구독자 8K, 영상 715개',
sourceUrl: 'https://www.youtube.com/channel/UCgnizu8p7lbCnfIs76O8J-A',
},
{
id: 'ig-profile',
url: '/assets/clients/ts/screenshots/ig-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-14T10:02:00Z',
caption: 'Instagram @tsprs_official — 2,626 팔로워, 리얼모델 콘텐츠',
sourceUrl: 'https://www.instagram.com/tsprs_official/',
},
{
id: 'fb-page',
url: '/assets/clients/ts/screenshots/fb-page.png',
channel: 'Facebook',
capturedAt: '2026-04-14T10:03:00Z',
caption: 'Facebook @tsprs — 3,900 팔로워',
sourceUrl: 'https://www.facebook.com/tsprs',
},
{
id: 'gangnamunni',
url: '/assets/clients/ts/screenshots/gangnamunni.png',
channel: '강남언니',
capturedAt: '2026-04-14T10:04:00Z',
caption: '강남언니 — 티에스성형외과 9.5점, 12,509 리뷰',
sourceUrl: 'https://www.gangnamunni.com/hospitals/116',
},
{
id: 'website-homepage',
url: '/assets/clients/ts/screenshots/website-homepage.png',
channel: 'Website',
capturedAt: '2026-04-14T10:05:00Z',
caption: 'tsprs.com — 공식 홈페이지',
sourceUrl: 'https://www.tsprs.com',
},
{
id: 'naver-blog',
url: '/assets/clients/ts/screenshots/naver-blog.png',
channel: '네이버 블로그',
capturedAt: '2026-04-14T10:06:00Z',
caption: '네이버 블로그 @tsprs — 업로드 중',
sourceUrl: 'https://blog.naver.com/tsprs',
},
],
};

View File

@ -0,0 +1,347 @@
import type { MarketingReport } from '../types/report';
import { mockReport } from './mockReport';
/**
*
*
* (2026-04-14):
* - YouTube @wjwonjin (WJ): 1.41 (14,100), Shorts
* - Instagram: @wonjin_official (KR) · @wonjin_ps · @wj_cosmetic (3 )
* - Facebook: @KwonjinPS
* - Blog: blog.naver.com/popokpop
* - : k-wonjin.co.kr
* - : /
*/
export const mockReportWonjin: MarketingReport = {
...mockReport,
id: 'wonjin',
createdAt: '2026-04-14',
targetUrl: 'https://www.k-wonjin.co.kr',
overallScore: 62,
clinicSnapshot: {
...mockReport.clinicSnapshot,
name: '원진성형외과',
nameEn: 'Wonjin Plastic Surgery',
established: '1991',
yearsInBusiness: 35,
staffCount: 10,
leadDoctor: {
name: '권진',
credentials: '원진성형외과 대표원장 · 코성형 전문',
rating: 9.3,
reviewCount: 11846,
},
overallRating: 9.3,
totalReviews: 11846,
priceRange: { min: '100,000', max: '20,000,000+', currency: '₩' },
certifications: [
'성형외과 전문의',
'코성형·눈성형 전문',
'국제 의료 관광 인증',
'다국어 상담 지원 (한/영/중/일/태)',
],
mediaAppearances: ['강남언니 11,846 리뷰', '국제 성형 의료 관광 병원'],
medicalTourism: ['영어·중국어·일어·태국어 상담', '외국인 전용 코디네이터'],
location: '서울 강남구 강남대로 (강남역)',
nearestStation: '2호선 강남역',
phone: '02-544-0404',
domain: 'wonjin.com',
source: 'registry' as const,
registryData: {
district: '강남',
branches: '본점 1개',
brandGroup: '코성형·국제환자 특화',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/2500',
googleMapsUrl: 'https://maps.google.com/?q=원진성형외과',
},
logoImages: {
circle: '/assets/clients/wonjin/logo-circle.png',
horizontal: '/assets/clients/wonjin/logo-horizontal.svg',
korean: '/assets/clients/wonjin/logo-korean.png',
},
brandColors: {
primary: '#2C1654',
accent: '#8B5CF6',
text: '#2C1654',
},
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 68, maxScore: 100, status: 'warning', headline: '@wjwonjin — 구독자 1.41만, Shorts 매우 활발, 롱폼 전략 보완 필요' },
{ channel: 'Instagram', icon: 'instagram', score: 72, maxScore: 100, status: 'warning', headline: '3개 계정 운영 — KR/글로벌 분리, 채널 간 연계 전략 부재' },
{ channel: 'Facebook', icon: 'facebook', score: 45, maxScore: 100, status: 'warning', headline: '@KwonjinPS — 운영 중이나 국내 도달 낮음' },
{ channel: '강남언니', icon: 'star', score: 85, maxScore: 100, status: 'good', headline: '9.3점/10, 11,846 리뷰 — 강남 상위 5% 수준, 리뷰 리마케팅 미활용' },
{ channel: 'Website', icon: 'globe', score: 65, maxScore: 100, status: 'warning', headline: 'wonjin.com 다국어 운영 양호 — 전환 추적 고도화 필요' },
{ channel: '네이버 블로그', icon: 'globe', score: 40, maxScore: 100, status: 'critical', headline: 'blog.naver.com/popokpop — 업로드 빈도 저조' },
],
youtubeAudit: {
...mockReport.youtubeAudit,
channelName: 'WJ원진성형외과',
handle: '@wjwonjin',
subscribers: 14100,
totalVideos: 350,
totalViews: 8500000,
weeklyViewGrowth: { absolute: 5000, percentage: 0.8 },
estimatedMonthlyRevenue: { min: 80, max: 300 },
avgVideoLength: '4.2분',
uploadFrequency: '주 3~5회 (Shorts 중심)',
channelCreatedDate: '2018-05-01',
subscriberRank: '',
channelDescription: 'WJ원진성형외과 — 코성형·눈성형·국제환자 전문 성형외과',
linkedUrls: [{ label: '원진성형외과', url: 'k-wonjin.co.kr' }],
playlists: ['코성형', '눈성형', '브이로그', '해외환자'],
topVideos: [],
diagnosis: [
{ category: 'Shorts 과다 집중', detail: 'Shorts 위주 업로드로 채널 전문성 희석 — 롱폼 Before/After 강화 필요', severity: 'warning', evidenceIds: ['yt-channel'] },
{ category: '3개 Instagram 계정 연계 부재', detail: '@wonjin_official · @wonjin_ps · @wj_cosmetic 간 콘텐츠 연계 전략 없음', severity: 'warning' },
{ category: '구독자 대비 조회수 잠재력', detail: '1.41만 구독자 — 적극적 롱폼 + SEO 최적화 시 30K 달성 가능', severity: 'warning' },
],
},
instagramAudit: {
accounts: [
{
handle: '@wonjin_official',
language: 'KR',
label: 'KR 공식',
posts: 1200,
followers: 23400,
following: 300,
category: 'Health/beauty',
profileLink: 'wonjin.com',
highlights: ['코성형', '눈성형', '후기', '이벤트', '글로벌'],
reelsCount: 80,
contentFormat: 'Reels + Before/After',
profilePhoto: '원진성형외과 공식 로고',
bio: '원진성형외과 공식 KR 계정',
},
{
handle: '@wonjin_ps',
language: 'KR',
label: 'KR 서브',
posts: 500,
followers: 18000,
following: 150,
category: 'Health/beauty',
profileLink: 'wonjin.com',
highlights: [],
reelsCount: 30,
contentFormat: 'Before/After + 시술 정보',
profilePhoto: '원진 로고',
bio: '원진성형외과 서브 계정',
},
],
diagnosis: [
{ category: '다계정 전략 비효율', detail: '3개 계정 분산으로 팔로워·콘텐츠 파편화 — 통합 또는 역할 명확화 필요', severity: 'critical' },
{ category: '글로벌 계정 활용도 낮음', detail: '@wj_cosmetic 글로벌 계정이 국제 환자 유입에 충분히 활용되지 않음', severity: 'warning' },
],
},
facebookAudit: {
pages: [
{
url: 'facebook.com/KwonjinPS',
pageName: 'Wonjin Plastic Surgery',
language: 'EN',
label: '국제',
followers: 19000,
following: 0,
category: '성형외과',
bio: 'Wonjin Plastic Surgery — International Patients Welcome',
logo: '공식 로고',
logoDescription: '원진성형외과 공식 로고',
link: 'wonjin.com',
linkedDomain: 'wonjin.com',
reviews: 0,
recentPostAge: '추정 1주 이내',
hasWhatsApp: true,
postFrequency: '주 2~4회',
topContentType: 'Before/After + 국제 환자 후기',
engagement: '게시물당 좋아요 20~150개 (추정)',
},
],
diagnosis: [
{ category: 'KR 전용 페이지 부재', detail: '국제 페이지만 운영 — 국내 환자용 KR 콘텐츠 별도 필요', severity: 'warning' },
],
brandInconsistencies: [],
consolidationRecommendation: '국제 페이지 유지 + 국내 콘텐츠 강화를 위한 Instagram KR 집중 권장.',
},
otherChannels: [
{ name: '네이버 블로그', status: 'unknown', details: '공식 블로그 운영 중 — 최근 업로드 저조', url: 'https://blog.naver.com/popokpop' },
{ name: '강남언니', status: 'active', details: '9.3점/10, 11,846 리뷰 · 코성형 강남 상위', url: 'https://www.gangnamunni.com/hospitals/2500' },
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중', url: 'https://map.naver.com/v5/search/원진성형외과' },
{ name: '카카오톡', status: 'active', details: '채널 운영 중', url: 'https://wonjin.com' },
],
websiteAudit: {
primaryDomain: 'wonjin.com',
additionalDomains: [{ domain: 'k-wonjin.co.kr', purpose: '서브 도메인' }],
snsLinksOnSite: true,
snsLinksDetail: [
{ platform: 'YouTube', url: 'https://www.youtube.com/@wjwonjin', location: 'Footer' },
{ platform: 'Instagram', url: 'https://www.instagram.com/wonjin_official/', location: 'Footer' },
{ platform: 'Facebook', url: 'https://www.facebook.com/KwonjinPS', location: 'Footer' },
{ platform: 'Naver Blog', url: 'https://blog.naver.com/popokpop', location: 'Footer' },
],
trackingPixels: [
{ name: 'Facebook Pixel', installed: true, details: '설치 확인 (추정)' },
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
],
mainCTA: '전화 상담 + 다국어 온라인 예약',
},
problemDiagnosis: [
{
category: '3개 Instagram 계정 분산으로 브랜드 파워 희석',
detail: '@wonjin_official(23.4K 실측) + @wonjin_ps(18K) + @wj_cosmetic 3개 계정이 분산 운영돼 팔로워 합산 대비 실제 도달이 낮음. 통합 또는 역할 명확화 필수.',
severity: 'critical',
},
{
category: 'Shorts 과다 의존 — 롱폼 전문성 콘텐츠 부족',
detail: 'YouTube Shorts 위주 업로드로 알고리즘 노출은 높으나, 코성형 전문 병원으로서의 신뢰도를 높이는 롱폼 Before/After·수술 과정 영상이 부족.',
severity: 'critical',
},
{
category: '국제 환자 디지털 여정 미설계',
detail: '글로벌 Instagram · Facebook 영문 페이지가 있으나 랜딩페이지 다국어 전환 추적 체계 없음. 외국인 유입 대비 전환율 측정 불가.',
severity: 'critical',
},
],
transformation: {
...mockReport.transformation,
brandIdentity: [
{ area: '다계정 전략', asIs: 'Instagram 3개 계정 역할 불명확', toBe: '@wonjin_official KR 메인 · @wj_cosmetic 글로벌 전용으로 역할 명확화' },
{ area: '컬러', asIs: '퍼플 계열 추정', toBe: 'Primary: Deep Purple (#2C1654) + Accent: Violet (#8B5CF6) 명문화' },
{ area: '전문성 포지셔닝', asIs: '종합 성형외과', toBe: '"35년 강남 코성형 전문 · 국제 환자 1위"' },
],
platformStrategies: [
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '14.1K subscribers · Shorts 활발',
targetMetric: '30K / 12개월',
strategies: [
{ strategy: '롱폼 Before/After 시리즈 강화', detail: '코성형 케이스 스터디 월 4편 — Shorts와 균형' },
{ strategy: '외국인 환자 브이로그 시리즈', detail: '영어·중국어 자막 추가 — 글로벌 노출' },
{ strategy: '원장 전문의 해설 시리즈', detail: '"코성형 전문의가 말하는" 롱폼 에듀케이션 콘텐츠' },
],
},
{
platform: 'Instagram',
icon: 'instagram',
currentMetric: '@wonjin_official 23,400 팔로워 (실측)',
targetMetric: '@wonjin_official 80K / 12개월',
strategies: [
{ strategy: '계정 역할 재정의', detail: '@wonjin_official KR 메인, @wj_cosmetic 글로벌 전용' },
{ strategy: '11,846 리뷰 콘텐츠화', detail: '강남언니 리뷰 → Instagram Story/Highlight' },
{ strategy: '다국어 캡션 시스템', detail: 'KR + EN 이중 캡션으로 글로벌 도달' },
],
},
],
websiteImprovements: [
{ area: '다국어 랜딩 UTM 추적', asIs: '전환 추적 없음', toBe: '언어별 UTM 파라미터 + GA4 이벤트 세팅' },
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 관련 YouTube 영상 임베드' },
],
newChannelProposals: [
{ channel: 'TikTok', priority: 'P1', rationale: '국제 환자 10~30대, YouTube Shorts 동시 배포' },
{ channel: 'LINE (일본)', priority: 'P2', rationale: '일본인 환자 유입 채널 확장' },
],
},
roadmap: [
{
month: 1,
title: 'Foundation',
subtitle: '계정 구조 재편',
tasks: [
{ task: 'Instagram 3개 계정 역할 재정의 (KR/글로벌 분리)', completed: false },
{ task: 'YouTube 롱폼 Before/After 시리즈 기획 시작', completed: false },
{ task: '강남언니 11,846 리뷰 SNS 콘텐츠화 50개', completed: false },
{ task: 'UTM 추적 체계 구축', completed: false },
],
},
{
month: 2,
title: 'Content Engine',
subtitle: '글로벌 콘텐츠',
tasks: [
{ task: 'YouTube 롱폼 월 4편 + Shorts 주 3회 병행', completed: false },
{ task: 'Instagram @wj_cosmetic 글로벌 콘텐츠 주 3회', completed: false },
{ task: 'Facebook 국제 광고 캠페인 세팅', completed: false },
],
},
{
month: 3,
title: 'Optimization',
subtitle: '전환 최적화',
tasks: [
{ task: '국가별 환자 유입 채널 분석', completed: false },
{ task: '고성과 콘텐츠 유료 광고 전환', completed: false },
{ task: 'KPI 리뷰 및 조정', completed: false },
],
},
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '14.1K', target3Month: '18K', target12Month: '30K' },
{ metric: 'YouTube 롱폼 업로드', current: '불규칙', target3Month: '월 4편', target12Month: '월 8편' },
{ metric: 'Instagram @wonjin_official 팔로워', current: '23,400', target3Month: '35K', target12Month: '60K' },
{ metric: '강남언니 리뷰', current: '11,846', target3Month: '4,700', target12Month: '6,000' },
{ metric: '외국인 환자 전환율', current: '측정 불가', target3Month: 'UTM 추적 시작', target12Month: '월 20건' },
],
screenshots: [
{
id: 'yt-channel',
url: '/assets/clients/wonjin/screenshots/yt-channel.png',
channel: 'YouTube',
capturedAt: '2026-04-14T10:00:00Z',
caption: 'WJ원진성형외과 @wjwonjin — 구독자 1.41만, Shorts 활발',
sourceUrl: 'https://www.youtube.com/@wjwonjin',
},
{
id: 'ig-profile',
url: '/assets/clients/wonjin/screenshots/ig-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-14T10:02:00Z',
caption: 'Instagram @wonjin_official — 23,400 팔로워 (KR 공식)',
sourceUrl: 'https://www.instagram.com/wonjin_official/',
},
{
id: 'fb-page',
url: '/assets/clients/wonjin/screenshots/fb-page.png',
channel: 'Facebook',
capturedAt: '2026-04-14T10:03:00Z',
caption: 'Facebook @KwonjinPS — 19,000 팔로워 (국제 공식)',
sourceUrl: 'https://www.facebook.com/KwonjinPS',
},
{
id: 'gangnamunni',
url: '/assets/clients/wonjin/screenshots/gangnamunni.png',
channel: '강남언니',
capturedAt: '2026-04-14T10:04:00Z',
caption: '강남언니 — 원진성형외과 9.3점, 11,846 리뷰',
sourceUrl: 'https://www.gangnamunni.com/hospitals/2500',
},
{
id: 'website-homepage',
url: '/assets/clients/wonjin/screenshots/website-homepage.png',
channel: 'Website',
capturedAt: '2026-04-14T10:05:00Z',
caption: 'wonjin.com — 다국어 공식 홈페이지',
sourceUrl: 'https://www.wonjin.com',
},
{
id: 'naver-blog',
url: '/assets/clients/wonjin/screenshots/naver-blog.png',
channel: '네이버 블로그',
capturedAt: '2026-04-14T10:06:00Z',
caption: '네이버 블로그 @popokpop — 최근 업로드 저조',
sourceUrl: 'https://blog.naver.com/popokpop',
},
],
};

View File

@ -4,6 +4,20 @@ import type { MarketingPlan, ChannelStrategyCard, CalendarData, ContentStrategyD
import { fetchReportById, fetchActiveContentPlan, supabase } from '../lib/supabase'; import { fetchReportById, fetchActiveContentPlan, supabase } from '../lib/supabase';
import { transformReportToPlan } from '../lib/transformPlan'; import { transformReportToPlan } from '../lib/transformPlan';
import { mockPlan } from '../data/mockPlan'; import { mockPlan } from '../data/mockPlan';
import { mockPlanBanobagi } from '../data/mockPlan_banobagi';
import { mockPlanGrand } from '../data/mockPlan_grand';
import { mockPlanWonjin } from '../data/mockPlan_wonjin';
import { mockPlanTs } from '../data/mockPlan_ts';
import { mockPlanIrum } from '../data/mockPlan_irum';
const DEMO_PLANS: Record<string, MarketingPlan> = {
'view-clinic': mockPlan,
'banobagi': mockPlanBanobagi,
'grand': mockPlanGrand,
'wonjin': mockPlanWonjin,
'ts': mockPlanTs,
'irum': mockPlanIrum,
};
interface UseMarketingPlanResult { interface UseMarketingPlanResult {
data: MarketingPlan | null; data: MarketingPlan | null;
@ -89,11 +103,16 @@ export function useMarketingPlan(id: string | undefined): UseMarketingPlanResult
async function loadPlan() { async function loadPlan() {
try { try {
// ─── Dev / Demo: return mock data immediately ─── // ─── Dev / Demo: return mock data immediately ───
if (id === 'demo' || id === 'view-clinic') { if (id === 'demo') {
setData(mockPlan); setData(mockPlan);
setIsLoading(false); setIsLoading(false);
return; return;
} }
if (id && id in DEMO_PLANS) {
setData(DEMO_PLANS[id]);
setIsLoading(false);
return;
}
// ─── Source 1: Try content_plans table (AI-generated strategy) ─── // ─── Source 1: Try content_plans table (AI-generated strategy) ───
// First, resolve clinicId from navigation state or analysis_runs // First, resolve clinicId from navigation state or analysis_runs

View File

@ -5,6 +5,29 @@ import { fetchReportById } from '../lib/supabase';
import { transformApiReport, mergeEnrichment, type EnrichmentData } from '../lib/transformReport'; import { transformApiReport, mergeEnrichment, type EnrichmentData } from '../lib/transformReport';
import { normalizeInstagramHandle } from '../lib/normalizeHandles'; import { normalizeInstagramHandle } from '../lib/normalizeHandles';
import { mockReport } from '../data/mockReport'; import { mockReport } from '../data/mockReport';
import { mockReportBanobagi } from '../data/mockReport_banobagi';
import { mockReportGrand } from '../data/mockReport_grand';
import { mockReportWonjin } from '../data/mockReport_wonjin';
import { mockReportTs } from '../data/mockReport_ts';
import { mockReportIrum } from '../data/mockReport_irum';
const DEMO_REPORTS: Record<string, MarketingReport> = {
'view-clinic': mockReport,
'banobagi': mockReportBanobagi,
'grand': mockReportGrand,
'wonjin': mockReportWonjin,
'ts': mockReportTs,
'irum': mockReportIrum,
};
const DEMO_HANDLES: Record<string, Record<string, string | null>> = {
'view-clinic': { instagram: '@viewplastic', youtube: '@ViewclinicKR', facebook: 'viewps1' },
'banobagi': { instagram: '@banobagi_ps', youtube: '@banobagips', facebook: 'BanobagiPlasticSurgery' },
'grand': { instagram: '@grand_korea', youtube: '@grandsurgery_QnA', facebook: 'grandps.korea' },
'wonjin': { instagram: '@wonjin_official', youtube: '@wjwonjin', facebook: 'KwonjinPS' },
'ts': { instagram: '@tsprs_official', youtube: '@TV-jm9dy', facebook: 'tsprs' },
'irum': { instagram: '@seoulips', youtube: '@SEOULiPS.', facebook: null },
};
interface UseReportResult { interface UseReportResult {
data: MarketingReport | null; data: MarketingReport | null;
@ -39,10 +62,10 @@ export function useReport(id: string | undefined): UseReportResult {
useEffect(() => { useEffect(() => {
// Source 0: Demo mode — ALWAYS takes priority over any other source // Source 0: Demo mode — ALWAYS takes priority over any other source
if (id === 'view-clinic') { if (id && id in DEMO_REPORTS) {
setData(mockReport); setData(DEMO_REPORTS[id]);
setIsEnriched(true); setIsEnriched(true);
setSocialHandles({ instagram: '@viewplastic', youtube: '@ViewclinicKR', facebook: 'viewps1' }); setSocialHandles(DEMO_HANDLES[id] ?? null);
setIsLoading(false); setIsLoading(false);
return; return;
} }

View File

@ -1,3 +1,4 @@
import { useEffect } from 'react';
import { useParams, useLocation } from 'react-router'; import { useParams, useLocation } from 'react-router';
import { useMarketingPlan } from '../hooks/useMarketingPlan'; import { useMarketingPlan } from '../hooks/useMarketingPlan';
import { ReportNav } from '../components/report/ReportNav'; import { ReportNav } from '../components/report/ReportNav';
@ -33,6 +34,21 @@ export default function MarketingPlanPage() {
const clinicId = (location.state as { clinicId?: string } | undefined)?.clinicId || null; const clinicId = (location.state as { clinicId?: string } | undefined)?.clinicId || null;
const { data, isLoading, error } = useMarketingPlan(id); const { data, isLoading, error } = useMarketingPlan(id);
// Hash-based scroll: /plan/:id#section-id → scroll to that section after render
// Offsets sticky Navbar (80px) + ReportNav (~48px) so the section top isn't covered.
useEffect(() => {
if (isLoading || !location.hash) return;
const sectionId = location.hash.slice(1);
const timer = setTimeout(() => {
const el = document.getElementById(sectionId);
if (!el) return;
const STICKY_OFFSET = 128;
const y = el.getBoundingClientRect().top + window.scrollY - STICKY_OFFSET;
window.scrollTo({ top: y, behavior: 'smooth' });
}, 300);
return () => clearTimeout(timer);
}, [isLoading, location.hash]);
if (isLoading) { if (isLoading) {
return ( return (
<div className="min-h-screen flex items-center justify-center pt-20"> <div className="min-h-screen flex items-center justify-center pt-20">

View File

@ -17,6 +17,7 @@ export interface VerifiedChannels {
naverBlog: VerifiedChannel | null; naverBlog: VerifiedChannel | null;
gangnamUnni: VerifiedChannel | null; gangnamUnni: VerifiedChannel | null;
tiktok: VerifiedChannel | null; tiktok: VerifiedChannel | null;
naverPlace?: { url: string; placeId?: string } | null; // registry-sourced place URL
} }
/** /**

View File

@ -560,23 +560,35 @@ Deno.serve(async (req) => {
const npVerified = (verified as Record<string, unknown>).naverPlace as Record<string, unknown> | null; const npVerified = (verified as Record<string, unknown>).naverPlace as Record<string, unknown> | null;
channelTasks.push(wrapChannelTask("naverPlace", async () => { channelTasks.push(wrapChannelTask("naverPlace", async () => {
// ── Fast path: already verified in DB ── // ── Fast path 1: already fully verified in DB (has name) ──
if (npVerified?.name) { if (npVerified?.name) {
console.log(`[naverPlace] Using verified DB data: ${npVerified.name}`); console.log(`[naverPlace] Using verified DB data: ${npVerified.name}`);
channelData.naverPlace = npVerified; channelData.naverPlace = npVerified;
return; return;
} }
// ── Slow path: first-time discovery via domain-matched search ── // ── Fast path 2: registry-sourced place URL → use Naver Place ID directly ──
const registryPlaceUrl = (verified as Record<string, unknown>).naverPlace as { url?: string; placeId?: string } | null;
const registryPlaceId = registryPlaceUrl?.placeId;
if (registryPlaceId) {
console.log(`[naverPlace] Using registry place ID: ${registryPlaceId}`);
// Build the Naver local search with placeId as a hint — use clinic name to fetch details
// We'll pass through to search but prime the query with clinic name
}
// ── Slow path: search via Naver Local API ──
const normalize = (s: string) => (s || '').replace(/<[^>]*>/g, '').toLowerCase(); const normalize = (s: string) => (s || '').replace(/<[^>]*>/g, '').toLowerCase();
let clinicDomain = ''; let clinicDomain = '';
try { clinicDomain = new URL(row.url || '').hostname.replace('www.', ''); } catch { /* skip */ } try { clinicDomain = new URL(row.url || '').hostname.replace('www.', ''); } catch { /* skip */ }
const districtMatch = address.match(/([가-힣]+(구|동))/); const districtMatch = address.match(/([가-힣]+(구|동))/);
const district = districtMatch?.[1] || ''; const district = districtMatch?.[1] || '';
// Strip 의원/병원 suffixes for broader search match
const shortName = clinicName.replace(/의원$|병원$/, '').trim();
const queries = [ const queries = [
...(district ? [`${clinicName} ${district}`, `${clinicName} 성형 ${district}`] : []), ...(district ? [`${clinicName} ${district}`, `${shortName} ${district}`] : []),
`${clinicName} 성형외과`, `${clinicName} 성형외과`,
`${shortName} 성형외과`,
`${clinicName} 성형`, `${clinicName} 성형`,
]; ];
@ -591,9 +603,10 @@ Deno.serve(async (req) => {
const data = await res.json(); const data = await res.json();
const items = (data.items || []) as Record<string, string>[]; const items = (data.items || []) as Record<string, string>[];
// Match by official domain first (most reliable), then exact name + 성형 category // Match priority: (1) domain match, (2) registry place ID in link, (3) name contains match + 성형 category
const match = (clinicDomain ? items.find(i => (i.link || '').includes(clinicDomain)) : null) const match = (clinicDomain ? items.find(i => (i.link || '').includes(clinicDomain)) : null)
?? items.find(i => normalize(i.title) === clinicName.toLowerCase() && (i.category || '').includes('성형')) ?? (registryPlaceId ? items.find(i => (i.link || '').includes(registryPlaceId)) : null)
?? items.find(i => normalize(i.title).includes(shortName.toLowerCase()) && (i.category || '').includes('성형'))
?? null; ?? null;
if (match) { if (match) {

View File

@ -74,6 +74,11 @@ function registryToVerifiedChannels(reg: RegistryRow): import("../_shared/verify
const blogHandle = extractHandleFromUrl(reg.naver_blog_url || '', 'naverBlog'); const blogHandle = extractHandleFromUrl(reg.naver_blog_url || '', 'naverBlog');
const ttHandle = extractHandleFromUrl(reg.tiktok_url || '', 'tiktok'); const ttHandle = extractHandleFromUrl(reg.tiktok_url || '', 'tiktok');
// Extract Naver Place ID from URL (e.g. https://m.place.naver.com/hospital/11709005 → "11709005")
const naverPlaceId = reg.naver_place_url
? (reg.naver_place_url.match(/\/(\d+)\/?$/) || [])[1] || undefined
: undefined;
return { return {
instagram: igHandles, instagram: igHandles,
youtube: ytHandle ? { handle: ytHandle, verified: true, url: reg.youtube_url! } : null, youtube: ytHandle ? { handle: ytHandle, verified: true, url: reg.youtube_url! } : null,
@ -81,6 +86,7 @@ function registryToVerifiedChannels(reg: RegistryRow): import("../_shared/verify
naverBlog: blogHandle ? { handle: blogHandle, verified: true, url: reg.naver_blog_url! } : null, naverBlog: blogHandle ? { handle: blogHandle, verified: true, url: reg.naver_blog_url! } : null,
gangnamUnni: reg.gangnam_unni_url ? { handle: reg.gangnam_unni_url, verified: true, url: reg.gangnam_unni_url } : null, gangnamUnni: reg.gangnam_unni_url ? { handle: reg.gangnam_unni_url, verified: true, url: reg.gangnam_unni_url } : null,
tiktok: ttHandle ? { handle: ttHandle, verified: true, url: reg.tiktok_url! } : null, tiktok: ttHandle ? { handle: ttHandle, verified: true, url: reg.tiktok_url! } : null,
naverPlace: reg.naver_place_url ? { url: reg.naver_place_url, placeId: naverPlaceId } : null,
}; };
} }