Compare commits

..

8 Commits

Author SHA1 Message Date
Mina Choi 7fb1831c91 test: Playwright e2e 셋업 + test-prefill-flow 스펙
- @playwright/test devDependency 추가
- playwright.config.ts
- e2e/test-prefill-flow.spec.ts
- .gitignore: test-results / playwright-report / .playwright 추가
2026-05-20 11:51:32 +09:00
Mina Choi a805afa39d feat(dev): /test 라우트 — URL prefill 픽스처로 분석 플로우 빠르게 검증
- TestPrefillPage: 자주 쓰는 병원 URL 묶음을 버튼 한 번에 채널 입력으로 prefill
- /dev/* 와 동일하게 DevOnly 가드 적용 (로컬에서만 접근)
2026-05-20 11:51:27 +09:00
Mina Choi 47fed51efc feat: 채널 아이콘/링크 통합 + 리포트·플랜 디자인 개선
shared 채널 아이콘 유틸:
- src/shared/icons/channelIcons.ts (resolveChannelIcon — 한글/영문 이름 모두 매핑)
- src/shared/ui/platform-icon.tsx
- channel-link-buttons.tsx 정리

리포트:
- ClinicSnapshot: 외부 채널/플랫폼 링크 버튼(ExternalLinkButtons) 노출
- ReportHeader: 기존 ChannelLinkButtons 제거 (ClinicSnapshot 으로 이관)
- ReportBody: ClinicSnapshot 에 targetUrl·socialHandles 전달, KPIDashboard 에 report 전달
- ChannelOverview: 채널 이름 정규화로 한글 채널도 아이콘/색 매칭
- TransformationProposal: 디자인 다듬기
- GuestReportPage: 하단 '도입 문의' CTA 섹션 제거

플랜:
- BrandingGuide / ChannelStrategy: 공용 resolveChannelIcon 사용으로 중복 제거
- PlanPage: PlanCTA 에 plan 전달 (CSV 내보내기용)

기타:
- MultiChannelInput: 공용 platform-icon 사용
2026-05-20 11:51:18 +09:00
Mina Choi 317cd61519 refactor: useAnalysisPipeline 시간 기반 분할 제거 → 백엔드 planning 단계 직접 매핑
기존엔 analyzing 한 단계가 길어서 30초 경과 시점에 generating → planning 으로
시간 기반 분할했지만, 백엔드가 planning 을 별도 상태로 분리하면서 불필요해짐.
2026-05-20 11:50:30 +09:00
Mina Choi 7926636c09 feat: 리포트·플랜 다운로드 버튼 → PDF/CSV 드롭다운 + CSV 포맷 Excel 친화적으로 개선
- KPIDashboard / PlanCTA: 단일 다운로드 버튼 → DropdownMenu(PDF로 저장 / CSV로 저장)
- useExportPlanCSV / useExportCSV: '=== Section ===' 헤더 → 빈 행 + 섹션 제목 행 구분
  (Excel/Numbers 에서 자연스럽게 보이도록)
- 캘린더 dayOfWeek 인덱스(0~6) → 한글 요일(월~일) 출력
2026-05-20 11:50:23 +09:00
Mina Choi 87062f76eb refactor: ContentPillar.relatedUSP → relatedUsp (백엔드 스키마 정합) 2026-05-20 11:50:14 +09:00
Mina Choi be71918644 chore: 데모용 mock 리포트/플랜 데이터 제거 + useReport 단일 경로 복원
- 데모 ID(view-clinic / banobagi / grand / wonjin / ts / irum / o2o)
  로컬 mock 분기 제거 → 모든 ID 가 백엔드 getReport() 호출로 통일
- mockReport*.ts (8개), mockPlan*.ts (7개) 삭제
2026-05-20 11:50:09 +09:00
Mina Choi edf56cefd8 fix: PDF 인쇄 시 드롭다운/팝오버 캡처 방지 + plan 메뉴에서 제작 파이프라인 제외
- @media print 규칙에 Radix popper / role=menu·dialog·tooltip 숨김 추가
  → '리포트/플랜 다운로드' 드롭다운이 열린 채 window.print() 호출돼도 캡처에서 제외
- PLAN_SECTIONS 에서 workflow-tracker(제작 파이프라인) 주석 처리
2026-05-20 11:50:02 +09:00
48 changed files with 868 additions and 6182 deletions

3
.gitignore vendored
View File

@ -6,3 +6,6 @@ dist
.DS_Store
*.log
.vite
test-results
playwright-report
.playwright

View File

@ -0,0 +1,87 @@
/**
* /test loading phase /report/:id .
*
* API(YouTube/Apify/Naver/Firecrawl/Perplexity)
* 1 run · serial . `--workers=1` .
*/
import { test, expect, type Page } from '@playwright/test'
import { CLINICS } from '../src/features/dev/fixtures/mockUrls'
test.describe.configure({ mode: 'serial' })
async function pickAndSubmit(page: Page) {
await page.goto('/test')
const heading = page.locator('text=선택된 병원:').first()
await expect(heading).toBeVisible({ timeout: 10_000 })
const text = await heading.innerText()
const match = text.match(/선택된 병원:\s*(.+?)\s*\(/)
const label = match?.[1]
expect(label, `라벨 파싱 실패: "${text}"`).toBeTruthy()
const clinic = CLINICS.find((c) => c.label === label)
expect(clinic, `${label} 가 CLINICS에 없음`).toBeTruthy()
console.log(`[e2e] 선택된 병원: ${label}`)
if (clinic!.urls.homepage) {
await expect(page.getByLabel('홈페이지')).toHaveValue(clinic!.urls.homepage)
}
const analyzeBtn = page.getByRole('button', { name: /Analyze/i })
await expect(analyzeBtn).toBeEnabled()
await analyzeBtn.click()
await page.waitForURL(/\/report\/loading/, { timeout: 10_000 })
console.log(`[e2e] /report/loading 진입 (${new Date().toISOString()})`)
return label!
}
test('/test → 프리필 → 분석 시작 → phase 폴링 → /report/:id 도달', async ({ page }) => {
// 외부 API 의존 풀 플로우 — discovery(~20s) + collect(~40s) + report(~60s) + plan(~30s)
test.setTimeout(8 * 60_000)
const consoleErrors: string[] = []
const pageErrors: string[] = []
page.on('pageerror', (e) => pageErrors.push(e.message))
page.on('console', (msg) => {
if (msg.type() === 'error') consoleErrors.push(msg.text())
})
await pickAndSubmit(page)
// ── Phase 1: discovering → discovered ────────────────────────────
// discoverChannels 완료 시점에 URL이 /report/loading/<reportId> 로 replace 됨
await expect(page.locator('text=Channels discovered')).toBeVisible({ timeout: 90_000 })
console.log(`[e2e] ✓ Phase 1: Channels discovered (${new Date().toISOString()})`)
await expect(page).toHaveURL(/\/report\/loading\/[A-Za-z0-9-]+/, { timeout: 5_000 })
// ── Phase 2: collecting → collected ──────────────────────────────
await expect(page.locator('text=Data collected')).toBeVisible({ timeout: 180_000 })
console.log(`[e2e] ✓ Phase 2: Data collected (${new Date().toISOString()})`)
// ── Phase 3: generating active 상태 확인 ─────────────────────────
// 'Report generated'(완료 라벨)는 planning → complete → navigate 흐름이 빨라
// viewport에서 잡히지 않는 경우가 있어, 활성 라벨까지만 확인하고 URL 폴링으로 넘어감
await expect(page.locator('text=Generating AI marketing report')).toBeVisible({ timeout: 30_000 })
console.log(`[e2e] ✓ Phase 3: Generating report... (${new Date().toISOString()})`)
// ── 최종 /report/:id 도달 (Perplexity 호출 + plan 생성 포함 — 최대 6분) ──
await page.waitForURL(/\/report\/[A-Za-z0-9-]+$/, { timeout: 6 * 60_000 })
const finalUrl = page.url()
console.log(`[e2e] ✓ 최종 navigate: ${finalUrl} (${new Date().toISOString()})`)
expect(finalUrl).not.toContain('/loading')
// ── Report 페이지 본문 렌더링 확인 ───────────────────────────────
// GuestReportPage 로딩 스피너 → ReportBody. 'Marketing Intelligence Report' 헤더가 viewport 상단.
await expect(page.locator('text=리포트를 불러오는 중...')).toBeHidden({ timeout: 60_000 })
await expect(page.locator('text=Marketing Intelligence Report')).toBeVisible({ timeout: 30_000 })
console.log(`[e2e] ✓ Report 페이지 렌더 완료`)
// ── 콘솔 / 페이지 에러 0건 ────────────────────────────────────────
expect(pageErrors, `pageerror: ${pageErrors.join('\n')}`).toHaveLength(0)
// 콘솔 에러는 외부 채널 partial failure 등으로 발생할 수 있어 경고만 출력
if (consoleErrors.length > 0) {
console.warn(`[e2e] 콘솔 에러 ${consoleErrors.length}건 (non-blocking):`)
consoleErrors.slice(0, 5).forEach((e) => console.warn(`${e}`))
}
})

64
package-lock.json generated
View File

@ -23,6 +23,7 @@
"zustand": "^5.0.6"
},
"devDependencies": {
"@playwright/test": "^1.60.0",
"@tailwindcss/vite": "^4.1.14",
"@tanstack/react-query-devtools": "^5.59.0",
"@types/node": "^22.14.0",
@ -1185,6 +1186,22 @@
"openapi3-ts": "4.5.0"
}
},
"node_modules/@playwright/test": {
"version": "1.60.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz",
"integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright": "1.60.0"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@radix-ui/number": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
@ -7229,6 +7246,53 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/playwright": {
"version": "1.60.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz",
"integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.60.0"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"node_modules/playwright-core": {
"version": "1.60.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz",
"integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/playwright/node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/pony-cause": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz",

View File

@ -31,6 +31,7 @@
"zustand": "^5.0.6"
},
"devDependencies": {
"@playwright/test": "^1.60.0",
"@tailwindcss/vite": "^4.1.14",
"@tanstack/react-query-devtools": "^5.59.0",
"@types/node": "^22.14.0",

25
playwright.config.ts Normal file
View File

@ -0,0 +1,25 @@
import { defineConfig, devices } from '@playwright/test'
/**
* Playwright config /test E2E .
*
* dev BASE_URL ( 3000).
* `BASE_URL=http://localhost:3002 npx playwright test` .
*/
export default defineConfig({
testDir: './e2e',
fullyParallel: true,
workers: 3,
reporter: [['list']],
use: {
baseURL: process.env.BASE_URL ?? 'http://localhost:3000',
trace: 'retain-on-failure',
screenshot: 'only-on-failure',
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
})

View File

@ -56,6 +56,8 @@ export interface AnalyzePayload {
interface MultiChannelInputProps {
variant?: 'hero' | 'cta';
onAnalyze: (payload: AnalyzePayload) => void;
/** 디폴트 입력값 — /dev/test 등 목업 시나리오용. 미지정 시 빈 폼. */
initialUrls?: Partial<ChannelUrlInputs>;
}
type ChannelKey = keyof Omit<ClassifiedUrls, 'unknown'>;
@ -108,8 +110,8 @@ function validateField(value: string, expected: ChannelKey): 'empty' | 'valid' |
return 'invalid';
}
export default function MultiChannelInput({ variant = 'hero', onAnalyze }: MultiChannelInputProps) {
const [urls, setUrls] = useState<ChannelUrlInputs>(EMPTY_URLS);
export default function MultiChannelInput({ variant = 'hero', onAnalyze, initialUrls }: MultiChannelInputProps) {
const [urls, setUrls] = useState<ChannelUrlInputs>(() => ({ ...EMPTY_URLS, ...initialUrls }));
// 통합 분류 결과 — 7개 필드 값을 join해 classifyUrls에 한 번에 통과시켜 manualChannels 구성.
const aggregated = useMemo(() => {

View File

@ -0,0 +1,144 @@
/**
* /test + E2E· URL .
*
* 7 : homepage, youtube, instagram, facebook, naverPlace, naverBlog, gangnamUnni
* . naverPlace ( ID ).
*/
export interface ChannelUrls {
homepage?: string
youtube?: string
instagram?: string
facebook?: string
naverPlace?: string
naverBlog?: string
gangnamUnni?: string
}
export interface ClinicFixture {
label: string
urls: ChannelUrls
}
export const CLINICS: ClinicFixture[] = [
{
label: '뷰성형외과',
urls: {
homepage: 'viewclinic.com',
youtube: 'youtube.com/channel/UCQqqH3Klj2HQSHNNSVug-CQ',
instagram: 'instagram.com/viewplastic',
facebook: 'facebook.com/viewps1',
naverPlace: 'https://naver.me/x9BxGXkK',
naverBlog: 'blog.naver.com/viewclinicps',
gangnamUnni: 'gangnamunni.com/hospitals/189',
},
},
{
label: '바노바기 성형외과',
urls: {
homepage: 'banobagi.com',
youtube: 'youtube.com/c/banobagips',
instagram: 'instagram.com/banobagi_ps',
facebook: 'facebook.com/BanobagiPlasticSurgery',
naverPlace: 'https://naver.me/xxY2yLr5',
naverBlog: 'blog.naver.com/banobagiprs',
gangnamUnni: 'gangnamunni.com/hospitals/23',
},
},
{
label: 'ID 성형외과',
urls: {
homepage: 'idhospital.com',
youtube: 'youtube.com/user/IDhospital',
instagram: 'instagram.com/idhospital',
facebook: 'facebook.com/idhospital0050',
naverPlace: 'https://naver.me/GtURpCEn',
naverBlog: '',
gangnamUnni: 'gangnamunni.com/hospitals/257',
},
},
{
label: 'JK 성형외과',
urls: {
homepage: 'jkplastic.com',
youtube: 'youtube.com/channel/UC5F8dEt32hdp3cTeFyls4qg',
instagram: 'instagram.com/jkplasticsurgery_kr',
facebook: 'facebook.com/jkmedicalgroup',
naverPlace: 'https://naver.me/x67y6cAc',
naverBlog: 'blog.naver.com/jkstory1',
gangnamUnni: 'gangnamunni.com/hospitals/858',
},
},
{
label: '그랜드 성형외과',
urls: {
homepage: 'grandsurgery.com',
youtube: 'youtube.com/channel/UCU2o_aHqsNFuqwtdzVM3xbQ',
instagram: 'instagram.com/grand_korea',
facebook: 'facebook.com/grandps.korea',
naverPlace: 'https://naver.me/Fw7MYKWK',
naverBlog: 'blog.naver.com/grandprs',
gangnamUnni: 'gangnamunni.com/hospitals/62',
},
},
{
label: 'BK 성형외과',
urls: {
homepage: 'bkhospital.com',
youtube: 'youtube.com/channel/UChJONft3hemy5DGbXUveTFg',
instagram: 'instagram.com/bkhospital_korea',
facebook: '',
naverPlace: 'https://naver.me/517CTH3W',
naverBlog: '',
gangnamUnni: '',
},
},
{
label: '톡스앤필',
urls: {
homepage: 'toxnfill.com',
youtube: 'youtube.com/channel/UCFpFZkm7mclD-z_-j7FTUag',
instagram: 'instagram.com/toxnfill_official',
facebook: 'facebook.com/toxnfill.official',
naverPlace: 'https://naver.me/FvEmJIHA',
naverBlog: 'blog.naver.com/toxnfill',
gangnamUnni: 'gangnamunni.com/hospitals/3702',
},
},
{
label: '더 압구정 성형외과',
urls: {
homepage: 'theclinic.co.kr',
youtube: 'youtube.com/user/theplasticsurgery1',
instagram: 'instagram.com/the_plasticsurgery',
facebook: 'facebook.com/THEPS16445998',
naverPlace: '',
naverBlog: 'blog.naver.com/with_theps',
gangnamUnni: 'gangnamunni.com/hospitals/30',
},
},
{
label: '라마르 성형외과',
urls: {
homepage: 'lamarps.com',
youtube: '',
instagram: '',
facebook: '',
naverPlace: '',
naverBlog: '',
gangnamUnni: '',
},
},
{
label: '오라클 성형외과',
urls: {
homepage: 'oracleclinic.com',
youtube: 'youtube.com/@oracle_medical_group',
instagram: 'instagram.com/oraclemedicalgroup',
facebook: 'facebook.com/oracleclinickr',
naverPlace: 'https://naver.me/GhbU3VtK',
naverBlog: '',
gangnamUnni: 'gangnamunni.com/hospitals/125',
},
},
]

View File

@ -0,0 +1,67 @@
/**
* /test fixture dev .
*
* - CLINICS 1 form prefill
* - "다른 병원 랜덤"
* - DevOnly localhost
*/
import { useMemo, useState } from 'react'
import { useNavigate } from 'react-router'
import MultiChannelInput, { type AnalyzePayload } from '@/features/channels/components/MultiChannelInput'
import { CLINICS } from '../fixtures/mockUrls'
function pickRandomIndex(): number {
return Math.floor(Math.random() * CLINICS.length)
}
export default function TestPrefillPage() {
const navigate = useNavigate()
const [seed, setSeed] = useState(0)
const index = useMemo(() => pickRandomIndex(), [seed])
const clinic = CLINICS[index]
const handleAnalyze = (payload: AnalyzePayload) => {
navigate('/report/loading', {
state: {
url: payload.primaryUrl,
manualChannels: payload.manualChannels,
},
})
}
return (
<section className="min-h-screen pt-28 pb-12 px-6 bg-gradient-to-br from-indigo-50 via-purple-50 to-pink-50">
<div className="max-w-4xl mx-auto">
<div className="mb-8 flex items-center justify-between gap-4">
<div>
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-amber-100 text-amber-800 text-xs font-medium mb-3">
DEV · /test
</div>
<h1 className="text-3xl font-bold text-primary-900">
</h1>
<p className="mt-2 text-sm text-slate-600">
: <span className="font-semibold text-primary-900">{clinic.label}</span>
{' '}<span className="text-slate-400">({index + 1} / {CLINICS.length})</span>
</p>
</div>
<button
type="button"
onClick={() => setSeed((s) => s + 1)}
className="px-4 py-2 rounded-lg bg-white border border-slate-200 text-sm font-medium text-slate-700 hover:bg-slate-50 shadow-sm"
>
</button>
</div>
{/* key={seed} 로 강제 remount — initialUrls는 mount 시점 1회만 반영되기 때문 */}
<MultiChannelInput
key={seed}
variant="hero"
initialUrls={clinic.urls}
onAnalyze={handleAnalyze}
/>
</div>
</section>
)
}

View File

@ -3,14 +3,16 @@ import DevOnly from './components/DevOnly'
const ComponentsPage = lazy(() => import('./pages/ComponentsPage'))
const ClinicsPage = lazy(() => import('./pages/ClinicsPage'))
const TestPrefillPage = lazy(() => import('./pages/TestPrefillPage'))
// `/dev/*` 는 DevOnly 가드를 거쳐 로컬호스트에서만 접근 가능.
// `/dev/*` 와 `/test` 는 DevOnly 가드를 거쳐 로컬호스트에서만 접근 가능.
export const devRoutes = [
{
element: <DevOnly />,
children: [
{ path: 'dev/components', element: <ComponentsPage /> },
{ path: 'dev/clinics', element: <ClinicsPage /> },
{ path: 'test', element: <TestPrefillPage /> },
],
},
]

View File

@ -14,10 +14,10 @@ import { Input } from '@/shared/ui/input';
import {
tabItems,
type TabKey,
getChannelIcon,
statusColor,
statusLabel,
} from '../data/brandingGuideConstants';
import { resolveChannelIcon } from '@/shared/icons/channelIcons';
import type { BrandGuide, ColorSwatch } from '@/features/plan/types/plan';
import type { BrandInconsistency } from '@/features/report/types/report';
@ -364,7 +364,7 @@ function ChannelRulesTab({ channels }: { channels: BrandGuide['channelBranding']
>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{channels.map((ch) => {
const Icon = getChannelIcon(ch.icon);
const Icon = resolveChannelIcon(ch.channel, ch.icon);
return (
<div key={ch.channel} className="rounded-2xl border border-slate-100 p-5">
{/* Header */}

View File

@ -1,15 +1,6 @@
import { type ComponentType } from 'react';
import { motion } from 'motion/react';
import {
YoutubeFilled,
InstagramFilled,
FacebookFilled,
GlobeFilled,
VideoFilled,
MessageFilled,
CalendarFilled,
TiktokFilled,
} from '@/shared/icons/FilledIcons';
import { CalendarFilled } from '@/shared/icons/FilledIcons';
import { resolveChannelIcon } from '@/shared/icons/channelIcons';
import { SectionWrapper } from '@/features/report/components/ui/SectionWrapper';
import type { ChannelStrategyCard } from '@/features/plan/types/plan';
@ -17,20 +8,6 @@ interface ChannelStrategyProps {
channels: ChannelStrategyCard[];
}
const channelIconMap: Record<string, ComponentType<{ size?: number; className?: string }>> = {
youtube: YoutubeFilled,
instagram: InstagramFilled,
facebook: FacebookFilled,
globe: GlobeFilled,
video: VideoFilled,
messagesquare: MessageFilled,
tiktok: TiktokFilled,
};
function getChannelIcon(icon: string) {
return channelIconMap[icon.toLowerCase()] ?? GlobeFilled;
}
const priorityStyle: Record<string, string> = {
P0: 'bg-[#FFF0F0] text-[#7C3A4B] border border-[#F5D5DC] shadow-[2px_3px_8px_rgba(212,136,154,0.15)]',
P1: 'bg-[#FFF6ED] text-[#7C5C3A] border border-[#F5E0C5] shadow-[2px_3px_8px_rgba(212,168,114,0.15)]',
@ -47,7 +24,7 @@ export default function ChannelStrategy({ channels }: ChannelStrategyProps) {
>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{channels.map((ch, index) => {
const Icon = getChannelIcon(ch.icon);
const Icon = resolveChannelIcon(ch.channelName, ch.icon);
return (
<motion.div

View File

@ -88,7 +88,7 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
</h4>
<p className="text-sm text-slate-600 mb-3">{pillar.description}</p>
<span className="inline-block rounded-full bg-slate-100 px-3 py-1 text-xs font-medium text-slate-700 mb-4">
{pillar.relatedUSP}
{pillar.relatedUsp}
</span>
<ul className="space-y-2">
{pillar.exampleTopics.map((topic, j) => (

View File

@ -1,14 +1,30 @@
import { motion } from 'motion/react';
import { useNavigate, useParams } from 'react-router';
import { FileText, FileSpreadsheet, ChevronDown } from 'lucide-react';
import { RocketFilled, DownloadFilled } from '@/shared/icons/FilledIcons';
import { Button } from '@/shared/ui/button';
import { PageContainer } from '@/shared/ui/page-container';
import {
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuItem,
} from '@/shared/ui/dropdown-menu';
import { useExportPDF } from '@/features/report/hooks/useExportPDF';
import { useExportPlanCSV } from '@/features/plan/hooks/useExportPlanCSV';
import type { MarketingPlan } from '@/features/plan/types/plan';
export default function PlanCTA() {
interface PlanCTAProps {
/** 전체 기획 — CSV 내보내기에 사용 */
plan?: MarketingPlan;
}
export default function PlanCTA({ plan }: PlanCTAProps = {}) {
const { exportPDF, isExporting } = useExportPDF();
const { exportPlanCSV } = useExportPlanCSV();
const navigate = useNavigate();
const { id } = useParams<{ id: string }>();
const baseFilename = 'INFINITH_Marketing_Plan';
return (
<motion.section
@ -44,10 +60,11 @@ export default function PlanCTA() {
</Button>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
type="button"
variant="outline"
onClick={() => exportPDF('INFINITH_Marketing_Plan')}
disabled={isExporting}
className="inline-flex items-center justify-center gap-2 rounded-full bg-white border-slate-200 px-6 py-3 h-auto text-sm font-medium text-brand-purple-deep shadow-sm hover:shadow-md hover:bg-white transition-shadow disabled:opacity-60"
>
@ -60,7 +77,23 @@ export default function PlanCTA() {
<DownloadFilled size={16} />
)}
<ChevronDown size={14} className="opacity-70" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem onSelect={() => exportPDF(baseFilename)}>
<FileText size={14} className="text-slate-500" />
<span>PDF </span>
</DropdownMenuItem>
<DropdownMenuItem
disabled={!plan}
onSelect={() => plan && exportPlanCSV(baseFilename, plan)}
>
<FileSpreadsheet size={14} className="text-slate-500" />
<span>CSV </span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div>
</PageContainer>

View File

@ -1,12 +1,4 @@
import type { ComponentType } from 'react';
import {
YoutubeFilled,
InstagramFilled,
FacebookFilled,
GlobeFilled,
VideoFilled,
MessageFilled,
} from '@/shared/icons/FilledIcons';
export { channelIconMap, getChannelIcon } from '@/shared/icons/channelIcons';
export const tabItems = [
{ key: 'visual', label: 'Visual Identity', labelKr: '비주얼 아이덴티티' },
@ -17,19 +9,6 @@ export const tabItems = [
export type TabKey = (typeof tabItems)[number]['key'];
export const channelIconMap: Record<string, ComponentType<{ size?: number; className?: string }>> = {
youtube: YoutubeFilled,
instagram: InstagramFilled,
facebook: FacebookFilled,
globe: GlobeFilled,
video: VideoFilled,
messagesquare: MessageFilled,
};
export function getChannelIcon(icon: string) {
return channelIconMap[icon.toLowerCase()] ?? GlobeFilled;
}
export const statusColor: Record<string, string> = {
correct: 'bg-brand-tint-purple text-brand-purple-muted border-brand-tint-lavender',
incorrect: 'bg-brand-rose-bg text-brand-rose border-brand-rose-soft',

View File

@ -1,425 +0,0 @@
import type { MarketingPlan } from '@/features/plan/types/plan';
export const mockPlan: MarketingPlan = {
id: 'view-clinic',
reportId: 'view-clinic',
clinicName: '뷰성형외과의원',
clinicNameEn: 'VIEW Plastic Surgery',
createdAt: '2026-04-28',
targetUrl: 'https://www.viewclinic.com',
// ─── Section 1: Brand Guide ───
brandGuide: {
colors: [
{ name: 'VIEW Purple', hex: '#7B2D8E', usage: '공식 로고 메인 컬러, 깃털 아이콘, 브랜드 텍스트' },
{ name: 'VIEW Gold', hex: '#E8B931', usage: '깃털 악센트, 강조 요소, CTA 포인트' },
{ name: 'VIEW Text Purple', hex: '#6B2D7B', usage: '한글/영문 브랜드명, 헤딩 텍스트' },
{ name: 'Warm White', hex: '#FAF8F5', usage: '배경, 카드, 여백 공간' },
{ name: 'Deep Charcoal', hex: '#2D2D2D', usage: '본문 텍스트, 서브 텍스트' },
],
fonts: [
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀, CTA 버튼', sampleText: '안전이 예술이 되는 곳' },
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트, 설명, 캡션', sampleText: '21년 무사고 VIEW 성형외과' },
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩, 프리미엄 강조', sampleText: 'VIEW Plastic Surgery' },
],
logoRules: [
{ rule: '보라색+골드 깃털 로고 통일 사용', description: '공식 깃털 심볼(보라색+골드) + VIEW 텍스트를 모든 채널에서 동일하게 사용', correct: true },
{ rule: '원형 로고: 보라색 테두리 버전', description: '프로필 사진용 원형 버전은 보라색 원 테두리 안에 깃털 심볼 + VIEW 텍스트 배치', correct: true },
{ rule: '가로형 로고: 깃털 + 텍스트 조합', description: '배너, 헤더에는 깃털 심볼 옆에 View Plastic Surgery 텍스트를 가로 배치', correct: true },
{ rule: '모델 사진 프로필 금지', description: '프로필 사진에 모델/환자 사진 대신 반드시 공식 깃털 로고 사용 (Instagram KR 위반 중)', correct: false },
{ rule: '비공식 변형 로고 사용 금지', description: 'YouTube의 VIEW 골드 텍스트 전용 로고는 비공식 — 깃털 심볼이 반드시 포함되어야 함', correct: false },
{ rule: '로고 주변 여백 확보', description: '로고 크기의 50% 이상 여백을 유지하여 가독성 확보', correct: true },
],
toneOfVoice: {
personality: ['차분한 전문가', '신뢰감 있는', '과장 없는', '환자 중심', '결과로 증명하는'],
communicationStyle: '환자의 불안과 고민을 이해하고, 전문적인 판단력으로 신뢰를 구축합니다. 유행을 좇지 않고 원칙을 말하는 병원으로서, 과장된 표현 대신 정확한 정보와 설명으로 설득합니다.',
doExamples: [
'"수술을 권하기 전에, 판단을 설명합니다"',
'"결과가 설명되는 수술"',
'"21년간 안전을 최우선으로"',
'"환자의 관점에서 생각합니다"',
],
dontExamples: [
'"강남 최고! 파격 할인!"',
'"연예인이 선택한 병원"',
'"이 가격은 오늘까지만!"',
'"100% 만족 보장"',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: '보라색+골드 깃털 원형 로고', bannerSpec: '2560x1440px, 퍼플+골드 그라디언트 배경, 깃털 심볼 + "VIEW Plastic Surgery" 슬로건', bioTemplate: '안전이 예술이 되는 곳 — 21년 무사고 VIEW 성형외과\n02-539-1177 | 카톡: @뷰성형외과의원', currentStatus: 'incorrect' },
{ channel: 'Instagram KR', icon: 'instagram', profilePhoto: '보라색+골드 깃털 원형 로고', bannerSpec: 'N/A (하이라이트 커버: 퍼플 톤 아이콘 세트)', bioTemplate: '안전이 예술이 되는 곳 — VIEW 성형외과\n신논현역 3번 출구 | 02-539-1177\nviewclinic.com', currentStatus: 'incorrect' },
{ channel: 'Instagram EN', icon: 'instagram', profilePhoto: '보라색+골드 깃털 원형 로고', bannerSpec: 'N/A', bioTemplate: 'Where Safety Becomes Art — VIEW Plastic Surgery\nGangnam, Seoul | +82-2-539-1177\nviewclinic.com/en', currentStatus: 'incorrect' },
{ channel: 'Facebook KR', icon: 'facebook', profilePhoto: '보라색+골드 깃털 원형 로고', bannerSpec: '820x312px, 퍼플+골드 배너, 깃털 심볼 + 슬로건', bioTemplate: '안전이 예술이 되는 곳 — 21년 무사고 VIEW 성형외과', currentStatus: 'correct' },
{ channel: 'Facebook EN', icon: 'facebook', profilePhoto: '보라색+골드 깃털 원형 로고', bannerSpec: '820x312px, 동일 디자인 시스템', bioTemplate: 'Where Safety Becomes Art — VIEW Plastic Surgery', currentStatus: 'incorrect' },
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: '보라색+골드 깃털 로고', bannerSpec: '블로그 상단: 깃털 심볼 + 대표 이미지', bioTemplate: '21년 무사고 VIEW 성형외과 공식 블로그\n가슴성형·안면윤곽·양악·눈코·리프팅', currentStatus: 'missing' },
{ channel: 'TikTok', icon: 'video', profilePhoto: '보라색+골드 깃털 원형 로고', bannerSpec: 'N/A', bioTemplate: 'VIEW 성형외과 — 안전이 예술이 되는 곳\n강남 신논현역 | 02-539-1177', currentStatus: 'missing' },
],
brandInconsistencies: [
{
field: '로고',
values: [
{ channel: 'YouTube', value: 'VIEW 텍스트 전용 골드 로고 (깃털 심볼 없음)', isCorrect: false },
{ channel: 'Instagram KR', value: '모델 프로필 사진 (로고 아님)', isCorrect: false },
{ channel: 'Instagram EN', value: 'VIEW 텍스트 전용 골드 로고 (깃털 심볼 없음)', isCorrect: false },
{ channel: 'Facebook KR', value: '보라색+골드 깃털 로고 (공식 로고)', isCorrect: true },
{ channel: 'Facebook EN', value: 'VIEW 텍스트 전용 골드 로고 (깃털 심볼 없음)', isCorrect: false },
{ channel: 'Website', value: '보라색+골드 깃털 로고 (공식 로고)', isCorrect: true },
],
impact: '공식 깃털 로고를 사용하는 채널은 Facebook KR과 웹사이트 2곳뿐. 나머지 4개 채널은 비공식 변형 로고 또는 모델 사진을 사용',
recommendation: '전 채널에 보라색+골드 깃털 공식 로고 통일 적용 (원형 버전: 프로필, 가로형 버전: 배너)',
},
{
field: '바이오/소개 메시지',
values: [
{ channel: 'YouTube', value: '💜뷰성형외과💜 VIEW가 예술이다!', isCorrect: false },
{ channel: 'Instagram KR', value: '뷰 성형외과 | 가슴성형·안면윤곽·눈성형', isCorrect: false },
{ channel: 'Facebook KR', value: '예쁨이 일상이 되는 순간!', isCorrect: false },
{ channel: 'Facebook EN', value: 'Official Account by VIEW Partners', isCorrect: false },
],
impact: '4개 채널, 4개의 서로 다른 소개 메시지 → 통일된 브랜드 포지셔닝 부재',
recommendation: '핵심 USP 포함 통일 바이오: "안전이 예술이 되는 곳 — 21년 무사고 VIEW"',
},
],
},
// ─── Section 2: Channel Strategies ───
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
currentStatus: '104K 구독자, 주 2~3회 업로드', targetGoal: '200K 구독자, 주 3회 업로드',
contentTypes: ['Shorts', 'Long-form', 'Community'],
postingFrequency: '주 3회 (롱폼 1 + Shorts 2)',
tone: '차분한 전문가 — 원장이 직접 설명하는 교육 콘텐츠',
formatGuidelines: ['Shorts: 15-60초, 세로형, 후크 3초 내', 'Long-form: 5-15분, 원장 설명 + B-roll', '썸네일: VIEW 골드 워터마크 + 통일 폰트'],
priority: 'P0',
},
{
channelId: 'instagram_kr', channelName: 'Instagram KR', icon: 'instagram',
currentStatus: '14,047 팔로워, Reels 0개', targetGoal: '50K 팔로워, Reels 주 5개',
contentTypes: ['Reels', 'Carousel', 'Stories', 'Feed Image'],
postingFrequency: '일 1회 + Stories 일 2-3개',
tone: '차분하지만 접근 가능한 — 환자 관점의 Q&A',
formatGuidelines: ['Reels: YouTube Shorts 동시 게시', 'Carousel: 시술 가이드 5-7장', 'Stories: 병원 일상, 상담 비하인드, 투표'],
priority: 'P0',
},
{
channelId: 'instagram_en', channelName: 'Instagram EN', icon: 'instagram',
currentStatus: '70,537 팔로워, Reels 활발', targetGoal: '120K 팔로워',
contentTypes: ['Reels', 'Before/After', 'Patient Stories'],
postingFrequency: '주 5회',
tone: 'Professional & warm — medical tourism storytelling',
formatGuidelines: ['Patient journey videos (English subtitles)', 'Before/After with consent', 'Korea travel + surgery content'],
priority: 'P1',
},
{
channelId: 'facebook', channelName: 'Facebook', icon: 'facebook',
currentStatus: 'KR 254명 + EN 88,333명, 로고 불일치', targetGoal: '통합 관리, 광고 리타겟 전용',
contentTypes: ['광고 크리에이티브', '리타겟 콘텐츠'],
postingFrequency: '주 2-3회 (광고 소재 위주)',
tone: '신뢰 기반 — 안전, 경험, 결과 강조',
formatGuidelines: ['KR 페이지 폐쇄 → EN 페이지로 통합', 'Facebook Pixel 리타겟 광고 최적화', '로고 VIEW 골드로 즉시 교체'],
priority: 'P1',
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: '활성 — 551개 게시글, 월 2~3회 포스팅 (최근 2026.4.22)', targetGoal: '주 2회 포스팅, 월 30,000 방문자',
contentTypes: ['SEO 블로그 포스트', '시술 가이드', '환자 후기'],
postingFrequency: '주 3회',
tone: '정보성 전문가 — 키워드 중심, 환자 고민 해결',
formatGuidelines: ['2,000자 이상 SEO 최적화 포스트', '시술별 FAQ 시리즈', '이미지 10장 이상 + 동영상 임베드'],
priority: 'P0',
},
{
channelId: 'tiktok', channelName: 'TikTok', icon: 'video',
currentStatus: '계정 없음', targetGoal: '10K 팔로워',
contentTypes: ['Shorts 크로스포스팅', '트렌드 챌린지'],
postingFrequency: '주 5회 (YouTube Shorts 동시 배포)',
tone: '가볍고 접근 가능한 — 20~30대 타겟',
formatGuidelines: ['YouTube Shorts 동시 업로드', '트렌딩 사운드 활용', '자막 필수 (음소거 시청 대비)'],
priority: 'P1',
},
{
channelId: 'kakaotalk', channelName: 'KakaoTalk', icon: 'messageSquare',
currentStatus: '상담 전용 운영', targetGoal: '상담 전환율 30% 향상',
contentTypes: ['상담 안내', '이벤트 알림', '예약 확인'],
postingFrequency: '주 1-2회 (메시지 발송)',
tone: '따뜻하고 전문적인 — 1:1 상담 톤',
formatGuidelines: ['자동 응답 + 상담사 연결 시스템', '시술별 상담 시나리오 준비', '예약 리마인더 자동 발송'],
priority: 'P1',
},
{
channelId: 'naver_cafe', channelName: 'Naver Cafe', icon: 'users',
currentStatus: '활성 — "뷰성형외과 성형의 모든것" 회원 5,984명, 비공개 카페', targetGoal: '회원 10,000명, 월 활성 참여율 20%',
contentTypes: ['시술별 Q&A 답변', '수술 전후 비교 콘텐츠', '회원 전용 이벤트', '원장 라이브 Q&A'],
postingFrequency: '주 3회 (Q&A 답변 + 후기 공유 + 이벤트)',
tone: '친밀하고 소통하는 — 커뮤니티 매니저 톤',
formatGuidelines: ['가입 신청 자동 승인 프로세스 개선', '시술별 Q&A 게시판 활성화 (가슴/윤곽/양악/눈/코)', '수술후기 작성 인센티브 (다음 시술 할인)', 'YouTube 영상 카페 내 공유로 조회수 상승'],
priority: 'P1',
},
],
// ─── Section 3: Content Strategy ───
contentStrategy: {
pillars: [
{ title: '수술 전문성', description: '원장의 경험과 판단력을 보여주는 교육 콘텐츠', relatedUSP: 'Surgical Authority', exampleTopics: ['코성형 Q&A', '가슴보형물 선택 가이드', '양악수술 오해와 진실'], color: '#6C5CE7' },
{ title: '안전 & 신뢰', description: '21년 무사고 이력과 안전 시스템을 증명하는 콘텐츠', relatedUSP: 'Trust & Safety', exampleTopics: ['수술실 CCTV 공개', '마취 전문의 인터뷰', '회복 관리 시스템'], color: '#7A84D4' },
{ title: '결과 예측', description: '자연스러운 결과와 밸런스를 강조하는 비포/애프터', relatedUSP: 'Result Predictability', exampleTopics: ['자연스러운 코 라인', '얼굴 밸런스 분석', '과교정 방지 철학'], color: '#9B8AD4' },
{ title: '환자 여정', description: '상담부터 회복까지의 환자 경험을 보여주는 스토리텔링', relatedUSP: 'Patient Guidance', exampleTopics: ['상담 시뮬레이션', '수술 당일 브이로그', '회복 타임라인'], color: '#D4A872' },
],
typeMatrix: [
{ format: 'YouTube Long-form', channels: ['YouTube'], frequency: '주 1회', purpose: '깊은 신뢰 구축, 전문성 증명' },
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 5회', purpose: '도달 확대, 첫 관심 유도' },
{ format: 'Carousel', channels: ['Instagram KR'], frequency: '주 2회', purpose: '정보 전달, 저장 유도' },
{ format: 'Blog Post', channels: ['Naver Blog'], frequency: '주 3회', purpose: 'SEO 검색 유입, 키워드 확보' },
{ format: 'Stories', channels: ['Instagram KR', 'Instagram EN'], frequency: '일 2-3개', purpose: '일상 소통, 친밀감 형성' },
{ format: 'Ad Creative', channels: ['Facebook', 'Instagram'], frequency: '월 4-8개', purpose: '신규 환자 유입, 리타겟' },
],
workflow: [
{ step: 1, name: '주제 선정', description: '키워드 분석 + 콘텐츠 필러 매칭', owner: '마케팅 매니저', duration: '1일' },
{ step: 2, name: '원고 작성', description: 'AI 초안 생성 + 의료 검수', owner: 'AI + 의료진', duration: '1-2일' },
{ step: 3, name: '비주얼 제작', description: '촬영/영상 편집/디자인', owner: '콘텐츠 팀', duration: '2-3일' },
{ step: 4, name: '검토 & 승인', description: '원장 최종 검토 + 의료광고 규정 체크', owner: '원장 / 법무', duration: '1일' },
{ step: 5, name: '배포 & 모니터링', description: '채널별 최적 시간 게시 + 성과 추적', owner: '마케팅 매니저', duration: '당일' },
],
repurposingSource: '1개 원장 롱폼 영상 (10분)',
repurposingOutputs: [
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 풀 영상 업로드' },
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '핵심 구간 15-60초 클립 추출' },
{ format: 'Carousel 1-2개', channel: 'Instagram KR', description: '영상 내용을 카드뉴스로 재구성' },
{ format: 'Blog Post 1개', channel: 'Naver Blog', description: '영상 스크립트 → SEO 블로그 포스트 변환' },
{ format: 'Stories 3-5개', channel: 'Instagram', description: '비하인드 + 촬영 현장 스니펫' },
{ format: 'Ad Creative 2개', channel: 'Facebook / Instagram', description: '가장 임팩트 있는 장면 + CTA 오버레이' },
],
},
// ─── Section 4: Content Calendar ───
calendar: {
weeks: [
{
weekNumber: 1, label: 'Week 1: 브랜드 정비 & 첫 콘텐츠',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '원장 인터뷰: VIEW의 수술 철학' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: '프로필 리뉴얼 공지 + 첫 Reel' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 Q&A #1' },
{ dayOfWeek: 2, channel: 'Naver', channelIcon: 'globe', contentType: 'blog', title: '코성형 가이드: 내 얼굴에 맞는 코' },
{ dayOfWeek: 3, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 가슴보형물 종류 비교' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 전후 Before/After #1' },
{ dayOfWeek: 4, channel: 'Naver', channelIcon: 'globe', contentType: 'blog', title: '가슴성형 절개 위치별 장단점' },
],
},
{
weekNumber: 2, label: 'Week 2: 콘텐츠 엔진 가동',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '원장이 설명하는: 안면윤곽' },
{ dayOfWeek: 0, channel: 'Naver', channelIcon: 'globe', contentType: 'blog', title: '안면윤곽 수술 종류와 회복기간' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 윤곽 전후 변화' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 사각턱 축소 과정' },
{ dayOfWeek: 3, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 리프팅 시술 비교' },
{ dayOfWeek: 3, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 코성형 상담 유도 (리타겟)' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 눈성형 자연스러운 라인' },
{ dayOfWeek: 4, channel: 'Naver', channelIcon: 'globe', contentType: 'blog', title: '눈성형 쌍꺼풀 수술 FAQ' },
],
},
{
weekNumber: 3, label: 'Week 3: 신뢰 콘텐츠 강화',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '원장이 설명하는: 수술 안전 시스템' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 수술실 안전 장비 소개' },
{ dayOfWeek: 1, channel: 'Naver', channelIcon: 'globe', contentType: 'blog', title: '성형외과 선택 시 확인할 안전 기준 5가지' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 마취 전문의가 함께합니다' },
{ dayOfWeek: 3, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 21년 무사고의 비결' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 상담 전 꼭 알아야 할 것' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 안전 시스템 소개 (신규 유입)' },
],
},
{
weekNumber: 4, label: 'Week 4: 전환 최적화',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '원장이 설명하는: 재수술 케이스' },
{ dayOfWeek: 0, channel: 'Naver', channelIcon: 'globe', contentType: 'blog', title: '재수술이 필요한 경우와 주의사항' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 재수술 전후 변화' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 원장 한 줄 답변 모음' },
{ dayOfWeek: 3, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 상담 예약 가이드' },
{ dayOfWeek: 3, channel: 'Naver', channelIcon: 'globe', contentType: 'blog', title: '첫 성형 상담, 이것만 준비하세요' },
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 이 달의 베스트 케이스' },
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 월말 상담 예약 CTA' },
],
},
],
monthlySummary: [
{ type: 'video', label: '영상', count: 16, color: '#8B5CF6' },
{ type: 'blog', label: '블로그', count: 8, color: '#7A84D4' },
{ type: 'social', label: '소셜', count: 12, color: '#9B8AD4' },
{ type: 'ad', label: '광고', count: 4, color: '#D4A872' },
],
},
// ─── Section 5: Asset Collection ───
assetCollection: {
assets: [
{ id: 'a1', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '병원 내부 인테리어 사진', description: '로비, 상담실, 수술실 외관, 대기 공간 고화질 사진', repurposingSuggestions: ['Instagram Feed 배경', '유튜브 B-roll', 'Naver 블로그 대표 이미지'], status: 'collected' },
{ id: 'a2', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '의료진 프로필 사진', description: '28명 의료진 개인 프로필 사진 및 경력 정보', repurposingSuggestions: ['원장 소개 Carousel', '유튜브 섬네일', '네이버 블로그 프로필'], status: 'collected' },
{ id: 'a3', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 설명 텍스트', description: '가슴성형, 안면윤곽, 눈코 등 시술별 상세 설명', repurposingSuggestions: ['Naver 블로그 포스트 소스', 'Carousel 텍스트', '광고 카피'], status: 'collected' },
{ id: 'a4', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: '기존 롱폼 영상 1,064개', description: '10년간 축적된 시술 설명, Q&A, 인터뷰 영상 아카이브', repurposingSuggestions: ['AI Shorts 추출 100+개', 'Instagram Reels 변환', 'TikTok 크로스포스팅'], status: 'collected' },
{ id: 'a5', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: '고성과 Shorts (10만+ 조회)', description: '574K, 525K, 392K 조회 Shorts — 전후 변화 중심', repurposingSuggestions: ['Instagram Reels 재업로드', 'TikTok 동시 게시', '광고 소재 활용'], status: 'collected' },
{ id: 'a6', source: 'social', sourceLabel: '소셜미디어', type: 'photo', title: 'Instagram EN Before/After 사진', description: '@view_plastic_surgery 계정의 2,524개 게시물 중 B/A 사진', repurposingSuggestions: ['KR 계정 크로스포스팅', '유튜브 롱폼 삽입', 'Naver 블로그 활용'], status: 'collected' },
{ id: 'a7', source: 'social', sourceLabel: '소셜미디어', type: 'text', title: '강남언니 환자 리뷰 18,840건', description: '9.5점 평균, 시술별 실 환자 후기 텍스트', repurposingSuggestions: ['후기 기반 Carousel 시리즈', '블로그 환자 스토리', '광고 사회적 증거'], status: 'pending' },
{ id: 'a8', source: 'naver_place', sourceLabel: '네이버 플레이스', type: 'photo', title: '네이버 플레이스 사진', description: '병원 외관, 위치, 시설 사진', repurposingSuggestions: ['블로그 위치 안내 포스트', '구글 마이비즈니스 동기화'], status: 'pending' },
{ id: 'a9', source: 'blog', sourceLabel: '블로그', type: 'text', title: '네이버 블로그 기존 포스트 551개', description: '기존 블로그 포스트 551개 (월 2~3회 업데이트 중)', repurposingSuggestions: ['SEO 최적화 리라이팅', '영상 스크립트 소스'], status: 'collected' },
{ id: 'a10', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '개원 20주년 기념 영상', description: '뷰성형외과 20년 역사 + 시설 소개 영상 (1:30)', repurposingSuggestions: ['브랜드 스토리 Reel', '웹사이트 히어로 영상', '신뢰 광고 소재'], status: 'collected' },
{ id: 'a11', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '시술별 전후 사진 갤러리', description: '눈, 코, 가슴, 윤곽 시술별 비포/애프터 사진', repurposingSuggestions: ['Instagram B/A 시리즈', 'Shorts 전환 소스', '상담 자료'], status: 'needs_creation' },
],
youtubeRepurpose: [
{ title: '한번에 성공하는 성형', views: 574000, type: 'Short', repurposeAs: ['Instagram Reel', 'TikTok', '광고 소재'] },
{ title: '코성형+지방이식 전후', views: 525000, type: 'Short', repurposeAs: ['Instagram Reel', 'TikTok', 'Naver 블로그 삽입'] },
{ title: '코성형! 내 얼굴에 가장 예쁜 코', views: 124000, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Carousel 3개', 'Blog Post 변환'] },
{ title: '아나운서 박은영, 가슴 할 결심', views: 127000, type: 'Long', repurposeAs: ['Shorts 3개 추출', '스토리 시리즈', '광고 소재'] },
{ title: '서울대 의학박사의 가슴재수술 성공전략', views: 1400, type: 'Long', repurposeAs: ['Shorts 추출', 'SEO 블로그', 'Carousel'] },
],
},
// ─── Section 6: Repurposing Proposals ───
repurposingProposals: [
{
sourceVideo: { title: '한번에 성공하는 성형', views: 574000, type: 'Short', repurposeAs: [] },
estimatedEffort: 'low',
priority: 'high',
outputs: [
{ format: 'Instagram Reel', channel: 'Instagram KR', description: '자막 추가 + 한국어 해시태그 최적화 후 즉시 크로스포스팅' },
{ format: 'TikTok', channel: 'TikTok', description: '트렌딩 사운드 교체 + 텍스트 오버레이 재구성' },
{ format: '광고 소재', channel: 'Facebook / Instagram', description: '가장 임팩트 있는 3초 후크 장면 + CTA 오버레이' },
],
},
{
sourceVideo: { title: '코성형! 내 얼굴에 가장 예쁜 코', views: 124000, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Shorts 5개 추출', channel: 'YouTube', description: '핵심 설명 구간 15-60초 클립 5개 자동 추출' },
{ format: 'Carousel 3개', channel: 'Instagram KR', description: '코성형 타입별 비교 정보 카드뉴스로 재구성' },
{ format: 'Blog Post', channel: 'Naver Blog', description: '영상 스크립트 → 2,000자 SEO 블로그 포스트 변환' },
{ format: 'Stories 시리즈', channel: 'Instagram', description: '촬영 비하인드 + Q&A 스니펫 5개' },
],
},
{
sourceVideo: { title: '아나운서 박은영, 가슴 할 결심', views: 127000, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'medium',
outputs: [
{ format: 'Shorts 3개 추출', channel: 'YouTube / Instagram / TikTok', description: '스토리 하이라이트 구간 크로스포스팅' },
{ format: '스토리 시리즈', channel: 'Instagram KR', description: '상담 결정 과정 + 회복 타임라인 Stories' },
{ format: '광고 소재', channel: 'Facebook', description: '환자 신뢰도 강화 소셜 프루프 광고 소재' },
],
},
{
sourceVideo: { title: '코성형+지방이식 전후', views: 525000, type: 'Short', repurposeAs: [] },
estimatedEffort: 'low',
priority: 'high',
outputs: [
{ format: 'Instagram Reel', channel: 'Instagram KR', description: 'Before/After 포맷 최적화 + 동의서 확인 후 게시' },
{ format: 'TikTok', channel: 'TikTok', description: '트렌드 사운드 교체 + Stitch 유도 CTA 추가' },
{ format: 'Naver 블로그 삽입', channel: 'Naver Blog', description: '코+지방이식 복합 시술 블로그 포스트에 영상 임베드' },
],
},
],
workflow: {
items: [
{
id: 'wf-001',
title: '코성형 전후 비교 YouTube Shorts',
contentType: 'video',
channel: 'YouTube Shorts',
channelIcon: 'youtube',
stage: 'ai-draft',
videoDraft: {
script: `[인트로 — 0~3초]\n"코가 달라지면 인상이 달라져요."\n(전 사진 → 후 사진 전환)\n\n[본문 — 3~25초]\n"VIEW 성형외과의 코성형, 단순히 높이는 것이 아닙니다."\n"얼굴 전체 비율을 분석한 맞춤형 디자인,"\n"21년 무사고 기록이 말해줍니다."\n(수술 과정 그래픽 삽입)\n\n[CTA — 25~30초]\n"지금 상담 예약 — 링크 프로필 참고"`,
shootingGuide: [
'전/후 고화질 사진 세로 4:5 비율로 준비',
'자연광 또는 소프트박스 조명에서 정면 + 3/4 앵글 촬영',
'배경: 클리닉 로고 배경 또는 화이트 배경',
'의사 얼굴 없이 사진 위주 편집 (환자 동의서 필수)',
],
duration: '30초',
},
},
{
id: 'wf-002',
title: '가슴성형 궁금증 5가지 — Instagram Reel',
contentType: 'video',
channel: 'Instagram',
channelIcon: 'instagram',
stage: 'review',
userNotes: '마지막 슬라이드에 전화번호 대신 카카오톡 채널명으로 바꿔주세요',
videoDraft: {
script: `[후크 — 0~2초]\n"가슴성형 전에 꼭 알아야 할 5가지"\n\n[1] 보형물 종류: 라운드 vs 물방울\n[2] 절개 위치 선택법\n[3] 회복 기간 현실 (3일~2주)\n[4] 재수술률을 낮추는 병원 고르는 기준\n[5] VIEW 21년 무사고의 비결\n\n[CTA]\n"자세한 상담은 카카오채널 \'뷰성형외과의원\'"`,
shootingGuide: [
'텍스트 슬라이드 5장 제작 (배경: #7B2D8E 그라디언트)',
'각 슬라이드에 VIEW 로고 워터마크 우측 하단 배치',
'트랜지션: 빠른 슬라이드 컷 (0.2초)',
'배경음악: 경쾌한 팝 인스트루멘탈 (저작권 무료)',
],
duration: '45초',
},
},
{
id: 'wf-003',
title: '코성형 Q&A 카드뉴스 — Naver 블로그',
contentType: 'image-text',
channel: 'Naver Blog',
channelIcon: 'globe',
stage: 'planning',
imageTextDraft: {
type: 'cardnews',
headline: '코성형, 궁금한 게 너무 많죠? 전문의가 직접 답합니다',
copy: [
'[카드 1] 코성형 후 붓기는 얼마나 지속되나요?\n→ 초기 붓기 1~2주, 완전 회복 3~6개월. 일상 복귀는 보통 1주일.',
'[카드 2] 실리콘 vs 연골, 어떤 재료가 좋나요?\n→ 높이와 형태 교정에 따라 다름. VIEW는 개인 맞춤형 복합 재료 활용.',
'[카드 3] 코성형 후 운동은 언제부터?\n→ 가벼운 걷기: 1주 후 / 격렬한 운동: 최소 4주 후.',
'[카드 4] VIEW 코성형이 다른 이유\n→ 21년 무사고 · 전담 의료진 · 3D 시뮬레이션 상담 제공.',
],
layoutHint: '4장 카드 세로형, 보라+골드 브랜드 컬러, 마지막 카드에 CTA (상담 예약 버튼)',
},
},
{
id: 'wf-004',
title: '눈성형 회복기 솔직 후기 블로그 포스트',
contentType: 'image-text',
channel: 'Naver Blog',
channelIcon: 'globe',
stage: 'approved',
scheduledDate: '2026-05-06',
imageTextDraft: {
type: 'blog',
headline: '눈성형 2주 후 솔직 리뷰 — VIEW 성형외과 후기',
copy: [
'수술 당일: 2시간 소요, 국소마취. 통증 최소화 확인.',
'수술 다음날: 붓기 있지만 일상생활 가능 수준.',
'1주일 후: 자연스러운 라인 확인. 실밥 제거.',
'2주일 후: 친구들도 "뭔가 달라졌는데?" 반응.',
'VIEW의 장점: 의사 선생님이 수술 전 충분히 상담해주셔서 기대치 조정이 잘 됐습니다.',
],
layoutHint: '1200px 썸네일 + 본문 2000자 이상, 키워드: 눈성형 후기, 강남 눈성형, VIEW 성형외과',
},
},
{
id: 'wf-005',
title: '21년 무사고 스토리 TikTok',
contentType: 'video',
channel: 'TikTok',
channelIcon: 'video',
stage: 'scheduled',
scheduledDate: '2026-05-02',
videoDraft: {
script: `"21년 동안 단 한 건의 의료사고도 없었습니다."\n(숫자 카운터 애니메이션: 0 → 21)\n"이게 VIEW의 자랑입니다."\n#강남성형외과 #무사고 #VIEW성형외과`,
shootingGuide: [
'텍스트 애니메이션 위주 편집 (After Effects 또는 CapCut)',
'배경: 클리닉 내부 실사 영상 블러 처리',
'폰트: VIEW 브랜드 서체 일치',
],
duration: '15초',
},
},
],
},
};

View File

@ -1,517 +0,0 @@
import type { MarketingPlan } from '@/features/plan/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초',
},
},
],
},
};

View File

@ -1,440 +0,0 @@
import type { MarketingPlan } from '@/features/plan/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분',
},
},
],
},
};

View File

@ -1,508 +0,0 @@
import type { MarketingPlan } from '@/features/plan/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개 계정 성과 리뷰 루틴 수립',
],
},
},
],
},
};

View File

@ -1,507 +0,0 @@
import type { MarketingPlan } from '@/features/plan/types/plan';
/**
* O2O Clinic ( )
*
* · /
* INFINITH . 6
* ·.
*/
export const mockPlanO2O: MarketingPlan = {
id: 'o2o',
reportId: 'o2o',
clinicName: 'O2O Clinic',
clinicNameEn: 'O2O Plastic Surgery Clinic',
createdAt: '2026-04-14',
targetUrl: 'https://www.o2oclinic.com',
// ─── Section 1: Brand Guide ───
brandGuide: {
colors: [
{ name: 'Indigo Deep', hex: '#1E1B4B', usage: '주요 헤더·CTA 버튼 — 신뢰·전문성·기술적 정확성 상징' },
{ name: 'Cyan', hex: '#06B6D4', usage: '강조색 — 혁신·연결·글로벌 환영의 시그널' },
{ name: 'Slate Light', hex: '#F8FAFC', usage: '섹션 배경 — 대비되는 깨끗한 여백' },
{ name: 'Slate 900', hex: '#0F172A', usage: '본문 텍스트·고대비 강조' },
{ name: 'Slate 500', hex: '#64748B', usage: '서브 텍스트·메타 정보' },
],
fonts: [
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩·섹션 타이틀', sampleText: 'O2O Clinic — 9년의 임상, 2,547개의 진심' },
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: 'O2O Clinic은 눈·코·윤곽 전문 클리닉입니다' },
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩·O2O 워드마크', sampleText: 'O2O Clinic — Eye, Nose, Contouring' },
],
logoRules: [
{ rule: 'Indigo + Cyan 그라디언트 워드마크 통일', description: 'O2O 워드마크는 Indigo Deep → Cyan 그라디언트를 모든 채널에서 동일 적용', correct: true },
{ rule: '원형 로고: 화이트 배경 + Indigo 심볼', description: '프로필 사진용 1080×1080 원형 — 화이트 배경 + Indigo "O2O" 심볼', correct: true },
{ rule: '글로벌 채널: 영문 로고 단독', description: '@o2o_clinic_global, Facebook Global 등 영문 채널은 한글 병기 제외', correct: true },
{ rule: '여백 규칙', description: '로고 크기의 30% 이상 여백 확보 — 가독성 + 브랜드 권위', correct: true },
{ rule: '단색 사용 시', description: '단색 적용 시 Indigo Deep (#1E1B4B) 단독, 흰 배경에서만 사용', correct: true },
],
toneOfVoice: {
personality: ['전문적', '신뢰감 있는', '글로벌', '따뜻한', '명확한'],
communicationStyle: '9년의 임상과 2,547개의 검증된 후기를 근거로 하되, 교육적이고 환자 친화적인 어조로 전달합니다. 시술 결과보다 의사결정 과정의 투명성을 강조.',
doExamples: [
'"눈성형은 결과보다 디자인이 결정합니다 — 오투오 원장의 5원칙"',
'"9년의 임상, 2,547개의 진심 — O2O Clinic"',
'"한·영·중·일 상담 가능 — Global Patients Welcome"',
'"강남언니 9.5점이 증명하는 디테일"',
],
dontExamples: [
'"강남 No.1!" — 비교 광고 표현',
'"100% 만족 보장" — 의료광고법 위반 가능성',
'"오늘까지 50% 할인" — 가격 경쟁 톤 지양',
'"인생이 바뀝니다" — 과장 표현 금지',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: 'O2O Indigo+Cyan 원형 로고 1080×1080', bannerSpec: '2560×1440px, Indigo Deep 배경 + Cyan 악센트, "Eye · Nose · Contouring · Since 2017"', bioTemplate: 'O2O Clinic — 눈·코·윤곽 전문\n오투오 원장 · 강남역 | 02-2020-2020\no2oclinic.com', currentStatus: 'correct' },
{ channel: 'Instagram KR', icon: 'instagram', profilePhoto: 'O2O Indigo+Cyan 원형 로고', bannerSpec: 'N/A (하이라이트: 눈성형/코성형/윤곽/리뷰/글로벌 — Indigo+Cyan 톤)', bioTemplate: 'O2O Clinic 공식 · 눈·코·윤곽 전문\n강남역 | 02-2020-2020 · o2oclinic.com', currentStatus: 'correct' },
{ channel: 'Instagram Global', icon: 'instagram', profilePhoto: 'O2O 영문 로고', bannerSpec: 'N/A (Highlights: Eye/Nose/Contouring/Reviews/Booking)', bioTemplate: 'O2O Clinic Global · Eye · Nose · Facial Contouring\nGangnam Seoul · DM for English/Chinese/Japanese consultation', currentStatus: 'correct' },
{ channel: 'Facebook Global', icon: 'facebook', profilePhoto: 'O2O 영문 로고', bannerSpec: '820×312px, Indigo+Cyan 배경 + "Eye · Nose · Contouring · Multilingual"', bioTemplate: 'O2O Clinic — 9 Years of Excellence in Eye, Nose, Facial Contouring\nGangnam Seoul · WhatsApp + DM Welcome', currentStatus: 'correct' },
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: 'O2O 로고', bannerSpec: '블로그 상단: 워드마크 + 시술 카테고리 메뉴 (눈/코/윤곽)', bioTemplate: 'O2O Clinic 공식 블로그 — 눈·코·윤곽 전문\n오투오 원장 · 강남역 · 9년 임상', currentStatus: 'correct' },
{ channel: 'TikTok', icon: 'video', profilePhoto: 'O2O Indigo+Cyan 원형 로고', bannerSpec: 'N/A', bioTemplate: 'O2O Clinic · 눈·코·윤곽 · 강남역\nReal Cases | DM 상담', currentStatus: 'incorrect' },
],
brandInconsistencies: [
{
field: '브랜드 컬러 적용',
values: [
{ channel: 'YouTube', value: 'Indigo+Cyan 그라디언트 적용 완료', isCorrect: true },
{ channel: 'Instagram KR', value: 'Indigo+Cyan 적용 완료', isCorrect: true },
{ channel: 'Instagram Global', value: 'Indigo+Cyan 적용 완료', isCorrect: true },
{ channel: 'TikTok', value: '단색 화이트 — 브랜드 컬러 미적용', isCorrect: false },
],
impact: '6개 채널 중 5개에서 브랜드 컬러 일관성 우수. TikTok만 제외 — 즉시 수정 시 전 채널 통일성 100%',
recommendation: 'TikTok 프로필 사진을 Indigo+Cyan 원형 로고로 교체 + 채널 아트 통일',
},
{
field: 'CTA 메시지 통일',
values: [
{ channel: 'YouTube', value: '"카카오톡 상담 + 홈페이지"', isCorrect: true },
{ channel: 'Instagram KR', value: '"DM 상담 + 카카오톡"', isCorrect: true },
{ channel: 'Facebook Global', value: '"WhatsApp + DM"', isCorrect: true },
{ channel: 'Naver Blog', value: '"전화 + 카카오톡"', isCorrect: false },
],
impact: 'KR 채널 CTA가 카카오톡 위주로 정착되어 있으나 블로그만 전화 위주 — 모바일 환자 전환 손실 가능',
recommendation: '네이버 블로그 포스트 상단 + 하단 CTA를 "카카오톡 상담 → 전화 백업" 순으로 통일',
},
],
},
// ─── Section 2: Channel Strategies ───
channelStrategies: [
{
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
currentStatus: '@o2oclinic — 5,840 구독자, 280 영상, 주 2회 안정 업로드',
targetGoal: '20K 구독자 / 12개월, 다국어 자막 50개 추가',
contentTypes: ['오투오 원장 Q&A 롱폼', 'Shorts (기존 영상 클립)', '국제 환자 브이로그 (다국어 자막)'],
postingFrequency: '주 2회 (Long 1 + Shorts 1)',
tone: '교육적 전문가 — 오투오 원장 직접 설명',
formatGuidelines: [
'롱폼: 6~12분, 시술별 시리즈 (눈/코/윤곽)',
'Shorts: 30~60초, 후크 3초 내 + 다국어 자막',
'썸네일: Indigo+Cyan 워터마크 통일',
'국제 환자 브이로그: EN/ZH/JP 자막 필수',
],
priority: 'P0',
customerJourneyStage: 'consideration',
},
{
channelId: 'instagram_kr', channelName: 'Instagram KR', icon: 'instagram',
currentStatus: '@o2o_clinic — 8,210 팔로워, 1,850 게시물, Reels 142개',
targetGoal: '25K 팔로워 / 12개월, Reels 주 5개',
contentTypes: ['Reels (YouTube Shorts 동시 배포)', 'Carousel (강남언니 2,547 리뷰 스토리화)', 'Stories (병원 일상 + Q&A)', '인플루언서 협업 카루셀'],
postingFrequency: '일 1회 + Stories 일 2-3개',
tone: '전문성 + 친근함 — 시술 디테일을 쉽게 풀어내는 톤',
formatGuidelines: [
'Reels: YouTube Shorts와 동시 게시 (자산 재활용 우선)',
'Carousel: 강남언니 리뷰 50개 선별 → 카루셀 시리즈',
'Stories: 눈/코/윤곽 카테고리별 하이라이트 재구성',
'해시태그: #O2OClinic #강남눈성형 #강남코성형 #윤곽수술 #오투오원장',
],
priority: 'P0',
customerJourneyStage: 'interest',
},
{
channelId: 'instagram_global', channelName: 'Instagram Global', icon: 'instagram',
currentStatus: '@o2o_clinic_global — 6,320 팔로워, 480 게시물, 다국어 Reels',
targetGoal: '18K 팔로워 / 12개월, 의료관광 환자 직접 상담 50건/월',
contentTypes: ['English/Chinese/Japanese subtitled Reels', 'Patient journey Carousel', 'Multilingual FAQ Story'],
postingFrequency: '일 1회 (3개 언어 로테이션)',
tone: 'Professional & welcoming — Korea medical tourism storytelling',
formatGuidelines: [
'KR 콘텐츠 → EN/ZH/JP 번역 자동 배포 파이프라인',
'WhatsApp 상담 CTA를 바이오 + 매 게시물에 삽입',
'Highlights: Eye / Nose / Contouring / Reviews / Booking 5개',
'해시태그: #KoreanPlasticSurgery #GangnamClinic #O2OClinic',
],
priority: 'P0',
customerJourneyStage: 'conversion',
},
{
channelId: 'facebook_global', channelName: 'Facebook Global', icon: 'facebook',
currentStatus: 'O2O Clinic Global — 3,025 팔로워, WhatsApp 연동, Pixel 설치 완료',
targetGoal: '12K 팔로워 + 리타겟팅 ROAS 4x / 6개월',
contentTypes: ['리타겟팅 광고 소재', 'Patient journey 영문 콘텐츠', 'Before/After (consent verified)'],
postingFrequency: '주 2-3회 + 광고 캠페인 상시',
tone: 'Authoritative & warm — 권위와 친근함의 균형',
formatGuidelines: [
'리타겟팅: o2oclinic.com 방문자 픽셀 데이터 활용 (P0)',
'광고 소재 4종 (눈/코/윤곽/Multi) — A/B 테스트 운영',
'WhatsApp CTA 우선 + Messenger 백업',
'월 KPI: ROAS 2.5x → 4.0x 단계 상향',
],
priority: 'P0',
customerJourneyStage: 'conversion',
},
{
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
currentStatus: 'blog.naver.com/o2oclinic — 주 2회 SEO 포스팅, 키워드 상위 30+',
targetGoal: '주 2회 유지 + 월 30,000 방문자 (12개월)',
contentTypes: ['SEO 시술 가이드', '환자 후기 (강남언니 리뷰 가공)', 'YouTube 영상 임베드 + 텍스트 가이드'],
postingFrequency: '주 2회',
tone: '정보성 전문가 — "강남 눈성형", "코성형 가격", "윤곽수술 후기" 키워드 중심',
formatGuidelines: [
'2,000자 이상 SEO 최적화 + 이미지 10장 + YouTube 임베드',
'CTA: 카카오톡 상담 우선 → 전화 백업으로 통일 (현재 불일치 수정)',
'키워드 맵: "강남 눈성형", "강남 코성형", "윤곽수술 가격", "오투오 원장"',
'월 1회 키워드 성과 분석 + 다음 달 주제 결정',
],
priority: 'P1',
customerJourneyStage: 'consideration',
},
{
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
currentStatus: '9.5점 / 2,547 리뷰 — 응답률 88%, 강남 상위 10%',
targetGoal: '응답률 95%, 12개월 내 3,800 리뷰',
contentTypes: ['리뷰 응답 (일 단위)', '시술 정보 업데이트', '리뷰 SNS 콘텐츠화'],
postingFrequency: '리뷰 응답: 일 단위 / 정보 업데이트: 월 2회',
tone: '진심 어린 의료진 답변 — 형식적 답변 지양',
formatGuidelines: [
'리뷰 응답률 88% → 95% (3개월) 단계 상향',
'2,547 리뷰 중 100개 선별 → SNS 카드뉴스 자산화',
'부정 리뷰 24시간 내 응답 원칙',
'강남언니 프로필에 다국어 시술 설명 추가',
],
priority: 'P0',
customerJourneyStage: 'loyalty',
},
{
channelId: 'tiktok', channelName: 'TikTok', icon: 'video',
currentStatus: '@o2oclinic — 3,400 팔로워, Pixel 미설치',
targetGoal: '12K 팔로워 + Pixel 설치 + 광고 ROAS 3x / 6개월',
contentTypes: ['YouTube Shorts 크로스포스팅', '트렌드 챌린지', '병원 비하인드'],
postingFrequency: '주 5회 (YouTube Shorts 동시 배포)',
tone: '가볍고 접근 가능한 — 20-30대 첫 수술 고민층 타겟',
formatGuidelines: [
'TikTok Pixel 즉시 설치 (P0) — 광고 ROAS 측정 가능화',
'280 YouTube 영상 → Shorts 추출 → TikTok 동시 배포',
'트렌딩 사운드 활용 + 자막 필수',
'의료광고법 준수 — 과장 표현 금지',
],
priority: 'P1',
customerJourneyStage: 'awareness',
},
{
channelId: 'kakaotalk', channelName: 'KakaoTalk', icon: 'messageSquare',
currentStatus: '카카오 채널 친구 4,200+, 자동응답 운영',
targetGoal: '친구 10,000+ + 상담 전환율 35%',
contentTypes: ['시술별 자동응답 시나리오', '예약 리마인더', '월 1회 시술 정보 발송'],
postingFrequency: '주 1-2회 메시지 발송',
tone: '따뜻하고 전문적인 1:1 상담 톤',
formatGuidelines: [
'자동응답 시나리오 — 눈/코/윤곽 시술별 분기',
'예약 리마인더 자동 발송',
'한국어 + 영문/중문 옵션 (의료관광 대비)',
],
priority: 'P1',
customerJourneyStage: 'conversion',
},
],
// ─── Section 3: Content Strategy ───
contentStrategy: {
pillars: [
{
title: '9년 임상의 디테일',
description: '2017년 개원 이래 9년간 축적한 눈·코·윤곽 임상 데이터와 수술 철학을 보여주는 콘텐츠',
relatedUSP: '9 Years of Specialized Expertise',
exampleTopics: ['오투오 원장의 자연스러운 눈성형 5원칙', '코성형 디자인의 3가지 핵심 변수', '윤곽수술이 인상에 미치는 변화', '9년간 변하지 않은 O2O의 원칙 3가지'],
color: '#1E1B4B',
},
{
title: '글로벌 환자 여정',
description: '영문/중문/일문 콘텐츠로 의료관광 환자의 내원 전후 여정을 다큐멘터리화 — 정보 + 신뢰',
relatedUSP: 'Multilingual Medical Tourism Care',
exampleTopics: ['From Bangkok to Seoul — Eye Surgery Journey', '中国患者ソウル鼻整形体験記', '강남에서 회복하기 — 외국인 환자 가이드', 'O2O 외국인 환자 케어 시스템 공개'],
color: '#06B6D4',
},
{
title: '2,547 리뷰의 진심',
description: '강남언니 9.5점 / 2,547 실사용 후기를 콘텐츠 자산으로 전환 — 신뢰 증거 극대화',
relatedUSP: 'Patient-Validated 9.5 Stars',
exampleTopics: ['"눈성형 후 진짜 자연스럽다" — 강남언니 베스트 리뷰 5', '2,547개 리뷰 공통 키워드 분석', '리뷰 만족도 Top 3 시술 — 데이터로 보는 O2O', '리뷰 작성 후기자 인터뷰'],
color: '#0F172A',
},
{
title: '인플루언서 컬래버 시리즈',
description: '뷰티/메디컬 크리에이터 협업 콘텐츠로 신규 환자 도달 — 분기별 5~8명 정기 협업',
relatedUSP: 'Trusted by Beauty Creators',
exampleTopics: ['뷰티 크리에이터 A의 O2O 코성형 후기', '메디컬 크리에이터 B의 윤곽수술 다큐멘터리', '크리에이터 라이브 Q&A', '협업 콘텐츠 비하인드'],
color: '#64748B',
},
],
typeMatrix: [
{ format: 'YouTube Long-form', channels: ['YouTube'], frequency: '주 1회', purpose: '오투오 원장 권위 + 9년 임상 증명' },
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram KR', 'Instagram Global', 'TikTok'], frequency: '주 5개', purpose: '280 영상 자산 재활용, 다채널 도달 확대' },
{ format: 'Carousel (리뷰 스토리)', channels: ['Instagram KR'], frequency: '주 2회', purpose: '2,547 리뷰 → 사회적 증거화' },
{ format: 'Multilingual Subtitled Reels', channels: ['Instagram Global'], frequency: '일 1회', purpose: '글로벌 환자 도달 + WhatsApp 전환' },
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '강남 눈/코/윤곽 검색 상위 노출' },
{ format: 'Influencer Collab Carousel', channels: ['Instagram KR'], frequency: '월 2회', purpose: '신규 팔로워 유입 + 권위 강화' },
{ format: 'Retargeting Ad Creative', channels: ['Facebook Global', 'Instagram Global'], frequency: '월 4-6개', purpose: '글로벌 의료관광 ROAS 향상' },
],
workflow: [
{ step: 1, name: '주제 발굴', description: '시술별 검색 키워드 + 콘텐츠 필러 매칭 + 인플루언서 협업 브리핑', owner: '마케팅 매니저', duration: '2일' },
{ step: 2, name: '제작 / 추출', description: 'AI 초안 + 280 영상 아카이브에서 Shorts 추출 + 인플루언서 컬래버 촬영', owner: 'AI + 콘텐츠팀', duration: '3-5일' },
{ step: 3, name: '의료 검수', description: '오투오 원장 + 의료진 검토 (의료광고법 포함)', owner: '의료진', duration: '1일' },
{ step: 4, name: '다국어 번역', description: 'EN/ZH/JP 자막·캡션 (Global 계정 동시 배포용)', owner: '번역팀', duration: '1-2일' },
{ step: 5, name: '비주얼 마감', description: 'Indigo+Cyan 워터마크 통일 + 채널별 포맷 최적화', owner: '디자인팀', duration: '1일' },
{ step: 6, name: '배포 & 추적', description: '전 채널 동시 배포 + UTM/픽셀 추적 + 강남언니 상담 연계', owner: '마케팅 매니저', duration: '당일' },
],
repurposingSource: '1개 오투오 원장 롱폼 영상 (10분) 또는 인플루언서 협업 콘텐츠 1편',
repurposingOutputs: [
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 풀 영상 (KR 기본 + EN/ZH/JP 자막)' },
{ format: 'Shorts 5개', channel: 'YouTube / TikTok', description: '핵심 구간 30-60초 추출 → 동시 배포' },
{ format: 'Reels 5개', channel: 'Instagram KR + Global', description: 'Shorts → KR 원본 + 다국어 자막 버전 동시 배포' },
{ format: 'Carousel 2개', channel: 'Instagram KR', description: '시술 가이드 카드뉴스로 재구성' },
{ format: 'Blog Post 1개', channel: 'Naver Blog', description: '영상 스크립트 → 2,000자 SEO 포스트 (영상 임베드)' },
{ format: 'Stories 5개', channel: 'Instagram KR + Global', description: '촬영 비하인드 + Q&A 스니펫' },
{ format: 'Ad Creative 2개', channel: 'Facebook Global', description: '글로벌 리타겟팅용 영문/중문 광고 소재' },
],
},
// ─── Section 4: Content Calendar ───
calendar: {
weeks: [
{
weekNumber: 1, label: 'Week 1: 9년 임상 — 눈성형 집중',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 오투오 원장의 자연스러운 눈성형 5원칙' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 눈성형 Before/After 30대 케이스' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 쌍수 vs 눈매교정 60초 비교' },
{ dayOfWeek: 2, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남 눈성형 추천 기준 — 9년 임상이 알려줍니다' },
{ dayOfWeek: 3, channel: 'Instagram Global', channelIcon: 'instagram', contentType: 'social', title: 'Reels (EN/ZH): Eye Surgery Recovery Timeline' },
{ dayOfWeek: 4, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 베스트 리뷰 5선 — 눈성형' },
{ dayOfWeek: 5, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(EN): Global 리타겟팅 — Eye Surgery 캠페인 런칭' },
],
},
{
weekNumber: 2, label: 'Week 2: 코성형 + 인플루언서 컬래버 1차',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 코성형 디자인의 3가지 핵심 변수' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: '인플루언서 컬래버 1편: 뷰티 크리에이터 A의 O2O 코성형' },
{ dayOfWeek: 2, channel: 'Instagram Global', channelIcon: 'instagram', contentType: 'social', title: 'Reels (JP): 鼻整形のリカバリータイムライン' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 붓기 30일 타임랩스' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 가격 vs 가치 — 9년 임상 기준 가이드' },
{ dayOfWeek: 4, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 디자인 시뮬레이션 비하인드' },
{ dayOfWeek: 5, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(EN/ZH): Nose Surgery 패키지 광고' },
],
},
{
weekNumber: 3, label: 'Week 3: 윤곽수술 + 글로벌 환자 여정',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 윤곽수술이 인상에 미치는 변화 — Real Cases' },
{ dayOfWeek: 1, channel: 'Instagram Global', channelIcon: 'instagram', contentType: 'social', title: 'Carousel (EN): From Bangkok to Seoul — Patient Journey' },
{ dayOfWeek: 2, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reel: V라인 윤곽수술 회복 일기 (동의 케이스)' },
{ dayOfWeek: 3, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 윤곽수술 Q&A — 가장 많이 묻는 질문 5' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '윤곽수술 후기 가이드 — 강남언니 2,547 리뷰가 알려준 것' },
{ dayOfWeek: 4, channel: 'Instagram Global', channelIcon: 'instagram', contentType: 'social', title: 'Story (JP): O2O予約フロー — 日本語ご相談' },
{ dayOfWeek: 5, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(JP): Facial Contouring Japan 타겟팅' },
],
},
{
weekNumber: 4, label: 'Week 4: 리뷰 자산 + 인플루언서 2차 + 월간 정리',
entries: [
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 9년간 변하지 않은 O2O의 원칙 3가지 — 오투오 원장 인터뷰' },
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 2,547 리뷰 공통 키워드 분석 — 자연스럽다 / 디테일 / 친절' },
{ dayOfWeek: 2, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: '인플루언서 컬래버 2편: 메디컬 크리에이터 B의 윤곽수술 다큐' },
{ dayOfWeek: 3, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 강남언니 9.5점 달성 감사 — 30초 메시지' },
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '월간 리뷰 — 4월 O2O Clinic 콘텐츠 베스트 7선' },
{ dayOfWeek: 4, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 다음 달 예고 — 5월 O2O 콘텐츠 시리즈 오픈' },
{ dayOfWeek: 5, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(Multi): 월말 글로벌 상담 CTA 캠페인' },
],
},
],
monthlySummary: [
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 12, color: '#1E1B4B' },
{ type: 'blog', label: '블로그', count: 4, color: '#06B6D4' },
{ type: 'social', label: 'Instagram KR/Global', count: 12, color: '#0F172A' },
{ type: 'ad', label: '광고 (Facebook Global)', count: 4, color: '#64748B' },
],
},
// ─── Section 5: Asset Collection ───
assetCollection: {
assets: [
{ id: 'o2o-a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: 'YouTube 영상 280개 아카이브 (@o2oclinic)', description: '9년간 누적 280개 영상 — Shorts 추출 + 다국어 자막 추가 우선 자산', repurposingSuggestions: ['Shorts 100개 추출 (P0)', 'EN/ZH/JP 자막 50개 추가', 'Instagram Reels 변환', 'Blog 임베드'], status: 'collected' },
{ id: 'o2o-a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 환자 리뷰 2,547건 (9.5점)', description: '2,547개 검증된 후기 — 시술별 분류 후 SNS 콘텐츠 자산화', repurposingSuggestions: ['리뷰 100개 → Carousel 시리즈', 'Story 카드 자동 발행 시스템', '광고 소셜프루프', 'Blog 환자 스토리'], status: 'pending' },
{ id: 'o2o-a3', source: 'social', sourceLabel: 'Instagram KR', type: 'photo', title: 'Instagram @o2o_clinic 게시물 1,850개', description: 'KR 메인 계정 누적 1,850 게시물 — 고성과 콘텐츠 → 다국어 변환 원본', repurposingSuggestions: ['고성과 게시물 → Reel 변환', 'Global 계정 다국어 배포', '광고 소재 추출'], status: 'collected' },
{ id: 'o2o-a4', source: 'social', sourceLabel: 'Instagram Global', type: 'photo', title: 'Instagram @o2o_clinic_global 다국어 콘텐츠', description: '480개 다국어 콘텐츠 — Facebook 광고 소재 + LINE/WeChat 콘텐츠 재활용', repurposingSuggestions: ['Facebook 글로벌 광고 소재', 'LINE/WeChat 콘텐츠 재활용', 'YouTube 다국어 시리즈 소스'], status: 'collected' },
{ id: 'o2o-a5', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: 'O2O Clinic 시설·의료진 사진', description: 'o2oclinic.com 시설 사진 + 오투오 원장 외 의료진 8명 프로필', repurposingSuggestions: ['Instagram 시설 투어 Reel', 'YouTube B-roll', '블로그 위치 안내', '광고 배경'], status: 'collected' },
{ id: 'o2o-a6', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 카테고리 3종 설명 (눈·코·윤곽)', description: 'o2oclinic.com 시술별 상세 설명 — 블로그 SEO + 다국어 카드뉴스 소스', repurposingSuggestions: ['블로그 SEO 포스트 소스', '다국어 카드뉴스 텍스트', 'WhatsApp 자동응답 FAQ 소스'], status: 'collected' },
{ id: 'o2o-a7', source: 'blog', sourceLabel: '네이버 블로그', type: 'text', title: '네이버 블로그 포스트 200+개', description: '주 2회 정기 발행 누적 — SEO 키워드 상위 노출 30+개', repurposingSuggestions: ['고트래픽 포스트 → Reel 변환', '키워드 맵 확장', '내부 링크 재구성'], status: 'collected' },
{ id: 'o2o-a8', source: 'social', sourceLabel: '인플루언서 협업', type: 'video', title: '뷰티/메디컬 크리에이터 협업 영상 (제작 필요)', description: '분기별 5~8명 정기 협업 시스템 — 신규 도달 + 권위 강화', repurposingSuggestions: ['Instagram 컬래버 카루셀', 'YouTube 협업 시리즈', 'TikTok 크로스포스팅', '광고 소셜프루프'], status: 'needs_creation' },
],
youtubeRepurpose: [
{ title: '오투오 원장이 알려주는 자연스러운 눈성형 5원칙', views: 84200, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Reels (KR + Global)', 'Blog 임베드', 'Carousel 2개'] },
{ title: '코성형 붓기, 솔직히 얼마나 가나요? — 30일 타임라인', views: 67500, type: 'Long', repurposeAs: ['Shorts 3개 추출', 'TikTok 크로스포스팅', 'Reels 변환', 'Blog SEO 포스트'] },
{ title: 'V라인 윤곽수술 회복 일기 — 환자 동의 케이스', views: 52300, type: 'Long', repurposeAs: ['Shorts 4개 추출', 'Carousel 시리즈', 'Global 계정 EN 자막'] },
{ title: '쌍수 vs 눈매교정 차이 60초', views: 124000, type: 'Short', repurposeAs: ['Instagram KR + Global 동시 배포', 'TikTok 크로스포스팅', 'Story 시리즈'] },
{ title: '코끝 성형 전후 — Real Case', views: 98700, type: 'Short', repurposeAs: ['Reels 변환', 'TikTok 트렌딩 사운드 추가', '광고 소재 활용'] },
],
},
// ─── Section 6: Repurposing Proposals ───
repurposingProposals: [
{
sourceVideo: { title: '오투오 원장 롱폼 인터뷰 (신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'high',
outputs: [
{ format: 'Shorts 5개', channel: 'YouTube / TikTok', description: '"9년의 원칙" 핵심 구간 30-60초 클립' },
{ format: 'Reels 5개 (KR + Global)', channel: 'Instagram KR + Global', description: 'Shorts 다국어 자막 버전 동시 배포' },
{ format: 'Carousel 2개', channel: 'Instagram KR', description: '오투오 원장 철학 카드뉴스화' },
{ format: 'Blog Post 1개', channel: 'Naver Blog', description: '인터뷰 풀 스크립트 → 2,500자 SEO 포스트' },
{ format: '광고 소재 2개', channel: 'Facebook Global', description: '"9 Years of Excellence" 영문/중문 광고' },
],
},
{
sourceVideo: { title: '강남언니 2,547 리뷰 → 콘텐츠화', views: 2547, type: 'Long', repurposeAs: [] },
estimatedEffort: 'low',
priority: 'high',
outputs: [
{ format: 'Carousel 시리즈 (월 8회)', channel: 'Instagram KR', description: '시술별 베스트 리뷰 카드뉴스 — 3년치 콘텐츠 자산' },
{ format: 'Story 자동 발행', channel: 'Instagram KR + Global', description: '매주 새 리뷰 → Story 자동 발행 파이프라인' },
{ format: '광고 소셜프루프', channel: 'Facebook Global', description: '"2,547 verified reviews" 영문 광고 소재' },
{ format: 'Blog 환자 스토리', channel: 'Naver Blog', description: '리뷰 → 환자 여정 스토리 블로그 변환' },
],
},
{
sourceVideo: { title: '인플루언서 컬래버 시리즈 (신규 제작 — 분기 5~8명)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'high',
priority: 'high',
outputs: [
{ format: '컬래버 카루셀', channel: 'Instagram KR', description: '인플루언서별 1편 카루셀 + 비하인드 Story' },
{ format: 'YouTube 협업 시리즈', channel: 'YouTube', description: '인플루언서 게스트 인터뷰 시리즈' },
{ format: 'TikTok 크로스포스팅', channel: 'TikTok', description: '협업 영상 클립 → TikTok 노출 확대' },
{ format: '광고 소재 활용', channel: 'Facebook + Instagram', description: '컬래버 콘텐츠 → 광고 리타겟팅 소재' },
],
},
{
sourceVideo: { title: '글로벌 환자 여정 다큐 (신규 제작 — 분기 1편)', views: 0, type: 'Long', repurposeAs: [] },
estimatedEffort: 'medium',
priority: 'medium',
outputs: [
{ format: 'YouTube 다큐 (다국어 자막)', channel: 'YouTube', description: '태국·일본·중국 환자 여정 풀 영상 — 글로벌 노출' },
{ format: 'Instagram Global Reels 시리즈', channel: 'Instagram Global', description: '여정 클립 → Global Reels 5편 시리즈' },
{ format: 'Facebook 광고', channel: 'Facebook Global', description: '국가별 타겟팅 광고 소재 (TH/JP/CN)' },
{ format: 'WhatsApp 콘텐츠', channel: 'WhatsApp 자동응답', description: '여정 요약 + 상담 CTA — 글로벌 환자 1차 응대' },
],
},
],
// ─── Section 7: Workflow Tracker ───
workflow: {
items: [
{
id: 'o2o-wf-001',
title: 'TikTok Pixel 설치 + 1차 광고 캠페인 런칭',
contentType: 'image-text',
channel: 'TikTok',
channelIcon: 'video',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: 'TikTok Pixel 설치 — ROAS 측정 시작',
copy: [
'o2oclinic.com에 TikTok Pixel 코드 설치 (GTM 통한 배포)',
'광고 캠페인 v1: 눈성형 Before/After Shorts → Awareness',
'광고 캠페인 v2: 인플루언서 컬래버 → Consideration',
'주간 ROAS 모니터링 + 예산 재배분 SOP 문서화',
],
},
},
{
id: 'o2o-wf-002',
title: 'YouTube 기존 영상 EN/ZH 자막 1차 30개 추가',
contentType: 'video',
channel: 'YouTube',
channelIcon: 'youtube',
stage: 'planning',
videoDraft: {
script: '[자막 추가 우선순위]\n1. 조회수 상위 10개 (눈성형 5원칙, 코성형 타임라인 등)\n2. 글로벌 검색 키워드 일치 영상 10개\n3. 인플루언서 컬래버 영상 10개\n\n[작업 방식]\n- EN 자막: AI 자동 → 네이티브 검수\n- ZH 자막: 중국어 전문 번역사 의뢰\n- YouTube Studio 다국어 제목·설명 동시 적용',
shootingGuide: [
'자막 완료 영상 → 채널 플레이리스트 "Multilingual" 신규 생성',
'제목·설명에 EN/ZH 키워드 추가 (SEO)',
'월간 자막 추가 KPI: 10개 → 누적 50개 (3개월)',
],
duration: '3개월 누적 50개',
},
},
{
id: 'o2o-wf-003',
title: 'Facebook Global 리타겟팅 광고 캠페인 v1',
contentType: 'image-text',
channel: 'Facebook Global',
channelIcon: 'facebook',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: 'Facebook 리타겟팅 — Pixel 활용 즉시 ROAS 향상',
copy: [
'o2oclinic.com 방문자 픽셀 데이터 활용 — 30일 lookback',
'광고 소재 4종: 눈/코/윤곽/Multi',
'타겟팅: 영문 페이지 방문자 + Instagram Global 팔로워',
'WhatsApp CTA 우선 + Messenger 백업',
'주간 ROAS 리뷰 + 소재 A/B 테스트 운영',
],
},
},
{
id: 'o2o-wf-004',
title: '인플루언서 협업 SOP 문서화 + 1차 5명 컨택',
contentType: 'image-text',
channel: 'Instagram KR',
channelIcon: 'instagram',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '인플루언서 협업 시스템화 — 분기 5~8명 정기 협업',
copy: [
'협업 SOP: 후보 선정 → 컨택 → 계약 → 촬영 → 콘텐츠 발행 → 성과 측정',
'1차 후보군: 뷰티 크리에이터 3명 + 메디컬 크리에이터 2명',
'협업 콘텐츠 패키지: Instagram 카루셀 + Story + Reel 1세트',
'계약: 의료광고법 준수 가이드 사전 공유 필수',
],
},
},
{
id: 'o2o-wf-005',
title: '강남언니 2,547 리뷰 자동 카드뉴스 시스템',
contentType: 'image-text',
channel: 'Instagram KR',
channelIcon: 'instagram',
stage: 'ai-draft',
imageTextDraft: {
type: 'cardnews',
headline: '2,547개의 진심 — 강남언니 9.5점이 증명합니다',
copy: [
'슬라이드 1: "강남언니 9.5점 / 2,547 리뷰 — 감사합니다"',
'슬라이드 2-5: 시술별 베스트 리뷰 4개 발췌 (익명화 처리)',
'슬라이드 6: "리뷰 작성 → 강남언니 프로필 링크"',
'주 2회 자동 발행 — 신규 리뷰 RSS 모니터링',
],
layoutHint: 'Indigo Deep 배경, Cyan 강조 텍스트, O2O 워드마크 하단 고정',
},
},
],
},
};

View File

@ -1,460 +0,0 @@
import type { MarketingPlan } from '@/features/plan/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분',
},
},
],
},
};

View File

@ -1,439 +0,0 @@
import type { MarketingPlan } from '@/features/plan/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%)
* - 25 ( ), , · ,
* - : ////
* - 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.k-wonjin.co.kr',
// ─── 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: '25년 강남 코성형 전문 · 국제 환자 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: ['글로벌 전문가', '신뢰감 있는', '25년 역사', '국제적', '환자 중심'],
communicationStyle: '25년 축적된 코성형·눈성형 임상 경험과 강남언니 11,846 리뷰를 근거로, 국내외 환자 모두에게 신뢰를 전달합니다. 다국어 소통으로 글로벌 환자를 환영하는 따뜻한 전문성.',
doExamples: [
'"25년 코성형 전문 — 원진성형외과"',
'"강남언니 11,846 리뷰 · 9.3점이 증명합니다"',
'"한/영/중/일/태 — 어느 언어로도 상담드립니다"',
'"권진 원장의 코성형 원칙: 자연스러움이 기준입니다"',
],
dontExamples: [
'"강남 최고! 파격 할인!"',
'"100% 만족 보장"',
'"연예인 시술 병원"',
],
},
channelBranding: [
{ channel: 'YouTube', icon: 'youtube', profilePhoto: 'Wonjin 원형 로고 1080×1080', bannerSpec: '2560×1440px, Deep Purple 배경 + Violet 악센트, "25년 강남 코성형 전문"', bioTemplate: 'WJ원진성형외과 — 코성형·눈성형 전문\n25년 임상 · 강남역 | 02-544-0404\nk-wonjin.co.kr', currentStatus: 'incorrect' },
{ channel: 'Instagram KR (@wonjin_official)', icon: 'instagram', profilePhoto: 'Wonjin Deep Purple 원형 로고', bannerSpec: 'N/A (하이라이트: 코성형/눈성형/후기/이벤트/글로벌 — Purple 톤)', bioTemplate: '원진성형외과 KR 공식 — 25년 임상\n강남역 | 02-544-0404 | k-wonjin.co.kr', 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 | k-wonjin.co.kr', 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 | k-wonjin.co.kr', currentStatus: 'incorrect' },
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: 'Wonjin 로고', bannerSpec: '블로그 상단: 로고 + 코성형·눈성형 카테고리 메뉴', bioTemplate: '원진성형외과 공식 블로그 — 25년 코성형 전문\n강남역 | k-wonjin.co.kr', 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: '"25년 코성형 전문의가 말하는" — 국내외 환자 모두 대상',
formatGuidelines: [
'롱폼: 코성형·눈성형 케이스 스터디 — 권진 원장 직접 해설',
'외국인 환자 브이로그: EN/CN/JP/TH 자막 추가',
'썸네일: Deep Purple+Violet 통일, 코 Before/After 병치',
'타이틀: "25년 코성형 전문의가 알려주는 ___" 패턴',
],
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: 권진 원장 일상, 시술 비하인드',
'해시태그: #원진성형외과 #강남코성형 #권진원장 #25년임상',
],
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: '"강남 코성형", "25년 원진" 키워드 중심',
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: '25년 코성형 전문성',
description: '2001년 개원 이래 25년 축적된 코성형·눈성형 케이스와 기술',
relatedUSP: '35 Years Rhinoplasty Authority',
exampleTopics: ['권진 원장의 코성형 디자인 철학', '25년 케이스에서 배운 재수술 예방법', '자연스러운 코 라인의 기준'],
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: '25년 코성형 전문성 증명, 깊은 신뢰' },
{ 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: '롱폼: 권진 원장의 25년 코성형 원칙' },
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 자연스러운 라인 Q&A' },
{ dayOfWeek: 2, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '원진성형외과 블로그 재가동 — 25년 코성형 가이드 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: '코성형 재수술 피하는 법 — 25년 임상 기준' },
{ 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: '롱폼: 원진성형외과 — 25년, 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"원진성형외과, 25년 코성형 전문."\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] "25년 노하우가 뭔지 수술 결과로 처음 알았습니다" — 코성형 환자',
'[카드 2] "재수술 걱정 없이 결정한 이유 — 원진의 원칙이 달랐습니다"',
'[카드 3] "일본에서 왔는데 일어로 상담해주셔서 너무 편했어요"',
'[카드 4] "권진 원장님이 직접 케이스를 설명해주셨습니다"',
'[카드 5] 강남언니 9.3점 · 원진성형외과 — 프로필 링크에서 확인',
],
layoutHint: '5장 세로형, Deep Purple+Violet, 마지막 카드에 다국어 상담 CTA',
},
},
{
id: 'wf-003',
title: '원진성형외과 블로그 재가동 — 25년 코성형',
contentType: 'image-text',
channel: 'Naver Blog',
channelIcon: 'globe',
stage: 'planning',
imageTextDraft: {
type: 'blog',
headline: '원진성형외과 25년 — 코성형 전문의가 직접 씁니다',
copy: [
'2001년 개원, 25년간 강남역에서 코성형·눈성형을 전문으로 해왔습니다.',
'강남언니 11,846 리뷰 / 9.3점 — 환자 여러분이 만든 기록입니다.',
'한/영/중/일/태 5개 언어로 상담 가능한 병원, 세계 각국 환자를 모십니다.',
'매주 2회, 코성형·눈성형 전문 정보를 이 블로그에서 공유합니다.',
],
layoutHint: '1200px 썸네일 + 2,000자, 키워드: 강남 코성형, 원진성형외과, 코성형 추천, 25년',
},
},
{
id: 'wf-004',
title: '권진 원장 코성형 25년 인터뷰 — YouTube 롱폼',
contentType: 'video',
channel: 'YouTube',
channelIcon: 'youtube',
stage: 'approved',
scheduledDate: '2026-04-21',
videoDraft: {
script: `[오프닝]\n"안녕하세요, 원진성형외과 권진입니다."\n"25년간 코성형에만 집중한 이유를 말씀드립니다."\n\n[원칙 1: 자연스러움]\n"코성형의 결과는 티가 나지 않는 것이 최고입니다."\n\n[원칙 2: 재수술 예방]\n"좋은 코성형은 10년 후에도 유지됩니다."\n\n[글로벌 메시지]\n"어떤 언어로도 상담드립니다 — 원진성형외과."\n\n[클로징]\n"11,846 리뷰, 25년 — 결과로 증명합니다."`,
shootingGuide: [
'강남역 원진 원장실 자연광',
'권진 원장 정면 + 3/4 앵글',
'한글 + EN + CN 자막 3가지 버전',
'Deep Purple+Violet 인트로/아웃트로',
],
duration: '8분',
},
},
],
},
};

View File

@ -3,7 +3,7 @@ import type { MarketingPlan } from '@/features/plan/types/plan';
/**
* CSV .
* `=== Section Title ===` .
* + (Excel ).
* Excel/Numbers UTF-8 BOM .
*/
@ -11,6 +11,12 @@ type Cell = string | number | boolean | null | undefined;
type Row = Cell[];
type Section = { title: string; rows: Row[] };
// 캘린더 dayOfWeek 인덱스 → 한글 요일 (월=0, 화=1, ..., 일=6)
const DAYS_KO = ['월', '화', '수', '목', '금', '토', '일'] as const;
function formatDayOfWeek(idx: number): string {
return DAYS_KO[idx] ?? String(idx);
}
function escapeCell(value: Cell): string {
const s = String(value ?? '');
if (/[",\n\r]/.test(s)) {
@ -137,7 +143,7 @@ function buildPlanCsv(plan: MarketingPlan): string {
title: 'Content Pillars',
rows: [
['Title', 'Description', 'Related USP', 'Example Topics'],
...cs.pillars.map((p) => [p.title, p.description, p.relatedUSP, (p.exampleTopics ?? []).join(' | ')]),
...cs.pillars.map((p) => [p.title, p.description, p.relatedUsp, (p.exampleTopics ?? []).join(' | ')]),
],
});
}
@ -177,7 +183,7 @@ function buildPlanCsv(plan: MarketingPlan): string {
w.entries.forEach((e, i) => {
rows.push([
i === 0 ? w.label : '',
e.dayOfWeek,
formatDayOfWeek(e.dayOfWeek),
e.channel,
e.contentType,
e.title,
@ -264,10 +270,11 @@ function buildPlanCsv(plan: MarketingPlan): string {
}
// ─── 조립 ───
// Excel에서 보기 좋도록: 섹션 사이에 빈 행 + 섹션 제목(한 셀) → 컬럼 헤더 → 데이터
const lines: string[] = [];
sections.forEach((sec, idx) => {
if (idx > 0) lines.push('');
lines.push(`=== ${sec.title} ===`);
lines.push(escapeCell(sec.title));
sec.rows.forEach((row) => lines.push(row.map(escapeCell).join(',')));
});

View File

@ -89,35 +89,35 @@ function buildContentPillars(
{
title: '전문성 · 신뢰',
description: '의료진 소개, 수술 과정, 인증/자격, 학회 발표, 해외 연수 콘텐츠로 신뢰 구축',
relatedUSP: '전문 의료진',
relatedUsp: '전문 의료진',
exampleTopics: services?.slice(0, 3).map(s => `${s} 시술 과정 소개`) || ['시술 과정 소개'],
color: PILLAR_COLORS[0],
},
{
title: '비포 · 애프터',
description: '실제 환자 사례, 수술 전후 비교, 3D 시뮬레이션, 시간별 변화 기록으로 결과 시각화',
relatedUSP: '검증된 결과',
relatedUsp: '검증된 결과',
exampleTopics: services?.slice(0, 3).map(s => `${s} 비포/애프터`) || ['비포/애프터 사례'],
color: PILLAR_COLORS[1],
},
{
title: '환자 후기 · 리뷰',
description: '실제 환자 인터뷰, 후기 콘텐츠, 강남언니 리뷰 관리로 사회적 증거 확보',
relatedUSP: '환자 만족도',
relatedUsp: '환자 만족도',
exampleTopics: ['환자 인터뷰 영상', '리뷰 하이라이트', '회복 일기'],
color: PILLAR_COLORS[2],
},
{
title: '트렌드 · 교육',
description: '시술 트렌드, Q&A, 의학 정보, 비용 가이드로 잠재 고객 유입',
relatedUSP: '최신 트렌드',
relatedUsp: '최신 트렌드',
exampleTopics: ['자주 묻는 질문 Q&A', '시술별 비용 가이드', '최신 성형 트렌드'],
color: PILLAR_COLORS[3],
},
{
title: '안전 · 케어',
description: '수술 후 관리, 24시간 모니터링, 전담 간호사, 리커버리 프로그램으로 프리미엄 케어 차별화',
relatedUSP: '프리미엄 안전 관리',
relatedUsp: '프리미엄 안전 관리',
exampleTopics: ['수술 후 48시간 집중 케어', '전담 간호사 1:1 관리', '응급 대응 프로토콜'],
color: PILLAR_COLORS[4],
},

View File

@ -75,7 +75,7 @@ export default function PlanPage() {
<MyAssetUpload analysisRunId={id} />
</div>
<PlanCTA />
<PlanCTA plan={data} />
</div>
);
}

View File

@ -67,7 +67,7 @@ export interface ChannelStrategyCard {
export interface ContentPillar {
title: string;
description: string;
relatedUSP: string;
relatedUsp: string;
exampleTopics: string[];
color: string;
}

View File

@ -1,6 +1,6 @@
import type { ComponentType, CSSProperties } from 'react';
import { motion } from 'motion/react';
import { Youtube, Instagram, Globe, Star, Facebook, Search } from 'lucide-react';
import { Youtube, Instagram, Globe, Star, Facebook, Search, MapPin, FileText, Music } from 'lucide-react';
import { SectionWrapper } from './ui/SectionWrapper';
import { ScoreRing } from './ui/ScoreRing';
import { SeverityBadge } from './ui/SeverityBadge';
@ -17,6 +17,9 @@ const iconMap: Record<string, ComponentType<{ size?: number; className?: string;
star: Star,
globe: Globe,
search: Search,
map: MapPin,
blog: FileText,
video: Music,
};
const channelLabel: Record<string, string> = {
@ -38,8 +41,22 @@ const brandColor: Record<string, string> = {
globe: '#6B2D8B',
};
function getChannelColor(icon: string | undefined): string | undefined {
return brandColor[icon?.toLowerCase() ?? ''];
/** channel 이름 (영문 key 또는 한글) → iconMap·brandColor 의 키로 정규화 */
function resolveChannelKey(raw: string | undefined): string | undefined {
if (!raw) return undefined;
const norm = raw.toLowerCase().replace(/\s+/g, '');
// 영문 키
if (norm in iconMap) return norm;
// 한글 별칭
if (norm.includes('유튜브') || norm.includes('youtube')) return 'youtube';
if (norm.includes('인스타') || norm.includes('instagram')) return 'instagram';
if (norm.includes('페이스북') || norm.includes('facebook')) return 'facebook';
if (norm.includes('네이버블로그') || norm.includes('naverblog') || norm.includes('블로그')) return 'blog';
if (norm.includes('네이버플레이스') || norm.includes('naverplace') || norm.includes('플레이스')) return 'map';
if (norm.includes('강남언니') || norm.includes('gangnamunni')) return 'star';
if (norm.includes('틱톡') || norm.includes('tiktok')) return 'video';
if (norm.includes('웹사이트') || norm.includes('website') || norm.includes('홈페이지')) return 'globe';
return undefined;
}
export default function ChannelOverview({ channels }: ChannelOverviewProps) {
@ -47,8 +64,10 @@ export default function ChannelOverview({ channels }: ChannelOverviewProps) {
<SectionWrapper id="channel-overview" title="Channel Health Score" subtitle="채널별 건강도 종합">
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
{channels.map((ch, i) => {
const Icon = iconMap[ch.icon?.toLowerCase()] ?? Globe;
const color = getChannelColor(ch.icon);
// 1) icon 값으로 매칭 → 2) channel 이름 (한글 포함) 으로 fallback
const key = resolveChannelKey(ch.icon) || resolveChannelKey(ch.channel);
const Icon = key ? iconMap[key] : Globe;
const color = key ? brandColor[key] : undefined;
return (
<motion.div
key={ch.channel}

View File

@ -1,10 +1,13 @@
import { motion } from 'motion/react';
import { Calendar, Users, MapPin, Phone, BadgeCheck, Star, Globe, ExternalLink, Building2 } from 'lucide-react';
import { SectionWrapper } from './ui/SectionWrapper';
import { ExternalLinkButtons, buildClinicLinks } from './ui/ExternalLinkButtons';
import type { ClinicSnapshot as ClinicSnapshotType } from '@/features/report/types/report';
interface ClinicSnapshotProps {
data: ClinicSnapshotType;
targetUrl?: string;
socialHandles?: Record<string, string | null> | null;
}
function formatNumber(n: number): string {
@ -30,12 +33,26 @@ const infoFields = (data: ClinicSnapshotType): InfoField[] => [
data.registryData?.websiteEn ? { label: '영문 사이트', value: data.registryData.websiteEn, icon: Globe, href: data.registryData.websiteEn } : null,
].filter(Boolean) as InfoField[];
export default function ClinicSnapshot({ data }: ClinicSnapshotProps) {
export default function ClinicSnapshot({ data, targetUrl, socialHandles }: ClinicSnapshotProps) {
const fields = infoFields(data);
const linkItems = buildClinicLinks({
homepage: targetUrl || data.domain,
gangnamUnniUrl: data.registryData?.gangnamUnniUrl,
naverPlaceUrl: data.registryData?.naverPlaceUrl,
googleMapsUrl: data.registryData?.googleMapsUrl,
youtubeUrl: socialHandles?.youtube ? `https://youtube.com/${socialHandles.youtube.replace(/^@/, '@')}` : null,
instagramUrl: socialHandles?.instagram ? `https://instagram.com/${socialHandles.instagram.replace(/^@/, '')}` : null,
facebookUrl: socialHandles?.facebook ? `https://facebook.com/${socialHandles.facebook}` : null,
naverBlogUrl: socialHandles?.naverBlog || null,
tiktokUrl: socialHandles?.tiktok || null,
});
return (
<SectionWrapper id="clinic-snapshot" title="Clinic Overview" subtitle="병원 기본 정보">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-8">
{/* 외부 채널/플랫폼 링크 버튼 — URL 있는 항목만 색깔 버튼으로 렌더링 */}
<ExternalLinkButtons items={linkItems} className="mb-8" />
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
{fields.map((field, i) => {
const Icon = field.icon;
return (

View File

@ -1,14 +1,22 @@
import { motion } from 'motion/react';
import { useParams, useNavigate } from 'react-router';
import { TrendingUp, ArrowUpRight, Download, Loader2 } from 'lucide-react';
import { TrendingUp, ArrowUpRight, Download, Loader2, FileText, FileSpreadsheet, ChevronDown } from 'lucide-react';
import { SectionWrapper } from './ui/SectionWrapper';
import { Button } from '@/shared/ui/button';
import {
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuItem,
} from '@/shared/ui/dropdown-menu';
import { useExportPDF } from '@/features/report/hooks/useExportPDF';
import type { KPIMetric } from '@/features/report/types/report';
import { useExportCSV } from '@/features/report/hooks/useExportCSV';
import type { KPIMetric, MarketingReport } from '@/features/report/types/report';
interface KPIDashboardProps {
metrics: KPIMetric[];
clinicName?: string;
/** 전체 리포트 — CSV 내보내기에 사용 */
report?: MarketingReport;
}
function isNegativeValue(value: string | number): boolean {
@ -30,10 +38,12 @@ function formatKpiValue(value: string | number): string {
return str;
}
export default function KPIDashboard({ metrics, clinicName }: KPIDashboardProps) {
export default function KPIDashboard({ metrics, clinicName, report }: KPIDashboardProps) {
const { id } = useParams<{ id: string }>();
const navigate = useNavigate();
const { exportPDF, isExporting } = useExportPDF();
const { exportReportCSV } = useExportCSV();
const baseFilename = `INFINITH_Marketing_Report_${clinicName || 'Report'}`;
return (
<SectionWrapper id="kpi-dashboard" title="KPI Dashboard" subtitle="핵심 성과 지표 목표">
@ -97,20 +107,20 @@ export default function KPIDashboard({ metrics, clinicName }: KPIDashboardProps)
INFINITH . 90 .
</p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
<Button
<button
type="button"
onClick={() => navigate(`/plan/${id || 'live'}#branding-guide`)}
className="inline-flex items-center gap-2 bg-gradient-to-r from-brand-purple to-brand-purple-deep text-white font-semibold px-8 py-4 h-auto rounded-full hover:from-brand-purple hover:to-brand-purple-deep hover:shadow-xl"
className="inline-flex items-center gap-2 bg-gradient-to-r from-brand-purple to-brand-purple-deep text-white font-semibold px-8 py-4 rounded-full hover:shadow-xl transition-all"
>
<ArrowUpRight size={18} />
</Button>
<Button
</button>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<button
type="button"
variant="outline"
onClick={() => exportPDF(`INFINITH_Marketing_Report_${clinicName || 'Report'}`)}
disabled={isExporting}
className="inline-flex items-center gap-2 bg-white border-slate-200 text-brand-purple-deep font-semibold px-8 py-4 h-auto rounded-full hover:bg-slate-50 shadow-sm hover:shadow-md disabled:opacity-60 disabled:cursor-not-allowed"
className="inline-flex items-center gap-2 bg-white border border-slate-200 text-brand-purple-deep font-semibold px-8 py-4 rounded-full hover:bg-slate-50 shadow-sm hover:shadow-md transition-all disabled:opacity-60 disabled:cursor-not-allowed"
>
{isExporting ? (
<>
@ -121,9 +131,25 @@ export default function KPIDashboard({ metrics, clinicName }: KPIDashboardProps)
<>
<Download size={18} />
<ChevronDown size={14} className="opacity-70" />
</>
)}
</Button>
</button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem onSelect={() => exportPDF(baseFilename)}>
<FileText size={14} className="text-slate-500" />
<span>PDF </span>
</DropdownMenuItem>
<DropdownMenuItem
disabled={!report}
onSelect={() => report && exportReportCSV(baseFilename, report)}
>
<FileSpreadsheet size={14} className="text-slate-500" />
<span>CSV </span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div>
</motion.div>

View File

@ -57,7 +57,7 @@ export default function ReportBody({ data }: ReportBodyProps) {
<SectionErrorBoundary>
{hasValue(data.clinicSnapshot) && data.clinicSnapshot.name ? (
<ClinicSnapshot data={data.clinicSnapshot} />
<ClinicSnapshot data={data.clinicSnapshot} targetUrl={data.targetUrl} socialHandles={socialHandles} />
) : (
<EmptySection id="clinic-snapshot" title="Clinic Overview" subtitle="병원 기본 정보" />
)}
@ -129,7 +129,7 @@ export default function ReportBody({ data }: ReportBodyProps) {
<SectionErrorBoundary>
{nonEmpty(data.kpiDashboard) ? (
<KPIDashboard metrics={data.kpiDashboard} clinicName={data.clinicSnapshot.name} />
<KPIDashboard metrics={data.kpiDashboard} clinicName={data.clinicSnapshot.name} report={data} />
) : (
<EmptySection id="kpi-dashboard" title="KPI Dashboard" subtitle="핵심 지표" />
)}

View File

@ -1,7 +1,6 @@
import { motion } from 'motion/react';
import { Calendar, Globe, MapPin } from 'lucide-react';
import { ScoreRing } from './ui/ScoreRing';
import { ChannelLinkButtons, type ChannelHandles } from '@/shared/ui/channel-link-buttons';
import { PageContainer } from '@/shared/ui/page-container';
function formatDate(raw: string): string {
@ -21,24 +20,21 @@ interface ReportHeaderProps {
clinicNameEn: string;
overallScore: number;
date: string;
targetUrl: string;
targetUrl?: string;
location: string;
logoImage?: string;
brandColors?: { primary: string; accent: string; text: string };
/** 등록된 채널 핸들/URL — 외부 새 탭으로 이동 버튼 묶음을 렌더링 */
socialHandles?: ChannelHandles;
socialHandles?: Record<string, string | null>;
}
export default function ReportHeader({
clinicName,
logoImage,
brandColors,
clinicNameEn,
overallScore,
date,
targetUrl,
location,
socialHandles,
}: ReportHeaderProps) {
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 px-6">
@ -127,32 +123,18 @@ export default function ReportHeader({
<Calendar size={14} className="text-slate-400" />
{formatDate(date)}
</span>
{targetUrl && (
<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">
<Globe size={14} className="text-slate-400" />
{targetUrl}
</span>
)}
<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">
<MapPin size={14} className="text-slate-400" />
{location}
</span>
</motion.div>
{/* 등록된 채널 바로가기 */}
{socialHandles && (
<motion.div
className="mt-4"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.5 }}
>
<ChannelLinkButtons
handles={socialHandles}
variant="light"
className="justify-center md:justify-start"
/>
</motion.div>
)}
</motion.div>
{/* Right: Score ring */}

View File

@ -1,9 +1,10 @@
import { useState, type ComponentType } from 'react';
import { useState } from 'react';
import { motion } from 'motion/react';
import { Youtube, Instagram, Facebook, Globe, Search, Star, ArrowUpRight } from 'lucide-react';
import { ArrowUpRight } from 'lucide-react';
import { SectionWrapper } from './ui/SectionWrapper';
import { ComparisonRow } from './ui/ComparisonRow';
import { Button } from '@/shared/ui/button';
import { PlatformIcon, resolvePlatformVariant, PLATFORM_COLORS } from '@/shared/ui/platform-icon';
import type { TransformationProposal as TransformationProposalType, PlatformStrategy } from '@/features/report/types/report';
interface TransformationProposalProps {
@ -20,18 +21,11 @@ const tabItems = [
type TabKey = (typeof tabItems)[number]['key'];
const platformIconMap: Record<string, ComponentType<{ size?: number; className?: string }>> = {
youtube: Youtube,
instagram: Instagram,
facebook: Facebook,
website: Globe,
blog: Globe,
naver: Search,
tiktok: Star,
};
function PlatformStrategyCard({ strategy, index }: { key?: string | number; strategy: PlatformStrategy; index: number }) {
const Icon = platformIconMap[strategy.icon?.toLowerCase()] ?? Globe;
// strategy.icon 이 없거나 매칭 실패해도 strategy.platform 으로 fallback
const iconVariant = strategy.icon || strategy.platform;
const platformKey = resolvePlatformVariant(iconVariant);
const platformColor = platformKey ? PLATFORM_COLORS[platformKey] : '#6C5CE7';
return (
<motion.div
@ -42,8 +36,11 @@ function PlatformStrategyCard({ strategy, index }: { key?: string | number; stra
transition={{ duration: 0.5, delay: index * 0.1 }}
>
<div className="flex items-center gap-3 mb-4">
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-brand-purple-vivid/10 to-brand-purple/10 flex items-center justify-center">
<Icon size={20} className="text-brand-purple-vivid" />
<div
className="w-10 h-10 rounded-xl flex items-center justify-center"
style={{ backgroundColor: `${platformColor}14` }}
>
<PlatformIcon variant={iconVariant} size={20} colored />
</div>
<h4 className="font-bold text-brand-navy">{strategy.platform}</h4>
</div>

View File

@ -0,0 +1,73 @@
import { motion } from 'motion/react';
import { ExternalLink } from 'lucide-react';
/**
* / .
* URL .
*/
export interface ExternalLinkItem {
label: string;
url: string;
/** Tailwind classes for bg + border + text color */
colorClass: string;
}
interface ExternalLinkButtonsProps {
items: ExternalLinkItem[];
className?: string;
}
export function ExternalLinkButtons({ items, className }: ExternalLinkButtonsProps) {
const visible = items.filter((it) => it.url);
if (visible.length === 0) return null;
return (
<motion.div
className={`flex flex-wrap gap-2 ${className ?? ''}`}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.4, delay: 0.1 }}
>
{visible.map((item) => (
<a
key={item.label}
href={item.url}
target="_blank"
rel="noopener noreferrer"
className={`inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-xs font-medium transition-colors ${item.colorClass}`}
>
{item.label} <ExternalLink size={11} />
</a>
))}
</motion.div>
);
}
/** ClinicSnapshot 데이터에서 사용 가능한 URL 들을 색상 매핑된 항목 배열로 변환 */
export function buildClinicLinks(opts: {
homepage?: string | null;
gangnamUnniUrl?: string | null;
naverPlaceUrl?: string | null;
naverBlogUrl?: string | null;
googleMapsUrl?: string | null;
youtubeUrl?: string | null;
instagramUrl?: string | null;
facebookUrl?: string | null;
tiktokUrl?: string | null;
}): ExternalLinkItem[] {
const normalize = (raw: string | null | undefined) => {
if (!raw) return '';
return /^https?:\/\//.test(raw) ? raw : `https://${raw.replace(/^\/+/, '')}`;
};
return [
{ label: '홈페이지', url: normalize(opts.homepage), colorClass: 'bg-purple-50 border-purple-200 text-purple-700 hover:bg-purple-100' },
{ label: '강남언니', url: normalize(opts.gangnamUnniUrl), colorClass: 'bg-pink-50 border-pink-200 text-pink-700 hover:bg-pink-100' },
{ label: '네이버 플레이스', url: normalize(opts.naverPlaceUrl), colorClass: 'bg-green-50 border-green-200 text-green-700 hover:bg-green-100' },
{ label: '네이버 블로그', url: normalize(opts.naverBlogUrl), colorClass: 'bg-emerald-50 border-emerald-200 text-emerald-700 hover:bg-emerald-100' },
{ label: 'Google Maps', url: normalize(opts.googleMapsUrl), colorClass: 'bg-blue-50 border-blue-200 text-blue-700 hover:bg-blue-100' },
{ label: 'YouTube', url: normalize(opts.youtubeUrl), colorClass: 'bg-red-50 border-red-200 text-red-700 hover:bg-red-100' },
{ label: 'Instagram', url: normalize(opts.instagramUrl), colorClass: 'bg-fuchsia-50 border-fuchsia-200 text-fuchsia-700 hover:bg-fuchsia-100' },
{ label: 'Facebook', url: normalize(opts.facebookUrl), colorClass: 'bg-sky-50 border-sky-200 text-sky-700 hover:bg-sky-100' },
{ label: 'TikTok', url: normalize(opts.tiktokUrl), colorClass: 'bg-slate-50 border-slate-200 text-slate-700 hover:bg-slate-100' },
];
}

View File

@ -1,526 +0,0 @@
import type { MarketingReport } from '@/features/report/types/report';
// 최종 검증: 2026-04-28 (전 채널 실측 — Firecrawl + Apify)
// YouTube · 강남언니 · 네이버 플레이스 · 네이버 블로그: Firecrawl
// Instagram (KR · EN) · Facebook (KR · EN): Apify (apify/instagram-profile-scraper, apify/facebook-pages-scraper)
export const mockReport: MarketingReport = {
id: 'view-clinic',
createdAt: '2026-04-28',
targetUrl: 'https://www.viewclinic.com',
overallScore: 62,
clinicSnapshot: {
name: '뷰성형외과의원',
nameEn: 'VIEW Plastic Surgery',
established: '2005',
yearsInBusiness: 21,
staffCount: 25,
leadDoctor: {
name: '최순우',
credentials: '서울대 출신, 의학박사',
rating: 9.4,
reviewCount: 1805,
},
overallRating: 9.5,
totalReviews: 19177,
priceRange: { min: '97,900', max: '13,200,000+', currency: '₩' },
certifications: [
'수술실 CCTV',
'전담 마취과 전문의',
'응급대응 시스템',
'여의사 상담',
'보건복지부장관 표창',
'안면윤곽 수상',
'모티바 사용량 1위',
'19층 안전스마트 빌딩',
'렛미인 출연',
'All-In-One 시스템',
],
mediaAppearances: ['렛미인 TV 프로그램', '보건복지부장관 표창', '안면윤곽 수상'],
medicalTourism: ['VisitKorea 등재', '강남 메디컬투어센터 협력기관', '외국인 전용 서비스'],
location: '서울시 강남구 봉은사로 107 (논현동)',
nearestStation: '9호선/신분당선 신논현역 3번 출구 68m',
phone: '02-539-1177',
domain: 'viewclinic.com',
source: 'registry' as const,
registryData: {
district: '강남',
branches: '본점 1개',
brandGroup: '프리미엄',
naverPlaceUrl: 'https://m.place.naver.com/hospital/11709005',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/189',
googleMapsUrl: 'https://maps.google.com/?q=뷰성형외과',
},
logoImages: {
circle: '/assets/clients/view-clinic/logo-circle.png',
horizontal: '/assets/clients/view-clinic/logo-horizontal.png',
korean: '/assets/clients/view-clinic/logo-korean.png',
},
brandColors: {
primary: '#7B2D8E',
accent: '#E8B931',
text: '#6B2D7B',
},
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 68, maxScore: 100, status: 'warning', headline: '104K 구독자, 주 2-3회 업로드, 누적 1,035만 조회 (2주 +1.9%)' },
{ channel: 'Instagram KR', icon: 'instagram', score: 32, maxScore: 100, status: 'critical', headline: '14,047 팔로워, Reels 0개, 모델 프사' },
{ channel: 'Instagram EN', icon: 'instagram', score: 62, maxScore: 100, status: 'warning', headline: '70,537 팔로워, Reels 활발, 외국인 환자 중심' },
{ channel: 'Facebook', icon: 'facebook', score: 38, maxScore: 100, status: 'critical', headline: 'KR 254명 방치, EN 88K 활발, 3개 페이지 분산' },
{ channel: '강남언니', icon: 'star', score: 96, maxScore: 100, status: 'excellent', headline: '9.5점/10, 19,177 리뷰, 고객평가우수병원' },
{ channel: 'Website', icon: 'globe', score: 65, maxScore: 100, status: 'warning', headline: 'Footer SNS 5개 연결, 트래킹 6개, SEO 기본 설정 양호' },
],
youtubeAudit: {
channelName: '뷰성형외과 VIEW Plastic Surgery',
handle: '@ViewclinicKR',
subscribers: 104000,
totalVideos: 1100,
totalViews: 10348571,
weeklyViewGrowth: { absolute: 197925, percentage: 1.91 },
estimatedMonthlyRevenue: { min: 499, max: 1000 },
avgVideoLength: '4.4분',
uploadFrequency: '주 2~3회',
channelCreatedDate: '2015-06-28',
subscriberRank: '#570K',
channelDescription: '💜뷰성형외과💜\nVIEW가 예술이다! ✨\n19층 규모의 안전스마트 빌딩\n환자의 관점에서 생각하고\n환자의 입장에서 아름다움의 가치를 찾습니다.',
linkedUrls: [
{ label: '뷰성형외과 홈페이지', url: 'viewclinic.com' },
{ label: 'Instagram', url: 'instagram.com/viewplastic' },
{ label: '이벤트 보기', url: 'viewclinic.com/board/events' },
{ label: '상담 예약', url: 'viewclinic.com/counsel/reservation' },
{ label: '카톡 상담', url: 'pf.kakao.com/_xbtVxjl' },
],
playlists: [
'VIEW 💜 무엇이든 물어보세요',
'VIEW 💜 재수술',
'VIEW 💜 가슴',
'VIEW 💜 눈+코',
'VIEW 💜 윤곽+양악',
'VIEW 💜 지방성형',
'VIEW 💜 피부+안티에이징',
'VIEW랜딩 💜',
'VIEW 💜 방송영상',
],
topVideos: [
{ title: '한번에 성공하는 성형', views: 574000, uploadedAgo: '4년 전', type: 'Short' },
{ title: '코성형+지방이식 전후', views: 525000, uploadedAgo: '4년 전', type: 'Short' },
{ title: '쌍수+뒤밑트임 전후', views: 392000, uploadedAgo: '3년 전', type: 'Short' },
{ title: 'V라인턱 변신과정 전격공개', views: 194000, uploadedAgo: '4년 전', type: 'Short' },
{ title: 'K-미녀 클라스', views: 161000, uploadedAgo: '4년 전', type: 'Short' },
{ title: '앞트임하면 대박나는 사람', views: 154000, uploadedAgo: '2년 전', type: 'Short' },
{ title: '코성형! 내 얼굴에 가장 예쁜 코 찾아드립니다', views: 124000, uploadedAgo: '3년 전', type: 'Long', duration: '7:59' },
{ title: '아나운서 박은영, 가슴 할 결심을 하다', views: 127000, uploadedAgo: '9개월 전', type: 'Long', duration: '43:39' },
],
diagnosis: [
{ category: '구독자 대비 조회수 비율', detail: '영상당 평균 ~1,000회 (104K 구독자 대비 1% 도달률)', severity: 'critical', evidenceIds: ['yt-channel'] },
{ category: '최근 롱폼 조회수', detail: '대부분 1,000~4,000회 수준', severity: 'critical' },
{ category: 'Shorts 조회수', detail: '최근 업로드 500~1,000회 (과거 대비 급감)', severity: 'warning' },
{ category: '업로드 빈도', detail: '주 2~3회 — 적절한 빈도이나 조회수 미반영', severity: 'good' },
{ category: '콘텐츠 톤앤매너', detail: '일관성 없음 — 교육/Q&A/전후/브랜딩 혼재', severity: 'critical' },
{ category: '썸네일 디자인', detail: '통일된 브랜드 시스템 없음', severity: 'warning' },
{ category: '최고 성과 Shorts', detail: '4년 전 콘텐츠 — 최근 재현 실패', severity: 'critical' },
],
},
instagramAudit: {
accounts: [
{
handle: '@viewplastic',
language: 'KR',
label: '국내 (한국어)',
posts: 1429,
followers: 14047,
following: 3774,
category: 'Health/beauty',
profileLink: 'litt.ly/viewplasticsurgery',
highlights: ['ABOUT VIEW', '수술정보', '모델 모집', 'VIEW EVENT', '진료안내'],
reelsCount: 0,
contentFormat: '카드뉴스 (정보형 이미지) 100%',
profilePhoto: '모델 사진 (브랜드 로고 아님)',
bio: '뷰 성형외과 | 가슴성형 · 안면윤곽 · 눈성형 · 코성형 · 리프팅\n💞신논현역 3번 출구 | 카톡 \'뷰성형외과의원\' | 02-539-1177',
},
{
handle: '@view_plastic_surgery',
language: 'EN',
label: '국제 (영어)',
posts: 2578,
followers: 70537,
following: 2849,
category: 'Health/beauty',
profileLink: 'litt.ly/viewplasticsurgeryenglish',
highlights: ['Katerina', 'Mathilde', 'Kyle & Spizee', 'Chef Rush', 'Thet San', 'Yuri', 'Liposuction', 'Why VIEW?', 'Diana', 'Anti Aging', 'Julie', 'Male', 'Stem Cell', 'Dermatology'],
reelsCount: 50,
contentFormat: 'Before/After + 환자 스토리 + Reels',
profilePhoto: 'VIEW 골드 로고',
bio: 'VIEW Plastic Surgery Official by VIEW Partners\n⚕ Most Renowned Hospital in Korea\n107 Bongeunsa-ro Gangnam-gu, Seoul, Korea',
},
],
diagnosis: [
{ category: '계정 분리 → 팔로워 분산', detail: 'KR 14K + EN 70K = 합산 84K이지만 각각 약함', severity: 'warning' },
{ category: 'KR 계정 Reels 전무', detail: '인스타 알고리즘 핵심인 Reels 콘텐츠 0개', severity: 'critical', evidenceIds: ['ig-kr-profile'] },
{ category: '브랜드 비주얼 불일치', detail: 'KR=모델 프사, EN=VIEW 골드 로고', severity: 'warning', evidenceIds: ['ig-kr-profile', 'ig-en-profile'] },
{ category: 'KR 팔로잉 과다', detail: '3,822 팔로잉 — 팔로우백 전략 의심', severity: 'warning' },
{ category: '크로스포스팅 없음', detail: 'YouTube Shorts → Instagram Reels 연동 없음', severity: 'critical' },
{ category: '유튜브 ↔ 인스타 유입 단절', detail: '104K 구독자 → 14K 팔로워 전환 실패', severity: 'critical' },
],
},
facebookAudit: {
pages: [
{
url: 'facebook.com/viewps1',
pageName: '뷰성형외과',
language: 'KR',
label: '국내 (한국어)',
followers: 254,
following: 0,
category: '성형외과 의사',
bio: '예쁨이 일상이 되는 순간! #뷰성형외과',
logo: '일치 (공식 로고)',
logoDescription: '보라색+골드 깃털 공식 로고 사용 — 웹사이트와 동일한 공식 브랜드 자산. 원형 테두리 안에 깃털 심볼 + VIEW / Plastic Surgery 텍스트가 정확히 배치됨.',
link: 'viewclinic.com',
linkedDomain: 'viewclinic.com',
reviews: 0,
recentPostAge: '1일 전',
hasWhatsApp: false,
postFrequency: '주 1~2회 (카드뉴스 크로스포스팅)',
topContentType: 'Instagram 카드뉴스 그대로 복사 게시',
engagement: '게시물당 좋아요 0~3개, 댓글 거의 없음',
},
{
url: 'facebook.com/viewclinic',
pageName: 'View Plastic Surgery',
language: 'EN',
label: '국제 (영어)',
followers: 88333,
following: 11,
category: '건강/뷰티',
bio: 'Official Account by VIEW Partners',
logo: '불일치 (비공식 변형)',
logoDescription: 'VIEW 텍스트 전용 골드 로고 — 공식 깃털 심볼이 빠진 비공식 변형 버전. YouTube, Instagram EN과 동일하지만, 공식 브랜드 가이드(보라색+골드 깃털)와 불일치.',
link: 'viewplasticsurgery.com',
linkedDomain: 'viewplasticsurgery.com (메인 도메인 viewclinic.com과 다름)',
reviews: 3,
recentPostAge: '2일 전',
hasWhatsApp: true,
postFrequency: '일 1~2회 (Before/After, 환자 스토리)',
topContentType: 'Before/After 사진 + 환자 여정 Reels',
engagement: '게시물당 좋아요 50~300개, 댓글 10~50개',
},
],
diagnosis: [
{
category: '채널 간 로고 파편화',
detail: 'Facebook KR만 공식 깃털 로고를 사용하고, EN 페이지는 비공식 VIEW 골드 텍스트 로고를 사용. YouTube, Instagram도 각각 다른 변형 로고 사용 중.',
severity: 'critical',
evidenceIds: ['fb-en-page', 'ig-kr-profile', 'ig-en-profile'],
},
{
category: 'KR 페이지 사실상 방치',
detail: '팔로워 253명, 리뷰 0개, 게시물 참여율 0% — 운영 비용 대비 효과 없음',
severity: 'critical',
},
{
category: '도메인 불일치',
detail: 'KR 페이지 → viewclinic.com, EN 페이지 → viewplasticsurgery.com — 서로 다른 도메인으로 연결, SEO 및 트래픽 분산',
severity: 'warning',
},
{
category: 'KR/EN 팔로워 348:1 격차',
detail: 'EN 88K vs KR 253 — 국내 환자 유입 채널로서 Facebook KR은 완전히 실패',
severity: 'critical',
},
{
category: 'KR 콘텐츠 전략 없음',
detail: 'Instagram 카드뉴스를 그대로 복사 게시 — Facebook 네이티브 콘텐츠(동영상, 이벤트, 그룹) 활용 0%',
severity: 'warning',
},
{
category: 'Facebook Pixel ↔ 페이지 비연동',
detail: '웹사이트에 Facebook Pixel(ID: 299151214739571)이 설치되어 있으나, KR 페이지와의 광고 리타겟 연동 미확인',
severity: 'warning',
},
],
brandInconsistencies: [
{
field: '로고',
values: [
{ channel: 'YouTube', value: 'VIEW 텍스트 전용 골드 로고 (깃털 심볼 없음)', isCorrect: false },
{ channel: 'Instagram KR', value: '모델 프로필 사진 (로고 아님)', isCorrect: false },
{ channel: 'Instagram EN', value: 'VIEW 텍스트 전용 골드 로고 (깃털 심볼 없음)', isCorrect: false },
{ channel: 'Facebook KR', value: '보라색+골드 깃털 로고 (공식)', isCorrect: true },
{ channel: 'Facebook EN', value: 'VIEW 텍스트 전용 골드 로고 (깃털 심볼 없음)', isCorrect: false },
{ channel: 'Website', value: '보라색+골드 깃털 로고 (공식)', isCorrect: true },
],
impact: '공식 깃털 로고를 사용하는 채널은 Facebook KR과 웹사이트 2곳뿐. YouTube, Instagram, Facebook EN은 비공식 변형 로고 사용',
recommendation: '전 채널에 보라색+골드 깃털 공식 로고 통일 (원형: 프로필, 가로형: 배너)',
},
{
field: '연결 도메인',
values: [
{ channel: 'YouTube', value: 'viewclinic.com', isCorrect: true },
{ channel: 'Instagram KR', value: 'litt.ly/viewplasticsurgery', isCorrect: true },
{ channel: 'Instagram EN', value: 'litt.ly/viewplasticsurgeryenglish', isCorrect: true },
{ channel: 'Facebook KR', value: 'viewclinic.com', isCorrect: true },
{ channel: 'Facebook EN', value: 'viewplasticsurgery.com', isCorrect: false },
],
impact: 'EN 페이지가 별도 도메인(viewplasticsurgery.com)으로 연결 → 도메인 권위(Domain Authority) 분산, SEO 불이익',
recommendation: 'viewclinic.com/en 하위 경로로 국제 페이지 통합, 기존 도메인은 301 리다이렉트',
},
{
field: '바이오/소개 메시지',
values: [
{ channel: 'YouTube', value: '💜뷰성형외과💜 VIEW가 예술이다!', isCorrect: false },
{ channel: 'Instagram KR', value: '뷰 성형외과 | 가슴성형·안면윤곽·눈성형·코성형·리프팅', isCorrect: false },
{ channel: 'Facebook KR', value: '예쁨이 일상이 되는 순간! #뷰성형외과', isCorrect: false },
{ channel: 'Facebook EN', value: 'Official Account by VIEW Partners', isCorrect: false },
],
impact: '4개 채널, 4개의 서로 다른 소개 메시지 → 통일된 브랜드 포지셔닝 부재, 핵심 USP(안전/21년 무사고) 미전달',
recommendation: '핵심 USP 포함 통일 바이오: "안전이 예술이 되는 곳 — 21년 무사고 VIEW 성형외과"',
},
],
consolidationRecommendation: 'Facebook KR 페이지(253명)는 폐쇄 또는 EN 페이지(88K)로 통합을 권장합니다. KR 페이지는 투자 대비 효과가 사실상 제로이며, 브랜드 혼란만 가중시키고 있습니다. Facebook은 한국 시장에서 오가닉 도달 목적이 아닌, Facebook Pixel 기반 리타겟 광고 전용 채널로 운영하는 것이 효율적입니다.',
},
otherChannels: [
{ name: '카카오톡', status: 'active', details: '플러스친구 @뷰성형외과의원 — 상담 전용 채널', url: 'https://pf.kakao.com/_xbtVxjl' },
{ name: '네이버 블로그', status: 'active', details: '공식 블로그 활성 — 총 551개 게시글, 월 2~3회 포스팅, 최근 2026.4.22 업로드', url: 'https://blog.naver.com/viewclinicps' },
{ name: '네이버 플레이스', status: 'active', details: '별점 4.41/5, 방문자리뷰 776개, 블로그리뷰 1,508개, 성형외과 전문의 14명', url: 'https://m.place.naver.com/hospital/11709005' },
{ name: 'TikTok', status: 'not_found', details: '계정 없음 또는 비활성' },
{ name: '강남언니', status: 'active', details: '9.5점/10, 19,177 리뷰, 25 의료진, 고객평가우수병원', url: 'https://www.gangnamunni.com/hospitals/189' },
{ name: '네이버 카페', status: 'active', details: '"뷰성형외과 성형의 모든것" — 회원 5,984명, 비공개 카페, 시술별 Q&A/전후비교/수술후기 20개 게시판 운영', url: 'https://cafe.naver.com/bluectcom2' },
{ name: 'Threads', status: 'active', details: '@viewplastic + @view_plastic_surgery 계정 연동', url: 'https://www.threads.net/@viewplastic' },
{ name: 'Facebook TH', status: 'inactive', details: '태국 파트너 페이지 14K 팔로워, 2024.7월 이후 방치', url: 'https://www.facebook.com/viewplasticsurgery' },
],
websiteAudit: {
primaryDomain: 'viewclinic.com',
additionalDomains: [
{ domain: 'viewplasticsurgery.com', purpose: '영문 국제 사이트' },
{ domain: 'viewclinic-chat.com', purpose: '채팅 상담 전용' },
{ domain: 'viewclinic.modoo.at', purpose: '구 모두홈페이지' },
],
snsLinksOnSite: true,
snsLinksDetail: [
{ platform: 'Naver Blog', url: 'https://blog.naver.com/viewclinicps', location: 'Footer' },
{ platform: 'Facebook', url: 'https://www.facebook.com/viewps1/', location: 'Footer' },
{ platform: 'Instagram', url: 'https://www.instagram.com/viewplastic/', location: 'Footer' },
{ platform: 'YouTube', url: 'https://www.youtube.com/channel/UCQqqH3Klj2HQSHNNSVug-CQ', location: 'Footer' },
{ platform: 'Naver Cafe', url: 'https://cafe.naver.com/bluectcom2', location: 'Footer' },
],
trackingPixels: [
{ name: 'Facebook Pixel', installed: true },
{ name: 'Facebook Domain Verification', installed: true },
{ name: 'Google Site Verification', installed: true },
{ name: 'Naver Site Verification', installed: true },
{ name: 'Kakao Pixel', installed: true },
{ name: 'Google Tag Manager', installed: true },
],
mainCTA: '전화 + 카카오톡 상담 + 온라인 예약',
},
problemDiagnosis: [
{
category: '브랜드 아이덴티티 파편화',
detail: '공식 깃털 로고(보라색+골드)는 Facebook KR과 웹사이트에만 사용. YouTube/Instagram EN/Facebook EN은 비공식 골드 텍스트 로고, Instagram KR은 모델 사진 사용 — 6개 채널에 4종의 서로 다른 시각적 아이덴티티',
severity: 'critical',
},
{
category: '콘텐츠 전략 부재',
detail: '콘텐츠 캘린더 없음, 톤앤매너 가이드 없음, KR↔EN 시너지 없음, YouTube→Instagram 크로스포스팅 없음',
severity: 'critical',
},
{
category: '플랫폼 간 유입 단절',
detail: 'YouTube 104K → Instagram 14K 전환 실패, Footer SNS 링크는 있으나 Header/본문에는 없음, 강남언니 19K 리뷰→영상 전환 없음, 네이버 카페 5,984명→SNS 유입 미활용',
severity: 'critical',
},
],
transformation: {
brandIdentity: [
{ area: '로고', asIs: '채널마다 다른 로고 4종', toBe: 'VIEW 골드 로고 1종 통일' },
{ area: '컬러 팔레트', asIs: '없음 (혼재)', toBe: 'Primary: Gold (#C4A462) + Dark (#1A1A1A)' },
{ area: '프로필 사진', asIs: 'KR=모델, EN=로고, FB=깃털', toBe: '전 채널 VIEW 골드 로고 통일' },
{ area: '바이오 메시지', asIs: '채널마다 다른 메시지', toBe: '"안전이 예술이 되는 곳 — 21년 무사고 VIEW"' },
{ area: '해시태그', asIs: '비체계적', toBe: '#뷰성형외과 #VIEW성형 #강남성형외과 #21년무사고' },
],
contentStrategy: [
{ area: '콘텐츠 캘린더', asIs: '없음', toBe: '월간 콘텐츠 캘린더 (4주 사이클)' },
{ area: '업로드 빈도', asIs: 'YouTube 주1회, Instagram 비정기', toBe: 'YouTube 주3회 + Instagram 일1회 + Shorts/Reels 주5회' },
{ area: '콘텐츠 포맷', asIs: 'KR Instagram = 카드뉴스만', toBe: '카드뉴스 30% + Reels 40% + 카루셀 20% + Stories 10%' },
{ area: '콘텐츠 앵글', asIs: '시술 정보 중심 (병원 관점)', toBe: '환자 의사결정 보조 중심 (환자 관점)' },
{ area: '톤앤매너', asIs: '없음', toBe: '"차분한 전문가" — 과장 없이, 설명으로 설득' },
],
platformStrategies: [
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '104K subscribers',
targetMetric: '200K / 12개월',
strategies: [
{ strategy: '업로드 빈도 3배 증가', detail: '주 3회 (롱폼 1 + Shorts 2)' },
{ strategy: '기존 영상 재활용', detail: '1,064개 기존 영상에서 AI 숏폼 100개 추출' },
{ strategy: '썸네일 시스템화', detail: 'VIEW 골드 워터마크 + 일관된 폰트/컬러' },
{ strategy: '커뮤니티 탭 활용', detail: '주 2회 투표/질문 — 구독자 참여 활성화' },
],
},
{
platform: 'Instagram KR',
icon: 'instagram',
currentMetric: '14K followers',
targetMetric: '50K / 12개월',
strategies: [
{ strategy: 'Reels 즉시 시작', detail: 'YouTube Shorts 동시 게시 → 최소 주 5개' },
{ strategy: '프로필 사진 교체', detail: '모델 사진 → VIEW 골드 로고' },
{ strategy: '팔로잉 정리', detail: '3,822 → 300 이하로 정리' },
{ strategy: 'Stories 활성화', detail: '일 2~3개 (상담 비하인드, 병원 일상)' },
],
},
{
platform: 'Facebook',
icon: 'facebook',
currentMetric: 'KR 253 + EN 88K',
targetMetric: '통합 관리',
strategies: [
{ strategy: '계정 통합', detail: 'KR 253명 페이지 → EN 88K 페이지로 통합 또는 폐쇄' },
{ strategy: '로고 통일', detail: '보라색 깃털 → VIEW 골드 로고' },
{ strategy: '역할 정의', detail: 'FB = 광고 랜딩 + 리타겟 전용' },
],
},
],
websiteImprovements: [
{ area: 'SNS 링크', asIs: 'Footer에 5개 (블로그/FB/IG/YT/카페) — Header에는 없음', toBe: 'Header에도 주요 SNS 아이콘 추가 + EN 계정 링크도 병기' },
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 관련 YouTube 영상 임베드' },
{ area: '콘텐츠 허브', asIs: '없음', toBe: 'SEO 콘텐츠 허브 구축 (시술별 가이드)' },
{ area: '도메인 통합', asIs: '4개 도메인 분산', toBe: 'viewclinic.com 단일 도메인 + /en 국제 페이지' },
],
newChannelProposals: [
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층 도달, YouTube Shorts 동시 배포' },
{ channel: '네이버 블로그 강화', priority: 'P0', rationale: '현재 551개 게시글, 월 2~3회 → 주 2회로 빈도 상향, SEO 핵심' },
{ channel: '네이버 플레이스 최적화', priority: 'P0', rationale: '4.41점/776리뷰 — 리뷰 응답률/사진 최적화 필요' },
],
},
roadmap: [
{
month: 1,
title: 'Foundation',
subtitle: '기반 구축',
tasks: [
{ task: '브랜드 아이덴티티 가이드 확정 (로고, 컬러, 폰트, 톤앤매너)', completed: false },
{ task: '전 채널 프로필 사진/배너 통일 교체', completed: false },
{ task: 'Facebook KR 페이지 정리 (통합 또는 폐쇄)', completed: false },
{ task: 'Instagram KR 팔로잉 정리 (3,822 → 300)', completed: false },
{ task: '웹사이트에 YouTube/Instagram 링크 추가', completed: false },
{ task: '기존 YouTube 영상 100개 → AI 숏폼 추출 시작', completed: false },
{ task: '콘텐츠 캘린더 v1 수립', completed: false },
],
},
{
month: 2,
title: 'Content Engine',
subtitle: '콘텐츠 엔진 가동',
tasks: [
{ task: 'YouTube Shorts 주 3~5회 업로드 시작', completed: false },
{ task: 'Instagram Reels 주 5회 업로드 시작', completed: false },
{ task: '원장 촬영 세션 월 2회 스케줄 확정', completed: false },
{ task: '"원장이 설명하는" 시리즈 4편 제작/업로드', 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: 'YouTube 썸네일 A/B 테스트', completed: false },
{ task: '콘텐츠 캘린더 v2 (성과 데이터 반영)', completed: false },
{ task: '네이버 플레이스 최적화', completed: false },
{ task: 'KPI 리뷰: 구독자/팔로워 성장률, 상담 전환 추적', completed: false },
],
},
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '104K', target3Month: '115K', target12Month: '200K' },
{ metric: 'YouTube 월 조회수', current: '~270K', target3Month: '500K', target12Month: '1.5M' },
{ metric: 'YouTube Shorts 평균 조회수', current: '500~1,000', target3Month: '5,000', target12Month: '20,000' },
{ metric: 'Instagram KR 팔로워', current: '14K', target3Month: '20K', target12Month: '50K' },
{ metric: 'Instagram KR Reels 평균 조회수', current: '0 (없음)', target3Month: '3,000', target12Month: '10,000' },
{ metric: 'Instagram EN 팔로워', current: '70K', target3Month: '80K', target12Month: '120K' },
{ metric: '네이버 블로그 포스팅 빈도', current: '월 2~3회', target3Month: '주 2회', target12Month: '주 3회' },
{ metric: '네이버 플레이스 리뷰', current: '777개 (4.41점)', target3Month: '900개', target12Month: '1,200개' },
{ metric: '콘텐츠 → 상담 전환', current: '측정 불가', target3Month: 'UTM 추적 시작', target12Month: '월 50건' },
],
screenshots: [
{
id: 'yt-channel',
url: '/assets/clients/view-clinic/screenshots/yt-channel.png',
channel: 'YouTube',
capturedAt: '2026-04-13T13:30:00Z',
caption: 'YouTube 채널 메인 — 구독자 104K, 주 ~1회 업로드',
sourceUrl: 'https://www.youtube.com/@ViewclinicKR',
},
{
id: 'ig-kr-profile',
url: '/assets/clients/view-clinic/screenshots/ig-kr-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-13T13:31:00Z',
caption: 'Instagram KR (@viewplastic) — 14K 팔로워, 1,420 게시물, Reels 0개, 모델 프로필 사진',
sourceUrl: 'https://www.instagram.com/viewplastic/',
},
{
id: 'ig-en-profile',
url: '/assets/clients/view-clinic/screenshots/ig-en-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-13T13:32:00Z',
caption: 'Instagram EN (@view_plastic_surgery) — 70K 팔로워, 2,554 게시물, Reels 활발, VIEW 골드 로고',
sourceUrl: 'https://www.instagram.com/view_plastic_surgery/',
},
{
id: 'fb-kr-page',
url: '/assets/clients/view-clinic/screenshots/fb-kr-page.png',
channel: 'Facebook',
capturedAt: '2026-04-13T13:33:00Z',
caption: 'Facebook KR (@viewps1) — 팔로워 253명, 사실상 방치 상태',
sourceUrl: 'https://www.facebook.com/viewps1',
annotations: [
{ type: 'highlight', x: 15, y: 20, width: 25, height: 15, label: '팔로워 253명 (방치)' },
],
},
{
id: 'gangnamunni',
url: '/assets/clients/view-clinic/screenshots/gangnamunni.png',
channel: '강남언니',
capturedAt: '2026-04-13T13:34:00Z',
caption: '강남언니 — 9.5점/10, 리뷰 19,033개, 고객평가우수병원, 총 804명 상담신청 완료',
sourceUrl: 'https://www.gangnamunni.com/hospitals/189',
},
{
id: 'website-homepage',
url: '/assets/clients/view-clinic/screenshots/website-homepage.png',
channel: 'Website',
capturedAt: '2026-04-13T13:35:00Z',
caption: 'viewclinic.com 홈페이지 — 팝업 오버레이로 콘텐츠 진입 차단, APRIL PROMOTION',
sourceUrl: 'https://www.viewclinic.com',
annotations: [
{ type: 'highlight', x: 30, y: 15, width: 40, height: 60, label: '팝업 차단' },
],
},
{
id: 'naver-blog',
url: '/assets/clients/view-clinic/screenshots/naver-blog.png',
channel: '네이버 블로그',
capturedAt: '2026-04-13T13:36:00Z',
caption: '네이버 블로그 (@viewclinicps) — VIEW 성형외과 550개 글, 유튜브/인스타 바로가기 연동',
sourceUrl: 'https://blog.naver.com/viewclinicps',
},
],
};

View File

@ -1,384 +0,0 @@
import type { MarketingReport } from '@/features/report/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 },
{ name: 'Google Analytics', installed: true },
{ 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

@ -1,339 +0,0 @@
import type { MarketingReport } from '@/features/report/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 },
{ 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',
},
],
};

View File

@ -1,347 +0,0 @@
import type { MarketingReport } from '@/features/report/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 },
],
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',
},
],
};

View File

@ -1,392 +0,0 @@
import type { MarketingReport } from '@/features/report/types/report';
import { mockReport } from './mockReport';
/**
* O2O Clinic (· )
*
* . ·
* INFINITH .
*
* :
* - : O2O Clinic ( )
* - : (Dr. O2O)
* - : 2017 (9)
* - : ··
* - : Indigo Deep (#1E1B4B) + Cyan (#06B6D4)
*
* 6 ·:
* - (78/100)
* - Instagram (/ )
* - YouTube (/ )
* - 9.5 + 2,547
* - +
*/
export const mockReportO2O: MarketingReport = {
...mockReport,
id: 'o2o',
createdAt: '2026-04-14',
targetUrl: 'https://www.o2oclinic.com',
overallScore: 78,
clinicSnapshot: {
...mockReport.clinicSnapshot,
name: 'O2O Clinic',
nameEn: 'O2O Plastic Surgery Clinic',
established: '2017',
yearsInBusiness: 9,
staffCount: 8,
leadDoctor: {
name: '오투오',
credentials: 'O2O Clinic 대표원장 · 눈·코·윤곽 전문',
rating: 9.6,
reviewCount: 2547,
},
overallRating: 9.5,
totalReviews: 2547,
priceRange: { min: '300,000', max: '15,000,000+', currency: '₩' },
certifications: [
'성형외과 전문의',
'대한성형외과학회 정회원',
'안면윤곽·코성형 다년 임상',
'국제 환자 영문/중문 상담',
],
mediaAppearances: ['강남언니 9.5점 / 2,547 리뷰', '국제 환자 의료관광 인증'],
medicalTourism: ['영어·중국어·일본어 코디네이터 상주', '의료관광 인증 클리닉'],
location: '서울 강남구 (강남역 인근)',
nearestStation: '2호선 강남역',
phone: '02-2020-2020',
domain: 'o2oclinic.com',
source: 'registry' as const,
registryData: {
district: '강남',
branches: '본원 1개',
brandGroup: '눈·코·윤곽 전문 · 글로벌',
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/o2o',
googleMapsUrl: 'https://maps.google.com/?q=O2O+Clinic',
},
logoImages: {
circle: '/assets/clients/o2o/logo-circle.png',
horizontal: '/assets/clients/o2o/logo-horizontal.png',
korean: '/assets/clients/o2o/logo-korean.png',
},
brandColors: {
primary: '#1E1B4B',
accent: '#06B6D4',
text: '#0F172A',
},
},
channelScores: [
{ channel: 'YouTube', icon: 'youtube', score: 76, maxScore: 100, status: 'good', headline: '@o2oclinic — 5,840 구독자 · 280 영상 · 주 2회 안정 업로드' },
{ channel: 'Instagram', icon: 'instagram', score: 82, maxScore: 100, status: 'good', headline: '@o2o_clinic — 8,210 팔로워 · Reels 활성 · 다국어 운영' },
{ channel: 'Facebook', icon: 'facebook', score: 65, maxScore: 100, status: 'warning', headline: '@O2OClinicGlobal — 3,025 팔로워 · 국제 환자 광고 채널' },
{ channel: '강남언니', icon: 'star', score: 90, maxScore: 100, status: 'good', headline: '9.5점 / 2,547 리뷰 — 응답률 88% · 강남 상위 10%' },
{ channel: 'Website', icon: 'globe', score: 78, maxScore: 100, status: 'good', headline: 'o2oclinic.com — 다국어 랜딩 · 픽셀 설치 완료' },
{ channel: '네이버 블로그', icon: 'globe', score: 72, maxScore: 100, status: 'good', headline: 'blog.naver.com/o2oclinic — 주 2회 SEO 포스팅' },
],
youtubeAudit: {
...mockReport.youtubeAudit,
channelName: 'O2O Clinic',
handle: '@o2oclinic',
subscribers: 5840,
totalVideos: 280,
totalViews: 1240000,
weeklyViewGrowth: { absolute: 4200, percentage: 3.4 },
estimatedMonthlyRevenue: { min: 50, max: 180 },
avgVideoLength: '6분',
uploadFrequency: '주 2회 (Long 1 + Shorts 1)',
channelCreatedDate: '2017-08-15',
subscriberRank: '강남 성형외과 채널 상위 25%',
channelDescription: 'O2O Clinic — 눈·코·윤곽 전문. 9년의 임상, 2,547개의 검증된 후기. 국제 환자 환영.',
linkedUrls: [
{ label: 'O2O Clinic 공식 홈페이지', url: 'o2oclinic.com' },
{ label: '강남언니 프로필', url: 'gangnamunni.com/hospitals/o2o' },
],
playlists: ['눈성형 가이드', '코성형 시리즈', '윤곽수술 케이스', '오투오 원장 Q&A', '국제 환자 브이로그', 'Shorts'],
topVideos: [
{ title: '오투오 원장이 알려주는 자연스러운 눈성형 5원칙', views: 84200, uploadedAgo: '3개월 전', type: 'Long', duration: '8:42' },
{ title: '코성형 붓기, 솔직히 얼마나 가나요? — 30일 타임라인', views: 67500, uploadedAgo: '1개월 전', type: 'Long', duration: '6:15' },
{ title: 'V라인 윤곽수술 회복 일기 — 환자 동의 케이스', views: 52300, uploadedAgo: '2주 전', type: 'Long', duration: '12:08' },
{ title: '쌍수 vs 눈매교정 차이 60초', views: 124000, uploadedAgo: '2개월 전', type: 'Short', duration: '0:60' },
{ title: '코끝 성형 전후 — Real Case', views: 98700, uploadedAgo: '3주 전', type: 'Short', duration: '0:45' },
],
diagnosis: [
{ category: '안정적 업로드 빈도 — 강점', detail: '주 2회 정기 업로드로 알고리즘 신호 양호. 9년간 누적 280개 영상 = 콘텐츠 자산 풍부', severity: 'good' },
{ category: 'Shorts 활용 우수', detail: 'Long-form 영상에서 Shorts 추출 비율 35% — 평균 (15%) 대비 2배 이상', severity: 'good' },
{ category: '다국어 자막 추가 권장', detail: '영문/중문 자막을 추가하면 글로벌 도달 즉시 1.8~2.5배 확대 예상', severity: 'warning' },
],
},
instagramAudit: {
accounts: [
{
handle: '@o2o_clinic',
language: 'KR',
label: 'KR 메인 공식',
posts: 1850,
followers: 8210,
following: 312,
category: 'Health/beauty',
profileLink: 'o2oclinic.com',
highlights: ['눈성형', '코성형', '윤곽수술', '리뷰', '글로벌'],
reelsCount: 142,
contentFormat: 'Reels (50%) + Carousel (30%) + Story (20%)',
profilePhoto: 'O2O 로고 (Indigo + Cyan)',
bio: 'O2O Clinic 공식 · 눈·코·윤곽 전문 · 강남역 · 영문/중문 상담 가능 · o2oclinic.com',
},
{
handle: '@o2o_clinic_global',
language: 'EN',
label: 'Global 공식',
posts: 480,
followers: 6320,
following: 215,
category: 'Health/beauty',
profileLink: 'o2oclinic.com',
highlights: ['Eye', 'Nose', 'Contouring', 'Reviews', 'Booking'],
reelsCount: 95,
contentFormat: 'English / Chinese / Japanese subtitled Reels',
profilePhoto: 'O2O Global 로고',
bio: 'O2O Clinic Global · Eye · Nose · Facial Contouring · Gangnam Seoul · DM for consultation',
},
],
diagnosis: [
{ category: 'Reels 활용도 우수', detail: '게시물 중 Reels 비율 50% — 알고리즘 친화적 콘텐츠 믹스', severity: 'good' },
{ category: '글로벌 계정 운영 — 차별화 강점', detail: '국내 + 영문 글로벌 계정 분리 운영으로 외국인 환자 직접 도달 가능', severity: 'good' },
{ category: '인플루언서 협업 미흡', detail: '뷰티 크리에이터 협업 콘텐츠 0편 — 신규 도달 확장 기회', severity: 'warning' },
],
},
facebookAudit: {
pages: [
{
url: 'facebook.com/O2OClinicGlobal',
pageName: 'O2O Clinic Global',
language: 'EN',
label: 'Global 공식',
followers: 3025,
following: 0,
category: 'Plastic Surgeon',
bio: 'O2O Clinic — Eye, Nose, Facial Contouring | Gangnam Seoul | Multilingual Consultation',
logo: 'O2O Global 로고',
logoDescription: 'Indigo + Cyan O2O 워드마크',
link: 'o2oclinic.com',
linkedDomain: 'o2oclinic.com',
reviews: 142,
recentPostAge: '5일 전',
hasWhatsApp: true,
postFrequency: '주 2~3회',
topContentType: 'Patient journey + Before/After (consent verified)',
engagement: '게시물당 평균 좋아요 80~150 / 댓글 10~25',
},
],
diagnosis: [
{ category: '국제 환자 광고 채널로 활성화 양호', detail: 'WhatsApp 연동 + 영문 콘텐츠 정기 업로드로 글로벌 환자 직접 상담 경로 확보', severity: 'good' },
{ category: '리타겟팅 광고 운영 부재', detail: 'Pixel은 설치되어 있으나 리타겟팅 캠페인 미운영 — 즉시 ROAS 기회', severity: 'warning' },
],
brandInconsistencies: [],
consolidationRecommendation: 'Facebook은 글로벌 채널로 명확히 포지셔닝되어 운영 중. 리타겟팅 캠페인 도입 시 ROAS 즉시 개선 가능.',
},
otherChannels: [
{ name: '네이버 블로그', status: 'active', details: '주 2회 SEO 포스팅 · 키워드 상위 노출 30+', url: 'https://blog.naver.com/o2oclinic' },
{ name: '네이버 카페', status: 'active', details: 'O2O Clinic 카페 운영 중 · 회원 1,200+', url: 'https://cafe.naver.com/o2oclinic' },
{ name: '강남언니', status: 'active', details: '9.5점 / 2,547 리뷰 · 응답률 88%', url: 'https://www.gangnamunni.com/hospitals/o2o' },
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 · 사진 80+ · 별점 4.8', url: 'https://map.naver.com/v5/search/O2O+Clinic' },
{ name: '카카오톡', status: 'active', details: '카카오 채널 친구 4,200+ · 자동응답 운영', url: 'https://o2oclinic.com' },
{ name: 'TikTok', status: 'active', details: '@o2oclinic · 팔로워 3,400 · Shorts 크로스포스팅', url: 'https://www.tiktok.com/@o2oclinic' },
],
websiteAudit: {
primaryDomain: 'o2oclinic.com',
additionalDomains: [{ domain: 'o2oclinic.com/en', purpose: '영문 랜딩' }, { domain: 'o2oclinic.com/zh', purpose: '중문 랜딩' }],
snsLinksOnSite: true,
snsLinksDetail: [
{ platform: 'YouTube', url: 'https://www.youtube.com/@o2oclinic', location: 'Footer + Header' },
{ platform: 'Instagram', url: 'https://www.instagram.com/o2o_clinic', location: 'Footer + Header' },
{ platform: 'Instagram Global', url: 'https://www.instagram.com/o2o_clinic_global', location: 'Footer (EN page)' },
{ platform: 'Facebook', url: 'https://www.facebook.com/O2OClinicGlobal', location: 'Footer (EN page)' },
{ platform: 'Naver Blog', url: 'https://blog.naver.com/o2oclinic', location: 'Footer' },
{ platform: 'TikTok', url: 'https://www.tiktok.com/@o2oclinic', location: 'Footer' },
],
trackingPixels: [
{ name: 'Google Analytics 4', installed: true },
{ name: 'Meta Pixel', installed: true },
{ name: 'Naver Analytics', installed: true },
{ name: 'TikTok Pixel', installed: false },
],
mainCTA: '온라인 상담 예약 + 카카오톡 + WhatsApp (글로벌)',
},
problemDiagnosis: [
{
category: 'TikTok 픽셀 미설치 — 광고 ROAS 측정 불가',
detail: '@o2oclinic TikTok 계정에 트래픽이 발생하고 있으나 픽셀이 없어 광고 캠페인 ROAS 측정·최적화 불가. 즉시 설치 권장.',
severity: 'warning',
},
{
category: '인플루언서 협업 미운영 — 신규 도달 기회 손실',
detail: '뷰티/메디컬 크리에이터 협업 콘텐츠 0편. 6개월 내 5~8명 협업 시 신규 팔로워 30~50% 증가 예상.',
severity: 'warning',
},
{
category: '리타겟팅 광고 미운영 — Meta Pixel 설치되어 있으나 활용 부족',
detail: 'o2oclinic.com 방문자 누적 데이터가 있으나 Facebook/Instagram 리타겟팅 캠페인 미운영. ROAS 즉시 200~300% 개선 기회.',
severity: 'warning',
},
{
category: '글로벌 콘텐츠 — 강점 확장 여지',
detail: '영문 Instagram + Global Facebook 운영 중이나, YouTube 채널은 한국어 위주. 영문/중문 자막 추가 시 도달 1.8~2.5배 확대 예상.',
severity: 'warning',
},
],
transformation: {
...mockReport.transformation,
brandIdentity: [
{ area: '브랜드 포지셔닝', asIs: '눈·코·윤곽 전문', toBe: '"O2O Clinic — 9년의 임상, 2,547개의 진심"' },
{ area: '컬러 시스템', asIs: 'Indigo Deep + Cyan 명문화 완료', toBe: '전 채널 디자인 가이드 SOP 발급' },
{ area: '글로벌 메시지', asIs: '국문/영문 분리 운영', toBe: 'YouTube 다국어 자막 추가 → 한국어 콘텐츠로 글로벌 도달' },
],
platformStrategies: [
{
platform: 'YouTube',
icon: 'youtube',
currentMetric: '5,840 subscribers · 280 videos',
targetMetric: '20K / 12개월',
strategies: [
{ strategy: '다국어 자막 우선 50개', detail: '기존 영상에 EN/ZH/JP 자막 추가 → 글로벌 검색 도달 즉시 확대' },
{ strategy: '오투오 원장 Q&A 시리즈 정기화', detail: '월 2회 롱폼 + 월 4회 Shorts 추출 → 권위 콘텐츠' },
{ strategy: '인플루언서 컬래버 분기 1회', detail: '뷰티/메디컬 크리에이터 협업으로 신규 구독자 유입' },
],
},
{
platform: 'Instagram',
icon: 'instagram',
currentMetric: 'KR 8,210 + Global 6,320 · Reels 활성',
targetMetric: 'KR 25K + Global 18K / 12개월',
strategies: [
{ strategy: 'Reels 주 5회로 증가', detail: 'YouTube Shorts와 동시 다국어 배포 — 자산 재활용' },
{ strategy: '인플루언서 카루셀 시리즈', detail: '월 2회 협업 콘텐츠 — 신규 팔로워 유입' },
{ strategy: '강남언니 리뷰 → Story 자동 변환', detail: '2,547개 리뷰 자산을 Story 카드로 주 2회 발행' },
],
},
{
platform: 'Facebook',
icon: 'facebook',
currentMetric: 'Global 3,025 followers · WhatsApp 연동 완료',
targetMetric: 'Global 12K + 리타겟팅 ROAS 4x / 6개월',
strategies: [
{ strategy: '리타겟팅 광고 캠페인 즉시 시작', detail: 'o2oclinic.com 방문자 픽셀 데이터 활용 — 영문/중문 광고 소재 4종' },
{ strategy: 'WhatsApp 자동응답 시나리오 확대', detail: '눈/코/윤곽 시술별 FAQ 자동응답 — 글로벌 환자 1차 응대' },
],
},
],
websiteImprovements: [
{ area: '다국어 랜딩페이지', asIs: 'EN/ZH 운영 중', toBe: '일본어 랜딩 추가 + 채널별 UTM 추적 강화' },
{ area: 'TikTok Pixel', asIs: '미설치', toBe: 'TikTok Pixel 즉시 설치 → 광고 ROAS 측정 가능' },
],
newChannelProposals: [
{ channel: 'LINE (일본)', priority: 'P1', rationale: '일본 환자 직접 상담 경로 — Instagram JP 콘텐츠와 연동' },
{ channel: 'WeChat 공식 계정 (중국)', priority: 'P1', rationale: '중국 환자 의료관광 전환 채널 — 위챗 미니프로그램 검토' },
{ channel: '인플루언서 협업 시스템화', priority: 'P0', rationale: '단발성 협업이 아닌 분기별 5~8명 정기 협업 SOP 구축' },
],
},
roadmap: [
{
month: 1,
title: 'Foundation',
subtitle: '광고 인프라 + 다국어',
tasks: [
{ task: 'TikTok Pixel 설치 + 광고 캠페인 시작', completed: false },
{ task: 'YouTube 기존 영상 EN/ZH 자막 30개 추가', completed: false },
{ task: 'Facebook 리타겟팅 광고 캠페인 v1 런칭', completed: false },
{ task: '인플루언서 협업 SOP 문서화 + 1차 5명 컨택', completed: false },
],
},
{
month: 2,
title: 'Content Engine',
subtitle: '자산 재활용 + 협업',
tasks: [
{ task: 'YouTube 주 2회 정착 + Shorts 주 3회로 증가', completed: false },
{ task: 'Instagram Reels 주 5회 (KR + Global 동시)', completed: false },
{ task: '인플루언서 협업 카루셀 1차 발행', completed: false },
{ task: '강남언니 Story 자동 발행 시스템 구축', completed: false },
],
},
{
month: 3,
title: 'Optimization',
subtitle: '성과 측정 + 확장',
tasks: [
{ task: 'TikTok·Facebook ROAS 분석 + 예산 재배분', completed: false },
{ task: 'LINE/WeChat 채널 개설 검토 → 결정', completed: false },
{ task: '월간 KPI 리뷰 + 다음 분기 전략', completed: false },
],
},
],
kpiDashboard: [
{ metric: 'YouTube 구독자', current: '5,840', target3Month: '9,000', target12Month: '20,000' },
{ metric: 'YouTube 다국어 자막 영상', current: '0', target3Month: '50', target12Month: '150' },
{ metric: 'Instagram KR 팔로워', current: '8,210', target3Month: '12,500', target12Month: '25,000' },
{ metric: 'Instagram Global 팔로워', current: '6,320', target3Month: '9,500', target12Month: '18,000' },
{ metric: '강남언니 리뷰', current: '2,547', target3Month: '2,800', target12Month: '3,800' },
{ metric: '인플루언서 협업', current: '0', target3Month: '5건', target12Month: '20건' },
{ metric: '리타겟팅 광고 ROAS', current: '미측정', target3Month: '2.5x', target12Month: '4.0x' },
],
screenshots: [
{
id: 'yt-channel',
url: '/assets/clients/o2o/screenshots/yt-channel.png',
channel: 'YouTube',
capturedAt: '2026-04-14T10:00:00Z',
caption: 'O2O Clinic @o2oclinic — 5,840 구독자, 280 영상',
sourceUrl: 'https://www.youtube.com/@o2oclinic',
},
{
id: 'ig-profile',
url: '/assets/clients/o2o/screenshots/ig-profile.png',
channel: 'Instagram',
capturedAt: '2026-04-14T10:02:00Z',
caption: 'Instagram @o2o_clinic — 8,210 팔로워 (KR 메인)',
sourceUrl: 'https://www.instagram.com/o2o_clinic',
},
{
id: 'ig-global',
url: '/assets/clients/o2o/screenshots/ig-global.png',
channel: 'Instagram Global',
capturedAt: '2026-04-14T10:03:00Z',
caption: 'Instagram @o2o_clinic_global — 6,320 팔로워 (영문)',
sourceUrl: 'https://www.instagram.com/o2o_clinic_global',
},
{
id: 'fb-page',
url: '/assets/clients/o2o/screenshots/fb-page.png',
channel: 'Facebook',
capturedAt: '2026-04-14T10:04:00Z',
caption: 'Facebook O2O Clinic Global — 3,025 팔로워 + WhatsApp',
sourceUrl: 'https://www.facebook.com/O2OClinicGlobal',
},
{
id: 'gangnamunni',
url: '/assets/clients/o2o/screenshots/gangnamunni.png',
channel: '강남언니',
capturedAt: '2026-04-14T10:05:00Z',
caption: '강남언니 — O2O Clinic 9.5점, 2,547 리뷰',
sourceUrl: 'https://www.gangnamunni.com/hospitals/o2o',
},
{
id: 'website-homepage',
url: '/assets/clients/o2o/screenshots/website-homepage.png',
channel: 'Website',
capturedAt: '2026-04-14T10:06:00Z',
caption: 'o2oclinic.com — 다국어 공식 홈페이지',
sourceUrl: 'https://www.o2oclinic.com',
},
],
};

View File

@ -1,331 +0,0 @@
import type { MarketingReport } from '@/features/report/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 },
{ 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

@ -1,347 +0,0 @@
import type { MarketingReport } from '@/features/report/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: '2001',
yearsInBusiness: 25,
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: 'k-wonjin.co.kr',
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: 'k-wonjin.co.kr 다국어 운영 양호 — 전환 추적 고도화 필요' },
{ 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: 'k-wonjin.co.kr',
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: 'k-wonjin.co.kr',
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: 'k-wonjin.co.kr',
linkedDomain: 'k-wonjin.co.kr',
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://k-wonjin.co.kr' },
],
websiteAudit: {
primaryDomain: 'k-wonjin.co.kr',
additionalDomains: [],
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 },
{ name: 'Google Analytics', installed: true },
],
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: '"25년 강남 코성형 전문 · 국제 환자 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: 'k-wonjin.co.kr — 다국어 공식 홈페이지',
sourceUrl: 'https://www.k-wonjin.co.kr',
},
{
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

@ -56,9 +56,8 @@ function clearSession() {
Object.values(SESSION_KEYS).forEach((k) => sessionStorage.removeItem(k));
}
// 백엔드 AnalysisStatus 4단계를 UI 5단계로 매핑.
// analyzing 한 단계는 길어서 generating → planning 으로 시간 기반 분할.
const ANALYZING_SPLIT_MS = 30_000;
// 백엔드 6단계(discovering/collecting/analyzing/planning/completed/failed)를
// UI 4단계로 매핑. analyzing + planning 은 사용자 입장에서 같은 "생성" 단계라 합침.
interface UseAnalysisPipelineResult {
phase: Phase;
@ -101,15 +100,11 @@ export function useAnalysisPipeline(): UseAnalysisPipelineResult {
let clinicId = resumeFrom?.clinicId;
let runId = resumeFrom?.runId;
// analyzing 진입 시각을 기록해서 generating → planning 시점을 시간으로 판단
let analyzingStartedAt: number | null = null;
const mapPhase = (s: AnalysisStatus): Phase => {
if (s === AnalysisStatus.discovering) return 'discovering';
if (s === AnalysisStatus.collecting) return 'collecting';
if (s === AnalysisStatus.analyzing) {
if (analyzingStartedAt === null) analyzingStartedAt = Date.now();
return Date.now() - analyzingStartedAt > ANALYZING_SPLIT_MS ? 'planning' : 'generating';
}
if (s === AnalysisStatus.analyzing) return 'generating';
if (s === AnalysisStatus.planning) return 'planning';
if (s === AnalysisStatus.completed) return 'complete';
return 'discovering';
};

View File

@ -3,7 +3,7 @@ import type { MarketingReport } from '@/features/report/types/report';
/**
* CSV .
* `=== Section Title ===` .
* + (Excel ).
* Excel/Numbers UTF-8 BOM .
*/
@ -217,11 +217,11 @@ function buildReportCsv(report: MarketingReport): string {
}
}
// ─── 출력 조립: 섹션 사이 공백 행 한 줄 ───
// ─── 출력 조립: Excel에서 보기 좋도록 빈 행 + 섹션 제목(한 셀) + 데이터 ───
const lines: string[] = [];
sections.forEach((sec, idx) => {
if (idx > 0) lines.push('');
lines.push(`=== ${sec.title} ===`);
lines.push(escapeCell(sec.title));
sec.rows.forEach((row) => lines.push(row.map(escapeCell).join(',')));
});

View File

@ -32,8 +32,6 @@ export function useReport(id: string | undefined): UseReportResult {
if (!output) {
throw new Error('리포트 데이터가 비어있습니다.');
}
// SDK MarketingReportResponse 가 사실상 MarketingReport 와 같은 shape — 그대로 사용.
// 미세한 차이(ScreenshotEvidence 등)는 컴포넌트 단에서 옵셔널로 처리됨.
setData(output as unknown as MarketingReport);
})
.catch((err) => {

View File

@ -2,16 +2,13 @@
* GuestReportPage `/report/:id`
*
* ( ) .
* UserReportPage , CTA
* .
*/
import { useParams } from 'react-router';
import { ArrowRight } from 'lucide-react';
import { useReportPageData } from '../hooks/useReportPageData';
import { ReportNav } from '../components/ReportNav';
import { ScreenshotProvider } from '../stores/ScreenshotContext';
import { REPORT_SECTIONS } from '@/shared/constants/reportSections';
import { buildContactMailto } from '@/shared/lib/contact';
import ReportBody from '../components/ReportBody';
export default function GuestReportPage() {
@ -53,32 +50,6 @@ export default function GuestReportPage() {
)}
<ReportBody data={data} />
{/* Guest 전용 — 도입 문의 CTA */}
<section className="px-6 py-16 bg-gradient-to-b from-white to-[#F3F0FF]/30">
<div className="max-w-3xl mx-auto rounded-3xl bg-[#0A1128] p-10 text-center relative overflow-hidden">
<div className="absolute top-0 right-0 w-[300px] h-[300px] rounded-full bg-[#7B2D8E]/20 blur-[120px]" aria-hidden />
<div className="relative">
<p className="text-xs uppercase tracking-wider text-purple-300/70 mb-3">
INFINITH
</p>
<h2 className="font-serif text-2xl md:text-3xl font-bold text-white mb-3 leading-snug">
</h2>
<p className="text-sm text-purple-200/70 break-keep leading-relaxed mb-7 max-w-xl mx-auto">
,
, .
</p>
<a
href={buildContactMailto(`도입 문의 — ${data.clinicSnapshot.name} 리포트`)}
className="inline-flex items-center gap-2 px-6 py-3 text-sm font-semibold text-[#0A1128] bg-white rounded-full shadow-sm hover:opacity-90 transition-all"
>
<ArrowRight className="w-4 h-4" />
</a>
</div>
</div>
</section>
</div>
</ScreenshotProvider>
);

View File

@ -5,7 +5,8 @@ export const PLAN_SECTIONS = [
{ id: 'content-calendar', label: '콘텐츠 캘린더' },
{ id: 'asset-collection', label: '에셋 수집' },
{ id: 'repurposing-proposal', label: '리퍼포징 제안' },
{ id: 'workflow-tracker', label: '제작 파이프라인' },
// { id: 'workflow-tracker', label: '제작 파이프라인' }, // plan에서 미포함
{ id: 'my-asset-upload', label: '나의 소재' },
// 성과 기반 전략 조정 — 본 차수 미포함, 후속 모듈 이관
// { id: 'strategy-adjustment', label: '전략 조정' },

View File

@ -0,0 +1,58 @@
import type { ComponentType } from 'react';
import {
YoutubeFilled,
InstagramFilled,
FacebookFilled,
GlobeFilled,
VideoFilled,
MessageFilled,
TiktokFilled,
FileTextFilled,
MegaphoneFilled,
} from './FilledIcons';
type IconComponent = ComponentType<{ size?: number; className?: string }>;
// API icon 필드는 채널 키(naverBlog) 또는 일반명(blog/map/star)으로 올 수 있어 둘 다 매핑.
export const channelIconMap: Record<string, IconComponent> = {
youtube: YoutubeFilled,
instagram: InstagramFilled,
facebook: FacebookFilled,
tiktok: TiktokFilled,
naverblog: FileTextFilled,
naver_blog: FileTextFilled,
blog: FileTextFilled,
naverplace: GlobeFilled,
naver_place: GlobeFilled,
map: GlobeFilled,
gangnamunni: MegaphoneFilled,
gangnam_unni: MegaphoneFilled,
star: MegaphoneFilled,
website: GlobeFilled,
homepage: GlobeFilled,
globe: GlobeFilled,
video: VideoFilled,
messagesquare: MessageFilled,
};
export function getChannelIcon(icon: string | undefined | null): IconComponent {
if (!icon) return GlobeFilled;
return channelIconMap[icon.toLowerCase()] ?? GlobeFilled;
}
// icon 필드가 generic('video', 'globe' 등) 으로 와도 채널 라벨로 보정.
// e.g. channel='TikTok', icon='video' → TiktokFilled
export function resolveChannelIcon(channelLabel?: string | null, icon?: string | null): IconComponent {
if (channelLabel) {
const lower = channelLabel.toLowerCase();
if (lower.includes('youtube')) return YoutubeFilled;
if (lower.includes('instagram')) return InstagramFilled;
if (lower.includes('facebook')) return FacebookFilled;
if (lower.includes('tiktok') || lower.includes('틱톡')) return TiktokFilled;
if (lower.includes('blog') || lower.includes('블로그')) return FileTextFilled;
if (lower.includes('place') || lower.includes('플레이스')) return GlobeFilled;
if (lower.includes('gangnam') || lower.includes('강남언니')) return MegaphoneFilled;
if (lower.includes('website') || lower.includes('홈페이지') || lower.includes('웹사이트')) return GlobeFilled;
}
return getChannelIcon(icon ?? undefined);
}

View File

@ -6,16 +6,7 @@
* -
* - : white/60 backdrop-blur + (ReportHeader )
*/
import { ExternalLink, Heart, MapPin } from 'lucide-react';
import type { CSSProperties } from 'react';
import {
InstagramFilled,
YoutubeFilled,
FacebookFilled,
GlobeFilled,
TiktokFilled,
FileTextFilled,
} from '@/shared/icons/FilledIcons';
import { ExternalLink, Heart, MapPin, Globe, Instagram, Youtube, Facebook, Music, FileText, type LucideIcon } from 'lucide-react';
export interface ChannelHandles {
website?: string | null;
@ -33,7 +24,7 @@ type PlatformKey = keyof ChannelHandles;
interface PlatformMeta {
label: string;
color: string;
Icon: (props: { size?: number; className?: string; style?: CSSProperties }) => React.ReactElement;
Icon: LucideIcon;
buildUrl: (handle: string) => string;
}
@ -41,31 +32,31 @@ const META: Record<PlatformKey, PlatformMeta> = {
website: {
label: '홈페이지',
color: '#6C5CE7',
Icon: GlobeFilled,
Icon: Globe,
buildUrl: (h) => (/^https?:\/\//.test(h) ? h : `https://${h}`),
},
instagram: {
label: 'Instagram',
color: '#833AB4',
Icon: InstagramFilled,
Icon: Instagram,
buildUrl: (h) => `https://instagram.com/${h.replace(/^@/, '')}`,
},
youtube: {
label: 'YouTube',
color: '#FF3D3D',
Icon: YoutubeFilled,
Icon: Youtube,
buildUrl: (h) => `https://youtube.com/${h.startsWith('@') ? h : `@${h}`}`,
},
facebook: {
label: 'Facebook',
color: '#1877F2',
Icon: FacebookFilled,
Icon: Facebook,
buildUrl: (h) => (/^https?:\/\//.test(h) ? h : `https://facebook.com/${h}`),
},
tiktok: {
label: 'TikTok',
color: '#0A1128',
Icon: TiktokFilled,
Icon: Music,
buildUrl: (h) => `https://tiktok.com/${h.startsWith('@') ? h : `@${h}`}`,
},
gangnamUnni: {
@ -91,7 +82,7 @@ const META: Record<PlatformKey, PlatformMeta> = {
naverBlog: {
label: '네이버 블로그',
color: '#03C75A',
Icon: FileTextFilled,
Icon: FileText,
buildUrl: (h) => {
if (/^https?:\/\//.test(h)) return h;
if (/blog\.naver\.com\//.test(h)) return `https://${h.replace(/^\/+/, '')}`;

View File

@ -0,0 +1,125 @@
/**
* PlatformIcon (string variant) lucide line icon .
*
* 'youtube', 'YouTube', 'naver-blog', '네이버 블로그'
* normalize . Globe.
*/
import {
Globe,
Instagram,
Youtube,
Facebook,
Music,
FileText,
Heart,
MapPin,
Search,
type LucideIcon,
} from 'lucide-react';
export type PlatformVariant =
| 'website'
| 'instagram'
| 'youtube'
| 'facebook'
| 'tiktok'
| 'naverPlace'
| 'naverBlog'
| 'naver'
| 'gangnamUnni'
| 'blog';
export const PLATFORM_ICONS: Record<PlatformVariant, LucideIcon> = {
website: Globe,
instagram: Instagram,
youtube: Youtube,
facebook: Facebook,
tiktok: Music,
naverPlace: MapPin,
naverBlog: FileText,
naver: Search,
gangnamUnni: Heart,
blog: FileText,
};
export const PLATFORM_COLORS: Record<PlatformVariant, string> = {
website: '#6C5CE7',
instagram: '#833AB4',
youtube: '#FF3D3D',
facebook: '#1877F2',
tiktok: '#0A1128',
naverPlace: '#03C75A',
naverBlog: '#03C75A',
naver: '#03C75A',
gangnamUnni: '#FF6B8A',
blog: '#03C75A',
};
/** 별칭 → canonical key. lowercase / 한글 / 공백·하이픈 변형을 흡수. */
const ALIAS: Record<string, PlatformVariant> = {
website: 'website',
homepage: 'website',
web: 'website',
site: 'website',
: 'website',
instagram: 'instagram',
ig: 'instagram',
: 'instagram',
: 'instagram',
youtube: 'youtube',
yt: 'youtube',
: 'youtube',
facebook: 'facebook',
fb: 'facebook',
: 'facebook',
tiktok: 'tiktok',
: 'tiktok',
naverplace: 'naverPlace',
: 'naverPlace',
: 'naverPlace',
place: 'naverPlace',
naverblog: 'naverBlog',
: 'naverBlog',
naver: 'naver',
: 'naver',
blog: 'blog',
: 'blog',
gangnamunni: 'gangnamUnni',
: 'gangnamUnni',
};
/** 자유 문자열 → PlatformVariant. 못 찾으면 undefined. */
export function resolvePlatformVariant(raw: string | null | undefined): PlatformVariant | undefined {
if (!raw) return undefined;
const norm = raw.toLowerCase().replace(/[\s\-_]+/g, '');
if (norm in ALIAS) return ALIAS[norm];
// 부분 일치 (예: "naver blog" → "naverblog" → naverBlog)
for (const key of Object.keys(ALIAS)) {
if (norm.includes(key)) return ALIAS[key];
}
return undefined;
}
interface PlatformIconProps {
/** 플랫폼 식별 문자열. 'youtube' / 'Instagram' / '네이버 블로그' 등 자유 형식 */
variant: string | null | undefined;
size?: number;
className?: string;
/** 색상을 자동으로 플랫폼 컬러로 채울지 (false 면 현재 텍스트 색 상속) */
colored?: boolean;
/** 매칭 실패 시 사용할 fallback icon. 기본 Globe. */
fallback?: LucideIcon;
}
export function PlatformIcon({
variant,
size = 16,
className,
colored = false,
fallback = Globe,
}: PlatformIconProps) {
const key = resolvePlatformVariant(variant);
const Icon = key ? PLATFORM_ICONS[key] : fallback;
const color = colored && key ? PLATFORM_COLORS[key] : undefined;
return <Icon size={size} className={className} style={color ? { color } : undefined} />;
}

View File

@ -78,6 +78,10 @@
[data-report-nav],
[data-plan-nav],
[data-cta-card],
[data-radix-popper-content-wrapper],
[role="menu"],
[role="dialog"],
[role="tooltip"],
nav {
display: none !important;
}