Compare commits
No commits in common. "main" and "claude/bold-hawking" have entirely different histories.
main
...
claude/bol
|
|
@ -1,6 +1,6 @@
|
||||||
hospital_name,brand_group,district,branches,website_kr,website_en,youtube_url,youtube_note,instagram_kr_url,instagram_followers,instagram_posts,instagram_kr_note,instagram_en_url,instagram_en_note,facebook_url,facebook_note,tiktok_url,tiktok_note,gangnam_unni_url,gangnam_unni_note,gangnam_unni_rating,gangnam_unni_reviews,gangnam_unni_badges,gangnam_unni_procedures,lead_doctor,naver_blog_url,naver_blog_note,naver_place_url,naver_place_reviews_note,google_maps_url,google_reviews_note
|
hospital_name,brand_group,district,branches,website_kr,website_en,youtube_url,youtube_note,instagram_kr_url,instagram_followers,instagram_posts,instagram_kr_note,instagram_en_url,instagram_en_note,facebook_url,facebook_note,tiktok_url,tiktok_note,gangnam_unni_url,gangnam_unni_note,gangnam_unni_rating,gangnam_unni_reviews,gangnam_unni_badges,gangnam_unni_procedures,lead_doctor,naver_blog_url,naver_blog_note,naver_place_url,naver_place_reviews_note,google_maps_url,google_reviews_note
|
||||||
바노바기성형외과,프리미엄/하이타깃 후보,강남,,https://www.banobagi.com,,https://www.youtube.com/c/banobagips,,https://www.instagram.com/banobagi_ps/,4124,196,,,,https://www.facebook.com/BanobagiPlasticSurgery,,,,https://www.gangnamunni.com/hospitals/23,,9.2,6843,수술실 CCTV;마취과 전문의 상주;여성 의사 진료;분야별 공동 진료;시술 후 관리;의료진 실명 공개;환자 숙박 정보 제공;전용 휴식 공간;입원 시설;응급 대응 체계;미용 의료 시술 진료;야간진료,눈성형;코성형;안면윤곽/양악;가슴성형;지방성형;필러;보톡스;리프팅;모발이식,반재상,https://blog.naver.com/banobagips,,https://m.place.naver.com/hospital/21033469,리뷰 773개,,
|
바노바기성형외과,프리미엄/하이타깃 후보,강남,,https://www.banobagi.com,,https://www.youtube.com/c/banobagips,,https://www.instagram.com/banobagi_ps/,4124,196,,,,https://www.facebook.com/BanobagiPlasticSurgery,,,,https://www.gangnamunni.com/hospitals/23,,9.2,6843,수술실 CCTV;마취과 전문의 상주;여성 의사 진료;분야별 공동 진료;시술 후 관리;의료진 실명 공개;환자 숙박 정보 제공;전용 휴식 공간;입원 시설;응급 대응 체계;미용 의료 시술 진료;야간진료,눈성형;코성형;안면윤곽/양악;가슴성형;지방성형;필러;보톡스;리프팅;모발이식,반재상,https://blog.naver.com/banobagips,,https://m.place.naver.com/hospital/21033469,리뷰 773개,,
|
||||||
뷰성형외과,프리미엄/하이타깃 후보,강남,뷰성형외과 역삼센터(역삼),https://www.viewclinic.com,,https://www.youtube.com/@ViewclinicKR,,https://www.instagram.com/viewplastic/,14072,1417,,,,https://www.facebook.com/viewps1/,,,,https://www.gangnamunni.com/hospitals/189,,9.5,19007,수술실 CCTV;마취과 전문의 상주;분야별 공동 진료;의료진 실명 공개;야간진료;여성 의사 진료;응급 대응 체계;시술 후 관리;입원 시설;전용 휴식 공간,눈성형;코성형;안면윤곽/양악;가슴성형;지방성형;필러;보톡스;피부리프팅;기타,최순우,https://blog.naver.com/viewclinicps,,https://m.place.naver.com/hospital/11709005,리뷰 776개,,
|
뷰성형외과,프리미엄/하이타깃 후보,강남,뷰성형외과 역삼센터(역삼),https://www.viewclinic.com,,https://www.youtube.com/@ViewclinicKR,,https://www.instagram.com/viewplastic/,14072,1417,,,,https://www.facebook.com/viewps1/,,,,https://www.gangnamunni.com/hospitals/189,,9.1,18840,수술실 CCTV;마취과 전문의 상주;분야별 공동 진료;의료진 실명 공개;야간진료;여성 의사 진료;응급 대응 체계;시술 후 관리;입원 시설;전용 휴식 공간,눈성형;코성형;안면윤곽/양악;가슴성형;지방성형;필러;보톡스;피부리프팅;기타,최순우,https://blog.naver.com/viewclinicps,,https://m.place.naver.com/hospital/11709005,리뷰 776개,,
|
||||||
아이디병원,프리미엄/하이타깃 후보,강남,아이디병원 별관(역삼),https://www.idhospital.com,,https://www.youtube.com/user/IDhospital,,https://www.instagram.com/idhospital,10120,811,,,,https://www.facebook.com/idhospital0050,,,,https://www.gangnamunni.com/hospitals/257,,9.5,14933,수술실 CCTV;시술 후 관리;의료진 실명 공개;여성 의사 진료;분야별 공동 진료;입원 시설;전용 휴식 공간;환자 숙박 정보 제공;야간진료;마취과 전문의 상주;응급 대응 체계,양악수술;안면윤곽;눈/코성형;가슴성형;리프팅;피부클리닉;쁘띠성형;치과,박상훈,https://blog.naver.com/idfacial,,https://m.place.naver.com/hospital/11548359,,,
|
아이디병원,프리미엄/하이타깃 후보,강남,아이디병원 별관(역삼),https://www.idhospital.com,,https://www.youtube.com/user/IDhospital,,https://www.instagram.com/idhospital,10120,811,,,,https://www.facebook.com/idhospital0050,,,,https://www.gangnamunni.com/hospitals/257,,9.5,14933,수술실 CCTV;시술 후 관리;의료진 실명 공개;여성 의사 진료;분야별 공동 진료;입원 시설;전용 휴식 공간;환자 숙박 정보 제공;야간진료;마취과 전문의 상주;응급 대응 체계,양악수술;안면윤곽;눈/코성형;가슴성형;리프팅;피부클리닉;쁘띠성형;치과,박상훈,https://blog.naver.com/idfacial,,https://m.place.naver.com/hospital/11548359,,,
|
||||||
그랜드성형외과,프리미엄/하이타깃 후보,강남,,https://www.grandsurgery.com,,https://www.youtube.com/channel/UCU2o_aHqsNFuqwtdzVM3xbQ,,https://www.instagram.com/grand_korea/,4015,1148,,,,https://www.facebook.com/grandps.korea,,,,https://www.gangnamunni.com/hospitals/62,,9.8,1531,분야별 공동 진료;응급 대응 체계;시술 후 관리;전용 휴식 공간;입원 시설;마취과 전문의 상주;의료진 실명 공개;성형외과 전문의 진료;여성 의사 진료;미용 의료 시술 진료;환자 숙박 정보 제공;역에서 도보 5분;학회 활동 의사,피부;코성형;눈성형;보톡스;필러;리프팅;가슴성형;지방성형,이세환,https://blog.naver.com/grandprs,,https://m.place.naver.com/hospital/12322994,,,
|
그랜드성형외과,프리미엄/하이타깃 후보,강남,,https://www.grandsurgery.com,,https://www.youtube.com/channel/UCU2o_aHqsNFuqwtdzVM3xbQ,,https://www.instagram.com/grand_korea/,4015,1148,,,,https://www.facebook.com/grandps.korea,,,,https://www.gangnamunni.com/hospitals/62,,9.8,1531,분야별 공동 진료;응급 대응 체계;시술 후 관리;전용 휴식 공간;입원 시설;마취과 전문의 상주;의료진 실명 공개;성형외과 전문의 진료;여성 의사 진료;미용 의료 시술 진료;환자 숙박 정보 제공;역에서 도보 5분;학회 활동 의사,피부;코성형;눈성형;보톡스;필러;리프팅;가슴성형;지방성형,이세환,https://blog.naver.com/grandprs,,https://m.place.naver.com/hospital/12322994,,,
|
||||||
원진성형외과,프리미엄/하이타깃 후보,강남,,https://www.k-wonjin.co.kr,,https://www.youtube.com/@wjwonjin,,https://www.instagram.com/wonjin_official/,23445,1844,,,,https://www.facebook.com/KwonjinPS,,https://www.tiktok.com/@wonjin_official,,https://www.gangnamunni.com/hospitals/2500,,9.3,11789,고객평가우수병원;분야별 공동 진료;응급 대응 체계;시술 후 관리;전용 휴식 공간;수술실 CCTV;여성 의사 진료;마취과 전문의 상주;야간진료;의료진 실명 공개,눈성형;코성형;안면윤곽/양악;가슴성형;지방성형;기타;모발이식;리프팅;보톡스;필러,강문석,https://blog.naver.com/popokpop,,https://m.place.naver.com/hospital/11887873,리뷰 9개,,
|
원진성형외과,프리미엄/하이타깃 후보,강남,,https://www.k-wonjin.co.kr,,https://www.youtube.com/@wjwonjin,,https://www.instagram.com/wonjin_official/,23445,1844,,,,https://www.facebook.com/KwonjinPS,,https://www.tiktok.com/@wonjin_official,,https://www.gangnamunni.com/hospitals/2500,,9.3,11789,고객평가우수병원;분야별 공동 진료;응급 대응 체계;시술 후 관리;전용 휴식 공간;수술실 CCTV;여성 의사 진료;마취과 전문의 상주;야간진료;의료진 실명 공개,눈성형;코성형;안면윤곽/양악;가슴성형;지방성형;기타;모발이식;리프팅;보톡스;필러,강문석,https://blog.naver.com/popokpop,,https://m.place.naver.com/hospital/11887873,리뷰 9개,,
|
||||||
|
|
|
||||||
|
|
|
@ -4,13 +4,9 @@
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>INFINITH - Infinite Marketing</title>
|
<title>INFINITH - Infinite Marketing</title>
|
||||||
<!-- Self-hosted Pretendard Variable preload (CDN 차단 망 대비) -->
|
|
||||||
<link rel="preload" href="/fonts/PretendardVariable.woff2" as="font" type="font/woff2" crossorigin />
|
|
||||||
<!-- Google Fonts: Inter + Playfair Display (영문 — fallback 안전) -->
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;0,900;1,400&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;0,900;1,400&display=swap" rel="stylesheet">
|
||||||
<!-- 백업 CDN (self-host 실패 대비) -->
|
|
||||||
<link rel="stylesheet" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css" />
|
<link rel="stylesheet" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,7 @@
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"clean": "rm -rf dist",
|
"clean": "rm -rf dist",
|
||||||
"lint": "tsc --noEmit",
|
"lint": "tsc --noEmit",
|
||||||
"db:sync": "tsx scripts/sync-db-local.ts",
|
"db:sync": "tsx scripts/sync-db-local.ts"
|
||||||
"sync-registry": "tsx scripts/import-registry.ts"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@google/genai": "^1.29.0",
|
"@google/genai": "^1.29.0",
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 602 KiB |
|
Before Width: | Height: | Size: 517 KiB |
|
Before Width: | Height: | Size: 397 KiB |
|
Before Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 404 KiB |
|
Before Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 314 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 403 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 620 KiB |
|
Before Width: | Height: | Size: 684 KiB |
|
Before Width: | Height: | Size: 331 KiB |
|
Before Width: | Height: | Size: 183 KiB |
|
Before Width: | Height: | Size: 403 KiB |
|
Before Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 919 KiB |
|
Before Width: | Height: | Size: 832 KiB |
|
Before Width: | Height: | Size: 343 KiB |
|
Before Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 404 KiB |
|
Before Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 642 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 607 KiB |
|
|
@ -14,8 +14,7 @@ import { createClient } from "@supabase/supabase-js";
|
||||||
import { readFileSync } from "fs";
|
import { readFileSync } from "fs";
|
||||||
import { config } from "dotenv";
|
import { config } from "dotenv";
|
||||||
|
|
||||||
config({ path: ".env" }); // base env (service role key lives here)
|
config({ path: ".env.local" });
|
||||||
config({ path: ".env.local" }); // local overrides (takes precedence)
|
|
||||||
|
|
||||||
const SUPABASE_URL = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
|
const SUPABASE_URL = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
|
||||||
const SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY;
|
const SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY;
|
||||||
|
|
@ -114,6 +113,8 @@ async function main() {
|
||||||
naver_blog_url: cols[COL.naver_blog_url]?.trim() || null,
|
naver_blog_url: cols[COL.naver_blog_url]?.trim() || null,
|
||||||
naver_place_url: cols[COL.naver_place_url]?.trim() || null,
|
naver_place_url: cols[COL.naver_place_url]?.trim() || null,
|
||||||
google_maps_url: cols[COL.google_maps_url]?.trim() || null,
|
google_maps_url: cols[COL.google_maps_url]?.trim() || null,
|
||||||
|
verified_by: "scrape",
|
||||||
|
is_active: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
import { Outlet, useLocation } from 'react-router';
|
import { Outlet, useLocation } from 'react-router';
|
||||||
import Navbar from './components/Navbar';
|
import Navbar from './components/Navbar';
|
||||||
import Footer from './components/Footer';
|
import Footer from './components/Footer';
|
||||||
// PageNavigator: 캡처/데모 시 화면을 가려 비활성화 (컴포넌트 자체는 보존)
|
import PageNavigator from './components/PageNavigator';
|
||||||
// import PageNavigator from './components/PageNavigator';
|
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
|
@ -13,7 +12,7 @@ export default function App() {
|
||||||
{!isLoadingPage && <Navbar />}
|
{!isLoadingPage && <Navbar />}
|
||||||
<Outlet />
|
<Outlet />
|
||||||
{!isLoadingPage && <Footer />}
|
{!isLoadingPage && <Footer />}
|
||||||
{/* {!isLoadingPage && <PageNavigator />} */}
|
{!isLoadingPage && <PageNavigator />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,14 @@
|
||||||
/**
|
import { useState } from 'react';
|
||||||
* CTA — 랜딩 페이지 하단 최종 전환 섹션.
|
import { useNavigate } from 'react-router';
|
||||||
*
|
|
||||||
* PART III 피봇:
|
|
||||||
* - Hero와 동일한 입력 로직(url state/navigate)을 중복 구현하던 문제 해소.
|
|
||||||
* 이제 `<MultiChannelInput variant="cta" />` 한 줄로 통일.
|
|
||||||
* - "무료 진단" 언급 삭제 — 계약 기반 모델 반영.
|
|
||||||
* - 헤드라인은 전략 소유권 메시지로 피봇 ("Own Your Marketing Strategy.").
|
|
||||||
* - 보조 CTA "가격 플랜 보기" 추가 (/pricing?from=cta).
|
|
||||||
*/
|
|
||||||
import { useNavigate, Link } from 'react-router';
|
|
||||||
import { motion } from 'motion/react';
|
import { motion } from 'motion/react';
|
||||||
import MultiChannelInput, { type AnalyzePayload } from './MultiChannelInput';
|
import { ArrowRight } from 'lucide-react';
|
||||||
|
|
||||||
export default function CTA() {
|
export default function CTA() {
|
||||||
|
const [url, setUrl] = useState('');
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const handleAnalyze = (payload: AnalyzePayload) => {
|
const handleAnalyze = () => {
|
||||||
navigate('/report/loading', {
|
if (url.trim()) navigate('/report/loading', { state: { url } });
|
||||||
state: {
|
|
||||||
url: payload.primaryUrl,
|
|
||||||
manualChannels: payload.manualChannels,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -37,7 +24,7 @@ export default function CTA() {
|
||||||
transition={{ duration: 0.6 }}
|
transition={{ duration: 0.6 }}
|
||||||
className="text-4xl md:text-5xl font-serif font-bold mb-4 leading-tight text-transparent bg-clip-text bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff]"
|
className="text-4xl md:text-5xl font-serif font-bold mb-4 leading-tight text-transparent bg-clip-text bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff]"
|
||||||
>
|
>
|
||||||
Own Your Marketing Strategy.
|
Ready to Transform Your Marketing?
|
||||||
</motion.h2>
|
</motion.h2>
|
||||||
|
|
||||||
<motion.p
|
<motion.p
|
||||||
|
|
@ -47,7 +34,7 @@ export default function CTA() {
|
||||||
transition={{ duration: 0.6, delay: 0.1 }}
|
transition={{ duration: 0.6, delay: 0.1 }}
|
||||||
className="text-lg md:text-xl text-purple-200 mb-10 max-w-2xl mx-auto font-light"
|
className="text-lg md:text-xl text-purple-200 mb-10 max-w-2xl mx-auto font-light"
|
||||||
>
|
>
|
||||||
URL 하나로 시작하는 AI 마케팅 전략 플래너.
|
URL 하나로 시작하는 완벽한 마케팅 자동화. 지금 바로 무료 진단을 받아보세요.
|
||||||
</motion.p>
|
</motion.p>
|
||||||
|
|
||||||
<motion.div
|
<motion.div
|
||||||
|
|
@ -55,19 +42,27 @@ export default function CTA() {
|
||||||
whileInView={{ opacity: 1, y: 0 }}
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
viewport={{ once: true }}
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.6, delay: 0.2 }}
|
transition={{ duration: 0.6, delay: 0.2 }}
|
||||||
className="w-full"
|
className="flex flex-col items-center justify-center gap-4 max-w-md mx-auto"
|
||||||
>
|
>
|
||||||
<MultiChannelInput variant="cta" onAnalyze={handleAnalyze} />
|
<input
|
||||||
|
type="url"
|
||||||
{/* 보조 CTA — 가격 플랜 */}
|
placeholder="Enter Your URL"
|
||||||
<div className="mt-6 flex justify-center">
|
value={url}
|
||||||
<Link
|
onChange={(e) => setUrl(e.target.value)}
|
||||||
to="/pricing?from=cta"
|
onKeyDown={(e) => e.key === 'Enter' && handleAnalyze()}
|
||||||
className="inline-flex items-center gap-2 text-sm font-semibold text-purple-200 hover:text-white transition-colors underline-offset-4 hover:underline"
|
className="w-full px-8 py-4 text-base font-medium bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff] border border-white/20 rounded-full focus:outline-none focus:ring-2 focus:ring-white/50 shadow-sm text-center text-primary-900 placeholder:text-primary-900/60"
|
||||||
>
|
/>
|
||||||
가격 플랜 보기 →
|
<button
|
||||||
</Link>
|
onClick={handleAnalyze}
|
||||||
</div>
|
disabled={!url.trim()}
|
||||||
|
className={`w-full px-10 py-4 text-lg font-medium text-white rounded-full transition-shadow duration-150 shadow-xl hover:shadow-2xl flex items-center justify-center gap-2 group bg-gradient-to-r from-[#4F1DA1] to-[#021341] hover:from-[#AF90FF] hover:to-[#AF90FF] active:scale-[0.98] ${!url.trim() ? 'opacity-50 cursor-not-allowed' : ''}`}
|
||||||
|
>
|
||||||
|
Analyze
|
||||||
|
<ArrowRight className="w-5 h-5 group-hover:translate-x-1" />
|
||||||
|
</button>
|
||||||
|
<p className="text-sm text-purple-200/80 mt-2">
|
||||||
|
네이버 블로그, 플레이스, 소셜미디어 종합 분석 리포트 받아보기
|
||||||
|
</p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,15 @@
|
||||||
|
import { useState } from 'react';
|
||||||
import { useNavigate } from 'react-router';
|
import { useNavigate } from 'react-router';
|
||||||
import { motion } from 'motion/react';
|
import { motion } from 'motion/react';
|
||||||
|
import { ArrowRight } from 'lucide-react';
|
||||||
import { PrismFilled } from './icons/FilledIcons';
|
import { PrismFilled } from './icons/FilledIcons';
|
||||||
import MultiChannelInput, { type AnalyzePayload } from './MultiChannelInput';
|
|
||||||
|
|
||||||
export default function Hero() {
|
export default function Hero() {
|
||||||
|
const [url, setUrl] = useState('');
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const handleAnalyze = (payload: AnalyzePayload) => {
|
const handleAnalyze = () => {
|
||||||
navigate('/report/loading', {
|
if (url.trim()) navigate('/report/loading', { state: { url } });
|
||||||
state: {
|
|
||||||
url: payload.primaryUrl,
|
|
||||||
manualChannels: payload.manualChannels,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -28,7 +25,7 @@ export default function Hero() {
|
||||||
className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/60 backdrop-blur-sm border border-white/40 shadow-sm mb-8"
|
className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/60 backdrop-blur-sm border border-white/40 shadow-sm mb-8"
|
||||||
>
|
>
|
||||||
<PrismFilled size={16} className="text-accent" />
|
<PrismFilled size={16} className="text-accent" />
|
||||||
<span className="text-sm font-medium text-slate-700">AI Marketing Strategist · Built for Premium Clinics</span>
|
<span className="text-sm font-medium text-slate-700">Agentic AI Marketing Automation for Premium Medical Business & Marketing Agency</span>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
<motion.h1
|
<motion.h1
|
||||||
|
|
@ -41,30 +38,39 @@ export default function Hero() {
|
||||||
<span className="text-gradient">Marketing Engine.</span>
|
<span className="text-gradient">Marketing Engine.</span>
|
||||||
</motion.h1>
|
</motion.h1>
|
||||||
|
|
||||||
{/* 서브 카피 — PART II 피봇: Strategic Planner 포지셔닝
|
|
||||||
▸ 이전 "Marketing that learns... 쓸수록 더 정교해지는..." 은 풀스택 자동화 약속이
|
|
||||||
Generation/Distribution Mock 상태와 맞지 않았음.
|
|
||||||
▸ Phase 1-4 (Discover→Collect→Report→Plan) 실제 구현 범위에 정직하게 일치시킴. */}
|
|
||||||
<motion.p
|
<motion.p
|
||||||
initial={{ opacity: 0, y: 20 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.6, delay: 0.2 }}
|
transition={{ duration: 0.6, delay: 0.2 }}
|
||||||
className="text-lg md:text-xl text-slate-600 mb-10 max-w-3xl mx-auto leading-relaxed"
|
className="text-lg md:text-xl text-slate-600 mb-10 max-w-3xl mx-auto leading-relaxed"
|
||||||
>
|
>
|
||||||
The Strategic Planner for Premium Medical Marketing. <br className="hidden md:block" />
|
Marketing that learns, improves, and accelerates — automatically. <br className="hidden md:block"/>
|
||||||
<span className="whitespace-nowrap">유튜브·인스타·네이버·강남언니를</span>{' '}
|
<span className="whitespace-nowrap">쓸수록 더 정교해지는</span>{' '}<span className="whitespace-nowrap">AI 마케팅 엔진.</span>{' '}<span className="whitespace-nowrap">콘텐츠 기획,</span>{' '}<span className="whitespace-nowrap">생성,</span>{' '}<span className="whitespace-nowrap">영상 제작,</span>{' '}<span className="whitespace-nowrap">채널 배포,</span>{' '}<span className="whitespace-nowrap">데이터 분석까지</span>{' '}<span className="whitespace-nowrap">하나로.</span>
|
||||||
<span className="whitespace-nowrap">10분 만에 진단하고,</span>{' '}
|
|
||||||
<span className="whitespace-nowrap">병원의 12개월 마케팅 전략을</span>{' '}
|
|
||||||
<span className="whitespace-nowrap">설계합니다.</span>
|
|
||||||
</motion.p>
|
</motion.p>
|
||||||
|
|
||||||
<motion.div
|
<motion.div
|
||||||
initial={{ opacity: 0, y: 20 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.6, delay: 0.3 }}
|
transition={{ duration: 0.6, delay: 0.3 }}
|
||||||
className="w-full"
|
className="flex flex-col items-center justify-center gap-5 max-w-lg mx-auto w-full"
|
||||||
>
|
>
|
||||||
<MultiChannelInput variant="hero" onAnalyze={handleAnalyze} />
|
<div className="relative w-full group">
|
||||||
|
<input
|
||||||
|
type="url"
|
||||||
|
placeholder="Enter Your Website URL"
|
||||||
|
value={url}
|
||||||
|
onChange={(e) => setUrl(e.target.value)}
|
||||||
|
onKeyDown={(e) => e.key === 'Enter' && handleAnalyze()}
|
||||||
|
className="w-full px-8 py-5 text-base font-medium bg-white/80 backdrop-blur-sm border border-slate-200 rounded-2xl focus:outline-none focus:ring-2 focus:ring-accent/20 focus:border-accent/40 shadow-sm text-center text-primary-900 placeholder:text-slate-400 transition-all group-hover:border-slate-300"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<button onClick={handleAnalyze} className={`relative z-10 w-full px-8 py-5 text-base font-bold rounded-2xl transition-all flex items-center justify-center gap-3 group ${url.trim() ? 'bg-gradient-to-r from-accent to-[#8B5CF6] text-white shadow-xl hover:shadow-2xl hover:scale-[1.02] active:scale-[0.98]' : 'bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white shadow-sm'}`} disabled={!url.trim()}>
|
||||||
|
Analyze Marketing Performance
|
||||||
|
<ArrowRight className="w-5 h-5 group-hover:translate-x-1 transition-transform" />
|
||||||
|
</button>
|
||||||
|
<p className="text-xs font-medium text-slate-500 mt-2">
|
||||||
|
네이버 블로그, 플레이스, 소셜미디어 등 Online Presence 종합 분석 리포트를 제공합니다.
|
||||||
|
</p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,76 +1,74 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { motion } from 'motion/react';
|
import { motion } from 'motion/react';
|
||||||
|
|
||||||
// PART II 피봇: 1·5번은 Product 1.0 Available, 2·3·4는 Coming Soon.
|
|
||||||
// 카피는 Intelligence + Planning 중심으로 조정 (구조 5개 카드는 유지).
|
|
||||||
const modules = [
|
const modules = [
|
||||||
{
|
{
|
||||||
step: "1",
|
step: "1",
|
||||||
title: "Marketing Intelligence",
|
title: "Marketing Intelligence",
|
||||||
items: [
|
items: [
|
||||||
"브랜드·온라인 프레즌스 진단",
|
"브랜딩, 마케팅 현황 분석",
|
||||||
"유튜브·인스타·네이버·강남언니 실측",
|
"타겟 고객 분석",
|
||||||
"경쟁 병원 벤치마크 (최대 10곳)",
|
"키워드 분석",
|
||||||
"키워드·해시태그 트렌드 분석",
|
"경쟁 및 포지셔닝 분석",
|
||||||
"Vision AI 기반 의료진·슬로건 추출",
|
"SEO 전략 & 채널별 콘텐츠 기획"
|
||||||
],
|
],
|
||||||
highlight: "10분 진단 → 전략 기획의 출발점",
|
highlight: "AI 기반 시장 통찰력 도출",
|
||||||
color: "bg-[#021341]",
|
color: "bg-[#021341]",
|
||||||
textColor: "text-indigo-600"
|
textColor: "text-indigo-600"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
step: "2",
|
step: "2",
|
||||||
title: "Strategic Planning",
|
title: "Content Creation",
|
||||||
items: [
|
items: [
|
||||||
"12개월 마케팅 로드맵",
|
"블로그 콘텐츠 생성",
|
||||||
"4~8주 콘텐츠 캘린더 + 필러 5종",
|
"SEO 콘텐츠 생성",
|
||||||
"KPI 대시보드 (3·12개월 목표)",
|
"SNS 콘텐츠 생성",
|
||||||
"주간 KPI 달성도 → 전략 조정 제안",
|
"마케팅 카피 생성",
|
||||||
"브랜드 가이드 (톤·컬러·로고) 자동 추출",
|
"Human-in-the loop 프로세스"
|
||||||
],
|
],
|
||||||
highlight: "관찰을 실행 가능한 전략으로 전환",
|
highlight: "고품질 맞춤형 콘텐츠 자동화",
|
||||||
color: "bg-[#021341]",
|
color: "bg-[#021341]",
|
||||||
textColor: "text-indigo-600"
|
textColor: "text-indigo-600"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
step: "3",
|
step: "3",
|
||||||
title: "Content Creation",
|
title: "Video Automation",
|
||||||
items: [
|
items: [
|
||||||
"블로그·SEO·SNS 카피 자동 생성",
|
"블로그 → 영상 변환",
|
||||||
"브랜드 톤 일관성 보장",
|
"숏폼 콘텐츠 생성",
|
||||||
"Human-in-the-loop 편집 워크플로우",
|
"유튜브 콘텐츠 제작",
|
||||||
"콘텐츠 필러·시즌별 테마 매핑",
|
"SNS 영상 제작",
|
||||||
"Coming Soon · Q4 2026",
|
"멀티모달 AI 엔진: 영상 + 음악 + 카피"
|
||||||
],
|
],
|
||||||
highlight: "전략을 실행 가능한 콘텐츠로",
|
highlight: "원클릭 영상 제작 시스템",
|
||||||
color: "bg-[#021341]",
|
color: "bg-[#021341]",
|
||||||
textColor: "text-indigo-600"
|
textColor: "text-indigo-600"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
step: "4",
|
step: "4",
|
||||||
title: "Video Automation",
|
title: "Distribution Engine",
|
||||||
items: [
|
items: [
|
||||||
"블로그 → 숏폼·유튜브 영상 변환",
|
"블로그 게시",
|
||||||
"Creatomate 기반 자동 렌더링",
|
"SNS 자동 게시",
|
||||||
"음악·자막·썸네일 AI 생성",
|
"유튜브 업로드",
|
||||||
"시즌별 템플릿 + 병원 CI 반영",
|
"콘텐츠 일정 관리",
|
||||||
"Coming Soon · Q4 2026",
|
"SEO, AEO 자동 최적화"
|
||||||
],
|
],
|
||||||
highlight: "영상 제작 리소스 부담 해소",
|
highlight: "전 채널 통합 배포 및 최적화",
|
||||||
color: "bg-[#021341]",
|
color: "bg-[#021341]",
|
||||||
textColor: "text-indigo-600"
|
textColor: "text-indigo-600"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
step: "5",
|
step: "5",
|
||||||
title: "Distribution & Performance",
|
title: "Performance Intelligence",
|
||||||
items: [
|
items: [
|
||||||
"멀티 채널 자동 게시 (블로그·SNS·유튜브)",
|
"SEO 성과 분석",
|
||||||
"SEO·AEO 자동 최적화",
|
"콘텐츠 성과 분석",
|
||||||
"실시간 성과 트래킹 + 리포트",
|
"채널 성과 분석",
|
||||||
"KPI 달성 → 다음 주기 전략 피드백",
|
"AI 콘텐츠 개선 전략 추천",
|
||||||
"Coming Soon · Q4 2026",
|
"데이터 기반 효과 검증"
|
||||||
],
|
],
|
||||||
highlight: "전략-실행-성과의 자율 루프 완성",
|
highlight: "실시간 성과 추적 및 개선",
|
||||||
color: "bg-[#021341]",
|
color: "bg-[#021341]",
|
||||||
textColor: "text-indigo-600"
|
textColor: "text-indigo-600"
|
||||||
}
|
}
|
||||||
|
|
@ -135,11 +133,8 @@ export default function Modules() {
|
||||||
<h2 className="text-4xl md:text-5xl font-serif font-bold text-primary-900 mb-6">
|
<h2 className="text-4xl md:text-5xl font-serif font-bold text-primary-900 mb-6">
|
||||||
Core Modules
|
Core Modules
|
||||||
</h2>
|
</h2>
|
||||||
{/* PART II 피봇: "자율 순환 마케팅 시스템" → 실제 Phase 1-4 구현 범위로 정직하게 조정.
|
<p className="text-lg md:text-xl text-slate-600 max-w-2xl mx-auto">
|
||||||
Product 1.0 Available 모듈 2개(Marketing Intelligence + Strategic Planning)와
|
성능 개선 반영 자율 순환 마케팅 시스템
|
||||||
Coming Soon 모듈 3개(Content/Video/Distribution)로 완성도 신호를 분명히. */}
|
|
||||||
<p className="text-lg md:text-xl text-slate-600 max-w-2xl mx-auto break-keep">
|
|
||||||
진단부터 전략 설계까지 <strong className="text-primary-900">Product 1.0 으로 출시된 모듈</strong>과 콘텐츠 실행을 위한 후속 로드맵입니다.
|
|
||||||
</p>
|
</p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,215 +0,0 @@
|
||||||
/**
|
|
||||||
* MultiChannelInput — 랜딩 Hero / CTA 공용 멀티 URL 입력 컴포넌트.
|
|
||||||
*
|
|
||||||
* 설계 배경 (PART III 피봇 + 2026-04 입력 분할 개편):
|
|
||||||
* - 영업 현장에서는 병원이 본인들의 YouTube/Instagram/FB/네이버플레이스/블로그/강남언니 URL을
|
|
||||||
* 이미 알고 있는 경우가 많아 이를 직접 받는 편이 정확도·속도 면에서 우월합니다.
|
|
||||||
* - 단일 textarea + 자동 분류 방식은 사용자가 "어떻게 입력해야 하는지" 직관이 없어
|
|
||||||
* 공란이 되거나 잘못된 URL이 섞이는 경우가 많았습니다.
|
|
||||||
* - 따라서 채널별로 7개 필드를 명시적으로 노출 — 빈 칸을 보면 "여기에 무엇을 넣어야 하는지"가 명확합니다.
|
|
||||||
*
|
|
||||||
* 동작:
|
|
||||||
* 1) 7개 필드 각각에 URL 입력 (한 줄에 하나)
|
|
||||||
* 2) 입력 시 `classifyUrls()`로 검증 — 해당 채널 패턴과 매치되는지 실시간 확인
|
|
||||||
* 3) 매치 성공: 우측에 체크 아이콘, 실패: 경고 아이콘
|
|
||||||
* 4) 1개 이상 유효 입력 시 Analyze 버튼 활성화
|
|
||||||
* 5) Submit 시 onAnalyze(payload) 호출 (부모가 navigation 처리)
|
|
||||||
*
|
|
||||||
* DS 준수:
|
|
||||||
* - Filled Icons Only (lucide 무단 사용 금지)
|
|
||||||
* - DS Primary pill: rounded-full + gradient `from-[#4F1DA1] to-[#021341]`
|
|
||||||
* - variant='hero': 글래스 배경 (랜딩 Hero)
|
|
||||||
* - variant='cta': 다크 배경 (CTA 섹션)
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { useMemo, useState, type ReactElement } from 'react';
|
|
||||||
import { ArrowRight } from 'lucide-react';
|
|
||||||
import {
|
|
||||||
GlobeFilled,
|
|
||||||
YoutubeFilled,
|
|
||||||
InstagramFilled,
|
|
||||||
FacebookFilled,
|
|
||||||
DatabaseFilled,
|
|
||||||
FileTextFilled,
|
|
||||||
MessageFilled,
|
|
||||||
CheckFilled,
|
|
||||||
WarningFilled,
|
|
||||||
} from './icons/FilledIcons';
|
|
||||||
import {
|
|
||||||
classifyUrls,
|
|
||||||
hasAnalyzableChannels,
|
|
||||||
pickPrimaryUrl,
|
|
||||||
type ClassifiedUrls,
|
|
||||||
} from '../lib/classifyUrls';
|
|
||||||
|
|
||||||
/** discover-channels Edge Function에 전달되는 수동 채널 URL 묶음. */
|
|
||||||
export interface ManualChannels {
|
|
||||||
youtube?: string[];
|
|
||||||
instagram?: string[];
|
|
||||||
facebook?: string[];
|
|
||||||
naverPlace?: string[];
|
|
||||||
naverBlog?: string[];
|
|
||||||
gangnamUnni?: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AnalyzePayload {
|
|
||||||
/** discover-channels `url` 필드 (필수) — 홈페이지 우선, 없으면 첫 SNS URL. */
|
|
||||||
primaryUrl: string;
|
|
||||||
/** 사용자가 제공한 채널별 URL — Edge Function이 Firecrawl discovery를 스킵. */
|
|
||||||
manualChannels: ManualChannels;
|
|
||||||
/** 사용자 원본 입력 (디버깅·재실행용) */
|
|
||||||
rawInput: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface MultiChannelInputProps {
|
|
||||||
variant?: 'hero' | 'cta';
|
|
||||||
onAnalyze: (payload: AnalyzePayload) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
type ChannelKey = keyof Omit<ClassifiedUrls, 'unknown'>;
|
|
||||||
|
|
||||||
/** 채널별 메타 — 라벨/아이콘/색상/플레이스홀더 (뷰성형외과 실 URL을 데모 placeholder로). */
|
|
||||||
const CHANNEL_META: Array<{
|
|
||||||
key: ChannelKey;
|
|
||||||
label: string;
|
|
||||||
Icon: (props: { size?: number; className?: string }) => ReactElement;
|
|
||||||
color: string;
|
|
||||||
placeholder: string;
|
|
||||||
}> = [
|
|
||||||
{ key: 'homepage', label: '홈페이지', Icon: GlobeFilled, color: 'text-[#4F1DA1]', placeholder: 'viewclinic.com' },
|
|
||||||
{ key: 'youtube', label: 'YouTube', Icon: YoutubeFilled, color: 'text-[#FF0000]', placeholder: 'youtube.com/@ViewclinicKR' },
|
|
||||||
{ key: 'instagram', label: 'Instagram', Icon: InstagramFilled,color: 'text-[#E1306C]', placeholder: 'instagram.com/viewplastic' },
|
|
||||||
{ key: 'facebook', label: 'Facebook', Icon: FacebookFilled, color: 'text-[#1877F2]', placeholder: 'facebook.com/viewps1' },
|
|
||||||
{ key: 'naverPlace', label: '네이버 플레이스', Icon: DatabaseFilled, color: 'text-[#03C75A]', placeholder: 'place.naver.com/hospital/11709005' },
|
|
||||||
{ key: 'naverBlog', label: '네이버 블로그', Icon: FileTextFilled, color: 'text-[#03C75A]', placeholder: 'blog.naver.com/viewclinicps' },
|
|
||||||
{ key: 'gangnamUnni', label: '강남언니', Icon: MessageFilled, color: 'text-[#FF5C89]', placeholder: 'gangnamunni.com/hospitals/189' },
|
|
||||||
];
|
|
||||||
|
|
||||||
type EmptyClassified = Record<ChannelKey, string>;
|
|
||||||
|
|
||||||
const EMPTY_URLS: EmptyClassified = {
|
|
||||||
homepage: '', youtube: '', instagram: '', facebook: '',
|
|
||||||
naverPlace: '', naverBlog: '', gangnamUnni: '',
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 단일 입력값 검증 — 해당 채널 패턴과 매치되는지.
|
|
||||||
* 빈 값: 'empty', 매치 성공: 'valid', SNS인데 다른 채널: 'wrong', 파싱 실패: 'invalid'
|
|
||||||
*/
|
|
||||||
function validateField(value: string, expected: ChannelKey): 'empty' | 'valid' | 'wrong' | 'invalid' {
|
|
||||||
if (!value.trim()) return 'empty';
|
|
||||||
const c = classifyUrls(value);
|
|
||||||
if (c[expected].length > 0) return 'valid';
|
|
||||||
// 다른 채널로 분류됐으면 'wrong', unknown이면 'invalid'
|
|
||||||
for (const k of Object.keys(c) as Array<keyof ClassifiedUrls>) {
|
|
||||||
if (k !== 'unknown' && k !== expected && c[k].length > 0) return 'wrong';
|
|
||||||
}
|
|
||||||
return 'invalid';
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function MultiChannelInput({ variant = 'hero', onAnalyze }: MultiChannelInputProps) {
|
|
||||||
const [urls, setUrls] = useState<EmptyClassified>(EMPTY_URLS);
|
|
||||||
|
|
||||||
// 통합 분류 결과 — 7개 필드 값을 join해 classifyUrls에 한 번에 통과시켜 manualChannels 구성.
|
|
||||||
const aggregated = useMemo(() => {
|
|
||||||
const joined = Object.values(urls).filter(Boolean).join('\n');
|
|
||||||
return classifyUrls(joined);
|
|
||||||
}, [urls]);
|
|
||||||
|
|
||||||
const canAnalyze = hasAnalyzableChannels(aggregated);
|
|
||||||
const primaryUrl = pickPrimaryUrl(aggregated);
|
|
||||||
|
|
||||||
const handleSubmit = () => {
|
|
||||||
if (!canAnalyze || !primaryUrl) return;
|
|
||||||
const payload: AnalyzePayload = {
|
|
||||||
primaryUrl,
|
|
||||||
manualChannels: {
|
|
||||||
youtube: aggregated.youtube.length ? aggregated.youtube : undefined,
|
|
||||||
instagram: aggregated.instagram.length ? aggregated.instagram : undefined,
|
|
||||||
facebook: aggregated.facebook.length ? aggregated.facebook : undefined,
|
|
||||||
naverPlace: aggregated.naverPlace.length ? aggregated.naverPlace : undefined,
|
|
||||||
naverBlog: aggregated.naverBlog.length ? aggregated.naverBlog : undefined,
|
|
||||||
gangnamUnni: aggregated.gangnamUnni.length ? aggregated.gangnamUnni : undefined,
|
|
||||||
},
|
|
||||||
rawInput: Object.entries(urls)
|
|
||||||
.filter(([, v]) => v.trim())
|
|
||||||
.map(([k, v]) => `${k}: ${v}`)
|
|
||||||
.join('\n'),
|
|
||||||
};
|
|
||||||
onAnalyze(payload);
|
|
||||||
};
|
|
||||||
|
|
||||||
// variant별 스타일 토큰
|
|
||||||
const isHero = variant === 'hero';
|
|
||||||
const inputClass = isHero
|
|
||||||
? 'w-full pl-11 pr-10 py-2.5 text-sm bg-white/80 backdrop-blur-sm border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-accent/20 focus:border-accent/40 shadow-sm text-primary-900 placeholder:text-slate-400 transition-all'
|
|
||||||
: 'w-full pl-11 pr-10 py-2.5 text-sm bg-white/5 backdrop-blur-sm border border-white/15 rounded-xl focus:outline-none focus:ring-2 focus:ring-accent/30 focus:border-accent/60 text-white placeholder:text-white/40 transition-all';
|
|
||||||
|
|
||||||
const labelClass = isHero ? 'text-slate-600' : 'text-white/70';
|
|
||||||
const helperClass = isHero ? 'text-slate-500' : 'text-white/60';
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="w-full max-w-2xl mx-auto">
|
|
||||||
{/* 7개 채널별 입력 필드 — 한 줄에 하나, 좌측 아이콘 + 우측 검증 상태 */}
|
|
||||||
<div className="flex flex-col gap-2">
|
|
||||||
{CHANNEL_META.map(({ key, label, Icon, color, placeholder }) => {
|
|
||||||
const value = urls[key];
|
|
||||||
const status = validateField(value, key);
|
|
||||||
return (
|
|
||||||
<div key={key} className="relative">
|
|
||||||
{/* 좌측 채널 아이콘 — 입력 시 컬러 적용, 빈 칸일 땐 회색 */}
|
|
||||||
<div className="absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none flex items-center gap-2">
|
|
||||||
<Icon size={16} className={value ? color : isHero ? 'text-slate-400' : 'text-white/40'} />
|
|
||||||
</div>
|
|
||||||
{/* 채널 라벨 — 좌측 상단 작은 라벨로 placeholder 위에 노출 */}
|
|
||||||
<input
|
|
||||||
type="url"
|
|
||||||
inputMode="url"
|
|
||||||
value={value}
|
|
||||||
onChange={(e) => setUrls((prev) => ({ ...prev, [key]: e.target.value }))}
|
|
||||||
placeholder={`${label} · ${placeholder}`}
|
|
||||||
aria-label={label}
|
|
||||||
className={inputClass}
|
|
||||||
spellCheck={false}
|
|
||||||
autoComplete="off"
|
|
||||||
/>
|
|
||||||
{/* 우측 검증 상태 아이콘 */}
|
|
||||||
<div className="absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none">
|
|
||||||
{status === 'valid' && (
|
|
||||||
<CheckFilled size={16} className="text-emerald-500" />
|
|
||||||
)}
|
|
||||||
{(status === 'wrong' || status === 'invalid') && (
|
|
||||||
<WarningFilled size={16} className={isHero ? 'text-amber-500' : 'text-amber-300'} />
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 보조 안내 — 1개 이상 입력 시 어느 채널이 분석 대상인지 요약 */}
|
|
||||||
<p className={`text-xs font-medium mt-3 text-center leading-relaxed break-keep ${labelClass}`}>
|
|
||||||
7개 채널 중 알고 계신 URL만 입력해주세요 — 1개만 입력하셔도 분석이 시작됩니다.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
{/* 분석 시작 버튼 — DS Primary pill */}
|
|
||||||
<button
|
|
||||||
onClick={handleSubmit}
|
|
||||||
disabled={!canAnalyze}
|
|
||||||
className={`w-full max-w-md mx-auto mt-4 px-10 py-4 text-lg font-medium rounded-full transition-all duration-150 shadow-xl hover:shadow-2xl flex items-center justify-center gap-2 group bg-gradient-to-r active:scale-[0.98] ${
|
|
||||||
isHero
|
|
||||||
? 'from-[#4F1DA1] to-[#021341] text-white hover:from-[#AF90FF] hover:to-[#AF90FF]'
|
|
||||||
: 'from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff] text-primary-900 hover:scale-[1.02]'
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
Analyze
|
|
||||||
<ArrowRight className="w-5 h-5 group-hover:translate-x-1" />
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{/* 보조 안내 (하단) */}
|
|
||||||
<p className={`text-xs font-medium mt-3 text-center leading-relaxed break-keep ${helperClass}`}>
|
|
||||||
네이버 블로그 · 플레이스 · 소셜미디어 등 Online Presence 종합 분석 리포트를 제공합니다.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -1,69 +1,22 @@
|
||||||
/**
|
|
||||||
* Navbar — 전역 상단 네비게이션.
|
|
||||||
*
|
|
||||||
* PART III 피봇:
|
|
||||||
* - "Free Report" CTA 완전 제거 (계약 기반 영업 모델로 전환).
|
|
||||||
* - Login 버튼 복원 — 계약 완료된 병원에 별도 발급된 자격 정보로 로그인 (스캐폴딩 단계).
|
|
||||||
* - 주 CTA는 `문의하기` (mailto:contact@o2o.kr) — 모든 리드 단일 채널화.
|
|
||||||
*
|
|
||||||
* 라우팅 구성:
|
|
||||||
* - 로고 "INFINITH" → `/` (홈)
|
|
||||||
* - Product / Use Cases → `/#solution`, `/#use-cases` 앵커
|
|
||||||
* - Pricing → `/pricing?from=header` (유입 추적용 쿼리)
|
|
||||||
* - Login → `/login` (Secondary pill — 계약 병원 전용)
|
|
||||||
* - 문의하기 → mailto (Primary pill — 신규 리드)
|
|
||||||
*
|
|
||||||
* ⚠️ 앵커 링크를 `/#solution` 형태로 쓰는 이유:
|
|
||||||
* 단순 `#solution`은 현재 페이지 내부 해시로 해석됩니다.
|
|
||||||
* 예컨대 `/pricing`에서 `#solution`을 누르면 /pricing 페이지 내의 #solution을 찾다가 실패합니다.
|
|
||||||
* `/#solution`은 React Router가 홈으로 이동시킨 뒤 브라우저가 해시 스크롤을 처리합니다.
|
|
||||||
*/
|
|
||||||
import { Link } from 'react-router';
|
import { Link } from 'react-router';
|
||||||
import { ArrowRight } from 'lucide-react';
|
import { motion } from 'motion/react';
|
||||||
import { buildContactMailto } from '../lib/contact';
|
|
||||||
|
|
||||||
export default function Navbar() {
|
export default function Navbar() {
|
||||||
return (
|
return (
|
||||||
<nav className="fixed top-0 left-0 right-0 z-50 bg-white/95 border-b border-slate-100 backdrop-blur-md">
|
<nav className="fixed top-0 left-0 right-0 z-50 bg-white/70 backdrop-blur-lg border-b border-white/20">
|
||||||
<div className="max-w-7xl mx-auto px-6 h-20 flex items-center justify-between">
|
<div className="max-w-7xl mx-auto px-6 h-20 flex items-center justify-between">
|
||||||
{/* 로고 */}
|
|
||||||
<Link to="/" className="flex items-center gap-2">
|
<Link to="/" className="flex items-center gap-2">
|
||||||
<span className="font-serif text-3xl font-black tracking-[0.05em] bg-gradient-to-r from-[#4F1DA1] to-[#021341] bg-clip-text text-transparent">
|
<span className="font-serif text-3xl font-black tracking-[0.05em] bg-gradient-to-r from-[#4F1DA1] to-[#021341] bg-clip-text text-transparent">INFINITH</span>
|
||||||
INFINITH
|
|
||||||
</span>
|
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{/* 가운데 메뉴 */}
|
|
||||||
<div className="hidden md:flex items-center gap-8 text-sm font-medium text-slate-600">
|
<div className="hidden md:flex items-center gap-8 text-sm font-medium text-slate-600">
|
||||||
<a href="/#solution" className="hover:text-primary-900 transition-colors">
|
<a href="#solution" className="hover:text-primary-900 transition-colors">Solution</a>
|
||||||
Product
|
<a href="#modules" className="hover:text-primary-900 transition-colors">Modules</a>
|
||||||
</a>
|
<a href="#use-cases" className="hover:text-primary-900 transition-colors">Use Cases</a>
|
||||||
<Link
|
|
||||||
to="/pricing?from=header"
|
|
||||||
className="hover:text-primary-900 transition-colors"
|
|
||||||
>
|
|
||||||
Pricing
|
|
||||||
</Link>
|
|
||||||
<a href="/#use-cases" className="hover:text-primary-900 transition-colors">
|
|
||||||
Use Cases
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div className="flex items-center gap-4">
|
||||||
{/* 우측 CTA — Login(Secondary) + 문의하기(Primary) */}
|
<button className="px-6 py-3 text-sm font-medium text-white rounded-full transition-all shadow-sm hover:shadow-md bg-gradient-to-r from-[#4F1DA1] to-[#021341] hover:opacity-90">
|
||||||
<div className="flex items-center gap-3">
|
|
||||||
<Link
|
|
||||||
to="/login"
|
|
||||||
className="inline-flex items-center gap-2 px-5 py-2.5 text-sm font-semibold text-[#021341] bg-white border border-slate-200 rounded-full hover:bg-slate-50 hover:border-slate-300 transition-colors"
|
|
||||||
>
|
|
||||||
Login
|
Login
|
||||||
</Link>
|
</button>
|
||||||
<a
|
|
||||||
href={buildContactMailto('도입 문의')}
|
|
||||||
className="inline-flex items-center gap-2 px-6 py-3 text-sm font-semibold text-white rounded-full transition-all shadow-sm hover:shadow-md bg-gradient-to-r from-[#4F1DA1] to-[#021341] hover:opacity-90"
|
|
||||||
>
|
|
||||||
문의하기
|
|
||||||
<ArrowRight className="w-4 h-4" />
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,18 @@
|
||||||
import { motion } from 'motion/react';
|
import { motion } from 'motion/react';
|
||||||
|
|
||||||
// PART II 피봇: 현장 고충 중심으로 재작성. #3 "데이터 기반의 마케팅 부족"은 유지(사용자 피드백).
|
|
||||||
const problems = [
|
const problems = [
|
||||||
{
|
{
|
||||||
title: "콘텐츠, 소진되는 비용과 시간",
|
title: "콘텐츠 생산의 한계",
|
||||||
desc: "매주 쏟아지는 콘텐츠 제작 요구에 인력·시간·예산이 빠르게 소진됩니다. ROI를 측정할 여력도 부족합니다."
|
desc: "블로그, SEO, 유튜브, 숏폼 등 지속적 생산이 필요하지만 인력과 비용, 시간 부족으로 제한됩니다."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "트렌드와 경쟁사 분석 부재",
|
title: "영상 콘텐츠 제작 비용",
|
||||||
desc: "강남언니·네이버·유튜브에서 경쟁 병원이 어떤 콘텐츠·메시지로 움직이는지 체계적으로 추적할 방법이 없습니다.",
|
desc: "영상은 중요하지만 촬영, 편집, 기획 비용이 높습니다. 특히 숏폼 콘텐츠는 지속적인 제작이 어렵습니다.",
|
||||||
highlight: true
|
highlight: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "데이터 기반의 마케팅 부족",
|
title: "데이터 기반의 마케팅 부족",
|
||||||
desc: "콘텐츠·광고·채널 성과가 어디에서 어떻게 작동하는지 데이터로 증명하기 어렵고, 의사결정은 감에 의존합니다."
|
desc: "어떤 콘텐츠가 효과적인지, 어떤 키워드가 유입을 만드는지, 어떤 채널이 성과가 좋은지 알기 어렵고, 각 플랫폼들의 데이터들을 한눈에 파악할 수 없습니다."
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ export default function Solution() {
|
||||||
className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/10 backdrop-blur-sm border border-white/20 mb-8"
|
className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/10 backdrop-blur-sm border border-white/20 mb-8"
|
||||||
>
|
>
|
||||||
<Sparkles className="w-4 h-4 text-purple-300" />
|
<Sparkles className="w-4 h-4 text-purple-300" />
|
||||||
<span className="text-sm font-medium text-purple-100">Strategic Planning Engine</span>
|
<span className="text-sm font-medium text-purple-100">AI Marketing Engine</span>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
<motion.h2
|
<motion.h2
|
||||||
|
|
@ -26,21 +26,20 @@ export default function Solution() {
|
||||||
transition={{ duration: 0.6, delay: 0.1 }}
|
transition={{ duration: 0.6, delay: 0.1 }}
|
||||||
className="text-4xl md:text-6xl font-serif font-bold mb-6 leading-tight text-transparent bg-clip-text bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff]"
|
className="text-4xl md:text-6xl font-serif font-bold mb-6 leading-tight text-transparent bg-clip-text bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff]"
|
||||||
>
|
>
|
||||||
The Strategic Planning Engine
|
Infinite Marketing Engine
|
||||||
</motion.h2>
|
</motion.h2>
|
||||||
|
|
||||||
{/* PART II 피봇: "관찰이 아닌 실행 가능한 전략을 출력하는 AI 플래너"
|
|
||||||
AGDP 키워드는 유지하되 의미를 전략 설계 중심으로 재해석. */}
|
|
||||||
<motion.p
|
<motion.p
|
||||||
initial={{ opacity: 0, y: 20 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
whileInView={{ opacity: 1, y: 0 }}
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
viewport={{ once: true }}
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.6, delay: 0.2 }}
|
transition={{ duration: 0.6, delay: 0.2 }}
|
||||||
className="text-xl md:text-2xl text-slate-300 mb-12 max-w-3xl mx-auto leading-relaxed font-light break-keep"
|
className="text-xl md:text-2xl text-slate-300 mb-12 max-w-3xl mx-auto leading-relaxed font-light"
|
||||||
>
|
>
|
||||||
<span className="font-medium text-white">관찰이 아닌, 실행 가능한 전략을 출력합니다.</span>
|
<span className="font-medium text-white">Infinite Marketing for Premium Medical Business & Marketing Agency</span>
|
||||||
<br className="hidden md:block" />
|
<br className="hidden md:block" />
|
||||||
INFINITH는 <strong className="text-white font-medium">Audit → Generation → Direction → Planning</strong>의 AGDP 루프로 병원의 마케팅 의사결정을 설계합니다. 유튜브·인스타·네이버·강남언니 실측 데이터를 기반으로 12개월 전략과 주간 KPI 조정까지.
|
Infinite Marketing은 Premium Medical Business와 Marketing Agency를 위한 AI Marketing Automation Platform입니다.
|
||||||
|
INFINITH는 마케팅 분석, 콘텐츠 생성, 영상 콘텐츠 제작, 채널 배포, 성과 분석과 피드백 적용을 하나의 Self-Improving Marketing Engine으로 제공합니다.
|
||||||
</motion.p>
|
</motion.p>
|
||||||
|
|
||||||
{/* Circular Loop Diagram */}
|
{/* Circular Loop Diagram */}
|
||||||
|
|
@ -70,21 +69,21 @@ export default function Solution() {
|
||||||
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-20">
|
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-20">
|
||||||
<div className="w-40 h-40 md:w-56 md:h-56 rounded-full bg-primary-900/90 backdrop-blur-xl border border-white/5 flex flex-col items-center justify-center shadow-[0_0_60px_rgba(167,139,250,0.1)]">
|
<div className="w-40 h-40 md:w-56 md:h-56 rounded-full bg-primary-900/90 backdrop-blur-xl border border-white/5 flex flex-col items-center justify-center shadow-[0_0_60px_rgba(167,139,250,0.1)]">
|
||||||
<span className="text-4xl md:text-6xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff] mb-2">AGDP</span>
|
<span className="text-4xl md:text-6xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff] mb-2">AGDP</span>
|
||||||
<h3 className="text-xl md:text-3xl font-serif font-bold text-white text-center leading-tight">Strategic<br/>Planning</h3>
|
<h3 className="text-xl md:text-3xl font-serif font-bold text-white text-center leading-tight">Infinite<br/>Marketing</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Node A: Audit (Left) — 구 Analysis. 병원·채널 진단 리포트 */}
|
{/* Node A: Analysis (Left) */}
|
||||||
<div className="absolute top-1/2 left-0 -translate-x-1/2 -translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
<div className="absolute top-1/2 left-0 -translate-x-1/2 -translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
||||||
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
||||||
<span className="text-3xl md:text-4xl font-bold text-purple-300">A</span>
|
<span className="text-3xl md:text-4xl font-bold text-purple-300">A</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<span className="block text-lg md:text-2xl font-medium text-purple-200 leading-tight">Audit</span>
|
<span className="block text-lg md:text-2xl font-medium text-purple-200 leading-tight">Analysis</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Node G: Generation (Top) — 전략·로드맵 문서 생성 (AI 콘텐츠 생성 아님) */}
|
{/* Node G: Generation (Top) */}
|
||||||
<div className="absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
<div className="absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
||||||
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
||||||
<span className="text-3xl md:text-4xl font-bold text-purple-300">G</span>
|
<span className="text-3xl md:text-4xl font-bold text-purple-300">G</span>
|
||||||
|
|
@ -94,23 +93,23 @@ export default function Solution() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Node D: Direction (Right) — 구 Distribution. 채널별 전략·우선순위 설계 */}
|
{/* Node D: Distribution (Right) */}
|
||||||
<div className="absolute top-1/2 right-0 translate-x-1/2 -translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
<div className="absolute top-1/2 right-0 translate-x-1/2 -translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
||||||
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
||||||
<span className="text-3xl md:text-4xl font-bold text-purple-300">D</span>
|
<span className="text-3xl md:text-4xl font-bold text-purple-300">D</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<span className="block text-lg md:text-2xl font-medium text-purple-200 leading-tight">Direction</span>
|
<span className="block text-lg md:text-2xl font-medium text-purple-200 leading-tight">Distribution</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Node P: Planning (Bottom) — 구 Performance. KPI 목표 설정 + 주간 조정 */}
|
{/* Node P: Performance (Bottom) */}
|
||||||
<div className="absolute bottom-0 left-1/2 -translate-x-1/2 translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
<div className="absolute bottom-0 left-1/2 -translate-x-1/2 translate-y-1/2 z-30 flex flex-col items-center gap-3 md:gap-4">
|
||||||
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
<div className="w-16 h-16 md:w-20 md:h-20 rounded-full border border-purple-500/30 bg-primary-900/80 backdrop-blur-sm flex items-center justify-center shadow-[0_0_20px_rgba(168,85,247,0.15)]">
|
||||||
<span className="text-3xl md:text-4xl font-bold text-purple-300">P</span>
|
<span className="text-3xl md:text-4xl font-bold text-purple-300">P</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<span className="block text-lg md:text-2xl font-medium text-purple-200 leading-tight">Planning</span>
|
<span className="block text-lg md:text-2xl font-medium text-purple-200 leading-tight">Performance</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -119,11 +118,9 @@ export default function Solution() {
|
||||||
<defs>
|
<defs>
|
||||||
<path id="rewardPath" d="M 10.6 56.9 A 40 40 0 0 0 43.1 89.4" fill="none" />
|
<path id="rewardPath" d="M 10.6 56.9 A 40 40 0 0 0 43.1 89.4" fill="none" />
|
||||||
</defs>
|
</defs>
|
||||||
{/* 구 "Reward Signal" → "KPI Feedback" 로 피봇.
|
|
||||||
주간 KPI 달성도가 전략 재조정의 입력 시그널이 된다는 의미. */}
|
|
||||||
<text fontSize="3.5" className="font-medium uppercase tracking-widest" fill="#d8b4fe" opacity="0.8">
|
<text fontSize="3.5" className="font-medium uppercase tracking-widest" fill="#d8b4fe" opacity="0.8">
|
||||||
<textPath href="#rewardPath" startOffset="50%" textAnchor="middle">
|
<textPath href="#rewardPath" startOffset="50%" textAnchor="middle">
|
||||||
← KPI FEEDBACK
|
← Reward SIGNAL
|
||||||
</textPath>
|
</textPath>
|
||||||
</text>
|
</text>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -138,8 +135,8 @@ export default function Solution() {
|
||||||
className="max-w-3xl mx-auto mt-12 text-center"
|
className="max-w-3xl mx-auto mt-12 text-center"
|
||||||
>
|
>
|
||||||
<div className="inline-block bg-white/5 border border-white/10 rounded-2xl px-6 py-4 backdrop-blur-sm">
|
<div className="inline-block bg-white/5 border border-white/10 rounded-2xl px-6 py-4 backdrop-blur-sm">
|
||||||
<p className="text-sm md:text-base text-slate-300 break-keep">
|
<p className="text-sm md:text-base text-slate-300">
|
||||||
<span className="font-bold text-purple-300">AGDP Cycle:</span> 진단(Audit) → 전략 생성(Generation) → 채널 방향성(Direction) → KPI 계획(Planning)의 무한 루프로 <span className="text-white font-medium">주간 KPI 달성도 → 전략 재조정</span>을 자율 반복합니다.
|
<span className="font-bold text-purple-300">AGDP Cycle:</span> 분석(Analysis) → 생성(Generation) → 배포(Distribution) → 성과(Performance)의 무한 루프를 통해 콘텐츠 품질(CTR)을 <span className="text-white font-medium">자율 최적화</span>합니다.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,8 @@ export default function TargetAudience() {
|
||||||
<h2 className="text-3xl md:text-5xl font-serif font-bold text-primary-900 mb-4">
|
<h2 className="text-3xl md:text-5xl font-serif font-bold text-primary-900 mb-4">
|
||||||
Who is Infinite Marketing for
|
Who is Infinite Marketing for
|
||||||
</h2>
|
</h2>
|
||||||
{/* PART II 피봇: 프리미엄 병원 메인, 대행사 보조. "전략 파트너·전략 자문" 포지셔닝 반영. */}
|
<p className="text-lg text-slate-600 max-w-2xl mx-auto">
|
||||||
<p className="text-lg text-slate-600 max-w-2xl mx-auto break-keep leading-relaxed">
|
프리미엄 의료 서비스와 전문 마케팅 에이전시를 위한 최적의 솔루션
|
||||||
프리미엄 병원의 <strong className="text-primary-900">전략 기획</strong>과 대행사 <strong className="text-primary-900">전략 자문</strong>을 위한 AI 플래너입니다.
|
|
||||||
</p>
|
</p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
|
|
@ -29,8 +28,8 @@ export default function TargetAudience() {
|
||||||
className="glass-card p-10 md:p-12 bg-gradient-to-br from-slate-50 to-white border border-slate-100 rounded-3xl"
|
className="glass-card p-10 md:p-12 bg-gradient-to-br from-slate-50 to-white border border-slate-100 rounded-3xl"
|
||||||
>
|
>
|
||||||
<h3 className="text-4xl md:text-5xl font-serif font-bold text-primary-900 mb-6 leading-tight">Premium Medical Business</h3>
|
<h3 className="text-4xl md:text-5xl font-serif font-bold text-primary-900 mb-6 leading-tight">Premium Medical Business</h3>
|
||||||
<p className="text-slate-600 mb-10 leading-relaxed text-lg break-keep">
|
<p className="text-slate-600 mb-10 leading-relaxed text-lg">
|
||||||
고객 LTV가 높은 <strong className="text-primary-900">프리미엄 성형외과의 전략 파트너</strong>. 유튜브·인스타·네이버·강남언니를 10분 만에 진단해 12개월 로드맵을 설계합니다.
|
고객 LTV가 높고 브랜드 경쟁이 심해 콘텐츠 마케팅이 필수적인 프리미엄 의료 서비스 제공 병원
|
||||||
</p>
|
</p>
|
||||||
<div className="flex flex-wrap gap-3">
|
<div className="flex flex-wrap gap-3">
|
||||||
{['피부과', '성형외과', '치과', '안과', '헬스케어 클리닉', '피트니스'].map((item, i) => (
|
{['피부과', '성형외과', '치과', '안과', '헬스케어 클리닉', '피트니스'].map((item, i) => (
|
||||||
|
|
@ -48,16 +47,9 @@ export default function TargetAudience() {
|
||||||
transition={{ duration: 0.6, delay: 0.2 }}
|
transition={{ duration: 0.6, delay: 0.2 }}
|
||||||
className="glass-card p-10 md:p-12 bg-gradient-to-br from-purple-50 to-white border border-purple-100/50 rounded-3xl"
|
className="glass-card p-10 md:p-12 bg-gradient-to-br from-purple-50 to-white border border-purple-100/50 rounded-3xl"
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-3 mb-6 flex-wrap">
|
<h3 className="text-4xl md:text-5xl font-serif font-bold text-primary-900 mb-6 leading-tight">Medical Marketing Agency</h3>
|
||||||
<h3 className="text-4xl md:text-5xl font-serif font-bold text-primary-900 leading-tight">Medical Marketing Agency</h3>
|
<p className="text-slate-600 mb-10 leading-relaxed text-lg">
|
||||||
{/* Partner Program 배지 — "준비중" 결핍 메시지 → "신청하세요" waitlist 희소성 프레임으로 전환.
|
콘텐츠 제작 비용 부담과 인력 의존도가 높고 영상 제작 생산성 개선이 필요한 병원 마케팅 대행사
|
||||||
대행사를 2차 페르소나가 아닌 early-access 대상으로 포지셔닝. */}
|
|
||||||
<span className="inline-flex items-center px-2.5 py-1 rounded-full bg-purple-100 text-purple-700 text-xs font-semibold border border-purple-200">
|
|
||||||
Partner Program · 신청하세요
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<p className="text-slate-600 mb-10 leading-relaxed text-lg break-keep">
|
|
||||||
병원 마케팅 대행사의 <strong className="text-primary-900">전략 자문</strong>. 진단 리포트와 경쟁사 벤치마크로 제안 품질을 높이고 수주 경쟁력을 강화합니다.
|
|
||||||
</p>
|
</p>
|
||||||
<div className="flex flex-wrap gap-3">
|
<div className="flex flex-wrap gap-3">
|
||||||
{['병원 마케팅 대행사', '콘텐츠 마케팅 Agency', '영상 마케팅 Agency', '광고 운영 대행사'].map((item, i) => (
|
{['병원 마케팅 대행사', '콘텐츠 마케팅 Agency', '영상 마케팅 Agency', '광고 운영 대행사'].map((item, i) => (
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,8 @@ export default function UseCases() {
|
||||||
<h2 className="text-3xl md:text-5xl font-serif font-bold text-primary-900 mb-4">
|
<h2 className="text-3xl md:text-5xl font-serif font-bold text-primary-900 mb-4">
|
||||||
Use Cases
|
Use Cases
|
||||||
</h2>
|
</h2>
|
||||||
{/* PART II 피봇: "만드는 실질적인 변화" (제품 중심) → 역할별 가치 (고객 중심)로 전환. */}
|
<p className="text-lg text-slate-600 max-w-2xl mx-auto font-medium">
|
||||||
<p className="text-lg text-slate-600 max-w-2xl mx-auto font-medium break-keep">
|
Infinite Marketing이 만드는 실질적인 변화를 확인해보세요!
|
||||||
프리미엄 병원과 전문 대행사가 INFINITH로 만드는 전략적 변화입니다.
|
|
||||||
</p>
|
</p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
|
|
@ -30,12 +29,11 @@ export default function UseCases() {
|
||||||
className="glass-card p-10 md:p-12 bg-gradient-to-br from-blue-50/50 to-white border border-blue-100/30"
|
className="glass-card p-10 md:p-12 bg-gradient-to-br from-blue-50/50 to-white border border-blue-100/30"
|
||||||
>
|
>
|
||||||
<h3 className="text-2xl md:text-3xl font-serif font-bold text-primary-900 mb-8">Premium Medical Business</h3>
|
<h3 className="text-2xl md:text-3xl font-serif font-bold text-primary-900 mb-8">Premium Medical Business</h3>
|
||||||
{/* 체크리스트 재설계: 진단(Audit) · 전략(Planning) · 운영(Weekly KPI) 3축. */}
|
|
||||||
<ul className="space-y-6">
|
<ul className="space-y-6">
|
||||||
{[
|
{[
|
||||||
'10분 진단으로 채널별 강·약점 파악, 투자 우선순위 즉시 도출',
|
'SEO 콘텐츠 자동 생산으로 검색 상위 노출 달성',
|
||||||
'12개월 마케팅 로드맵과 콘텐츠 캘린더로 기획 리소스 70% 절감',
|
'비용 부담 없이 고품질 영상 콘텐츠 대량 확대',
|
||||||
'주간 KPI 달성도 → 전략 조정 루프로 환자 전환 흐름 자율 최적화',
|
'자연 검색 유입 증가로 인한 환자 전환율 상승'
|
||||||
].map((item, i) => (
|
].map((item, i) => (
|
||||||
<li key={i} className="flex items-start gap-4 text-slate-700 font-medium group">
|
<li key={i} className="flex items-start gap-4 text-slate-700 font-medium group">
|
||||||
<CheckCircle2 className="w-6 h-6 text-[#7A84D4] shrink-0 mt-1" />
|
<CheckCircle2 className="w-6 h-6 text-[#7A84D4] shrink-0 mt-1" />
|
||||||
|
|
@ -53,12 +51,11 @@ export default function UseCases() {
|
||||||
className="glass-card p-10 md:p-12 bg-gradient-to-br from-purple-50/50 to-white border border-purple-100/30"
|
className="glass-card p-10 md:p-12 bg-gradient-to-br from-purple-50/50 to-white border border-purple-100/30"
|
||||||
>
|
>
|
||||||
<h3 className="text-2xl md:text-3xl font-serif font-bold text-primary-900 mb-8">Marketing Agency</h3>
|
<h3 className="text-2xl md:text-3xl font-serif font-bold text-primary-900 mb-8">Marketing Agency</h3>
|
||||||
{/* 대행사 가치축: 수주(Pitch) · 전략 품질(Strategy) · 포트폴리오 확장(Portfolio). */}
|
|
||||||
<ul className="space-y-6">
|
<ul className="space-y-6">
|
||||||
{[
|
{[
|
||||||
'진단 리포트와 경쟁사 벤치마크로 제안서 품질 강화, 수주 경쟁력 상승',
|
'AI 기반 콘텐츠 제작 자동화로 생산성 극대화',
|
||||||
'병원별 12개월 로드맵으로 전략 자문 일관성과 리텐션 확보',
|
'블로그 텍스트 기반 영상 제작 자동화로 리소스 절감',
|
||||||
'다수 병원 클라이언트 통합 대시보드로 운영 효율 극대화',
|
'다수 클라이언트 계정의 통합 운영 및 효율화'
|
||||||
].map((item, i) => (
|
].map((item, i) => (
|
||||||
<li key={i} className="flex items-start gap-4 text-slate-700 font-medium group">
|
<li key={i} className="flex items-start gap-4 text-slate-700 font-medium group">
|
||||||
<CheckCircle2 className="w-6 h-6 text-purple-500 shrink-0 mt-1" />
|
<CheckCircle2 className="w-6 h-6 text-purple-500 shrink-0 mt-1" />
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,9 @@ export default function AssetCollection({ data }: AssetCollectionProps) {
|
||||||
key={asset.id}
|
key={asset.id}
|
||||||
className="rounded-2xl border border-slate-100 bg-white shadow-sm p-5 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all"
|
className="rounded-2xl border border-slate-100 bg-white shadow-sm p-5 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all"
|
||||||
onClick={() => setSelectedAsset({ kind: 'asset', data: asset })}
|
onClick={() => setSelectedAsset({ kind: 'asset', data: asset })}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.4, delay: i * 0.05 }}
|
transition={{ duration: 0.4, delay: i * 0.05 }}
|
||||||
>
|
>
|
||||||
{/* Top badges row */}
|
{/* Top badges row */}
|
||||||
|
|
@ -152,7 +154,9 @@ export default function AssetCollection({ data }: AssetCollectionProps) {
|
||||||
key={video.title}
|
key={video.title}
|
||||||
className="min-w-[280px] rounded-2xl border border-slate-100 bg-white shadow-sm p-5 shrink-0 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all"
|
className="min-w-[280px] rounded-2xl border border-slate-100 bg-white shadow-sm p-5 shrink-0 cursor-pointer hover:shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:border-[#D5CDF5] transition-all"
|
||||||
onClick={() => setSelectedAsset({ kind: 'youtube', data: video })}
|
onClick={() => setSelectedAsset({ kind: 'youtube', data: video })}
|
||||||
animate={{ opacity: 1, x: 0 }}
|
initial={{ opacity: 0, x: 20 }}
|
||||||
|
whileInView={{ opacity: 1, x: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.4, delay: i * 0.1 }}
|
transition={{ duration: 0.4, delay: i * 0.1 }}
|
||||||
>
|
>
|
||||||
<div className="flex items-start gap-2 mb-3">
|
<div className="flex items-start gap-2 mb-3">
|
||||||
|
|
|
||||||
|
|
@ -157,6 +157,7 @@ function VisualIdentityTab({ data }: { data: BrandGuide }) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4 }}
|
transition={{ duration: 0.4 }}
|
||||||
className="space-y-8"
|
className="space-y-8"
|
||||||
|
|
@ -267,6 +268,7 @@ function VisualIdentityTab({ data }: { data: BrandGuide }) {
|
||||||
function ToneVoiceTab({ tone }: { tone: BrandGuide['toneOfVoice'] }) {
|
function ToneVoiceTab({ tone }: { tone: BrandGuide['toneOfVoice'] }) {
|
||||||
return (
|
return (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4 }}
|
transition={{ duration: 0.4 }}
|
||||||
className="space-y-6"
|
className="space-y-6"
|
||||||
|
|
@ -337,6 +339,7 @@ function ToneVoiceTab({ tone }: { tone: BrandGuide['toneOfVoice'] }) {
|
||||||
function ChannelRulesTab({ channels }: { channels: BrandGuide['channelBranding'] }) {
|
function ChannelRulesTab({ channels }: { channels: BrandGuide['channelBranding'] }) {
|
||||||
return (
|
return (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4 }}
|
transition={{ duration: 0.4 }}
|
||||||
>
|
>
|
||||||
|
|
@ -393,6 +396,7 @@ function BrandConsistencyTab({ inconsistencies }: { inconsistencies: BrandIncons
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4 }}
|
transition={{ duration: 0.4 }}
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,9 @@ export default function ChannelStrategy({ channels }: ChannelStrategyProps) {
|
||||||
<motion.div
|
<motion.div
|
||||||
key={ch.channelId}
|
key={ch.channelId}
|
||||||
className="bg-white rounded-2xl p-6 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:shadow-[4px_6px_16px_rgba(0,0,0,0.09)] transition-shadow"
|
className="bg-white rounded-2xl p-6 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] hover:shadow-[4px_6px_16px_rgba(0,0,0,0.09)] transition-shadow"
|
||||||
animate={{ opacity: 1, y: 0 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.5, delay: index * 0.1 }}
|
transition={{ duration: 0.5, delay: index * 0.1 }}
|
||||||
>
|
>
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import React, { useState, useCallback } from 'react';
|
import React, { useState, useCallback } from 'react';
|
||||||
import { exportCalendarToICS } from '../../lib/calendarExport';
|
import { exportCalendarToICS } from '../../lib/calendarExport';
|
||||||
|
import { motion } from 'motion/react';
|
||||||
import {
|
import {
|
||||||
VideoFilled,
|
VideoFilled,
|
||||||
FileTextFilled,
|
FileTextFilled,
|
||||||
|
|
@ -24,10 +25,10 @@ interface ContentCalendarProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
const contentTypeColors: Record<ContentCategory, { bg: string; text: string; entry: string; border: string; shadow: string }> = {
|
const contentTypeColors: Record<ContentCategory, { bg: string; text: string; entry: string; border: string; shadow: string }> = {
|
||||||
video: { bg: 'bg-[#F3F0FF]', text: 'text-[#6C5CE7]', entry: 'bg-[#EDE5FF] border-[#B8A8E8]', border: 'border-[#D5CDF5]', shadow: 'shadow-[2px_3px_8px_rgba(155,138,212,0.15)]' },
|
video: { bg: 'bg-[#F3F0FF]', text: 'text-[#6C5CE7]', entry: 'bg-[#F3F0FF] border-[#D5CDF5]', border: 'border-[#D5CDF5]', shadow: 'shadow-[2px_3px_8px_rgba(155,138,212,0.15)]' },
|
||||||
blog: { bg: 'bg-[#EFF0FF]', text: 'text-[#3A3F7C]', entry: 'bg-[#E2E5FF] border-[#A8B0E8]', border: 'border-[#C5CBF5]', shadow: 'shadow-[2px_3px_8px_rgba(122,132,212,0.15)]' },
|
blog: { bg: 'bg-[#EFF0FF]', text: 'text-[#3A3F7C]', entry: 'bg-[#EFF0FF] border-[#C5CBF5]', border: 'border-[#C5CBF5]', shadow: 'shadow-[2px_3px_8px_rgba(122,132,212,0.15)]' },
|
||||||
social: { bg: 'bg-[#FFF6ED]', text: 'text-[#7C5C3A]', entry: 'bg-[#FFEED9] border-[#E8C896]', border: 'border-[#F5E0C5]', shadow: 'shadow-[2px_3px_8px_rgba(212,168,114,0.15)]' },
|
social: { bg: 'bg-[#FFF6ED]', text: 'text-[#7C5C3A]', entry: 'bg-[#FFF6ED] border-[#F5E0C5]', border: 'border-[#F5E0C5]', shadow: 'shadow-[2px_3px_8px_rgba(212,168,114,0.15)]' },
|
||||||
ad: { bg: 'bg-[#FFF0F0]', text: 'text-[#7C3A4B]', entry: 'bg-[#FFE0E0] border-[#E8A8B4]', border: 'border-[#F5D5DC]', shadow: 'shadow-[2px_3px_8px_rgba(212,136,154,0.15)]' },
|
ad: { bg: 'bg-[#FFF0F0]', text: 'text-[#7C3A4B]', entry: 'bg-[#FFF0F0] border-[#F5D5DC]', border: 'border-[#F5D5DC]', shadow: 'shadow-[2px_3px_8px_rgba(212,136,154,0.15)]' },
|
||||||
};
|
};
|
||||||
|
|
||||||
const contentTypeLabels: Record<ContentCategory, string> = {
|
const contentTypeLabels: Record<ContentCategory, string> = {
|
||||||
|
|
@ -203,8 +204,8 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
|
||||||
key={dayIdx}
|
key={dayIdx}
|
||||||
className={`min-h-[100px] rounded-xl p-1.5 ${
|
className={`min-h-[100px] rounded-xl p-1.5 ${
|
||||||
entries.length > 0
|
entries.length > 0
|
||||||
? ''
|
? 'bg-slate-50/50 border border-slate-100'
|
||||||
: 'border border-dashed border-slate-200'
|
: 'border border-dashed border-slate-200/60'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{entries.map((entry, entryIdx) => renderEntry(entry, entryIdx))}
|
{entries.map((entry, entryIdx) => renderEntry(entry, entryIdx))}
|
||||||
|
|
@ -220,12 +221,12 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
|
||||||
const ContentIcon = contentTypeIcons[entry.contentType];
|
const ContentIcon = contentTypeIcons[entry.contentType];
|
||||||
const ChannelIcon = channelIconMap[entry.channelIcon] ?? GlobeFilled;
|
const ChannelIcon = channelIconMap[entry.channelIcon] ?? GlobeFilled;
|
||||||
const statusDot = statusDotColors[entry.status ?? 'draft'];
|
const statusDot = statusDotColors[entry.status ?? 'draft'];
|
||||||
const isDragging = draggedEntry !== null && draggedEntry.entry === entry;
|
const isDragging = draggedEntry?.entry.id === entry.id;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
key={entry.id ?? entryIdx}
|
key={entry.id ?? entryIdx}
|
||||||
className={`${colors.entry} border rounded-lg p-1.5 mb-1 last:mb-0 cursor-grab active:cursor-grabbing hover:ring-2 hover:ring-[#6C5CE7]/30 hover:shadow-lg shadow-sm transition-all group relative ${isDragging ? 'opacity-40' : ''}`}
|
className={`${colors.entry} border rounded-lg p-1.5 mb-1 last:mb-0 cursor-grab active:cursor-grabbing hover:ring-2 hover:ring-purple-200 transition-all group relative ${isDragging ? 'opacity-40' : ''}`}
|
||||||
draggable={weekNumber !== undefined}
|
draggable={weekNumber !== undefined}
|
||||||
onDragStart={weekNumber !== undefined ? () => handleDragStart(entry, weekNumber) : undefined}
|
onDragStart={weekNumber !== undefined ? () => handleDragStart(entry, weekNumber) : undefined}
|
||||||
onDragEnd={weekNumber !== undefined ? handleDragEnd : undefined}
|
onDragEnd={weekNumber !== undefined ? handleDragEnd : undefined}
|
||||||
|
|
@ -234,9 +235,9 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
|
||||||
<div className="flex items-center gap-1 mb-0.5">
|
<div className="flex items-center gap-1 mb-0.5">
|
||||||
<span className={`w-1.5 h-1.5 rounded-full ${statusDot} flex-shrink-0`} />
|
<span className={`w-1.5 h-1.5 rounded-full ${statusDot} flex-shrink-0`} />
|
||||||
<ChannelIcon size={10} className={colors.text} />
|
<ChannelIcon size={10} className={colors.text} />
|
||||||
<ContentIcon size={10} className={colors.text} />
|
<ContentIcon size={10} className={`${colors.text} opacity-60`} />
|
||||||
</div>
|
</div>
|
||||||
<p className="text-[11px] font-medium text-[#0A1128] leading-tight line-clamp-2">
|
<p className="text-[11px] text-slate-700 leading-tight line-clamp-2">
|
||||||
{entry.title}
|
{entry.title}
|
||||||
</p>
|
</p>
|
||||||
{entry.description && (
|
{entry.description && (
|
||||||
|
|
@ -312,19 +313,23 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
|
||||||
const Icon = contentTypeIcons[item.type];
|
const Icon = contentTypeIcons[item.type];
|
||||||
const isActive = filterType === item.type;
|
const isActive = filterType === item.type;
|
||||||
return (
|
return (
|
||||||
<button
|
<motion.button
|
||||||
key={item.type}
|
key={item.type}
|
||||||
className={`flex items-center gap-3 px-5 py-3 rounded-2xl border cursor-pointer transition-all ${colors.bg} ${colors.border} ${colors.shadow} ${
|
className={`flex items-center gap-3 px-5 py-3 rounded-2xl border cursor-pointer transition-all ${colors.bg} ${colors.border} ${colors.shadow} ${
|
||||||
isActive ? 'ring-2 ring-white/40 ring-offset-2 ring-offset-transparent' : ''
|
isActive ? 'ring-2 ring-white/40 ring-offset-2 ring-offset-transparent' : ''
|
||||||
} ${filterType && !isActive ? 'opacity-40' : ''}`}
|
} ${filterType && !isActive ? 'opacity-40' : ''}`}
|
||||||
onClick={() => toggleFilter(item.type)}
|
onClick={() => toggleFilter(item.type)}
|
||||||
|
initial={{ opacity: 0, y: 10 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.3, delay: i * 0.07 }}
|
||||||
>
|
>
|
||||||
<Icon size={16} className={`${colors.text} opacity-70`} />
|
<Icon size={16} className={`${colors.text} opacity-70`} />
|
||||||
<div className="flex flex-col items-start">
|
<div className="flex flex-col items-start">
|
||||||
<span className={`text-2xl font-bold leading-none ${colors.text}`}>{item.count}</span>
|
<span className={`text-2xl font-bold leading-none ${colors.text}`}>{item.count}</span>
|
||||||
<span className={`text-xs font-medium ${colors.text} opacity-70 mt-0.5`}>{item.label}</span>
|
<span className={`text-xs font-medium ${colors.text} opacity-70 mt-0.5`}>{item.label}</span>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</motion.button>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
{filterType && (
|
{filterType && (
|
||||||
|
|
@ -353,9 +358,13 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<motion.div
|
||||||
key={week.weekNumber}
|
key={week.weekNumber}
|
||||||
className="bg-white rounded-2xl p-5 mb-4 shadow-[3px_4px_12px_rgba(0,0,0,0.06)]"
|
className="bg-white rounded-2xl p-5 mb-4 shadow-[3px_4px_12px_rgba(0,0,0,0.06)]"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.4, delay: weekIdx * 0.1 }}
|
||||||
>
|
>
|
||||||
<p className="text-sm font-bold text-[#0A1128] mb-3">{week.label}</p>
|
<p className="text-sm font-bold text-[#0A1128] mb-3">{week.label}</p>
|
||||||
|
|
||||||
|
|
@ -376,9 +385,9 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
|
||||||
key={dayIdx}
|
key={dayIdx}
|
||||||
className={`min-h-[80px] rounded-xl p-1.5 transition-all ${
|
className={`min-h-[80px] rounded-xl p-1.5 transition-all ${
|
||||||
entries.length > 0
|
entries.length > 0
|
||||||
? ''
|
? 'bg-slate-50/50 border border-slate-100'
|
||||||
: 'border border-dashed border-slate-200'
|
: 'border border-dashed border-slate-200/60'
|
||||||
} ${isDropTarget ? 'ring-2 ring-[#6C5CE7]/40 bg-[#F3F0FF] border-[#D5CDF5]' : ''}`}
|
} ${isDropTarget ? 'ring-2 ring-[#6C5CE7]/40 bg-[#F3F0FF]/20 border-[#D5CDF5]' : ''}`}
|
||||||
onDragOver={(e) => handleDragOver(e, week.weekNumber, dayIdx)}
|
onDragOver={(e) => handleDragOver(e, week.weekNumber, dayIdx)}
|
||||||
onDragLeave={handleDragLeave}
|
onDragLeave={handleDragLeave}
|
||||||
onDrop={() => handleDrop(week.weekNumber, dayIdx)}
|
onDrop={() => handleDrop(week.weekNumber, dayIdx)}
|
||||||
|
|
@ -400,7 +409,7 @@ export default function ContentCalendar({ data, planId, onEntryUpdate }: Content
|
||||||
</svg>
|
</svg>
|
||||||
콘텐츠 추가
|
콘텐츠 추가
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</motion.div>
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
|
||||||
{activeTab === 'pillars' && (
|
{activeTab === 'pillars' && (
|
||||||
<motion.div
|
<motion.div
|
||||||
className="grid md:grid-cols-2 gap-6"
|
className="grid md:grid-cols-2 gap-6"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4 }}
|
transition={{ duration: 0.4 }}
|
||||||
>
|
>
|
||||||
|
|
@ -77,6 +78,7 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
|
||||||
key={pillar.title}
|
key={pillar.title}
|
||||||
className="rounded-2xl border border-slate-100 bg-white shadow-sm p-6 border-l-4"
|
className="rounded-2xl border border-slate-100 bg-white shadow-sm p-6 border-l-4"
|
||||||
style={{ borderLeftColor: pillar.color }}
|
style={{ borderLeftColor: pillar.color }}
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4, delay: i * 0.1 }}
|
transition={{ duration: 0.4, delay: i * 0.1 }}
|
||||||
>
|
>
|
||||||
|
|
@ -107,6 +109,7 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
|
||||||
{activeTab === 'types' && (
|
{activeTab === 'types' && (
|
||||||
<motion.div
|
<motion.div
|
||||||
className="rounded-2xl overflow-hidden border border-slate-100"
|
className="rounded-2xl overflow-hidden border border-slate-100"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4 }}
|
transition={{ duration: 0.4 }}
|
||||||
>
|
>
|
||||||
|
|
@ -120,6 +123,7 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
|
||||||
<motion.div
|
<motion.div
|
||||||
key={row.format}
|
key={row.format}
|
||||||
className={`grid grid-cols-4 ${i % 2 === 0 ? 'bg-white' : 'bg-slate-50'}`}
|
className={`grid grid-cols-4 ${i % 2 === 0 ? 'bg-white' : 'bg-slate-50'}`}
|
||||||
|
initial={{ opacity: 0, y: 10 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.3, delay: i * 0.04 }}
|
transition={{ duration: 0.3, delay: i * 0.04 }}
|
||||||
>
|
>
|
||||||
|
|
@ -144,59 +148,50 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Tab 3: Production Workflow */}
|
{/* Tab 3: Production Workflow */}
|
||||||
{activeTab === 'workflow' && (() => {
|
{activeTab === 'workflow' && (
|
||||||
// step 수에 따라 동일 너비 grid 컬럼 매핑 (Tailwind purge 안전)
|
<motion.div
|
||||||
const cols = data.workflow.length;
|
className="flex md:flex-row flex-col gap-4 items-stretch"
|
||||||
const gridColsClass =
|
initial={{ opacity: 0, y: 20 }}
|
||||||
cols <= 3 ? 'md:grid-cols-3'
|
animate={{ opacity: 1, y: 0 }}
|
||||||
: cols === 4 ? 'md:grid-cols-4'
|
transition={{ duration: 0.4 }}
|
||||||
: cols === 5 ? 'md:grid-cols-5'
|
>
|
||||||
: cols === 6 ? 'md:grid-cols-6'
|
{data.workflow.map((step, i) => (
|
||||||
: cols === 7 ? 'md:grid-cols-7'
|
<div key={step.step} className="flex md:flex-row flex-col items-center gap-4 flex-1">
|
||||||
: 'md:grid-cols-8';
|
<motion.div
|
||||||
|
className="flex-1 w-full rounded-2xl border border-slate-100 bg-white shadow-sm p-5"
|
||||||
return (
|
initial={{ opacity: 0, y: 20 }}
|
||||||
<motion.div
|
animate={{ opacity: 1, y: 0 }}
|
||||||
className={`grid grid-cols-1 ${gridColsClass} gap-4`}
|
transition={{ duration: 0.4, delay: i * 0.1 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
>
|
||||||
transition={{ duration: 0.4 }}
|
<div className="w-10 h-10 rounded-full bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white font-bold flex items-center justify-center mb-3">
|
||||||
>
|
{step.step}
|
||||||
{data.workflow.map((step, i) => (
|
</div>
|
||||||
<div key={step.step} className="relative">
|
<h4 className="font-semibold text-[#0A1128] mb-1">{step.name}</h4>
|
||||||
<motion.div
|
<p className="text-sm text-slate-600 mb-3">{step.description}</p>
|
||||||
className="h-full w-full rounded-2xl border border-slate-100 bg-white shadow-sm p-5 flex flex-col"
|
<div className="flex flex-wrap gap-2">
|
||||||
animate={{ opacity: 1, y: 0 }}
|
<span className="rounded-full bg-[#F3F0FF] text-[#4A3A7C] px-2 py-1 text-xs">
|
||||||
transition={{ duration: 0.4, delay: i * 0.1 }}
|
{step.owner}
|
||||||
>
|
</span>
|
||||||
<div className="w-10 h-10 rounded-full bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white font-bold flex items-center justify-center mb-3 shrink-0">
|
<span className="rounded-full bg-slate-100 text-slate-600 px-2 py-1 text-xs">
|
||||||
{step.step}
|
{step.duration}
|
||||||
</div>
|
</span>
|
||||||
<h4 className="font-semibold text-[#0A1128] mb-1">{step.name}</h4>
|
</div>
|
||||||
<p className="text-sm text-slate-600 mb-3 flex-1">{step.description}</p>
|
</motion.div>
|
||||||
<div className="flex flex-wrap gap-2 mt-auto">
|
{i < data.workflow.length - 1 && (
|
||||||
<span className="rounded-full bg-[#F3F0FF] text-[#4A3A7C] px-2 py-1 text-xs">
|
<ArrowRight
|
||||||
{step.owner}
|
size={20}
|
||||||
</span>
|
className="text-slate-300 shrink-0 hidden md:block"
|
||||||
<span className="rounded-full bg-slate-100 text-slate-600 px-2 py-1 text-xs">
|
/>
|
||||||
{step.duration}
|
)}
|
||||||
</span>
|
</div>
|
||||||
</div>
|
))}
|
||||||
</motion.div>
|
</motion.div>
|
||||||
{i < data.workflow.length - 1 && (
|
)}
|
||||||
<ArrowRight
|
|
||||||
size={20}
|
|
||||||
className="text-slate-300 absolute -right-3 top-1/2 -translate-y-1/2 hidden md:block z-10"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</motion.div>
|
|
||||||
);
|
|
||||||
})()}
|
|
||||||
|
|
||||||
{/* Tab 4: Repurposing */}
|
{/* Tab 4: Repurposing */}
|
||||||
{activeTab === 'repurposing' && (
|
{activeTab === 'repurposing' && (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.4 }}
|
transition={{ duration: 0.4 }}
|
||||||
>
|
>
|
||||||
|
|
@ -219,6 +214,7 @@ export default function ContentStrategy({ data }: ContentStrategyProps) {
|
||||||
<motion.div
|
<motion.div
|
||||||
key={`${output.format}-${i}`}
|
key={`${output.format}-${i}`}
|
||||||
className="rounded-xl border border-slate-100 bg-white p-4"
|
className="rounded-xl border border-slate-100 bg-white p-4"
|
||||||
|
initial={{ opacity: 0, y: 10 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.3, delay: i * 0.05 }}
|
transition={{ duration: 0.3, delay: i * 0.05 }}
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,9 @@ export default function PlanCTA() {
|
||||||
return (
|
return (
|
||||||
<motion.section
|
<motion.section
|
||||||
className="py-16 md:py-20 px-6"
|
className="py-16 md:py-20 px-6"
|
||||||
animate={{ opacity: 1, y: 0 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.6, ease: 'easeOut' }}
|
transition={{ duration: 0.6, ease: 'easeOut' }}
|
||||||
>
|
>
|
||||||
<div className="max-w-7xl mx-auto">
|
<div className="max-w-7xl mx-auto">
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ export default function PlanHeader({
|
||||||
}: PlanHeaderProps) {
|
}: PlanHeaderProps) {
|
||||||
return (
|
return (
|
||||||
<section className="relative overflow-hidden bg-[radial-gradient(ellipse_at_top_left,#e0e7ff,transparent_50%),radial-gradient(ellipse_at_bottom_right,#fce7f3,transparent_50%),radial-gradient(ellipse_at_center,#f5f3ff,transparent_60%)] py-20 md:py-28 px-6">
|
<section className="relative overflow-hidden bg-[radial-gradient(ellipse_at_top_left,#e0e7ff,transparent_50%),radial-gradient(ellipse_at_bottom_right,#fce7f3,transparent_50%),radial-gradient(ellipse_at_center,#f5f3ff,transparent_60%)] py-20 md:py-28 px-6">
|
||||||
{/* Animated blobs — position only, no opacity */}
|
{/* Animated blobs */}
|
||||||
<motion.div
|
<motion.div
|
||||||
className="absolute top-10 left-10 w-72 h-72 rounded-full bg-[#6C5CE7]/10 blur-3xl"
|
className="absolute top-10 left-10 w-72 h-72 rounded-full bg-[#6C5CE7]/10 blur-3xl"
|
||||||
animate={{ x: [0, 30, 0], y: [0, -20, 0] }}
|
animate={{ x: [0, 30, 0], y: [0, -20, 0] }}
|
||||||
|
|
@ -47,21 +47,51 @@ export default function PlanHeader({
|
||||||
|
|
||||||
<div className="relative max-w-7xl mx-auto">
|
<div className="relative max-w-7xl mx-auto">
|
||||||
<div className="flex flex-col md:flex-row items-center md:items-start justify-between gap-10">
|
<div className="flex flex-col md:flex-row items-center md:items-start justify-between gap-10">
|
||||||
{/* Left: Text content — plain div, no opacity animation */}
|
{/* Left: Text content */}
|
||||||
<div className="flex-1 text-center md:text-left">
|
<motion.div
|
||||||
<p className="text-xs font-semibold text-[#6C5CE7] mb-4 tracking-widest uppercase">
|
className="flex-1 text-center md:text-left"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.5 }}
|
||||||
|
>
|
||||||
|
<motion.p
|
||||||
|
className="text-xs font-semibold text-[#6C5CE7] mb-4 tracking-widest uppercase"
|
||||||
|
initial={{ opacity: 0, y: 10 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.5, delay: 0.1 }}
|
||||||
|
>
|
||||||
Marketing Execution Plan
|
Marketing Execution Plan
|
||||||
</p>
|
</motion.p>
|
||||||
|
|
||||||
<h1 className="font-serif text-4xl md:text-5xl font-bold text-[#0A1128] mb-3">
|
<motion.h1
|
||||||
|
className="font-serif text-4xl md:text-5xl font-bold text-[#0A1128] mb-3"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.5, delay: 0.2 }}
|
||||||
|
>
|
||||||
{clinicName}
|
{clinicName}
|
||||||
</h1>
|
</motion.h1>
|
||||||
|
|
||||||
<p className="text-xl text-slate-600 mb-8">
|
<motion.p
|
||||||
|
className="text-xl text-slate-600 mb-8"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.5, delay: 0.3 }}
|
||||||
|
>
|
||||||
{clinicNameEn}
|
{clinicNameEn}
|
||||||
</p>
|
</motion.p>
|
||||||
|
|
||||||
<div className="flex flex-wrap gap-3 justify-center md:justify-start">
|
<motion.div
|
||||||
|
className="flex flex-wrap gap-3 justify-center md:justify-start"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.5, delay: 0.4 }}
|
||||||
|
>
|
||||||
<span className="inline-flex items-center gap-2 rounded-full bg-white/60 backdrop-blur-sm border border-white/40 px-3 py-1 text-sm font-medium text-slate-700">
|
<span className="inline-flex items-center gap-2 rounded-full bg-white/60 backdrop-blur-sm border border-white/40 px-3 py-1 text-sm font-medium text-slate-700">
|
||||||
<CalendarFilled size={14} className="text-slate-400" />
|
<CalendarFilled size={14} className="text-slate-400" />
|
||||||
{formatDate(date)}
|
{formatDate(date)}
|
||||||
|
|
@ -70,18 +100,24 @@ export default function PlanHeader({
|
||||||
<GlobeFilled size={14} className="text-slate-400" />
|
<GlobeFilled size={14} className="text-slate-400" />
|
||||||
{targetUrl}
|
{targetUrl}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</motion.div>
|
||||||
</div>
|
</motion.div>
|
||||||
|
|
||||||
{/* Right: 90 Days badge */}
|
{/* Right: 90 Days badge */}
|
||||||
<div className="shrink-0">
|
<motion.div
|
||||||
|
className="shrink-0"
|
||||||
|
initial={{ opacity: 0, scale: 0.8 }}
|
||||||
|
whileInView={{ opacity: 1, scale: 1 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.6, delay: 0.3 }}
|
||||||
|
>
|
||||||
<div className="w-32 h-32 rounded-full bg-gradient-to-r from-[#4F1DA1] to-[#021341] flex flex-col items-center justify-center shadow-lg">
|
<div className="w-32 h-32 rounded-full bg-gradient-to-r from-[#4F1DA1] to-[#021341] flex flex-col items-center justify-center shadow-lg">
|
||||||
<span className="text-4xl font-bold text-white leading-none">
|
<span className="text-4xl font-bold text-white leading-none">
|
||||||
90
|
90
|
||||||
</span>
|
</span>
|
||||||
<span className="text-sm text-white/60">Days</span>
|
<span className="text-sm text-white/60">Days</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
import { motion } from 'motion/react';
|
||||||
import {
|
import {
|
||||||
YoutubeFilled,
|
YoutubeFilled,
|
||||||
InstagramFilled,
|
InstagramFilled,
|
||||||
|
|
@ -62,9 +63,13 @@ export default function RepurposingProposal({ proposals }: RepurposingProposalPr
|
||||||
const isExpanded = expandedIdx === idx;
|
const isExpanded = expandedIdx === idx;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<motion.div
|
||||||
key={item.sourceVideo.title}
|
key={item.sourceVideo.title}
|
||||||
className="rounded-2xl border border-slate-100 bg-white shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden"
|
className="rounded-2xl border border-slate-100 bg-white shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden"
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.4, delay: idx * 0.08 }}
|
||||||
>
|
>
|
||||||
{/* Card Header — click to expand */}
|
{/* Card Header — click to expand */}
|
||||||
<button
|
<button
|
||||||
|
|
@ -116,17 +121,26 @@ export default function RepurposingProposal({ proposals }: RepurposingProposalPr
|
||||||
|
|
||||||
{/* Expanded: Repurpose outputs */}
|
{/* Expanded: Repurpose outputs */}
|
||||||
{isExpanded && (
|
{isExpanded && (
|
||||||
<div className="border-t border-slate-100">
|
<motion.div
|
||||||
|
initial={{ opacity: 0, height: 0 }}
|
||||||
|
animate={{ opacity: 1, height: 'auto' }}
|
||||||
|
exit={{ opacity: 0, height: 0 }}
|
||||||
|
transition={{ duration: 0.2 }}
|
||||||
|
className="border-t border-slate-100"
|
||||||
|
>
|
||||||
<div className="px-6 py-4">
|
<div className="px-6 py-4">
|
||||||
<div className="flex items-center gap-2 mb-4">
|
<div className="flex items-center gap-2 mb-4">
|
||||||
<BoltFilled size={14} className="text-[#6C5CE7]" />
|
<BoltFilled size={14} className="text-[#6C5CE7]" />
|
||||||
<p className="text-xs font-semibold text-slate-500 uppercase tracking-widest">REPURPOSE AS</p>
|
<p className="text-xs font-semibold text-slate-500 uppercase tracking-widest">REPURPOSE AS</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
||||||
{item.outputs.map((output) => (
|
{item.outputs.map((output, oIdx) => (
|
||||||
<div
|
<motion.div
|
||||||
key={output.format}
|
key={output.format}
|
||||||
className="flex items-start gap-3 p-4 rounded-xl bg-slate-50 border border-slate-100"
|
className="flex items-start gap-3 p-4 rounded-xl bg-slate-50 border border-slate-100"
|
||||||
|
initial={{ opacity: 0, x: -8 }}
|
||||||
|
animate={{ opacity: 1, x: 0 }}
|
||||||
|
transition={{ delay: oIdx * 0.06 }}
|
||||||
>
|
>
|
||||||
<div className="w-8 h-8 rounded-lg bg-gradient-to-br from-[#6C5CE7]/10 to-[#4F1DA1]/10 flex items-center justify-center shrink-0">
|
<div className="w-8 h-8 rounded-lg bg-gradient-to-br from-[#6C5CE7]/10 to-[#4F1DA1]/10 flex items-center justify-center shrink-0">
|
||||||
<ChannelIcon channel={output.channel} size={16} />
|
<ChannelIcon channel={output.channel} size={16} />
|
||||||
|
|
@ -136,13 +150,13 @@ export default function RepurposingProposal({ proposals }: RepurposingProposalPr
|
||||||
<p className="text-xs text-[#6C5CE7] font-medium mb-1">{output.channel}</p>
|
<p className="text-xs text-[#6C5CE7] font-medium mb-1">{output.channel}</p>
|
||||||
<p className="text-xs text-slate-500 leading-relaxed">{output.description}</p>
|
<p className="text-xs text-slate-500 leading-relaxed">{output.description}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</motion.div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</motion.div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</motion.div>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,7 @@ export default function StrategyAdjustmentSection({ clinicId, planId }: Strategy
|
||||||
{overallAssessment && (
|
{overallAssessment && (
|
||||||
<motion.div
|
<motion.div
|
||||||
className="bg-purple-50 border border-purple-100 rounded-2xl p-4 mb-6"
|
className="bg-purple-50 border border-purple-100 rounded-2xl p-4 mb-6"
|
||||||
|
initial={{ opacity: 0, y: 10 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
>
|
>
|
||||||
<p className="text-sm text-purple-800">{overallAssessment}</p>
|
<p className="text-sm text-purple-800">{overallAssessment}</p>
|
||||||
|
|
@ -191,6 +192,7 @@ export default function StrategyAdjustmentSection({ clinicId, planId }: Strategy
|
||||||
<motion.div
|
<motion.div
|
||||||
key={i}
|
key={i}
|
||||||
className="bg-white rounded-xl p-4 border border-slate-100"
|
className="bg-white rounded-xl p-4 border border-slate-100"
|
||||||
|
initial={{ opacity: 0, x: -10 }}
|
||||||
animate={{ opacity: 1, x: 0 }}
|
animate={{ opacity: 1, x: 0 }}
|
||||||
transition={{ delay: i * 0.05 }}
|
transition={{ delay: i * 0.05 }}
|
||||||
>
|
>
|
||||||
|
|
@ -235,6 +237,7 @@ export default function StrategyAdjustmentSection({ clinicId, planId }: Strategy
|
||||||
<motion.div
|
<motion.div
|
||||||
key={i}
|
key={i}
|
||||||
className={`${colors.bg} rounded-xl p-4 border border-slate-100`}
|
className={`${colors.bg} rounded-xl p-4 border border-slate-100`}
|
||||||
|
initial={{ opacity: 0, y: 10 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ delay: i * 0.08 }}
|
transition={{ delay: i * 0.08 }}
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ function WorkflowCard({ item, onStageChange, onNotesChange }: {
|
||||||
<motion.div
|
<motion.div
|
||||||
layout
|
layout
|
||||||
className="bg-white rounded-2xl border border-slate-100 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden"
|
className="bg-white rounded-2xl border border-slate-100 shadow-[3px_4px_12px_rgba(0,0,0,0.06)] overflow-hidden"
|
||||||
|
initial={{ opacity: 0, y: 16 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
exit={{ opacity: 0, y: -8 }}
|
exit={{ opacity: 0, y: -8 }}
|
||||||
transition={{ duration: 0.3 }}
|
transition={{ duration: 0.3 }}
|
||||||
|
|
@ -143,6 +144,7 @@ function WorkflowCard({ item, onStageChange, onNotesChange }: {
|
||||||
<AnimatePresence>
|
<AnimatePresence>
|
||||||
{expanded && (
|
{expanded && (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
initial={{ opacity: 0, height: 0 }}
|
||||||
animate={{ opacity: 1, height: 'auto' }}
|
animate={{ opacity: 1, height: 'auto' }}
|
||||||
exit={{ opacity: 0, height: 0 }}
|
exit={{ opacity: 0, height: 0 }}
|
||||||
transition={{ duration: 0.2 }}
|
transition={{ duration: 0.2 }}
|
||||||
|
|
@ -339,6 +341,7 @@ export default function WorkflowTracker({ data }: WorkflowTrackerProps) {
|
||||||
className={`flex items-center gap-2 px-3 py-1.5 rounded-full border text-xs font-medium transition-all ${color.bg} ${color.text} ${color.border} ${
|
className={`flex items-center gap-2 px-3 py-1.5 rounded-full border text-xs font-medium transition-all ${color.bg} ${color.text} ${color.border} ${
|
||||||
isActive ? 'ring-2 ring-white/40' : ''
|
isActive ? 'ring-2 ring-white/40' : ''
|
||||||
} ${activeStageFilter && !isActive ? 'opacity-40' : ''}`}
|
} ${activeStageFilter && !isActive ? 'opacity-40' : ''}`}
|
||||||
|
initial={{ opacity: 0, scale: 0.9 }}
|
||||||
animate={{ opacity: 1, scale: 1 }}
|
animate={{ opacity: 1, scale: 1 }}
|
||||||
transition={{ duration: 0.2 }}
|
transition={{ duration: 0.2 }}
|
||||||
>
|
>
|
||||||
|
|
@ -363,6 +366,7 @@ export default function WorkflowTracker({ data }: WorkflowTrackerProps) {
|
||||||
<AnimatePresence mode="popLayout">
|
<AnimatePresence mode="popLayout">
|
||||||
{filtered.length === 0 ? (
|
{filtered.length === 0 ? (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
initial={{ opacity: 0 }}
|
||||||
animate={{ opacity: 1 }}
|
animate={{ opacity: 1 }}
|
||||||
className="text-center py-10 text-white/30 text-sm"
|
className="text-center py-10 text-white/30 text-sm"
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
||||||
/**
|
|
||||||
* FAQ — Pricing 페이지 하단 자주 묻는 질문.
|
|
||||||
*
|
|
||||||
* 계약 기반 영업 모델에 맞춰 카피 재작성 (plan 섹션 15-E 변형):
|
|
||||||
* - 온라인 결제 관련 질문 제거
|
|
||||||
* - 세금계산서 / 계약서 / 분원 4개↑ 커스텀 / 의료법 심의 / 강남언니 데이터 / 품질 보장 / Export 포함
|
|
||||||
*
|
|
||||||
* 인터랙션:
|
|
||||||
* - 단일 오픈(single-open) 아코디언 — `useState<string | null>` 로 현재 열린 질문 ID 추적
|
|
||||||
* - 같은 버튼 재클릭 시 닫힘 (`prev === id ? null : id`)
|
|
||||||
* - motion/react AnimatePresence로 높이 전환 애니메이션
|
|
||||||
*
|
|
||||||
* DS 준수:
|
|
||||||
* - 아이콘은 lucide Plus/Minus 대신 단순 회전 ChevronDown(기본 lucide는 동반 가능 — outlined 단색)
|
|
||||||
* ※ DS "Filled Icons Only"는 '아이콘 면적 채움' 규칙이며 UI utility(chevron·arrow)는 허용 범위.
|
|
||||||
* 이미 CTA 버튼도 lucide ArrowRight를 사용 중이므로 일관.
|
|
||||||
*/
|
|
||||||
import { useState } from 'react';
|
|
||||||
import { motion, AnimatePresence } from 'motion/react';
|
|
||||||
import { ChevronDown } from 'lucide-react';
|
|
||||||
|
|
||||||
interface FaqItem {
|
|
||||||
id: string;
|
|
||||||
q: string;
|
|
||||||
a: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* FAQ 항목 목록.
|
|
||||||
*
|
|
||||||
* ※ 해지·환불 관련 세부 정책(구 `refund`, `quality` 항목)은 추후 세부 정책 확정 후
|
|
||||||
* 재도입 예정. 현재는 계약·결제·운영 프로세스 + 의료법/데이터 수집 범위만 노출.
|
|
||||||
*/
|
|
||||||
const items: FaqItem[] = [
|
|
||||||
{
|
|
||||||
id: 'contract',
|
|
||||||
q: '계약은 어떻게 진행하나요?',
|
|
||||||
a: '상담 문의 → 요건·범위 확정 → 계약서 및 세금계산서 발행 순서로 진행됩니다. 계약 기간은 월·분기·연 단위 중 선택 가능하며, 연 계약 시 월 환산 20% 할인이 적용됩니다.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'payment',
|
|
||||||
q: '결제 방식은 어떻게 되나요?',
|
|
||||||
a: '온라인 카드 결제는 제공하지 않으며, 세금계산서 기반 계좌 입금으로 진행됩니다. 법인·개인사업자 모두 지원하며, 결제 조건(선불/후불)은 계약서에서 협의합니다.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'multi-clinic',
|
|
||||||
q: '분원이 4개 이상인데 어떻게 하나요?',
|
|
||||||
a: 'INTELLIGENCE+는 최대 3개 분원까지 통합 대시보드를 제공합니다. 4개 이상이거나 그룹사 단위로 분석이 필요하신 경우 커스텀 플랜 상담을 통해 데이터 구조·리포팅 범위를 맞춤 설계해 드립니다.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'medical-law',
|
|
||||||
q: '의료법 광고 심의와 충돌하지 않나요?',
|
|
||||||
a: 'INFINITH 리포트는 내부 마케팅 전략 문서이며 환자 대상 광고물이 아닙니다. 리포트 내용을 실제 광고·SNS 게시물로 활용하실 경우 의료광고심의위원회 심의가 별도로 필요하며, 이는 고객사(병원) 및 대행사 책임입니다.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'gangnamunni',
|
|
||||||
q: '강남언니 데이터는 어떻게 수집하나요?',
|
|
||||||
a: '강남언니 앱 및 웹의 공개 병원 페이지에서 병원명·리뷰 수·평점·대표 시술 등 공개 정보만 수집합니다. 개인 식별 정보(PII)는 일절 수집하지 않으며, 수집 주기와 범위는 서비스 약관에 명시되어 있습니다.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'data-export',
|
|
||||||
q: '리포트 데이터를 내보낼 수 있나요?',
|
|
||||||
a: '모든 플랜에서 PDF 내보내기를 지원합니다. INTELLIGENCE+는 병원 CI(로고·컬러) 반영 커스텀 템플릿을 제공합니다. JSON·CSV 다운로드는 상담 시 요청하실 수 있습니다.',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function FAQ() {
|
|
||||||
const [openId, setOpenId] = useState<string | null>(null);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, y: 20 }}
|
|
||||||
whileInView={{ opacity: 1, y: 0 }}
|
|
||||||
viewport={{ once: true, margin: '-80px' }}
|
|
||||||
transition={{ duration: 0.5 }}
|
|
||||||
className="w-full"
|
|
||||||
>
|
|
||||||
{/* 헤드라인 */}
|
|
||||||
<div className="text-center mb-10">
|
|
||||||
<h2 className="text-3xl md:text-4xl font-serif font-bold text-primary-900 mb-3">
|
|
||||||
자주 묻는 질문
|
|
||||||
</h2>
|
|
||||||
<p className="text-slate-600 break-keep">
|
|
||||||
계약·결제·운영 관련해 자주 받는 질문을 모았습니다.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 아코디언 리스트 — 콘텐츠 가독성을 위해 inner max-w-3xl, outer w-full */}
|
|
||||||
<div className="max-w-3xl mx-auto divide-y divide-slate-200 rounded-2xl bg-white border border-slate-200 shadow-sm overflow-hidden">
|
|
||||||
{items.map((item) => {
|
|
||||||
const isOpen = openId === item.id;
|
|
||||||
return (
|
|
||||||
<div key={item.id}>
|
|
||||||
<button
|
|
||||||
onClick={() => setOpenId((prev) => (prev === item.id ? null : item.id))}
|
|
||||||
aria-expanded={isOpen}
|
|
||||||
aria-controls={`faq-panel-${item.id}`}
|
|
||||||
className="w-full flex items-start gap-4 px-6 py-5 text-left hover:bg-slate-50/60 transition-colors"
|
|
||||||
>
|
|
||||||
<span className="flex-1 text-base font-semibold text-primary-900 break-keep leading-snug">
|
|
||||||
{item.q}
|
|
||||||
</span>
|
|
||||||
<ChevronDown
|
|
||||||
className={`w-5 h-5 text-slate-400 shrink-0 mt-0.5 transition-transform duration-200 ${
|
|
||||||
isOpen ? 'rotate-180 text-accent' : ''
|
|
||||||
}`}
|
|
||||||
/>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<AnimatePresence initial={false}>
|
|
||||||
{isOpen && (
|
|
||||||
<motion.div
|
|
||||||
key="answer"
|
|
||||||
id={`faq-panel-${item.id}`}
|
|
||||||
role="region"
|
|
||||||
initial={{ height: 0, opacity: 0 }}
|
|
||||||
animate={{ height: 'auto', opacity: 1 }}
|
|
||||||
exit={{ height: 0, opacity: 0 }}
|
|
||||||
transition={{ duration: 0.25, ease: 'easeInOut' }}
|
|
||||||
className="overflow-hidden"
|
|
||||||
>
|
|
||||||
<div className="px-6 pb-5 text-sm text-slate-600 leading-relaxed break-keep">
|
|
||||||
{item.a}
|
|
||||||
</div>
|
|
||||||
</motion.div>
|
|
||||||
)}
|
|
||||||
</AnimatePresence>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</motion.div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -1,270 +0,0 @@
|
||||||
/**
|
|
||||||
* FeatureComparisonTable — 3-Tier 기능 세부 비교표.
|
|
||||||
*
|
|
||||||
* 설계 원칙:
|
|
||||||
* - Cell 값 3종:
|
|
||||||
* true → CheckFilled (accent) 포함
|
|
||||||
* false → CrossFilled (slate-300) 미포함
|
|
||||||
* string → 짧은 레이블 ("월 1회", "고급" 등)
|
|
||||||
* - INSIGHT가 전 채널을 커버하므로 차별화 축은 "빈도 · 깊이 · 전략 자산 · 범위"
|
|
||||||
* - 중앙 INTELLIGENCE 컬럼은 `bg-accent/5` 로 시각적 강조 (Tier Cards의 ring-accent와 톤 매칭)
|
|
||||||
* - 모바일에서는 가로 스크롤 (min-w-[720px])
|
|
||||||
*
|
|
||||||
* 카테고리 헤더는 배경 strip으로 섹션 경계를 분명히 하여 스캔 가능성(scannability) 확보.
|
|
||||||
*/
|
|
||||||
import { motion } from 'motion/react';
|
|
||||||
import { CheckFilled, CrossFilled } from '../icons/FilledIcons';
|
|
||||||
|
|
||||||
type CellValue = true | false | string;
|
|
||||||
|
|
||||||
interface FeatureRow {
|
|
||||||
label: string;
|
|
||||||
insight: CellValue;
|
|
||||||
intelligence: CellValue;
|
|
||||||
intelligencePlus: CellValue;
|
|
||||||
/** 추가 설명(헬프 텍스트) — 필요 시 행 아래 회색 부연 */
|
|
||||||
hint?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FeatureCategory {
|
|
||||||
name: string;
|
|
||||||
rows: FeatureRow[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 기능 매트릭스 (plan 섹션 15-D 기준, INSIGHT 전채널화 반영)
|
|
||||||
*
|
|
||||||
* ⚠️ Tier Cards의 bullets과 "차별화 메시지"가 일치해야 신뢰가 유지됩니다.
|
|
||||||
* 카드 bullets를 수정할 경우 이 매트릭스도 함께 업데이트하세요.
|
|
||||||
*/
|
|
||||||
const categories: FeatureCategory[] = [
|
|
||||||
{
|
|
||||||
name: '분석',
|
|
||||||
rows: [
|
|
||||||
{
|
|
||||||
label: '월 리포트 수',
|
|
||||||
insight: '1회',
|
|
||||||
intelligence: '4회',
|
|
||||||
intelligencePlus: '10회',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '전 채널 커버리지',
|
|
||||||
insight: true,
|
|
||||||
intelligence: true,
|
|
||||||
intelligencePlus: true,
|
|
||||||
hint: '홈페이지 · 강남언니 · YouTube · Instagram · Facebook · 네이버 플레이스 · 블로그',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Vision AI (의료진·슬로건·인증 자동 추출)',
|
|
||||||
insight: false,
|
|
||||||
intelligence: true,
|
|
||||||
intelligencePlus: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '스크린샷 증거 기반 심층 분석',
|
|
||||||
insight: '기본',
|
|
||||||
intelligence: '심층',
|
|
||||||
intelligencePlus: '심층 + 변화 추적',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '전략',
|
|
||||||
rows: [
|
|
||||||
{
|
|
||||||
label: '콘텐츠 플랜',
|
|
||||||
insight: '4주',
|
|
||||||
intelligence: '8주 + 주간 조정',
|
|
||||||
intelligencePlus: '12개월 + 월간 리뷰',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'KPI 대시보드',
|
|
||||||
insight: '기본',
|
|
||||||
intelligence: '고급 (3/12개월 목표)',
|
|
||||||
intelligencePlus: '커스텀',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '브랜드 가이드 + 콘텐츠 필러',
|
|
||||||
insight: false,
|
|
||||||
intelligence: '5종',
|
|
||||||
intelligencePlus: '10종',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '경쟁',
|
|
||||||
rows: [
|
|
||||||
{
|
|
||||||
label: '경쟁사 추적',
|
|
||||||
insight: '1개',
|
|
||||||
intelligence: '3개',
|
|
||||||
intelligencePlus: '5개',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '변동 알림',
|
|
||||||
insight: false,
|
|
||||||
intelligence: '주간',
|
|
||||||
intelligencePlus: '일간',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '조직',
|
|
||||||
rows: [
|
|
||||||
{
|
|
||||||
label: '멀티 분원 통합 대시보드',
|
|
||||||
insight: false,
|
|
||||||
intelligence: false,
|
|
||||||
intelligencePlus: '최대 3개',
|
|
||||||
hint: '4개 이상은 커스텀 플랜 상담',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'PDF 내보내기',
|
|
||||||
insight: true,
|
|
||||||
intelligence: true,
|
|
||||||
intelligencePlus: '병원 CI 커스텀 템플릿',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '기타',
|
|
||||||
rows: [
|
|
||||||
{
|
|
||||||
label: '신규 기능 베타 우선 접근',
|
|
||||||
insight: false,
|
|
||||||
intelligence: false,
|
|
||||||
intelligencePlus: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '지원',
|
|
||||||
insight: '이메일',
|
|
||||||
intelligence: '이메일 + 화상 월 1회',
|
|
||||||
intelligencePlus: '전담 CSM',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
/** 셀 값 렌더러 — 3종(true/false/string)을 DS 아이콘 규칙으로 일관되게 표현 */
|
|
||||||
function Cell({ value, isHighlight }: { value: CellValue; isHighlight?: boolean }) {
|
|
||||||
if (value === true) {
|
|
||||||
return (
|
|
||||||
<div className="flex items-center justify-center">
|
|
||||||
<CheckFilled size={18} className={isHighlight ? 'text-accent' : 'text-emerald-500'} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (value === false) {
|
|
||||||
return (
|
|
||||||
<div className="flex items-center justify-center">
|
|
||||||
<CrossFilled size={18} className="text-slate-300" />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
className={`text-sm text-center leading-snug break-keep ${
|
|
||||||
isHighlight ? 'text-primary-900 font-semibold' : 'text-slate-700'
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{value}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function FeatureComparisonTable() {
|
|
||||||
return (
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, y: 20 }}
|
|
||||||
whileInView={{ opacity: 1, y: 0 }}
|
|
||||||
viewport={{ once: true, margin: '-80px' }}
|
|
||||||
transition={{ duration: 0.5 }}
|
|
||||||
className="w-full"
|
|
||||||
>
|
|
||||||
{/* 섹션 헤드라인 */}
|
|
||||||
<div className="text-center mb-10">
|
|
||||||
<h2 className="text-3xl md:text-4xl font-serif font-bold text-primary-900 mb-3">
|
|
||||||
플랜 세부 비교
|
|
||||||
</h2>
|
|
||||||
<p className="text-slate-600 break-keep">
|
|
||||||
병원 규모·마케팅 예산에 맞는 플랜을 한눈에 비교해 보세요.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 테이블 — 모바일 가로 스크롤 */}
|
|
||||||
<div className="rounded-3xl bg-white border border-slate-200 shadow-sm overflow-hidden">
|
|
||||||
<div className="overflow-x-auto">
|
|
||||||
<div className="min-w-[720px]">
|
|
||||||
{/* 상단 헤더 행 */}
|
|
||||||
<div className="grid grid-cols-[1.4fr_1fr_1fr_1fr] border-b border-slate-200">
|
|
||||||
<div className="px-6 py-5 text-sm font-semibold text-slate-500">기능</div>
|
|
||||||
<div className="px-4 py-5 text-center">
|
|
||||||
<div className="text-sm font-bold text-primary-900">INSIGHT</div>
|
|
||||||
<div className="text-xs text-slate-400 mt-0.5">소형·1인 의원</div>
|
|
||||||
</div>
|
|
||||||
<div className="px-4 py-5 text-center bg-accent/5 border-x border-accent/15 relative">
|
|
||||||
<div className="absolute top-0 left-0 right-0 h-1 bg-gradient-to-r from-accent/50 to-accent" />
|
|
||||||
<div className="text-sm font-bold text-primary-900">INTELLIGENCE</div>
|
|
||||||
<div className="text-xs text-accent font-semibold mt-0.5">메인 타겟</div>
|
|
||||||
</div>
|
|
||||||
<div className="px-4 py-5 text-center">
|
|
||||||
<div className="text-sm font-bold text-primary-900">INTELLIGENCE+</div>
|
|
||||||
<div className="text-xs text-slate-400 mt-0.5">대형·멀티 분원</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 카테고리별 렌더링 */}
|
|
||||||
{categories.map((cat) => (
|
|
||||||
<div key={cat.name}>
|
|
||||||
{/* 카테고리 스트립 */}
|
|
||||||
<div className="grid grid-cols-[1.4fr_1fr_1fr_1fr] bg-slate-50/70 border-b border-slate-100">
|
|
||||||
<div className="px-6 py-2.5 text-xs font-bold tracking-wide text-slate-500 uppercase">
|
|
||||||
{cat.name}
|
|
||||||
</div>
|
|
||||||
<div className="bg-transparent" />
|
|
||||||
<div className="bg-accent/5 border-x border-accent/15" />
|
|
||||||
<div className="bg-transparent" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 각 기능 행 */}
|
|
||||||
{cat.rows.map((row, idx) => (
|
|
||||||
<div
|
|
||||||
key={row.label}
|
|
||||||
className={`grid grid-cols-[1.4fr_1fr_1fr_1fr] items-center ${
|
|
||||||
idx !== cat.rows.length - 1 ? 'border-b border-slate-100' : ''
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
<div className="px-6 py-4">
|
|
||||||
<div className="text-sm text-primary-900 font-medium break-keep">
|
|
||||||
{row.label}
|
|
||||||
</div>
|
|
||||||
{row.hint && (
|
|
||||||
<div className="text-xs text-slate-400 mt-1 leading-relaxed break-keep">
|
|
||||||
{row.hint}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div className="px-4 py-4">
|
|
||||||
<Cell value={row.insight} />
|
|
||||||
</div>
|
|
||||||
<div className="px-4 py-4 bg-accent/5 border-x border-accent/15 h-full flex items-center justify-center">
|
|
||||||
<Cell value={row.intelligence} isHighlight />
|
|
||||||
</div>
|
|
||||||
<div className="px-4 py-4">
|
|
||||||
<Cell value={row.intelligencePlus} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 보조 안내 */}
|
|
||||||
<p className="text-xs text-slate-400 text-center mt-4 break-keep">
|
|
||||||
모든 플랜은 계약 기반이며, 세부 조건은 상담 시 맞춤 설계됩니다.
|
|
||||||
</p>
|
|
||||||
</motion.div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -62,13 +62,7 @@ function PageCard({ page, index }: { key?: string | number; page: FacebookPage;
|
||||||
<h3 className="font-bold text-lg text-[#0A1128] mb-1">
|
<h3 className="font-bold text-lg text-[#0A1128] mb-1">
|
||||||
{page.url ? (
|
{page.url ? (
|
||||||
<a
|
<a
|
||||||
href={
|
href={page.url.startsWith('http') ? page.url : `https://www.facebook.com/${page.url}`}
|
||||||
page.url.startsWith('http')
|
|
||||||
? page.url
|
|
||||||
: page.url.startsWith('facebook.com/') || page.url.startsWith('www.facebook.com/')
|
|
||||||
? `https://${page.url.replace(/^www\./, 'www.')}`
|
|
||||||
: `https://www.facebook.com/${page.url.replace(/^@/, '')}`
|
|
||||||
}
|
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="hover:text-[#6C5CE7] inline-flex items-center gap-1"
|
className="hover:text-[#6C5CE7] inline-flex items-center gap-1"
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ function AccountCard({ account, index }: { key?: string | number; account: Insta
|
||||||
<h3 className="font-bold text-lg text-[#0A1128] mb-1">
|
<h3 className="font-bold text-lg text-[#0A1128] mb-1">
|
||||||
{account.handle ? (
|
{account.handle ? (
|
||||||
<a
|
<a
|
||||||
href={`https://instagram.com/${account.handle.replace(/^@/, '')}`}
|
href={account.profileLink || `https://instagram.com/${account.handle.replace(/^@/, '')}`}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="hover:text-[#6C5CE7] inline-flex items-center gap-1"
|
className="hover:text-[#6C5CE7] inline-flex items-center gap-1"
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ export default function KPIDashboard({ metrics, clinicName }: KPIDashboardProps)
|
||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
||||||
<button
|
<button
|
||||||
onClick={() => navigate(`/plan/${id || 'live'}#branding-guide`)}
|
onClick={() => navigate(`/plan/${id || 'live'}`)}
|
||||||
className="inline-flex items-center gap-2 bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white font-semibold px-8 py-4 rounded-full hover:shadow-xl transition-all"
|
className="inline-flex items-center gap-2 bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white font-semibold px-8 py-4 rounded-full hover:shadow-xl transition-all"
|
||||||
>
|
>
|
||||||
마케팅 기획
|
마케팅 기획
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ export function ReportNav({ sections }: ReportNavProps) {
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<nav data-report-nav className="sticky top-20 z-40 bg-white/95 border-b border-slate-100">
|
<nav data-report-nav className="sticky top-20 z-40 bg-white/80 backdrop-blur-lg border-b border-slate-100">
|
||||||
<div
|
<div
|
||||||
ref={navRef}
|
ref={navRef}
|
||||||
className="max-w-7xl mx-auto flex overflow-x-auto scrollbar-hide"
|
className="max-w-7xl mx-auto flex overflow-x-auto scrollbar-hide"
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ export default function YouTubeAudit({ data }: YouTubeAuditProps) {
|
||||||
{data.linkedUrls.map((link) => (
|
{data.linkedUrls.map((link) => (
|
||||||
<a
|
<a
|
||||||
key={link.url}
|
key={link.url}
|
||||||
href={link.url.startsWith('http') ? link.url : `https://${link.url}`}
|
href={link.url}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="inline-flex items-center gap-1 text-xs text-[#6C5CE7] hover:underline"
|
className="inline-flex items-center gap-1 text-xs text-[#6C5CE7] hover:underline"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import type { ReactNode } from 'react';
|
import type { ReactNode } from 'react';
|
||||||
|
import { motion } from 'motion/react';
|
||||||
|
|
||||||
interface SectionWrapperProps {
|
interface SectionWrapperProps {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
@ -18,8 +19,12 @@ export function SectionWrapper({
|
||||||
className = '',
|
className = '',
|
||||||
}: SectionWrapperProps) {
|
}: SectionWrapperProps) {
|
||||||
return (
|
return (
|
||||||
<section
|
<motion.section
|
||||||
id={id}
|
id={id}
|
||||||
|
initial={{ opacity: 0, y: 40 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.6, ease: 'easeOut' }}
|
||||||
className={`
|
className={`
|
||||||
${dark
|
${dark
|
||||||
? 'bg-[#0A1128] text-white relative overflow-hidden'
|
? 'bg-[#0A1128] text-white relative overflow-hidden'
|
||||||
|
|
@ -55,6 +60,6 @@ export function SectionWrapper({
|
||||||
</div>
|
</div>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</motion.section>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
reportId: 'view-clinic',
|
reportId: 'view-clinic',
|
||||||
clinicName: '뷰성형외과의원',
|
clinicName: '뷰성형외과의원',
|
||||||
clinicNameEn: 'VIEW Plastic Surgery',
|
clinicNameEn: 'VIEW Plastic Surgery',
|
||||||
createdAt: '2026-04-28',
|
createdAt: '2026-04-13',
|
||||||
targetUrl: 'https://www.viewclinic.com',
|
targetUrl: 'https://www.viewclinic.com',
|
||||||
|
|
||||||
// ─── Section 1: Brand Guide ───
|
// ─── Section 1: Brand Guide ───
|
||||||
|
|
@ -96,7 +96,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
channelId: 'instagram_kr', channelName: 'Instagram KR', icon: 'instagram',
|
channelId: 'instagram_kr', channelName: 'Instagram KR', icon: 'instagram',
|
||||||
currentStatus: '14,047 팔로워, Reels 0개', targetGoal: '50K 팔로워, Reels 주 5개',
|
currentStatus: '14K 팔로워, Reels 0개', targetGoal: '50K 팔로워, Reels 주 5개',
|
||||||
contentTypes: ['Reels', 'Carousel', 'Stories', 'Feed Image'],
|
contentTypes: ['Reels', 'Carousel', 'Stories', 'Feed Image'],
|
||||||
postingFrequency: '일 1회 + Stories 일 2-3개',
|
postingFrequency: '일 1회 + Stories 일 2-3개',
|
||||||
tone: '차분하지만 접근 가능한 — 환자 관점의 Q&A',
|
tone: '차분하지만 접근 가능한 — 환자 관점의 Q&A',
|
||||||
|
|
@ -105,7 +105,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
channelId: 'instagram_en', channelName: 'Instagram EN', icon: 'instagram',
|
channelId: 'instagram_en', channelName: 'Instagram EN', icon: 'instagram',
|
||||||
currentStatus: '70,537 팔로워, Reels 활발', targetGoal: '120K 팔로워',
|
currentStatus: '70K 팔로워, Reels 활발', targetGoal: '120K 팔로워',
|
||||||
contentTypes: ['Reels', 'Before/After', 'Patient Stories'],
|
contentTypes: ['Reels', 'Before/After', 'Patient Stories'],
|
||||||
postingFrequency: '주 5회',
|
postingFrequency: '주 5회',
|
||||||
tone: 'Professional & warm — medical tourism storytelling',
|
tone: 'Professional & warm — medical tourism storytelling',
|
||||||
|
|
@ -114,7 +114,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
channelId: 'facebook', channelName: 'Facebook', icon: 'facebook',
|
channelId: 'facebook', channelName: 'Facebook', icon: 'facebook',
|
||||||
currentStatus: 'KR 254명 + EN 88,333명, 로고 불일치', targetGoal: '통합 관리, 광고 리타겟 전용',
|
currentStatus: 'KR 253명 + EN 88K, 로고 불일치', targetGoal: '통합 관리, 광고 리타겟 전용',
|
||||||
contentTypes: ['광고 크리에이티브', '리타겟 콘텐츠'],
|
contentTypes: ['광고 크리에이티브', '리타겟 콘텐츠'],
|
||||||
postingFrequency: '주 2-3회 (광고 소재 위주)',
|
postingFrequency: '주 2-3회 (광고 소재 위주)',
|
||||||
tone: '신뢰 기반 — 안전, 경험, 결과 강조',
|
tone: '신뢰 기반 — 안전, 경험, 결과 강조',
|
||||||
|
|
@ -123,7 +123,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
|
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
|
||||||
currentStatus: '활성 — 551개 게시글, 월 2~3회 포스팅 (최근 2026.4.22)', targetGoal: '주 2회 포스팅, 월 30,000 방문자',
|
currentStatus: '활성 — 550개 게시글, 월 2~3회 포스팅', targetGoal: '주 2회 포스팅, 월 30,000 방문자',
|
||||||
contentTypes: ['SEO 블로그 포스트', '시술 가이드', '환자 후기'],
|
contentTypes: ['SEO 블로그 포스트', '시술 가이드', '환자 후기'],
|
||||||
postingFrequency: '주 3회',
|
postingFrequency: '주 3회',
|
||||||
tone: '정보성 전문가 — 키워드 중심, 환자 고민 해결',
|
tone: '정보성 전문가 — 키워드 중심, 환자 고민 해결',
|
||||||
|
|
@ -266,7 +266,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
{ id: 'a6', source: 'social', sourceLabel: '소셜미디어', type: 'photo', title: 'Instagram EN Before/After 사진', description: '@view_plastic_surgery 계정의 2,524개 게시물 중 B/A 사진', repurposingSuggestions: ['KR 계정 크로스포스팅', '유튜브 롱폼 삽입', 'Naver 블로그 활용'], status: 'collected' },
|
{ id: '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: '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: '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: 'a9', source: 'blog', sourceLabel: '블로그', type: 'text', title: '네이버 블로그 기존 포스트 550개', description: '기존 블로그 포스트 550개 (월 2~3회 업데이트 중)', repurposingSuggestions: ['SEO 최적화 리라이팅', '영상 스크립트 소스'], status: 'collected' },
|
||||||
{ id: 'a10', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '개원 20주년 기념 영상', description: '뷰성형외과 20년 역사 + 시설 소개 영상 (1:30)', repurposingSuggestions: ['브랜드 스토리 Reel', '웹사이트 히어로 영상', '신뢰 광고 소재'], status: 'collected' },
|
{ id: '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' },
|
{ id: 'a11', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '시술별 전후 사진 갤러리', description: '눈, 코, 가슴, 윤곽 시술별 비포/애프터 사진', repurposingSuggestions: ['Instagram B/A 시리즈', 'Shorts 전환 소스', '상담 자료'], status: 'needs_creation' },
|
||||||
],
|
],
|
||||||
|
|
@ -388,7 +388,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
channel: 'Naver Blog',
|
channel: 'Naver Blog',
|
||||||
channelIcon: 'globe',
|
channelIcon: 'globe',
|
||||||
stage: 'approved',
|
stage: 'approved',
|
||||||
scheduledDate: '2026-05-06',
|
scheduledDate: '2026-04-14',
|
||||||
imageTextDraft: {
|
imageTextDraft: {
|
||||||
type: 'blog',
|
type: 'blog',
|
||||||
headline: '눈성형 2주 후 솔직 리뷰 — VIEW 성형외과 후기',
|
headline: '눈성형 2주 후 솔직 리뷰 — VIEW 성형외과 후기',
|
||||||
|
|
@ -409,7 +409,7 @@ export const mockPlan: MarketingPlan = {
|
||||||
channel: 'TikTok',
|
channel: 'TikTok',
|
||||||
channelIcon: 'video',
|
channelIcon: 'video',
|
||||||
stage: 'scheduled',
|
stage: 'scheduled',
|
||||||
scheduledDate: '2026-05-02',
|
scheduledDate: '2026-04-10',
|
||||||
videoDraft: {
|
videoDraft: {
|
||||||
script: `"21년 동안 단 한 건의 의료사고도 없었습니다."\n(숫자 카운터 애니메이션: 0 → 21)\n"이게 VIEW의 자랑입니다."\n#강남성형외과 #무사고 #VIEW성형외과`,
|
script: `"21년 동안 단 한 건의 의료사고도 없었습니다."\n(숫자 카운터 애니메이션: 0 → 21)\n"이게 VIEW의 자랑입니다."\n#강남성형외과 #무사고 #VIEW성형외과`,
|
||||||
shootingGuide: [
|
shootingGuide: [
|
||||||
|
|
|
||||||
|
|
@ -1,517 +0,0 @@
|
||||||
import type { MarketingPlan } from '../types/plan';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 바노바기성형외과 — 데모 마케팅 플랜
|
|
||||||
*
|
|
||||||
* 리포트 근거 (`mockReport_banobagi.ts` 2026-04-14 실측):
|
|
||||||
* - YouTube @banobagips: 13K 구독자, 925 영상 (최근 6개월 업로드 저조)
|
|
||||||
* - Instagram @banobagi_ps: 4,183 팔로워, 2,000 게시물 (Reels 10개 — 부족)
|
|
||||||
* - Facebook @BanobagiPlasticSurgery: 16K (EN 전용 — KR 페이지 없음)
|
|
||||||
* - 네이버 블로그 @banobagips: 2023-04-21 마지막 포스트 (2년 이상 방치)
|
|
||||||
* - 강남언니: 9.2점 / 6,853 리뷰 (강남 상위권)
|
|
||||||
* - 26년 (2000년 설립), 반재중 대표원장, 본관+별관 6+5층
|
|
||||||
* - 시술군: 안면윤곽 / 눈 / 코 / 가슴 / 지방체형 / 리프팅·동안성형
|
|
||||||
*
|
|
||||||
* 모든 섹션을 바노바기 실측·맥락 기반으로 재구성. mockPlan(View) 의존성 제거.
|
|
||||||
*/
|
|
||||||
export const mockPlanBanobagi: MarketingPlan = {
|
|
||||||
id: 'banobagi',
|
|
||||||
reportId: 'banobagi',
|
|
||||||
clinicName: '바노바기성형외과의원',
|
|
||||||
clinicNameEn: 'Banobagi Plastic Surgery Clinic',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.banobagi.com',
|
|
||||||
|
|
||||||
// ─── Section 1: Brand Guide ───
|
|
||||||
brandGuide: {
|
|
||||||
colors: [
|
|
||||||
{ name: 'Banobagi Black', hex: '#1A1A1A', usage: '공식 로고 메인, 헤딩, 강조 텍스트' },
|
|
||||||
{ name: 'Banobagi Gold', hex: '#C8A96A', usage: '로고 악센트, CTA 포인트, 구분선' },
|
|
||||||
{ name: 'Ivory White', hex: '#FAF7F2', usage: '배경, 카드, 여백' },
|
|
||||||
{ name: 'Deep Charcoal', hex: '#2D2D2D', usage: '본문 텍스트' },
|
|
||||||
{ name: 'Soft Gray', hex: '#6B6B6B', usage: '서브 텍스트, 메타 정보' },
|
|
||||||
],
|
|
||||||
fonts: [
|
|
||||||
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀', sampleText: '26년 강남 대표 성형외과' },
|
|
||||||
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: '바노바기성형외과 — 안전과 자연스러움' },
|
|
||||||
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩', sampleText: 'BANOBAGI' },
|
|
||||||
],
|
|
||||||
logoRules: [
|
|
||||||
{ rule: '블랙+골드 워드마크 통일 사용', description: '공식 BANOBAGI 워드마크(블랙 배경 + 골드 텍스트)를 모든 채널에서 동일하게 사용', correct: true },
|
|
||||||
{ rule: '원형 로고: 블랙 배경 골드 심볼 버전', description: '프로필 사진용 원형 버전은 블랙 원형 + 골드 "B" 심볼 1080×1080 사용', correct: true },
|
|
||||||
{ rule: '가로형 로고: 워드마크 + 한글 병기', description: '배너·헤더에는 BANOBAGI 워드마크 + "바노바기성형외과" 한글 병기', correct: true },
|
|
||||||
{ rule: '저해상도 프로필 사진 금지', description: '채널별 프로필 해상도 편차 발견 — 1080×1080 단일 원형 로고로 통일 필요', correct: false },
|
|
||||||
{ rule: '한글 채널 설명 우선', description: 'YouTube 채널 설명이 영문 위주 — 한국 시장 타겟팅 위해 한글 우선/영문 병기', correct: false },
|
|
||||||
{ rule: '로고 주변 여백 확보', description: '로고 크기의 30% 이상 여백을 유지하여 가독성 확보', correct: true },
|
|
||||||
],
|
|
||||||
toneOfVoice: {
|
|
||||||
personality: ['신뢰감 있는', '전문적', '차분한', '결과 중심', '절제된 럭셔리'],
|
|
||||||
communicationStyle: '26년 축적된 임상 경험을 바탕으로, 과장 없이 결과와 원칙으로 설득합니다. 환자의 관점에서 생각하되 의료 전문성을 잃지 않는 톤.',
|
|
||||||
doExamples: [
|
|
||||||
'"자연스러움이 보일 때까지, 디테일에 디테일을 더합니다"',
|
|
||||||
'"26년 임상 경험, 6,853개의 진솔한 후기"',
|
|
||||||
'"바노바기의 원칙: 결과로 증명합니다"',
|
|
||||||
'"분야별 전문의 공동 진료 시스템"',
|
|
||||||
],
|
|
||||||
dontExamples: [
|
|
||||||
'"강남 최고! 파격 할인!"',
|
|
||||||
'"연예인이 선택한 병원"',
|
|
||||||
'"100% 만족 보장"',
|
|
||||||
'"이 가격은 오늘까지만!"',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
channelBranding: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', profilePhoto: '블랙+골드 BANOBAGI 원형 로고 1080×1080', bannerSpec: '2560×1440px, 블랙 배경 + 골드 워드마크, "26년 강남 대표 성형외과" 슬로건', bioTemplate: '26년 강남 대표 성형외과 — 바노바기\n안면윤곽·눈·코·가슴·리프팅\n02-1588-6508 | banobagi.com', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Instagram KR', icon: 'instagram', profilePhoto: '블랙+골드 원형 로고', bannerSpec: 'N/A (하이라이트 커버: 블랙+골드 아이콘 세트 — 안면윤곽/눈/코/가슴/리뷰)', bioTemplate: '바노바기성형외과 공식 — 26년 임상\n역삼역·강남역 | 02-1588-6508\nbanobagi.com', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Facebook KR', icon: 'facebook', profilePhoto: '블랙+골드 원형 로고', bannerSpec: '820×312px, 블랙+골드 배너 + "26년 강남 대표 성형외과"', bioTemplate: '바노바기성형외과 한국 공식 — 26년 임상 경험', currentStatus: 'missing' },
|
|
||||||
{ channel: 'Facebook EN', icon: 'facebook', profilePhoto: '블랙+골드 원형 로고', bannerSpec: '820×312px, 동일 디자인 시스템', bioTemplate: 'Banobagi Plastic Surgery — 26 Years of Excellence in Gangnam', currentStatus: 'correct' },
|
|
||||||
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: '블랙+골드 로고', bannerSpec: '블로그 상단: 워드마크 + 시술 카테고리 메뉴', bioTemplate: '바노바기성형외과 공식 블로그 — 26년 강남 대표\n안면윤곽·눈·코·가슴·리프팅·지방체형', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'TikTok', icon: 'video', profilePhoto: '블랙+골드 원형 로고', bannerSpec: 'N/A', bioTemplate: '바노바기성형외과 — 26년 강남 대표\n역삼역 | 02-1588-6508', currentStatus: 'missing' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [
|
|
||||||
{
|
|
||||||
field: '로고',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube', value: 'BANOBAGI 영문 워드마크', isCorrect: true },
|
|
||||||
{ channel: 'Instagram KR', value: '바노바기 블랙+골드 로고', isCorrect: true },
|
|
||||||
{ channel: 'Facebook EN', value: '블랙+골드 워드마크', isCorrect: true },
|
|
||||||
{ channel: 'Website', value: '블랙+골드 공식 로고', isCorrect: true },
|
|
||||||
],
|
|
||||||
impact: '브랜드 시각 아이덴티티는 비교적 일관되지만 채널별 프로필 해상도 편차 존재. 한국 시장용 Facebook KR 페이지와 TikTok 채널 자산 부재.',
|
|
||||||
recommendation: '전 채널 1080×1080 원형 로고 재발급 + Facebook KR / TikTok 신규 채널 자산 제작',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: '바이오/소개 메시지',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube', value: 'Protect and nurture your true beauty… (영문 위주)', isCorrect: false },
|
|
||||||
{ channel: 'Instagram KR', value: '바노바기성형외과 공식 계정 (USP 부재)', isCorrect: false },
|
|
||||||
{ channel: 'Facebook EN', value: 'Korean Premium Plastic Surgery Clinic', isCorrect: false },
|
|
||||||
{ channel: 'Naver Blog', value: '(설명 부실 — 2년 방치)', isCorrect: false },
|
|
||||||
],
|
|
||||||
impact: '4개 채널, 4개의 서로 다른 소개 — "26년 임상" 핵심 USP가 어느 곳에도 부각되지 않음',
|
|
||||||
recommendation: '핵심 USP 통일: "26년 강남 대표 성형외과 — 바노바기" + 시술군 + 연락처 표준 포맷',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 2: Channel Strategies ───
|
|
||||||
channelStrategies: [
|
|
||||||
{
|
|
||||||
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
|
|
||||||
currentStatus: '13K 구독자, 925 영상 누적 — 최근 6개월 업로드 저조',
|
|
||||||
targetGoal: '30K 구독자 / 12개월, 주 2회 정기 업로드 복구',
|
|
||||||
contentTypes: ['Shorts (기존 925 영상 재편집)', 'Long-form (원장 인터뷰·시술 가이드)', 'Community (Q&A 투표)'],
|
|
||||||
postingFrequency: '주 2회 (Shorts 1 + 롱폼 격주)',
|
|
||||||
tone: '차분한 전문가 — 반재중 원장 직접 설명 교육 콘텐츠',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Shorts: 925개 기존 영상에서 핵심 15-60초 구간 추출, 후크 3초 내',
|
|
||||||
'Long-form: 5-12분, 안면윤곽/가슴 등 시술별 시리즈',
|
|
||||||
'썸네일: 블랙+골드 워드마크 워터마크 통일',
|
|
||||||
'한글 타이틀 + 영문 부제 병기 (한국 시장 타겟팅 강화)',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'instagram_kr', channelName: 'Instagram', icon: 'instagram',
|
|
||||||
currentStatus: '@banobagi_ps — 4,183 팔로워, 2,000 게시물, Reels 10개 (부족)',
|
|
||||||
targetGoal: '60K 팔로워 / 12개월, Reels 주 5개',
|
|
||||||
contentTypes: ['Reels (YouTube Shorts 동시 배포)', 'Carousel (강남언니 6,853 리뷰 스토리화)', 'Stories (병원 일상)', 'Before/After'],
|
|
||||||
postingFrequency: '일 1회 + Stories 일 2-3개',
|
|
||||||
tone: '차분하지만 친근한 — 26년 신뢰감 + 환자 관점 Q&A',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Reels: YouTube Shorts 와 동시 게시 (자산 재활용 우선)',
|
|
||||||
'Carousel: 강남언니 리뷰 50개 선별 → 카루셀 콘텐츠 시리즈',
|
|
||||||
'Stories: 안면윤곽/눈/코/가슴 카테고리별 하이라이트 재구성',
|
|
||||||
'해시태그: #바노바기성형외과 #Banobagi #강남안면윤곽 #26년임상',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'interest',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'facebook_en', channelName: 'Facebook EN (국제)', icon: 'facebook',
|
|
||||||
currentStatus: '@BanobagiPlasticSurgery — 16K 팔로워, 영문 위주, 리타겟 채널로 활용 가능',
|
|
||||||
targetGoal: '의료관광 리타겟 광고 채널로 전환, 광고 ROAS 추적 시작',
|
|
||||||
contentTypes: ['영문 환자 여정 콘텐츠', 'Before/After (동의서 확인)', '리타겟 광고 소재'],
|
|
||||||
postingFrequency: '주 1-2회 + 광고 캠페인 상시',
|
|
||||||
tone: 'Professional & warm — Korea medical tourism storytelling',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Pixel 기반 리타겟 광고 (이미 설치 확인됨)',
|
|
||||||
'WhatsApp 연동 활용 — 해외 상담 자동 응대',
|
|
||||||
'영문 환자 후기 인터뷰 시리즈',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'conversion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'facebook_kr', channelName: 'Facebook KR (신규)', icon: 'facebook',
|
|
||||||
currentStatus: '한국 전용 페이지 부재 — 한국 환자 접근성 0',
|
|
||||||
targetGoal: '한국 페이지 신규 개설 또는 Instagram KR 집중 결정 (3개월 내)',
|
|
||||||
contentTypes: ['(개설 시) Reels 크로스포스팅', '광고 리타겟'],
|
|
||||||
postingFrequency: '주 2-3회 (개설 시)',
|
|
||||||
tone: '한국 환자 친화적 — 신뢰 기반',
|
|
||||||
formatGuidelines: [
|
|
||||||
'한국 KR 페이지 신규 개설 vs Instagram KR 집중 ROI 비교 후 결정',
|
|
||||||
'개설 시: Instagram Reels 와 동일 콘텐츠 크로스포스팅',
|
|
||||||
],
|
|
||||||
priority: 'P2',
|
|
||||||
customerJourneyStage: 'awareness',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
|
|
||||||
currentStatus: '@banobagips — 마지막 포스트 2023-04-21 (2년 이상 방치, SEO 자산 잠금)',
|
|
||||||
targetGoal: '주 2회 포스팅 즉시 재가동, 12개월 내 월 20,000 방문자',
|
|
||||||
contentTypes: ['SEO 시술 가이드', '환자 후기 (강남언니 리뷰 가공)', 'YouTube 영상 임베드 + 텍스트 가이드'],
|
|
||||||
postingFrequency: '주 2회 (1차 6월 내 시작)',
|
|
||||||
tone: '정보성 전문가 — "바노바기 후기/안면윤곽/V라인" 키워드 중심',
|
|
||||||
formatGuidelines: [
|
|
||||||
'2,000자 이상 SEO 최적화 포스트',
|
|
||||||
'YouTube 시술 영상 + 텍스트 가이드 결합 구조',
|
|
||||||
'SEO 키워드 맵: "바노바기 후기", "강남 안면윤곽", "사각턱 축소", "V라인"',
|
|
||||||
'이미지 10장 이상 + 영상 임베드 1개 이상',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
|
|
||||||
currentStatus: '9.2점/10, 6,853 리뷰 — 강남 상위권, 핵심 자산',
|
|
||||||
targetGoal: '리뷰 응답률 80% 달성, 12개월 내 8,500 리뷰',
|
|
||||||
contentTypes: ['리뷰 응답', '시술 정보 업데이트', '이벤트/프로모션 게시'],
|
|
||||||
postingFrequency: '리뷰 응답: 일 단위 / 정보 업데이트: 월 1-2회',
|
|
||||||
tone: '진심 어린 의료진 답변 — 형식적 답변 지양',
|
|
||||||
formatGuidelines: [
|
|
||||||
'리뷰 응답률 50%(3개월) → 80%(12개월) 단계 상향',
|
|
||||||
'6,853 리뷰 중 50개 선별 → SNS 콘텐츠로 재가공',
|
|
||||||
'부정 리뷰 24시간 내 응답 원칙',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'loyalty',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'tiktok', channelName: 'TikTok (신규)', icon: 'video',
|
|
||||||
currentStatus: '계정 없음',
|
|
||||||
targetGoal: '10K 팔로워 / 12개월, 20-30대 첫 수술 고민층 도달',
|
|
||||||
contentTypes: ['YouTube Shorts 크로스포스팅', '트렌드 챌린지', '병원 비하인드'],
|
|
||||||
postingFrequency: '주 5회 (YouTube Shorts 동시 배포)',
|
|
||||||
tone: '가볍고 접근 가능한 — 20-30대 타겟',
|
|
||||||
formatGuidelines: [
|
|
||||||
'925 YouTube 영상 → Shorts 추출 → TikTok 동시 배포',
|
|
||||||
'트렌딩 사운드 활용 + 자막 필수',
|
|
||||||
'의료광고법 준수 — 과장 표현 금지',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'awareness',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'kakaotalk', channelName: 'KakaoTalk', icon: 'messageSquare',
|
|
||||||
currentStatus: '02-1588-6508 대표번호 + 카카오 채널 운영',
|
|
||||||
targetGoal: '카카오 채널 친구 수 확보, 상담 전환율 30% 향상',
|
|
||||||
contentTypes: ['상담 안내', '예약 확인', '월 1회 시술 정보 발송'],
|
|
||||||
postingFrequency: '주 1-2회 메시지 발송',
|
|
||||||
tone: '따뜻하고 전문적인 — 1:1 상담 톤',
|
|
||||||
formatGuidelines: [
|
|
||||||
'자동 응답 시나리오 — 안면윤곽/가슴/눈/코 시술별 분기',
|
|
||||||
'예약 리마인더 자동 발송',
|
|
||||||
'한국어 + 영문/중문 옵션 (의료관광 대비)',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'conversion',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 3: Content Strategy ───
|
|
||||||
contentStrategy: {
|
|
||||||
pillars: [
|
|
||||||
{
|
|
||||||
title: '26년 임상의 원칙',
|
|
||||||
description: '2000년 개원 이래 26년간 축적한 임상 데이터와 수술 철학을 보여주는 콘텐츠',
|
|
||||||
relatedUSP: '26 Years of Clinical Experience',
|
|
||||||
exampleTopics: ['반재중 원장의 안면윤곽 철학', '26년간 변하지 않은 원칙 3가지', '바노바기의 분야별 공동 진료 시스템'],
|
|
||||||
color: '#1A1A1A',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '안면윤곽 전문성',
|
|
||||||
description: '바노바기의 핵심 USP인 안면윤곽 분야의 깊이 있는 교육·기술 콘텐츠',
|
|
||||||
relatedUSP: 'Facial Contouring Authority',
|
|
||||||
exampleTopics: ['사각턱 축소 — 골격별 맞춤 디자인', 'V라인 자연스러움의 기준', '안면윤곽 후 회복 타임라인'],
|
|
||||||
color: '#C8A96A',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '6,853 리뷰의 진심',
|
|
||||||
description: '강남언니 6,853 리뷰를 환자의 목소리로 재구성, 진솔한 후기 콘텐츠',
|
|
||||||
relatedUSP: 'Patient-Validated Trust',
|
|
||||||
exampleTopics: ['실제 환자 인터뷰 시리즈', '강남언니 베스트 리뷰 카루셀', '수술 결정부터 회복까지 환자 다이어리'],
|
|
||||||
color: '#6B6B6B',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '안전 시스템',
|
|
||||||
description: '마취과 전문의 상주, 분야별 공동 진료 등 바노바기의 안전 인프라',
|
|
||||||
relatedUSP: 'Safety Infrastructure',
|
|
||||||
exampleTopics: ['마취과 전문의가 상주하는 이유', '본관+별관 시설 투어', '시술 후 관리 프로토콜'],
|
|
||||||
color: '#FAF7F2',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
typeMatrix: [
|
|
||||||
{ format: 'YouTube Long-form', channels: ['YouTube'], frequency: '격주 1회', purpose: '26년 임상 전문성 증명, 깊은 신뢰 구축' },
|
|
||||||
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 5개', purpose: '925 영상 자산 재활용, 도달 확대' },
|
|
||||||
{ format: 'Carousel (리뷰 스토리)', channels: ['Instagram'], frequency: '주 2회', purpose: '강남언니 6,853 리뷰 → 사회적 증거화' },
|
|
||||||
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '2년 방치된 SEO 자산 복구, 검색 유입' },
|
|
||||||
{ format: 'Stories', channels: ['Instagram'], frequency: '일 2-3개', purpose: '병원 일상·상담 비하인드' },
|
|
||||||
{ format: 'Ad Creative (EN)', channels: ['Facebook EN', 'Instagram'], frequency: '월 4-6개', purpose: '의료관광 리타겟, Pixel 기반 전환' },
|
|
||||||
],
|
|
||||||
workflow: [
|
|
||||||
{ step: 1, name: '기존 자산 인벤토리', description: '925 YouTube 영상 + 2,000 IG 게시물 + 6,853 강남언니 리뷰 카탈로그화', owner: '마케팅 매니저', duration: '1-2주 (1회성)' },
|
|
||||||
{ step: 2, name: '주제 선정', description: '시술별 검색 키워드 + 콘텐츠 필러 매칭', owner: '마케팅 매니저', duration: '1일' },
|
|
||||||
{ step: 3, name: '초안 작성/추출', description: 'AI 초안 생성 또는 기존 영상에서 Shorts 추출', owner: 'AI + 콘텐츠 팀', duration: '1-2일' },
|
|
||||||
{ step: 4, name: '의료 검수', description: '반재중 원장 + 분야별 전문의 검토 (의료광고법 포함)', owner: '의료진', duration: '1일' },
|
|
||||||
{ step: 5, name: '비주얼 마감', description: '블랙+골드 워터마크, 한글/영문 자막 추가', owner: '디자인 팀', duration: '1일' },
|
|
||||||
{ step: 6, name: '배포 & 모니터링', description: '채널별 최적 시간 게시 + UTM 추적', owner: '마케팅 매니저', duration: '당일' },
|
|
||||||
],
|
|
||||||
repurposingSource: '1개 원장 롱폼 영상 (10분) 또는 925 영상 아카이브 1편',
|
|
||||||
repurposingOutputs: [
|
|
||||||
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 풀 영상 업로드 (한글/영문 자막)' },
|
|
||||||
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '핵심 구간 15-60초 추출, 3채널 동시 배포' },
|
|
||||||
{ format: 'Carousel 1-2개', channel: 'Instagram', description: '시술 가이드 카드뉴스로 재구성' },
|
|
||||||
{ format: 'Blog Post 1개', channel: 'Naver Blog', description: '영상 스크립트 → 2,000자 SEO 포스트 (영상 임베드 포함)' },
|
|
||||||
{ format: 'Stories 3-5개', channel: 'Instagram', description: '촬영 비하인드 + Q&A 스니펫' },
|
|
||||||
{ format: 'Ad Creative 2개', channel: 'Facebook EN / Instagram', description: '의료관광 리타겟용 영문 광고 소재' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 4: Content Calendar ───
|
|
||||||
calendar: {
|
|
||||||
weeks: [
|
|
||||||
{
|
|
||||||
weekNumber: 1, label: 'Week 1: 브랜드 정비 & 블로그 재가동',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '재가동 1편: 26년 바노바기, 다시 시작합니다 — 시술 카테고리 가이드' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: '프로필 리뉴얼 공지 + 첫 Reel (블랙+골드 통일)' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 안면윤곽 Q&A — 사각턱 축소 #1' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '안면윤곽 수술 종류와 회복기간 — 26년 임상 기준' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 6,853 리뷰 중 베스트 5' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 반재중 원장 — 바노바기의 26년 원칙' },
|
|
||||||
{ dayOfWeek: 5, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 본관+별관 시설 투어' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 2, label: 'Week 2: 안면윤곽 집중 주간',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: 'V라인의 자연스러움 기준 — 골격별 맞춤 디자인' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 안면윤곽 전후 변화 (동의 환자)' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 사각턱 축소 과정 30초' },
|
|
||||||
{ dayOfWeek: 2, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 안면윤곽 후 회복 타임라인' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(EN): 의료관광 안면윤곽 인콰이어리 (리타겟)' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 환자 후기 인터뷰 #1' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '바노바기 안면윤곽 후기 — 강남언니 검증' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 3, label: 'Week 3: 가슴·눈·코 시술 콘텐츠',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 가슴성형 — 보형물 종류와 선택 기준' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 자연스러운 라인' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '눈성형 쌍꺼풀 수술 FAQ — 26년 임상 답변' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 회복 1주 차' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 눈성형 4가지 디자인 비교' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 마취과 전문의가 상주합니다' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '바노바기 안전 시스템 — 마취 전문의 상주의 의미' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 4, label: 'Week 4: 전환 & 리뷰 응답 강화',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 분야별 공동 진료 시스템 — 4명 전문의의 협진' },
|
|
||||||
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '첫 성형 상담, 이것만 준비하세요 — 바노바기 가이드' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 상담 비하인드 — 3D 시뮬레이션 데모' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 반재중 원장 한 줄 답변 모음' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 카카오 상담 예약 4단계' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남언니 9.2점, 6,853 리뷰의 의미 — 환자가 검증한 26년' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(EN): 월말 의료관광 상담 CTA' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
monthlySummary: [
|
|
||||||
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 14, color: '#1A1A1A' },
|
|
||||||
{ type: 'blog', label: '블로그', count: 8, color: '#C8A96A' },
|
|
||||||
{ type: 'social', label: 'Instagram', count: 9, color: '#6B6B6B' },
|
|
||||||
{ type: 'ad', label: '광고', count: 2, color: '#FAF7F2' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 5: Asset Collection ───
|
|
||||||
assetCollection: {
|
|
||||||
assets: [
|
|
||||||
{ id: 'a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: '925 영상 아카이브 (13년 누적)', description: '2013년 개설 이래 누적 925개 영상 — Shorts 추출 최우선 자산', repurposingSuggestions: ['Shorts 200개 추출 (P0)', 'Instagram Reels 변환', 'TikTok 크로스포스팅', '블로그 포스트 임베드'], status: 'collected' },
|
|
||||||
{ id: 'a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 환자 리뷰 6,853건', description: '9.2점/10 평균, 시술별 실 환자 후기 — 사회적 증거 핵심 자산', repurposingSuggestions: ['후기 50개 선별 → Carousel 시리즈', 'Instagram Stories 시리즈', '광고 소셜프루프', 'Blog 환자 스토리'], status: 'pending' },
|
|
||||||
{ id: 'a3', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '본관+별관 시설 사진', description: '본관 6층 + 별관 5층 외관/내부 인테리어 고화질 사진', repurposingSuggestions: ['Instagram 시설 투어 Reel', '유튜브 B-roll', '블로그 위치 안내'], status: 'collected' },
|
|
||||||
{ id: 'a4', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '의료진 4명 프로필', description: '반재중 대표원장 + 분야별 전문의 4명 프로필 사진·경력', repurposingSuggestions: ['원장 소개 Carousel', '유튜브 인터뷰 섬네일', '블로그 의료진 페이지'], status: 'collected' },
|
|
||||||
{ id: 'a5', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 카테고리 6종 설명', description: '안면윤곽/눈/코/가슴/지방체형/리프팅 시술별 상세 설명', repurposingSuggestions: ['블로그 SEO 포스트 소스', 'Carousel 텍스트', '광고 카피'], status: 'collected' },
|
|
||||||
{ id: 'a6', source: 'social', sourceLabel: 'Instagram', type: 'photo', title: 'Instagram 게시물 2,000개', description: '@banobagi_ps 누적 2,000 게시물 (B/A · 카드뉴스 혼합)', repurposingSuggestions: ['고성과 게시물 → Reel 변환', 'Carousel 재편집', '광고 소재 추출'], status: 'collected' },
|
|
||||||
{ id: 'a7', source: 'blog', sourceLabel: '네이버 블로그', type: 'text', title: '기존 블로그 포스트 (2023-04 이전)', description: '2년 방치 전 포스트 — SEO 키워드 분석 후 리라이팅 대상', repurposingSuggestions: ['고트래픽 포스트 리라이팅', '키워드 맵 추출', '내부 링크 재구성'], status: 'pending' },
|
|
||||||
{ id: 'a8', source: 'naver_place', sourceLabel: '네이버 플레이스', type: 'photo', title: '네이버 플레이스 사진/리뷰', description: '플레이스 등록 사진 + 리뷰 (응답률 최적화 대상)', repurposingSuggestions: ['리뷰 응답 시스템화', '플레이스 사진 업데이트', '구글 마이비즈니스 동기화'], status: 'pending' },
|
|
||||||
{ id: 'a9', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '시술별 전후 사진 갤러리', description: '안면윤곽/눈/코/가슴 시술별 비포/애프터 (동의서 보유 분)', repurposingSuggestions: ['Instagram B/A 시리즈', 'Shorts 전환 소스', '상담 자료'], status: 'collected' },
|
|
||||||
{ id: 'a10', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '병원 소개 영상 (제작 필요)', description: '26년 역사 + 시설 + 의료진 통합 브랜드 영상 — 신규 제작', repurposingSuggestions: ['브랜드 스토리 Reel', '웹사이트 히어로 영상', 'YouTube 채널 트레일러'], status: 'needs_creation' },
|
|
||||||
{ id: 'a11', source: 'social', sourceLabel: '의료관광', type: 'video', title: '영문 환자 인터뷰 (제작 필요)', description: '의료관광 환자 영문 인터뷰 시리즈 — Facebook EN 16K 활성화용', repurposingSuggestions: ['Facebook EN 시리즈', 'Instagram EN Reels', 'WhatsApp 상담 자료'], status: 'needs_creation' },
|
|
||||||
],
|
|
||||||
youtubeRepurpose: [
|
|
||||||
{ title: '바노바기 안면윤곽 재생목록 베스트', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Carousel', 'Blog 임베드'] },
|
|
||||||
{ title: '눈성형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 3개 추출', 'Reels 동시 배포', 'Blog 변환'] },
|
|
||||||
{ title: '코성형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 3개 추출', 'TikTok 크로스포스팅', 'Carousel'] },
|
|
||||||
{ title: '가슴성형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Reel', 'Blog 변환'] },
|
|
||||||
{ title: '지방체형 시술 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Reel 시리즈'] },
|
|
||||||
{ title: '리프팅·동안성형 가이드', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Carousel', 'Blog'] },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 6: Repurposing Proposals ───
|
|
||||||
repurposingProposals: [
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '925 영상 → 안면윤곽 베스트 추출', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'high',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Shorts 50개 (1차)', channel: 'YouTube / Instagram / TikTok', description: '925 영상 중 안면윤곽 카테고리 우선 추출 — 3개월 분량 확보' },
|
|
||||||
{ format: 'Carousel 10개', channel: 'Instagram', description: '시술 단계·회복 타임라인 카드뉴스화' },
|
|
||||||
{ format: 'Blog Post 5개', channel: 'Naver Blog', description: '영상 스크립트 → SEO 포스트 변환 (재가동 콘텐츠)' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '강남언니 6,853 리뷰 → 콘텐츠화', views: 6853, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Carousel 시리즈 20개', channel: 'Instagram', description: '시술별 베스트 리뷰 카드뉴스 — 익명화 + 동의 확인' },
|
|
||||||
{ format: 'Stories 시리즈', channel: 'Instagram', description: '환자 다이어리 형식 Stories' },
|
|
||||||
{ format: '광고 소셜프루프', channel: 'Facebook EN / Instagram', description: '"6,853 리뷰의 진심" 메시지 광고 소재' },
|
|
||||||
{ format: 'Blog 환자 스토리', channel: 'Naver Blog', description: '리뷰 → 환자 여정 스토리 블로그 변환' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '반재중 원장 인터뷰 (롱폼 신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Shorts 5개 추출', channel: 'YouTube / TikTok', description: '"바노바기의 26년 원칙" 핵심 구간 클립' },
|
|
||||||
{ format: 'Carousel', channel: 'Instagram', description: '원장 철학 카드뉴스' },
|
|
||||||
{ format: 'Blog Post', channel: 'Naver Blog', description: '인터뷰 풀 스크립트 → 2,500자 SEO 포스트' },
|
|
||||||
{ format: '광고 소재', channel: 'Facebook EN', description: '"26 Years of Excellence" 영문 광고' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '본관+별관 시설 투어 (신규 제작)', views: 0, type: 'Short', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'low',
|
|
||||||
priority: 'medium',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Instagram Reel', channel: 'Instagram', description: '시설 투어 60초 Reel' },
|
|
||||||
{ format: 'TikTok', channel: 'TikTok', description: '동일 영상 TikTok 동시 배포' },
|
|
||||||
{ format: 'Stories 시리즈', channel: 'Instagram', description: '구역별 Stories (대기실/상담실/수술실 외관)' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 7: Workflow Tracker ───
|
|
||||||
workflow: {
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
id: 'wf-001',
|
|
||||||
title: '안면윤곽 사각턱 축소 Shorts (925 영상 추출)',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'YouTube Shorts',
|
|
||||||
channelIcon: 'youtube',
|
|
||||||
stage: 'ai-draft',
|
|
||||||
videoDraft: {
|
|
||||||
script: `[인트로 — 0~3초]\n"사각턱, 깎는다고 다 V라인 되는 게 아닙니다."\n(전 사진 → 후 사진 전환)\n\n[본문 — 3~25초]\n"바노바기는 골격 분석부터 시작합니다."\n"턱 끝, 광대, 옆모습 비율을 함께 보고"\n"26년 임상 기준으로 디자인합니다."\n(수술 과정 그래픽 삽입)\n\n[CTA — 25~30초]\n"강남언니 6,853 리뷰 — 프로필 링크 확인"`,
|
|
||||||
shootingGuide: [
|
|
||||||
'925 영상 아카이브에서 안면윤곽 카테고리 베스트 컷 추출',
|
|
||||||
'블랙+골드 워드마크 우측 하단 워터마크 통일',
|
|
||||||
'한글 자막 필수 + 영문 자막 옵션',
|
|
||||||
'환자 동의서 확인 후 비식별화 처리',
|
|
||||||
],
|
|
||||||
duration: '30초',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-002',
|
|
||||||
title: '강남언니 베스트 리뷰 5선 Carousel',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Instagram',
|
|
||||||
channelIcon: 'instagram',
|
|
||||||
stage: 'review',
|
|
||||||
userNotes: '리뷰 인용 시 환자 동의 절차 다시 확인 부탁드립니다',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'cardnews',
|
|
||||||
headline: '강남언니 6,853 리뷰 중 — 진심이 담긴 5개',
|
|
||||||
copy: [
|
|
||||||
'[카드 1] "26년 임상이 어떤 의미인지 상담받고 알았어요" — 안면윤곽 환자',
|
|
||||||
'[카드 2] "마취 전문의가 상주한다는 게 이렇게 든든할 줄 몰랐습니다" — 가슴 환자',
|
|
||||||
'[카드 3] "수술 후 케어가 오래 이어져서 안심했어요" — 눈 환자',
|
|
||||||
'[카드 4] "분야별 전문의 협진이 결과의 디테일을 만든다" — 코 환자',
|
|
||||||
'[카드 5] 9.2점 / 6,853 리뷰 — 강남언니에서 직접 확인하세요',
|
|
||||||
],
|
|
||||||
layoutHint: '5장 카드 세로형, 블랙+골드 컬러, 마지막 카드에 강남언니 링크 CTA',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-003',
|
|
||||||
title: '네이버 블로그 재가동 1편 — 26년 인사',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Naver Blog',
|
|
||||||
channelIcon: 'globe',
|
|
||||||
stage: 'planning',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'blog',
|
|
||||||
headline: '바노바기성형외과 블로그, 다시 시작합니다 — 26년의 약속',
|
|
||||||
copy: [
|
|
||||||
'2년간 멈춰 있던 블로그를 다시 엽니다.',
|
|
||||||
'바노바기는 2000년부터 26년간 강남에서 한 자리를 지켰습니다.',
|
|
||||||
'안면윤곽·눈·코·가슴·지방체형·리프팅 6개 카테고리 가이드를 매주 두 번씩 올립니다.',
|
|
||||||
'의료진 4명 — 분야별 공동 진료 시스템을 이 블로그에서 자세히 소개할 예정입니다.',
|
|
||||||
'본관 6층 + 별관 5층의 시설 투어, 마취과 전문의 상주 시스템도 곧 다룹니다.',
|
|
||||||
'강남언니에 쌓인 6,853 리뷰의 진심을 — 이 블로그에서 더 자세히 풀어드리겠습니다.',
|
|
||||||
],
|
|
||||||
layoutHint: '1200px 썸네일 + 본문 2,000자 이상, 키워드: 바노바기성형외과, 강남 안면윤곽, 26년 임상',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-004',
|
|
||||||
title: '반재중 원장 26년 원칙 — YouTube 롱폼',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'YouTube',
|
|
||||||
channelIcon: 'youtube',
|
|
||||||
stage: 'approved',
|
|
||||||
scheduledDate: '2026-04-21',
|
|
||||||
videoDraft: {
|
|
||||||
script: `[오프닝]\n"안녕하세요, 바노바기성형외과 반재중입니다."\n"오늘은 26년간 변하지 않은 3가지 원칙을 말씀드립니다."\n\n[원칙 1: 골격 분석]\n"디자인은 사진이 아니라 골격에서 시작합니다."\n\n[원칙 2: 분야별 협진]\n"한 명의 의사가 모든 것을 결정하지 않습니다."\n\n[원칙 3: 회복까지의 책임]\n"수술이 끝이 아니라, 회복이 끝입니다."\n\n[클로징]\n"26년, 6,853 리뷰가 증명합니다. 바노바기성형외과."`,
|
|
||||||
shootingGuide: [
|
|
||||||
'본관 상담실 자연광 촬영',
|
|
||||||
'원장 정면 + 3/4 앵글 2채널',
|
|
||||||
'시설 B-roll: 본관/별관 외관, 수술실 입구, 마취 장비',
|
|
||||||
'한글 자막 + 영문 자막 (의료관광 대비)',
|
|
||||||
'블랙+골드 인트로/아웃트로 6초 통일',
|
|
||||||
],
|
|
||||||
duration: '8분',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-005',
|
|
||||||
title: '본관+별관 시설 투어 TikTok',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'TikTok',
|
|
||||||
channelIcon: 'video',
|
|
||||||
stage: 'scheduled',
|
|
||||||
scheduledDate: '2026-04-18',
|
|
||||||
videoDraft: {
|
|
||||||
script: `"강남 한가운데 본관 6층 + 별관 5층."\n(시설 점프컷)\n"마취과 전문의가 상주합니다."\n"분야별 전문의 4명이 협진합니다."\n"2000년부터 26년 — 바노바기성형외과."\n#강남성형외과 #안면윤곽 #바노바기`,
|
|
||||||
shootingGuide: [
|
|
||||||
'세로 9:16 촬영',
|
|
||||||
'점프컷 위주 편집 (CapCut)',
|
|
||||||
'블랙+골드 워드마크 좌측 상단 고정',
|
|
||||||
'트렌딩 사운드 + 자막 필수',
|
|
||||||
],
|
|
||||||
duration: '20초',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,440 +0,0 @@
|
||||||
import type { MarketingPlan } from '../types/plan';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 그랜드성형외과 — 데모 마케팅 플랜
|
|
||||||
*
|
|
||||||
* 리포트 근거 (`mockReport_grand.ts` 2026-04-14 실측):
|
|
||||||
* - YouTube @grandsurgery_QnA: 2.37K 구독자, 332 영상, 업로드 ~0/week (사실상 중단)
|
|
||||||
* - Instagram @grand_korea: 4,013 팔로워
|
|
||||||
* - Facebook @grandps.korea: 26,000 팔로워 (KR+EN 혼합)
|
|
||||||
* - 네이버 블로그 @grandprs: 업로드 저조
|
|
||||||
* - 강남언니: 9.8점/1,533 리뷰
|
|
||||||
* - 이세환 원장, 안면거상·리프팅 전문, 압구정역, 2005년 설립 (21년)
|
|
||||||
* - Primary: Navy Blue (#1B3A6B), Accent: Sky Blue (#4A90D9)
|
|
||||||
*/
|
|
||||||
export const mockPlanGrand: MarketingPlan = {
|
|
||||||
id: 'grand',
|
|
||||||
reportId: 'grand',
|
|
||||||
clinicName: '그랜드성형외과',
|
|
||||||
clinicNameEn: 'Grand Plastic Surgery',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.grandps.com',
|
|
||||||
|
|
||||||
// ─── Section 1: Brand Guide ───
|
|
||||||
brandGuide: {
|
|
||||||
colors: [
|
|
||||||
{ name: 'Grand Navy', hex: '#1B3A6B', usage: '공식 로고 메인, 헤딩, 강조 텍스트' },
|
|
||||||
{ name: 'Grand Sky Blue', hex: '#4A90D9', usage: '로고 악센트, CTA 포인트, 링크' },
|
|
||||||
{ name: 'Crisp White', hex: '#FAFAFA', usage: '배경, 카드, 여백' },
|
|
||||||
{ name: 'Deep Navy Text', hex: '#1B2A4A', usage: '본문 텍스트' },
|
|
||||||
{ name: 'Slate Gray', hex: '#5A6A7A', usage: '서브 텍스트, 메타 정보' },
|
|
||||||
],
|
|
||||||
fonts: [
|
|
||||||
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀', sampleText: '압구정 안면거상·리프팅 전문' },
|
|
||||||
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: '그랜드성형외과 이세환 원장' },
|
|
||||||
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩', sampleText: 'GRAND Plastic Surgery' },
|
|
||||||
],
|
|
||||||
logoRules: [
|
|
||||||
{ rule: 'Navy+Sky Blue 공식 로고 통일', description: '그랜드성형외과 공식 로고(네이비+스카이블루)를 모든 채널에서 동일하게 사용', correct: true },
|
|
||||||
{ rule: '원형 프로필 버전 제작', description: '소셜 프로필 전용 원형 버전 1080×1080 제작 필요 (현재 미제작)', correct: false },
|
|
||||||
{ rule: '가로형 로고: 영문+한글 병기', description: 'GRAND + "그랜드성형외과" 병기 가로형 버전 — 배너·헤더용', correct: true },
|
|
||||||
{ rule: '전문성 태그라인 추가', description: '"압구정 안면거상·리프팅 전문" 태그라인을 로고 하단 병기 검토', correct: true },
|
|
||||||
{ rule: '로고 주변 여백 확보', description: '로고 크기 30% 이상 여백 유지', correct: true },
|
|
||||||
],
|
|
||||||
toneOfVoice: {
|
|
||||||
personality: ['전문적', '신뢰감 있는', '기술 중심', '결과 지향', '차분한 권위'],
|
|
||||||
communicationStyle: '이세환 원장의 안면거상·리프팅 전문 기술력을 핵심으로, 과장 없이 정확한 의료 정보와 케이스 결과로 신뢰를 구축합니다.',
|
|
||||||
doExamples: [
|
|
||||||
'"안면거상은 피부가 아니라 근막을 바로잡는 수술입니다"',
|
|
||||||
'"21년, 결과로 말합니다 — 그랜드성형외과"',
|
|
||||||
'"이세환 원장의 Q&A — 궁금한 것을 직접 답합니다"',
|
|
||||||
'"강남언니 9.8점 · 1,533건의 검증"',
|
|
||||||
],
|
|
||||||
dontExamples: [
|
|
||||||
'"파격 할인! 오늘만!"',
|
|
||||||
'"연예인 시술 병원"',
|
|
||||||
'"100% 만족 보장"',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
channelBranding: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', profilePhoto: 'Grand Navy 원형 로고 1080×1080', bannerSpec: '2560×1440px, Navy 배경 + Sky Blue 악센트, "압구정 안면거상·리프팅 전문의 Q&A"', bioTemplate: '그랜드성형외과 Q&A — 이세환 원장\n안면거상·리프팅·코성형 전문\n02-547-5100 | grandps.com', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Instagram', icon: 'instagram', profilePhoto: 'Grand Navy 원형 로고', bannerSpec: 'N/A (하이라이트: Navy 톤 아이콘 — 안면거상/리프팅/코/가슴/후기)', bioTemplate: '그랜드성형외과 공식 — 이세환 원장\n압구정역 | 02-547-5100\ngrandps.com', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Facebook', icon: 'facebook', profilePhoto: 'Grand Navy 원형 로고', bannerSpec: '820×312px, Navy+Sky Blue 배너 + 전문성 태그라인', bioTemplate: '그랜드성형외과 공식 — 압구정 안면거상·리프팅 전문', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: 'Grand 로고', bannerSpec: '블로그 상단: 로고 + "안면거상·리프팅 전문 Q&A" 카테고리 메뉴', bioTemplate: '그랜드성형외과 공식 블로그\n안면거상·리프팅·코성형·가슴성형 전문 정보', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'TikTok', icon: 'video', profilePhoto: 'Grand Navy 원형 로고', bannerSpec: 'N/A', bioTemplate: '그랜드성형외과 — 이세환 원장 Q&A\n압구정 | 02-547-5100', currentStatus: 'missing' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [
|
|
||||||
{
|
|
||||||
field: '전문성 포지셔닝',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube', value: '그랜드성형외과Q&A (Q&A 채널명)', isCorrect: true },
|
|
||||||
{ channel: 'Instagram', value: '그랜드성형외과 공식 계정 (전문성 USP 없음)', isCorrect: false },
|
|
||||||
{ channel: 'Facebook', value: '그랜드성형외과 공식 Facebook', isCorrect: false },
|
|
||||||
{ channel: 'Website', value: '안면거상·리프팅 명시 (부분)', isCorrect: true },
|
|
||||||
],
|
|
||||||
impact: '"압구정 안면거상·리프팅 전문"이라는 핵심 USP가 YouTube 채널명에만 일부 반영. 나머지 채널에서 전문성 포지셔닝 부재',
|
|
||||||
recommendation: '전 채널 바이오에 "안면거상·리프팅 전문 이세환 원장" 명시',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: '업로드 빈도',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube', value: '~0/week (사실상 중단)', isCorrect: false },
|
|
||||||
{ channel: 'Instagram', value: '저빈도', isCorrect: false },
|
|
||||||
{ channel: 'Naver Blog', value: '저빈도', isCorrect: false },
|
|
||||||
],
|
|
||||||
impact: '전 채널 업로드 중단 상태 — 신규 환자 유입 경로가 거의 없음',
|
|
||||||
recommendation: 'YouTube·Instagram·Blog 동시 재가동 — 안면거상 전문 콘텐츠 우선',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 2: Channel Strategies ───
|
|
||||||
channelStrategies: [
|
|
||||||
{
|
|
||||||
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
|
|
||||||
currentStatus: '@grandsurgery_QnA — 2.37K 구독자, 332 영상, 업로드 사실상 중단',
|
|
||||||
targetGoal: '10K 구독자 / 12개월, 주 2회 업로드 재개',
|
|
||||||
contentTypes: ['Shorts (332 영상 재편집)', '안면거상 전문 롱폼', '이세환 원장 Q&A 시리즈'],
|
|
||||||
postingFrequency: '주 2회 (Shorts 1 + 롱폼 격주)',
|
|
||||||
tone: '전문의 직접 설명 — "이세환 원장이 말하는 안면거상"',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Shorts: 332 Q&A 영상에서 핵심 30-60초 추출',
|
|
||||||
'롱폼: 안면거상 케이스 스터디 월 2편 — 전후 비교 중심',
|
|
||||||
'썸네일: Navy+Sky Blue 통일, 이세환 원장 + 케이스 사진',
|
|
||||||
'타이틀: "압구정 안면거상 전문의가 말하는 ___" 패턴',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'instagram_kr', channelName: 'Instagram', icon: 'instagram',
|
|
||||||
currentStatus: '@grand_korea — 4,013 팔로워, 카드뉴스·이미지 위주 (Reels 부족)',
|
|
||||||
targetGoal: '25K 팔로워 / 12개월, Reels 주 4개',
|
|
||||||
contentTypes: ['Reels (YouTube Shorts 동시)', 'Before/After Carousel', '이세환 원장 Q&A Stories'],
|
|
||||||
postingFrequency: '일 1회 + Stories 일 2개',
|
|
||||||
tone: '차분하고 전문적인 — 안면거상 결과로 설득',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Reels: YouTube Shorts 동시 배포',
|
|
||||||
'Carousel: 안면거상·리프팅 전후 케이스 5-7장',
|
|
||||||
'Highlight: 안면거상/코성형/가슴/리프팅/후기 재구성',
|
|
||||||
'해시태그: #그랜드성형외과 #압구정안면거상 #이세환원장 #리프팅전문',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'interest',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'facebook', channelName: 'Facebook', icon: 'facebook',
|
|
||||||
currentStatus: '@grandps.korea — 26,000 팔로워, 콘텐츠 빈도 낮음',
|
|
||||||
targetGoal: 'Instagram 크로스포스팅 + Pixel 리타겟 활용',
|
|
||||||
contentTypes: ['Instagram 크로스포스팅', '리타겟 광고 소재'],
|
|
||||||
postingFrequency: '주 2-3회 (자동 크로스포스팅 위주)',
|
|
||||||
tone: '안면거상·리프팅 결과 중심 — 40~55세 여성 타겟',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Instagram 콘텐츠 자동 연동 유지',
|
|
||||||
'Pixel 광고: 안면거상 관심사 타겟 — 40~55세 여성',
|
|
||||||
'26K 팔로워 리타겟 활용',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'conversion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
|
|
||||||
currentStatus: '@grandprs — 업로드 저조, SEO 자산 방치',
|
|
||||||
targetGoal: '주 2회 포스팅 재가동, 12개월 내 월 15,000 방문자',
|
|
||||||
contentTypes: ['안면거상 SEO 가이드', '이세환 원장 Q&A 텍스트 변환', 'YouTube 영상 임베드+설명'],
|
|
||||||
postingFrequency: '주 2회',
|
|
||||||
tone: '"압구정 안면거상", "강남 리프팅" 키워드 중심',
|
|
||||||
formatGuidelines: [
|
|
||||||
'2,000자 이상 SEO 최적화 포스트',
|
|
||||||
'YouTube Q&A 영상 + 텍스트 답변 구조',
|
|
||||||
'핵심 키워드: "압구정 안면거상", "강남 리프팅", "그랜드성형외과 후기"',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
|
|
||||||
currentStatus: '9.8점/10, 1,533 리뷰 — 응답 전략 부재',
|
|
||||||
targetGoal: '리뷰 응답률 80%, 2,500 리뷰 / 12개월',
|
|
||||||
contentTypes: ['리뷰 응답', '시술 정보 최신화'],
|
|
||||||
postingFrequency: '리뷰 응답 일 단위',
|
|
||||||
tone: '진심 어린 이세환 원장 답변',
|
|
||||||
formatGuidelines: [
|
|
||||||
'응답률 50%(3개월) → 80%(12개월)',
|
|
||||||
'1,533 리뷰 중 30개 선별 → SNS Carousel',
|
|
||||||
'부정 리뷰 24시간 내 응답',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'loyalty',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'tiktok', channelName: 'TikTok (신규)', icon: 'video',
|
|
||||||
currentStatus: '계정 없음',
|
|
||||||
targetGoal: '5K 팔로워 / 12개월 — 30~50대 안면거상 고민층',
|
|
||||||
contentTypes: ['YouTube Shorts 크로스포스팅', '이세환 원장 숏클립 Q&A'],
|
|
||||||
postingFrequency: '주 3-5회 (Shorts 동시 배포)',
|
|
||||||
tone: '안면거상 궁금증 해소 — 가볍고 정확한 정보',
|
|
||||||
formatGuidelines: [
|
|
||||||
'332 YouTube 영상 Shorts 추출 → TikTok 동시',
|
|
||||||
'트렌딩 사운드 + 자막 필수',
|
|
||||||
'의료광고법 준수',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'awareness',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 3: Content Strategy ───
|
|
||||||
contentStrategy: {
|
|
||||||
pillars: [
|
|
||||||
{
|
|
||||||
title: '안면거상 전문 기술',
|
|
||||||
description: '이세환 원장의 딥플레인 안면거상 전문성을 케이스와 기술 설명으로 증명',
|
|
||||||
relatedUSP: 'Facelift Surgical Authority',
|
|
||||||
exampleTopics: ['딥플레인 안면거상 vs 일반 리프팅 차이', '안면거상 수술 전후 케이스 스터디', '리프팅 지속 시간의 과학'],
|
|
||||||
color: '#1B3A6B',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '이세환 원장 Q&A',
|
|
||||||
description: '332개 YouTube Q&A 영상 자산을 확장한 원장 직접 답변 시리즈',
|
|
||||||
relatedUSP: 'Direct Doctor Communication',
|
|
||||||
exampleTopics: ['안면거상 Q&A: 가장 많이 묻는 10가지', '코성형 후 리프팅 타이밍', '나이별 리프팅 권장 시술'],
|
|
||||||
color: '#4A90D9',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '강남언니 9.8점의 증거',
|
|
||||||
description: '1,533 리뷰에서 추출한 환자 목소리와 결과 중심 콘텐츠',
|
|
||||||
relatedUSP: 'Patient-Verified Excellence',
|
|
||||||
exampleTopics: ['안면거상 후기 — 6개월 경과', '40대 환자의 리프팅 결정 스토리', '재수술 없이 자연스러운 결과'],
|
|
||||||
color: '#5A6A7A',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '안전한 수술 환경',
|
|
||||||
description: '압구정 본원 시설·장비·안전 시스템 소개',
|
|
||||||
relatedUSP: 'Safety & Environment',
|
|
||||||
exampleTopics: ['그랜드성형외과 시설 투어', '수술 후 케어 프로토콜', '1:1 원장 책임 시스템'],
|
|
||||||
color: '#FAFAFA',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
typeMatrix: [
|
|
||||||
{ format: 'YouTube Long-form', channels: ['YouTube'], frequency: '격주 1편', purpose: '안면거상 전문성 증명, 깊은 신뢰' },
|
|
||||||
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 4개', purpose: '332 영상 자산 재활용, 30~55대 도달' },
|
|
||||||
{ format: 'Carousel (Q&A)', channels: ['Instagram'], frequency: '주 2회', purpose: '안면거상 궁금증 해소, 저장 유도' },
|
|
||||||
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '"압구정 안면거상" 검색 상위 확보' },
|
|
||||||
{ format: 'Stories', channels: ['Instagram'], frequency: '일 2개', purpose: '이세환 원장 일상·상담 친밀감' },
|
|
||||||
{ format: 'Ad Creative', channels: ['Facebook', 'Instagram'], frequency: '월 4개', purpose: '40~55세 여성 리타겟' },
|
|
||||||
],
|
|
||||||
workflow: [
|
|
||||||
{ step: 1, name: 'Q&A 아카이브 정리', description: '332개 YouTube 영상 카테고리화 — 안면거상/리프팅/코/가슴 분류', owner: '마케팅 매니저', duration: '1주 (1회성)' },
|
|
||||||
{ step: 2, name: '주제 선정', description: '이세환 원장 Q&A 패턴 + 검색 키워드 매칭', owner: '마케팅 매니저', duration: '1일' },
|
|
||||||
{ step: 3, name: 'Shorts 추출 / 스크립트 작성', description: '기존 영상 핵심 구간 추출 또는 AI 초안', owner: 'AI + 편집', duration: '1-2일' },
|
|
||||||
{ step: 4, name: '원장 검수', description: '이세환 원장 의료 정확성 + 광고법 체크', owner: '이세환 원장', duration: '1일' },
|
|
||||||
{ step: 5, name: '비주얼 마감', description: 'Navy+Sky Blue 썸네일, 한글 자막', owner: '디자인', duration: '1일' },
|
|
||||||
{ step: 6, name: '배포', description: '채널별 최적 시간 + UTM 추적', owner: '마케팅 매니저', duration: '당일' },
|
|
||||||
],
|
|
||||||
repurposingSource: '이세환 원장 안면거상 롱폼 Q&A (10분)',
|
|
||||||
repurposingOutputs: [
|
|
||||||
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 Q&A 풀 영상 (한글 자막)' },
|
|
||||||
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '핵심 Q&A 답변 30-60초, 3채널 동시' },
|
|
||||||
{ format: 'Carousel 2개', channel: 'Instagram', description: '안면거상 Q&A 카드뉴스화' },
|
|
||||||
{ format: 'Blog Post', channel: 'Naver Blog', description: 'Q&A 스크립트 → 2,000자 SEO 포스트 (영상 임베드)' },
|
|
||||||
{ format: 'Stories 3개', channel: 'Instagram', description: '촬영 비하인드 스니펫' },
|
|
||||||
{ format: 'Ad Creative', channel: 'Facebook', description: '안면거상 Before/After + CTA 광고' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 4: Content Calendar ───
|
|
||||||
calendar: {
|
|
||||||
weeks: [
|
|
||||||
{
|
|
||||||
weekNumber: 1, label: 'Week 1: YouTube 재가동 & 브랜드 정비',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '재가동 1편: 이세환 원장의 안면거상 철학' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: '프로필 리뉴얼 + 첫 Reel (안면거상 전후 케이스)' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 안면거상 Q&A — 피부가 아닌 근막을 바로잡는 이유' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '안면거상이란? — 이세환 원장이 설명하는 기초 가이드' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 안면거상 VS 실리프팅 차이' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 강남언니 9.8점 리뷰 하이라이트' },
|
|
||||||
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '그랜드성형외과 안면거상 후기 — 강남언니 9.8점의 의미' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 2, label: 'Week 2: 안면거상 전문성 집중',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 딥플레인 안면거상 vs 일반 리프팅 — 이세환 원장 비교' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 안면거상 전후 케이스 #1' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 안면거상 회복 기간 Q&A' },
|
|
||||||
{ dayOfWeek: 2, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '딥플레인 안면거상 — 압구정 전문의가 설명하는 차이점' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 리프팅 시술 나이별 추천 가이드' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 이세환 원장 한 줄 Q&A' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 40~55세 여성 — 안면거상 상담 CTA' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 3, label: 'Week 3: 코성형·가슴성형 콘텐츠',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 Q&A 10가지 — 그랜드 이세환 원장 답변' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 전후 — 자연스러운 라인' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 재수술 피하는 방법' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 가슴성형 보형물 종류 비교' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '그랜드성형외과 코성형 후기 — 강남언니 검증' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 회복 현실 Q&A' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 4, label: 'Week 4: 전환 최적화',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 그랜드성형외과 — 21년의 기술력' },
|
|
||||||
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '첫 성형 상담 준비 가이드 — 그랜드성형외과 압구정' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 압구정 그랜드 시설 투어' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 이세환 원장 이달의 케이스' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 상담 예약 안내 — 압구정역 5분' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 월말 안면거상 상담 CTA' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '그랜드성형외과 9.8점 — 1,533 리뷰의 진심' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
monthlySummary: [
|
|
||||||
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 12, color: '#1B3A6B' },
|
|
||||||
{ type: 'blog', label: '블로그', count: 8, color: '#4A90D9' },
|
|
||||||
{ type: 'social', label: 'Instagram', count: 8, color: '#5A6A7A' },
|
|
||||||
{ type: 'ad', label: '광고', count: 2, color: '#FAFAFA' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 5: Asset Collection ───
|
|
||||||
assetCollection: {
|
|
||||||
assets: [
|
|
||||||
{ id: 'a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: '332개 Q&A 영상 아카이브', description: '2017년 이래 안면거상·코성형·가슴 Q&A 332개 — Shorts 추출 최우선', repurposingSuggestions: ['Shorts 100개 추출 (P0)', 'Instagram Reels', 'TikTok 동시', '블로그 임베드'], status: 'collected' },
|
|
||||||
{ id: 'a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 리뷰 1,533건', description: '9.8점/10 — 안면거상·리프팅 케이스 중심', repurposingSuggestions: ['베스트 30개 → Carousel', 'Instagram Stories', '광고 소셜프루프', 'Blog 후기'], status: 'pending' },
|
|
||||||
{ id: 'a3', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '압구정 본원 시설 사진', description: '본원 내외부 고화질', repurposingSuggestions: ['Instagram 시설 Reel', 'YouTube B-roll', '블로그 위치'], status: 'collected' },
|
|
||||||
{ id: 'a4', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '이세환 원장 프로필', description: '이세환 원장 고화질 프로필 + 경력', repurposingSuggestions: ['YouTube 인터뷰 섬네일', 'Carousel 원장 소개', '광고 신뢰도 소재'], status: 'collected' },
|
|
||||||
{ id: 'a5', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 설명 텍스트', description: '안면거상·리프팅·코·가슴 시술별 상세', repurposingSuggestions: ['블로그 SEO 소스', 'Carousel', '광고 카피'], status: 'collected' },
|
|
||||||
{ id: 'a6', source: 'social', sourceLabel: 'Instagram', type: 'photo', title: '@grand_korea 게시물 800개', description: '시술 설명·카드뉴스 누적 800개', repurposingSuggestions: ['고성과 게시물 Reel 변환', 'Carousel 재편집'], status: 'collected' },
|
|
||||||
{ id: 'a7', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '안면거상 전후 사진 갤러리', description: '이세환 원장 케이스 — 동의 환자 대상', repurposingSuggestions: ['Instagram B/A 시리즈', 'Shorts 소스', '상담 자료'], status: 'collected' },
|
|
||||||
{ id: 'a8', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '이세환 원장 소개 영상 (제작 필요)', description: '21년 경력·전문성 브랜드 영상 신규 제작', repurposingSuggestions: ['YouTube 채널 트레일러', 'Instagram 브랜드 Reel', '웹사이트 히어로'], status: 'needs_creation' },
|
|
||||||
],
|
|
||||||
youtubeRepurpose: [
|
|
||||||
{ title: '안면거상 수술 Q&A 베스트', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Carousel', '블로그 임베드'] },
|
|
||||||
{ title: '리프팅 지속 시간 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 3개', 'TikTok 동시', 'Blog'] },
|
|
||||||
{ title: '코성형 재수술 케이스', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Reel', 'Carousel'] },
|
|
||||||
{ title: '가슴성형 보형물 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Reel', 'Blog'] },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 6: Repurposing Proposals ───
|
|
||||||
repurposingProposals: [
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '332 Q&A 영상 → 안면거상 Shorts 추출', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'high',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Shorts 50개 (1차)', channel: 'YouTube / Instagram / TikTok', description: '안면거상·리프팅 카테고리 우선 — 3채널 동시' },
|
|
||||||
{ format: 'Carousel 10개', channel: 'Instagram', description: 'Q&A 카드뉴스화' },
|
|
||||||
{ format: 'Blog Post 5개', channel: 'Naver Blog', description: 'Q&A 스크립트 → SEO 포스트 변환' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '강남언니 1,533 리뷰 콘텐츠화', views: 1533, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Carousel 15개', channel: 'Instagram', description: '안면거상·리프팅 후기 카드뉴스 — 익명화' },
|
|
||||||
{ format: '광고 소재', channel: 'Facebook / Instagram', description: '"9.8점 강남언니 검증" 소셜프루프 광고' },
|
|
||||||
{ format: 'Blog 후기 포스트', channel: 'Naver Blog', description: '케이스별 상세 후기 블로그 변환' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '이세환 원장 인터뷰 (신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Shorts 5개', channel: 'YouTube / TikTok', description: '"21년 안면거상 전문의가 말하는" 핵심 구간' },
|
|
||||||
{ format: 'Carousel', channel: 'Instagram', description: '이세환 원장 철학 카드뉴스' },
|
|
||||||
{ format: 'Blog Post', channel: 'Naver Blog', description: '인터뷰 → SEO 포스트' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 7: Workflow Tracker ───
|
|
||||||
workflow: {
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
id: 'wf-001',
|
|
||||||
title: '딥플레인 안면거상 vs 리프팅 Shorts',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'YouTube Shorts',
|
|
||||||
channelIcon: 'youtube',
|
|
||||||
stage: 'ai-draft',
|
|
||||||
videoDraft: {
|
|
||||||
script: `[인트로 — 0~3초]\n"피부만 당기는 리프팅, 효과는 1년도 안 갑니다."\n\n[본문 — 3~25초]\n"그랜드성형외과는 근막층(SMAS)부터 바로잡습니다."\n"딥플레인 안면거상 — 자연스럽고 오래가는 이유입니다."\n"이세환 원장이 21년간 선택한 방식."\n\n[CTA — 25~30초]\n"강남언니 9.8점 · 1,533 리뷰 — 프로필 링크"`,
|
|
||||||
shootingGuide: [
|
|
||||||
'332 영상 중 안면거상 카테고리 핵심 구간 추출',
|
|
||||||
'Navy+Sky Blue 워터마크 하단 고정',
|
|
||||||
'한글 자막 필수',
|
|
||||||
'환자 동의서 확인 + 비식별화',
|
|
||||||
],
|
|
||||||
duration: '30초',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-002',
|
|
||||||
title: '안면거상 Q&A 5가지 Carousel',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Instagram',
|
|
||||||
channelIcon: 'instagram',
|
|
||||||
stage: 'review',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'cardnews',
|
|
||||||
headline: '안면거상, 가장 많이 묻는 5가지 — 이세환 원장 직접 답변',
|
|
||||||
copy: [
|
|
||||||
'[카드 1] Q. 몇 살부터? → A. 처짐의 정도가 기준. 나이보다 상태를 봅니다.',
|
|
||||||
'[카드 2] Q. 실리프팅이랑 다른가요? → A. 실리프팅은 임시, 안면거상은 근막층 교정.',
|
|
||||||
'[카드 3] Q. 회복 기간은? → A. 일상 복귀 1~2주, 완전 회복 3~6개월.',
|
|
||||||
'[카드 4] Q. 흉터? → A. 귀 앞뒤 은닉 절개 — 자연스럽게.',
|
|
||||||
'[카드 5] 강남언니 9.8점 · 그랜드성형외과 이세환 원장',
|
|
||||||
],
|
|
||||||
layoutHint: '5장 세로형, Navy+Sky Blue, 마지막 카드에 상담 예약 CTA',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-003',
|
|
||||||
title: '안면거상이란? SEO 블로그 재가동 1편',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Naver Blog',
|
|
||||||
channelIcon: 'globe',
|
|
||||||
stage: 'planning',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'blog',
|
|
||||||
headline: '안면거상이란? — 압구정 전문의 이세환 원장이 직접 설명합니다',
|
|
||||||
copy: [
|
|
||||||
'안면거상은 피부를 당기는 시술이 아닙니다. 근막층(SMAS)의 처짐을 바로잡는 수술입니다.',
|
|
||||||
'그랜드성형외과 이세환 원장은 21년간 안면거상·리프팅에 집중해왔습니다.',
|
|
||||||
'강남언니 9.8점 / 1,533 리뷰 — 결과로 검증된 전문성.',
|
|
||||||
'앞으로 안면거상·리프팅·코성형 전문 정보를 매주 2회 업로드합니다.',
|
|
||||||
],
|
|
||||||
layoutHint: '1200px 썸네일 + 2,000자, 키워드: 안면거상, 압구정 안면거상, 그랜드성형외과, 이세환 원장',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-004',
|
|
||||||
title: '이세환 원장 인터뷰 — 21년의 기술력',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'YouTube',
|
|
||||||
channelIcon: 'youtube',
|
|
||||||
stage: 'approved',
|
|
||||||
scheduledDate: '2026-04-21',
|
|
||||||
videoDraft: {
|
|
||||||
script: `[오프닝]\n"안녕하세요, 그랜드성형외과 이세환입니다."\n"21년간 안면거상에만 집중한 이유를 말씀드립니다."\n\n[핵심 1: 왜 안면거상인가]\n"처짐은 피부 문제가 아닙니다. 근막이 늘어나는 겁니다."\n\n[핵심 2: 딥플레인의 차이]\n"표면 리프팅은 1년, 딥플레인은 5~10년 — 이유가 있습니다."\n\n[클로징]\n"강남언니 1,533분이 남긴 9.8점이 증거입니다. 그랜드성형외과."`,
|
|
||||||
shootingGuide: [
|
|
||||||
'압구정 원장실 자연광',
|
|
||||||
'이세환 원장 정면 + 3/4 앵글',
|
|
||||||
'안면거상 케이스 그래픽 인서트',
|
|
||||||
'Navy+Sky Blue 인트로/아웃트로',
|
|
||||||
],
|
|
||||||
duration: '8분',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,508 +0,0 @@
|
||||||
import type { MarketingPlan } from '../types/plan';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 이룸성형외과 (서울아이 / Seoul i Plastic Surgery) — 맞춤 마케팅 플랜
|
|
||||||
*
|
|
||||||
* 리포트 근거 (mockReport_irum.ts, 2026-04-14 실측):
|
|
||||||
* - YouTube @SEOULiPS.: 구독자 322명, 영상 155개 (성장 완전 정체)
|
|
||||||
* - Instagram: @seoulips KR 826명 / @seouli_ps_th 태국 5K / @seouli_jp 일본 운영
|
|
||||||
* - Facebook: 서울아이성형외과 페이지 비공개/삭제 확인
|
|
||||||
* - 강남언니: 9.4점 / 86 리뷰 (5개 병원 중 가장 적음)
|
|
||||||
* - 포지셔닝: 코성형·눈밑지방·실리프팅 전문, 태국·일본 외국인 환자 특화
|
|
||||||
* - 설립: 2015년 (11년), 강남역 인근
|
|
||||||
*
|
|
||||||
* mockPlan(View) 의존성 완전 제거 — 모든 섹션 이룸 실측 기반 재구성.
|
|
||||||
*/
|
|
||||||
export const mockPlanIrum: MarketingPlan = {
|
|
||||||
id: 'irum',
|
|
||||||
reportId: 'irum',
|
|
||||||
clinicName: '이룸성형외과 (서울아이)',
|
|
||||||
clinicNameEn: 'Seoul i Plastic Surgery',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.seoulips.com',
|
|
||||||
|
|
||||||
// ─── Section 1: Brand Guide ───
|
|
||||||
brandGuide: {
|
|
||||||
colors: [
|
|
||||||
{ name: 'Forest Green', hex: '#0D4F3C', usage: '주요 배경·헤더·CTA 버튼 — 신뢰·자연·안전 상징' },
|
|
||||||
{ name: 'Mint', hex: '#2ECC71', usage: '강조색 — 성장·생명력·외국인 환자 친화성 표현' },
|
|
||||||
{ name: 'Off-White', hex: '#F4FAF7', usage: '섹션 배경 — 그린 계열과 대비되는 밝고 깨끗한 여백' },
|
|
||||||
{ name: 'Deep Forest', hex: '#07331F', usage: '헤딩 텍스트·고대비 강조 영역' },
|
|
||||||
{ name: 'Stone Gray', hex: '#6B7280', usage: '서브 텍스트·부연 설명 — 중립적 가독성' },
|
|
||||||
],
|
|
||||||
fonts: [
|
|
||||||
{ family: 'Pretendard', weight: '400 / 600 / 700', usage: 'KR 본문·UI 레이블', sampleText: '서울아이성형외과 — 안전하고 바른 성형' },
|
|
||||||
{ family: 'Playfair Display', weight: '400 / 700', usage: '영문 헤딩·Seoul i 영문 브랜드 표기', sampleText: 'Seoul i Plastic Surgery' },
|
|
||||||
{ family: 'Noto Sans', weight: '400 / 600', usage: '태국어·일본어 다국어 콘텐츠 — 현지 가독성 확보', sampleText: 'Seoul i — ศัลยกรรม · 整形外科' },
|
|
||||||
],
|
|
||||||
logoRules: [
|
|
||||||
{ rule: '영문 로고 글로벌 우선', description: '"Seoul i Plastic Surgery" 영문 로고를 TH/JP 계정·Facebook·LINE에 일관 사용 — 서울아이/이룸 혼용 금지', correct: true },
|
|
||||||
{ rule: '국내 채널: 서울아이 KR + 영문 병기', description: '국내 KR 채널(@seoulips, Naver Blog)에는 "서울아이 Seoul i" KR+EN 병기 버전 사용', correct: true },
|
|
||||||
{ rule: 'Forest Green 배경 통일', description: '로고 단색 배경은 반드시 Forest Green(#0D4F3C) 또는 Off-White(#F4FAF7) 계열만 허용', correct: true },
|
|
||||||
{ rule: '다국어 로고 4개 버전', description: 'KR / EN / TH / JP 4개 언어 버전 제작 → 각 Instagram 계정 프로필 사진에 언어별 적용 필요', correct: false },
|
|
||||||
{ rule: '프로필 사진 1080×1080 통일', description: '채널별 해상도 편차 존재 — 1080×1080 단일 원형 로고로 전 채널 통일 필요', correct: false },
|
|
||||||
],
|
|
||||||
toneOfVoice: {
|
|
||||||
personality: ['안심되는', '전문적', '따뜻한', '글로벌', '섬세한'],
|
|
||||||
communicationStyle: '외국인 환자가 이해하기 쉬운 쉬운 단어를 선택하되, 코성형·눈밑지방·리프팅 전문성을 교육적 어조로 전달합니다. "안전하고 바른 성형"이라는 서울아이 슬로건을 다국어로 일관 표현.',
|
|
||||||
doExamples: [
|
|
||||||
'"안전하고 바른 성형을 위해 서울아이는 항상 노력합니다"',
|
|
||||||
'"강남언니 9.4점, 86명의 진솔한 후기"',
|
|
||||||
'"코성형·눈밑지방·리프팅 11년 전문성"',
|
|
||||||
'"태국·일본 환자도 한국어 걱정 없이 상담하세요"',
|
|
||||||
],
|
|
||||||
dontExamples: [
|
|
||||||
'"파격 할인! 오늘까지만!"',
|
|
||||||
'"연예인이 선택한 병원"',
|
|
||||||
'번역 품질이 낮은 직역체 TH/JP 콘텐츠',
|
|
||||||
'"서울아이 / 이룸 / Seoul i" 브랜드명 혼용',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
channelBranding: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', profilePhoto: '서울아이 Forest Green 배경 원형 로고 1080×1080', bannerSpec: '2560×1440px, Forest Green 배경 + "서울아이 Seoul i Plastic Surgery" + 코성형·눈밑지방·리프팅 서브타이틀', bioTemplate: '안전하고 바른 성형 — 서울아이\n코성형·눈밑지방·실리프팅 전문\nseoulips.com | 강남역 인근', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Instagram KR', icon: 'instagram', profilePhoto: '서울아이 KR 로고 원형', bannerSpec: 'Highlights: Forest Green 아이콘 세트 (코성형/눈밑지방/리프팅/후기/외국인환영)', bioTemplate: '서울아이성형외과 | 코성형·눈밑지방·리프팅\n강남역 | 02-555-0900 | seoulips.com', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Instagram TH', icon: 'instagram', profilePhoto: '서울아이 TH 로고 원형', bannerSpec: 'Highlights: ศัลยกรรมจมูก / ใต้ตา / ลิฟติ้ง / รีวิว / ปรึกษา 5개 카테고리', bioTemplate: 'Seoul i Plastic Surgery | ศัลยกรรมความงามเกาหลี | LINE: @seoulips_th', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Instagram JP', icon: 'instagram', profilePhoto: '서울아이 JP 로고 원형', bannerSpec: 'Highlights: 鼻整形 / 目の下 / リフティング / 口コミ / ご予約 5개', bioTemplate: 'Seoul i Plastic Surgery | 韓国美容整形 | LINE: @seoulips_jp', currentStatus: 'missing' },
|
|
||||||
{ channel: 'Facebook (신규)', icon: 'facebook', profilePhoto: '서울아이 EN 로고', bannerSpec: '820×312px, Forest Green + "Seoul i Plastic Surgery" + 코·눈밑지방·리프팅 서브타이틀', bioTemplate: 'Seoul i Plastic Surgery — 코성형 · 눈밑지방 · 리프팅 전문 | 태국·일본 환자 환영', currentStatus: 'missing' },
|
|
||||||
{ channel: 'LINE (신규)', icon: 'globe', profilePhoto: '서울아이 EN 로고', bannerSpec: 'LINE 채널 아트: Forest Green + "Seoul i — 일본 환자 전용 상담"', bioTemplate: 'Seoul i Plastic Surgery 공식 LINE — 일본어 상담 가능 | seoulips.com', currentStatus: 'missing' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [
|
|
||||||
{
|
|
||||||
field: '브랜드명 혼용',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube', value: '서울아이 Seoul i Plastic Surgery', isCorrect: true },
|
|
||||||
{ channel: 'Instagram KR', value: '서울아이성형외과', isCorrect: true },
|
|
||||||
{ channel: '강남언니', value: '이룸(서울아이)성형외과', isCorrect: false },
|
|
||||||
{ channel: 'Website', value: 'seoulips.com (서울아이 + 이룸 혼용)', isCorrect: false },
|
|
||||||
],
|
|
||||||
impact: '"이룸" / "서울아이" / "Seoul i" 3개 명칭 혼용 — 신규 환자의 브랜드 인지 혼란 유발. 특히 외국인 환자는 동일 병원임을 인지 못 할 가능성.',
|
|
||||||
recommendation: '국내 KR: "서울아이" 통일 / 글로벌: "Seoul i Plastic Surgery" 통일 — 강남언니 프로필명도 "서울아이성형외과"로 수정',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: 'YouTube 성장 정체',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube @SEOULiPS.', value: '155개 영상 · 구독자 322명 (영상당 구독자 2명 미만)', isCorrect: false },
|
|
||||||
{ channel: 'Instagram TH @seouli_ps_th', value: '200개 게시물 · 5,000 팔로워 (10배 차이)', isCorrect: true },
|
|
||||||
{ channel: 'Instagram KR @seoulips', value: '600개 게시물 · 826 팔로워', isCorrect: false },
|
|
||||||
],
|
|
||||||
impact: 'YouTube 글로벌 채널 잠재력이 완전히 미활용 중 — 다국어 자막 추가만으로 즉시 글로벌 검색 노출 10배 이상 확대 가능',
|
|
||||||
recommendation: '기존 155개 영상에 EN/TH 자막 우선 30개 추가 P0 — 신규 영상 제작보다 기존 자산 글로벌 전환이 ROI 더 높음',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: '3개국 Instagram 크로스채널 단절',
|
|
||||||
values: [
|
|
||||||
{ channel: '@seoulips (KR)', value: '826 팔로워 — KR 단독 운영', isCorrect: false },
|
|
||||||
{ channel: '@seouli_ps_th (TH)', value: '5,000 팔로워 — TH 단독 운영', isCorrect: false },
|
|
||||||
{ channel: '@seouli_jp (JP)', value: '팔로워 미확인 — JP 단독 운영', isCorrect: false },
|
|
||||||
],
|
|
||||||
impact: 'KR/TH/JP 3개 계정이 서로 태그·크로스 배포 없음 — 계정 간 팔로워 유입 기회 0% 상태',
|
|
||||||
recommendation: 'KR 원본 → TH/JP 번역 크로스 배포 파이프라인 구축 (자동화) — 제작 비용 동일, 노출 3배',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 2: Channel Strategies ───
|
|
||||||
channelStrategies: [
|
|
||||||
{
|
|
||||||
channelId: 'youtube', channelName: 'YouTube', icon: 'youtube',
|
|
||||||
currentStatus: '@SEOULiPS. — 구독자 322명 · 155개 영상 · 업로드 월 1~2회 · 성장 완전 정체',
|
|
||||||
targetGoal: '구독자 3,000명 / 12개월, 주 2회 정기 업로드 + 다국어 자막 100% 적용',
|
|
||||||
contentTypes: ['다국어 자막 추가 (기존 155개 → EN/TH/JP)', 'Shorts 50개 추출 (기존 영상 재활용)', '전문의 Q&A 롱폼 (코성형·눈밑지방)', '외국인 환자 브이로그'],
|
|
||||||
postingFrequency: '주 2회 (Shorts 1 + 롱폼 격주), 자막 추가는 월 10개 이상',
|
|
||||||
tone: '교육적·안심감 — 서울아이 전문의 직접 설명, 외국인 친화적 쉬운 언어',
|
|
||||||
formatGuidelines: [
|
|
||||||
'기존 155개 영상에 EN/TH 자막 우선 30개 추가 — 즉시 글로벌 노출 확대 (P0)',
|
|
||||||
'Shorts: 기존 영상에서 1분 클립 추출 → KR/EN/TH/JP 다국어 Shorts',
|
|
||||||
'플레이리스트 재정비: 코성형 / 눈밑지방 / 리프팅 / 외국인 환자 브이로그 4개',
|
|
||||||
'썸네일: Forest Green 배경 + "서울아이 Seoul i" 워터마크 통일',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'instagram_kr', channelName: 'Instagram KR', icon: 'instagram',
|
|
||||||
currentStatus: '@seoulips — 826 팔로워 · 게시물 600개 · Reels 30개 (부족)',
|
|
||||||
targetGoal: '팔로워 10,000명 / 12개월, Reels 주 5개',
|
|
||||||
contentTypes: ['Reels (코성형·눈밑지방 Before/After)', 'Carousel (강남언니 86 리뷰 스토리화)', 'Stories (병원 일상)', '시술 교육 카드뉴스'],
|
|
||||||
postingFrequency: '일 1회 + Stories 일 2~3개',
|
|
||||||
tone: '따뜻하고 안심되는 — 전문성과 친근함의 균형',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Reels 주 5회 업로드 (KR 자막 기본 + EN 자막 추가로 해외 노출 병행)',
|
|
||||||
'@seouli_ps_th / @seouli_jp 계정과 상호 태그 → 팔로워 크로스 유입',
|
|
||||||
'강남언니 86 리뷰 핵심 발췌 → Carousel + Story 월 4회',
|
|
||||||
'Highlights 재구성: 코성형 / 눈밑지방 / 리프팅 / 후기 / 외국인 환영',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'interest',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'instagram_th', channelName: 'Instagram TH', icon: 'instagram',
|
|
||||||
currentStatus: '@seouli_ps_th — 5,000 팔로워 · 200개 게시물 · KR 계정과 크로스 배포 없음',
|
|
||||||
targetGoal: '팔로워 15,000명 / 12개월, KR 콘텐츠 번역 자동 배포 구축',
|
|
||||||
contentTypes: ['KR 원본 번역 배포 (태국어)', 'Reels (태국어 자막)', '태국 환자 Before/After', 'LINE 상담 CTA'],
|
|
||||||
postingFrequency: '주 3회 (KR 번역 배포 2 + 태국 전용 1)',
|
|
||||||
tone: 'Warm & informative — 태국 환자 관점에서 한국 성형 정보 제공',
|
|
||||||
formatGuidelines: [
|
|
||||||
'@seoulips KR 게시물 → 태국어 번역 → 동시 배포 파이프라인 구축 (P0)',
|
|
||||||
'Highlights: ศัลยกรรมจมูก / ใต้ตา / ลิฟติ้ง / รีวิว / ปรึกษาฟรี 5개',
|
|
||||||
'바이오 + 게시물에 LINE 상담 링크 추가 — 태국 환자 직접 전환 경로',
|
|
||||||
'Reels 주 3회: 태국어 자막 코성형 Before/After + 태국어 상담 안내',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'conversion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'instagram_jp', channelName: 'Instagram JP', icon: 'instagram',
|
|
||||||
currentStatus: '@seouli_jp — 팔로워 미확인 · 일본어 운영 중 · 업로드 비정기',
|
|
||||||
targetGoal: '팔로워 3,000명 / 12개월, LINE 연동으로 직접 상담 전환',
|
|
||||||
contentTypes: ['일본어 네이티브 콘텐츠', 'KR 번역 배포 (일본어)', 'LINE 상담 CTA'],
|
|
||||||
postingFrequency: '주 2회 (KR 번역 배포 1 + 일본 전용 1)',
|
|
||||||
tone: '자연스러운 일본어 — 직역체 금지, 네이티브 검수 필수',
|
|
||||||
formatGuidelines: [
|
|
||||||
'LINE QR코드를 바이오와 모든 게시물에 삽입 — 일본 환자 전환 핵심 경로',
|
|
||||||
'네이티브 일본어 검수 후 게시 (직역체 금지)',
|
|
||||||
'Highlights: 鼻整形 / 目の下の脂肪 / リフティング / 口コミ / ご予約 5개',
|
|
||||||
'KR 원본 → 일본어 번역 배포로 업로드 부담 감소',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'conversion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'facebook_new', channelName: 'Facebook (신규 개설)', icon: 'facebook',
|
|
||||||
currentStatus: '기존 페이지 비공개/삭제 확인 — 외국인 환자 광고 채널 완전 공백',
|
|
||||||
targetGoal: '태국·일본 환자 타겟 광고 집행 인프라 구축 (3개월 내)',
|
|
||||||
contentTypes: ['영문/태국어 광고 소재', 'Instagram TH 크로스포스팅', 'Before/After 광고'],
|
|
||||||
postingFrequency: '주 2회 + 광고 캠페인 상시',
|
|
||||||
tone: 'Professional & welcoming — Korea medical tourism storytelling',
|
|
||||||
formatGuidelines: [
|
|
||||||
'"Seoul i Plastic Surgery" 영문명으로 신규 개설 (P0)',
|
|
||||||
'seoulips.com 픽셀 설치 → Instagram TH/JP 방문자 리타겟팅 광고',
|
|
||||||
'코성형·눈밑지방 시술별 태국어·일본어 광고 소재 제작 후 집행',
|
|
||||||
'WhatsApp 연동 검토 — 동남아 시장 직접 상담',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'awareness',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'line_new', channelName: 'LINE (신규 개설)', icon: 'globe',
|
|
||||||
currentStatus: '미개설 — 일본·태국 환자 직접 상담 경로 없음',
|
|
||||||
targetGoal: 'LINE 공식 계정 개설 + 일본어 FAQ 자동응답 + 친구 500명 (6개월)',
|
|
||||||
contentTypes: ['일본어 자동응답 FAQ', '상담 예약 플로우', 'TH/JP 전용 이벤트 메시지'],
|
|
||||||
postingFrequency: '일 단위 자동응답 + 월 2회 메시지 발송',
|
|
||||||
tone: '친절하고 안심되는 — 일본어·태국어 네이티브 수준',
|
|
||||||
formatGuidelines: [
|
|
||||||
'LINE Official Account 개설 — 일본어 자동응답 + 상담 예약 플로우 설정 (P0)',
|
|
||||||
'@seouli_jp 바이오 + 모든 게시물에 LINE QR코드 삽입',
|
|
||||||
'코성형·눈밑지방·리프팅 시술별 FAQ 자동 응답 (일본어)',
|
|
||||||
'친구 수 목표: 500명 (6개월) → 1,000명 (12개월)',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'conversion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
|
|
||||||
currentStatus: 'blog.naver.com/seoulips — 공식 블로그 운영 중, 업로드 저조',
|
|
||||||
targetGoal: '월 8회 SEO 포스팅 정착, 코성형·눈밑지방 검색 상위 노출',
|
|
||||||
contentTypes: ['코성형 SEO 가이드', '눈밑지방 FAQ', '강남언니 리뷰 가공', 'YouTube 임베드'],
|
|
||||||
postingFrequency: '주 2회 (1차 1개월 내 시작)',
|
|
||||||
tone: '정보성 전문가 — "코성형 가격" / "눈밑지방 제거" / "실리프팅" 키워드 중심',
|
|
||||||
formatGuidelines: [
|
|
||||||
'2,000자 이상 SEO 최적화 포스트, 이미지 10장 + YouTube 임베드 1개',
|
|
||||||
'키워드 맵: "코성형 가격", "눈밑지방 제거", "실리프팅", "강남 코성형"',
|
|
||||||
'강남언니 86 리뷰 핵심 발췌 → 블로그 후기 형식 재가공',
|
|
||||||
'시술 영상 임베드 → 체류 시간 증가 → 네이버 검색 상위 노출',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
|
|
||||||
currentStatus: '9.4점 / 86 리뷰 — 5개 병원 중 가장 적음 · SNS 홍보 미흡',
|
|
||||||
targetGoal: '리뷰 1,500건 (12개월), 월 신규 리뷰 20건 목표',
|
|
||||||
contentTypes: ['리뷰 응답 (일 단위)', '시술 정보 업데이트', '리뷰 SNS 콘텐츠화'],
|
|
||||||
postingFrequency: '리뷰 응답: 일 단위 / 프로필 업데이트: 월 1~2회',
|
|
||||||
tone: '진심 어린 의료진 답변 — 형식적 답변 지양',
|
|
||||||
formatGuidelines: [
|
|
||||||
'수술 후 3개월 추적 관리 시 강남언니 리뷰 작성 요청 → 월 20건 목표',
|
|
||||||
'86개 기존 리뷰 핵심 발췌 → Instagram 카드뉴스 + YouTube 추천사 영상',
|
|
||||||
'부정 리뷰 24시간 내 응답 원칙',
|
|
||||||
'강남언니 프로필에 다국어 시술 설명 추가 + 최신 Before/After 업로드',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'loyalty',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 3: Content Strategy ───
|
|
||||||
contentStrategy: {
|
|
||||||
pillars: [
|
|
||||||
{
|
|
||||||
title: '글로벌 코성형·눈밑지방 전문성',
|
|
||||||
description: '11년 경력의 코성형·눈밑지방·실리프팅 전문 기술을 KR/TH/JP 3개 언어로 전달 — "안전하고 바른 성형" 서울아이 원칙',
|
|
||||||
relatedUSP: '11 Years of Rhinoplasty & Blepharoplasty Expertise',
|
|
||||||
exampleTopics: ['코성형 3가지 방법 비교 (한/태/영/일 자막)', '눈밑지방 제거 Before/After 30일 변화', '실리프팅 효과와 지속 기간', '코성형 붓기 타임라인 Day 1~30'],
|
|
||||||
color: '#0D4F3C',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '3개국 다국어 외국인 환자 여정',
|
|
||||||
description: '태국·일본 실제 환자의 내원 전후 여정을 현지어로 다큐멘터리화 — 정보 제공 + 신뢰 구축',
|
|
||||||
relatedUSP: 'KR/TH/JP Multilingual Patient Experience',
|
|
||||||
exampleTopics: ['태국에서 서울아이로 — 코성형 여행 브이로그', '日本から来た!목의 下の脂肪取り手術体験記', '외국인 환자 상담 과정 공개', '강남역에서 서울아이까지 오는 방법'],
|
|
||||||
color: '#2ECC71',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '86 리뷰의 진심 — 강남언니 증거',
|
|
||||||
description: '강남언니 9.4점 / 86 실사용 후기를 콘텐츠 자산으로 전환 — 신뢰 증거 극대화',
|
|
||||||
relatedUSP: 'Patient-Validated 9.4 Stars',
|
|
||||||
exampleTopics: ['"코성형 후 진짜 자연스럽다" — 강남언니 리뷰 발췌', '86개 리뷰 공통 키워드: 자연스럽다 / 회복 빠르다 / 친절하다', '강남언니 9.4점 달성 감사 이벤트', '리뷰 100 달성 기념 특별 콘텐츠'],
|
|
||||||
color: '#07331F',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'K-Beauty 글로벌 허브 — 서울 강남',
|
|
||||||
description: '강남역 입지와 K-Beauty 트렌드를 활용한 글로벌 환자 유입 전략 — 서울 방문 가이드 + 한국 성형 문화',
|
|
||||||
relatedUSP: 'K-Beauty Seoul Gangnam Destination',
|
|
||||||
exampleTopics: ['강남에서 수술 후 회복하기 — 숙소/식당/관광지 추천', '왜 태국/일본 분들이 한국에서 코성형을 하나요?', '서울아이 찾아오는 방법 — 강남역 3번 출구 5분', '2026 코성형 트렌드 — 서울아이 전문의 전망'],
|
|
||||||
color: '#6B7280',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
typeMatrix: [
|
|
||||||
{ format: 'YouTube 전문의 Q&A (다국어 자막)', channels: ['YouTube'], frequency: '주 1회', purpose: '코성형·눈밑지방 전문성 증명, 깊은 신뢰 구축' },
|
|
||||||
{ format: 'Shorts / Reels (다국어)', channels: ['YouTube', 'Instagram KR', 'Instagram TH', 'Instagram JP'], frequency: '주 5개', purpose: '기존 155개 영상 글로벌 재활용, 도달 확대' },
|
|
||||||
{ format: 'Carousel (리뷰 스토리)', channels: ['Instagram KR'], frequency: '주 1회', purpose: '강남언니 86 리뷰 → 사회적 증거화' },
|
|
||||||
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 2회', purpose: '코성형·눈밑지방 검색 유입, SEO 강화' },
|
|
||||||
{ format: '외국인 환자 브이로그', channels: ['YouTube', 'Instagram TH', 'Instagram JP'], frequency: '월 2회', purpose: '태국·일본 환자 여정 콘텐츠 — 전환 유도' },
|
|
||||||
{ format: 'LINE 메시지', channels: ['LINE'], frequency: '월 2회', purpose: '일본 환자 직접 상담 전환 채널' },
|
|
||||||
],
|
|
||||||
workflow: [
|
|
||||||
{ step: 1, name: 'KR 원본 제작', description: '한국어 원본 콘텐츠 (영상/카드뉴스/Reels) 제작 — 후반작업 포함', owner: '콘텐츠팀', duration: '5~7일' },
|
|
||||||
{ step: 2, name: '다국어 번역 + 자막', description: 'EN/TH/JP 번역 및 자막 파일 제작 — 네이티브 검수 필수', owner: '번역팀', duration: '2~3일' },
|
|
||||||
{ step: 3, name: '플랫폼별 최적화', description: 'Instagram 계정별(KR/TH/JP) 포맷·해시태그 최적화 후 예약 등록', owner: 'SNS 담당', duration: '1일' },
|
|
||||||
{ step: 4, name: '크로스 배포 + 성과 추적', description: '전 채널 동시 배포 후 UTM 기반 유입 추적 + 강남언니 상담 연계 확인', owner: '마케팅 매니저', duration: '당일' },
|
|
||||||
],
|
|
||||||
repurposingSource: '1개 코성형·눈밑지방 전문의 설명 영상 (10분) 또는 기존 155개 영상 아카이브 1편',
|
|
||||||
repurposingOutputs: [
|
|
||||||
{ format: 'YouTube Long-form', channel: 'YouTube', description: '원본 풀 영상 업로드 (KR 기본 + EN/TH/JP 자막 추가)' },
|
|
||||||
{ format: 'Shorts 3개', channel: 'YouTube / Instagram KR', description: '핵심 구간 30~60초 추출, KR+EN 자막 동시 배포' },
|
|
||||||
{ format: 'Instagram TH Reels', channel: 'Instagram TH (@seouli_ps_th)', description: 'Shorts 태국어 번역 버전 — @seouli_ps_th 배포' },
|
|
||||||
{ format: 'Instagram JP Reels', channel: 'Instagram JP (@seouli_jp)', description: 'Shorts 일본어 번역 버전 — @seouli_jp 배포' },
|
|
||||||
{ format: 'Blog Post 1개', channel: 'Naver Blog', description: '영상 스크립트 → 2,000자 SEO 포스트 (영상 임베드 포함)' },
|
|
||||||
{ format: 'LINE 메시지', channel: 'LINE', description: '영상 요약 + 상담 CTA — 일본 LINE 친구 대상 발송' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 4: Content Calendar ───
|
|
||||||
calendar: {
|
|
||||||
weeks: [
|
|
||||||
{
|
|
||||||
weekNumber: 1, label: 'Week 1: 다국어 기반 구축 — 브랜드 통일 선언',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: '서울아이 리브랜딩 — "Seoul i Plastic Surgery" 공식 발표 Reels' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'Seoul i Plastic Surgery — เปิดตัวแบรนด์ใหม่ (TH Reels)' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형이란? — 1분 설명 (KR/EN/TH/JP 자막)' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram JP', channelIcon: 'instagram', contentType: 'social', title: 'ソウルアイ — 鼻整形専門クリニック紹介 (JP Reels)' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 86 리뷰 감사 — 핵심 후기 발췌 5선' },
|
|
||||||
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 방법 3가지 비교 — 어떤 수술이 나에게 맞을까' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 2, label: 'Week 2: 코성형 전문성 — 교육 콘텐츠 집중',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '코성형 상담부터 수술까지 — 서울아이 전문의 Q&A (EN/TH 자막)' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reels: 코성형 붓기 타임라인 — Day 1~30 비교' },
|
|
||||||
{ dayOfWeek: 2, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'ไทม์ไลน์ฟื้นตัวหลังทำจมูก — 1~30 วัน (TH 번역)' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram JP', channelIcon: 'instagram', contentType: 'social', title: '鼻整形の腫れはいつ引く? リカバリータイムライン (JP 번역)' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '눈밑지방 제거 vs 필러 — 차이와 선택 기준 (SEO)' },
|
|
||||||
{ dayOfWeek: 5, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Story: 강남언니 9.4점 리뷰 — "정말 자연스럽다" 후기 공유' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 3, label: 'Week 3: 외국인 환자 여정 — 태국 집중',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '태국에서 서울아이로 — 코성형 여행 브이로그 (태국어 자막)' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'จากกรุงเทพมาโซล — ทำจมูกที่ Seoul i (TH Reels)' },
|
|
||||||
{ dayOfWeek: 2, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reels: 눈밑지방 제거 전후 — 30대 여성 케이스' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'ขั้นตอนนัดหมายที่ Seoul i — ง่ายกว่าที่คิด (TH 카드뉴스)' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고(TH): Seoul i — 태국 환자 코성형 신규 광고 런칭' },
|
|
||||||
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '실리프팅이란? 효과와 지속 기간 — 서울아이 케이스 분석' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 4, label: 'Week 4: LINE 오픈 + 일본 환자 전환',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 86→100 리뷰 달성 감사 이벤트' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram JP', channelIcon: 'instagram', contentType: 'social', title: '日本からソウルアイへ — 目の下の脂肪取りブイログ (JP)' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '실리프팅이란? 서울아이 전문의 1:1 설명 (4개 언어 자막)' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram KR', channelIcon: 'instagram', contentType: 'social', title: 'Reels: 서울아이 상담실 공개 — 외국인 환자 첫 방문 가이드' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Instagram TH', channelIcon: 'instagram', contentType: 'social', title: 'ก่อน-หลัง เสริมจมูก Seoul i — คนไข้จริงรีวิว (TH)' },
|
|
||||||
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남언니 9.4점 달성 스토리 — 서울아이가 받은 86개의 진심' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
monthlySummary: [
|
|
||||||
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 12, color: '#0D4F3C' },
|
|
||||||
{ type: 'blog', label: '블로그', count: 4, color: '#2ECC71' },
|
|
||||||
{ type: 'social', label: 'Instagram KR/TH/JP', count: 14, color: '#07331F' },
|
|
||||||
{ type: 'ad', label: '광고 (Facebook TH)', count: 1, color: '#6B7280' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 5: Asset Collection ───
|
|
||||||
assetCollection: {
|
|
||||||
assets: [
|
|
||||||
{ id: 'ir-a1', source: 'youtube', sourceLabel: 'YouTube', type: 'video', title: 'YouTube 영상 155개 아카이브 (@SEOULiPS.)', description: '2019년 개설 이래 누적 155개 영상 — 다국어 자막 추가 + Shorts 추출 최우선 자산', repurposingSuggestions: ['EN/TH/JP 자막 추가 30개 (P0)', 'Shorts 50개 추출', 'Instagram Reels 변환', 'Blog 포스트 임베드'], status: 'collected' },
|
|
||||||
{ id: 'ir-a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 환자 리뷰 86건 (9.4점)', description: '5개 병원 중 가장 적지만 9.4점 고품질 — 리뷰 증가 전략 + 콘텐츠 자산화 우선', repurposingSuggestions: ['리뷰 발췌 Carousel 시리즈', 'Instagram Stories 시리즈', '블로그 환자 스토리', '광고 소셜프루프'], status: 'pending' },
|
|
||||||
{ id: 'ir-a3', source: 'social', sourceLabel: 'Instagram TH', type: 'photo', title: 'Instagram @seouli_ps_th 게시물 200개 (5K 팔로워)', description: '태국어 콘텐츠 200개 — Facebook 태국 광고 소재 + LINE 콘텐츠 재활용 가능', repurposingSuggestions: ['Facebook 태국 타겟 광고 소재', 'LINE 태국 메시지 콘텐츠', '@seoulips KR 크로스 태그 시리즈'], status: 'collected' },
|
|
||||||
{ id: 'ir-a4', source: 'social', sourceLabel: 'Instagram KR', type: 'photo', title: 'Instagram @seoulips 게시물 600개', description: '@seoulips KR 누적 600 게시물 — TH/JP 번역 크로스 배포 원본 소스', repurposingSuggestions: ['TH 번역 → @seouli_ps_th 배포', 'JP 번역 → @seouli_jp 배포', 'Reels 재편집'], status: 'collected' },
|
|
||||||
{ id: 'ir-a5', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '서울아이 시설·의료진 사진', description: 'seoulips.com 내 시설 사진 + 의료진 프로필 — 다국어 채널 신뢰 콘텐츠 소스', repurposingSuggestions: ['Instagram 시설 투어 Reels', 'YouTube B-roll', '블로그 위치 안내', '다국어 광고 배경'], status: 'collected' },
|
|
||||||
{ id: 'ir-a6', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '시술 카테고리 3종 설명 (코성형·눈밑지방·리프팅)', description: 'seoulips.com 시술별 상세 설명 — 블로그 SEO 포스트 + 다국어 카드뉴스 소스', repurposingSuggestions: ['블로그 SEO 포스트 소스', '다국어 카드뉴스 텍스트', 'LINE FAQ 자동응답 소스'], status: 'collected' },
|
|
||||||
{ id: 'ir-a7', source: 'blog', sourceLabel: '네이버 블로그', type: 'text', title: '기존 네이버 블로그 포스트', description: 'blog.naver.com/seoulips 기존 포스트 — SEO 키워드 분석 후 리라이팅 대상', repurposingSuggestions: ['고트래픽 포스트 리라이팅', '키워드 맵 추출', '내부 링크 재구성'], status: 'pending' },
|
|
||||||
{ id: 'ir-a8', source: 'homepage', sourceLabel: '홈페이지 (제작 필요)', type: 'video', title: '다국어 병원 소개 영상 (신규 제작)', description: '"서울아이 = 안전하고 바른 성형 + KR/TH/JP 환자 환영" 통합 브랜드 영상', repurposingSuggestions: ['YouTube 채널 트레일러', '다국어 Landing Page 히어로 영상', 'Instagram KR/TH/JP 프로필 영상'], status: 'needs_creation' },
|
|
||||||
],
|
|
||||||
youtubeRepurpose: [
|
|
||||||
{ title: '코성형 상담부터 수술까지 — 전문의 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 3개 추출', 'Instagram KR Reels', 'TH/JP 번역 배포', 'Blog 임베드'] },
|
|
||||||
{ title: '눈밑지방 제거 과정 설명', views: 0, type: 'Long', repurposeAs: ['Shorts 2개 추출', 'Reels KR+TH+JP 동시 배포', 'Blog SEO 포스트'] },
|
|
||||||
{ title: '실리프팅 효과와 지속 기간', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'Blog 임베드', '강남언니 프로필 연동'] },
|
|
||||||
{ title: '코성형 붓기 타임라인 — 1개월 경과', views: 0, type: 'Short', repurposeAs: ['Instagram KR/TH/JP 동시 배포', 'TikTok 크로스포스팅'] },
|
|
||||||
{ title: '서울아이 서울 방문 가이드 (외국인)', views: 0, type: 'Long', repurposeAs: ['Instagram TH/JP 여행 시리즈', 'LINE 메시지 콘텐츠', 'Facebook 광고 소재'] },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 6: Repurposing Proposals ───
|
|
||||||
repurposingProposals: [
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '155개 YouTube 영상 → EN/TH/JP 자막 추가', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: '자막 추가 영상 30개 (1차)', channel: 'YouTube', description: '기존 영상에 EN/TH 자막 추가 → 글로벌 검색 노출 즉시 10배 확대 (P0)' },
|
|
||||||
{ format: 'Shorts 50개 추출', channel: 'YouTube / Instagram KR / TH / JP', description: '1분 클립 추출 후 KR/EN/TH/JP 다국어 Shorts — 3개월 분량 확보' },
|
|
||||||
{ format: 'Instagram TH/JP 버전', channel: 'Instagram TH + JP', description: 'Shorts를 태국어·일본어 번역 버전으로 변환 → 3개 계정 동시 배포' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '강남언니 86 리뷰 → 콘텐츠화', views: 86, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'low',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Carousel 시리즈 (월 4회)', channel: 'Instagram KR', description: '리뷰 핵심 발췌 카드뉴스 — 21개월치 소재 확보' },
|
|
||||||
{ format: 'Blog 환자 스토리', channel: 'Naver Blog', description: '리뷰 → 환자 여정 스토리 블로그 변환 (SEO 포스트)' },
|
|
||||||
{ format: '광고 소셜프루프', channel: 'Facebook TH / JP', description: '"9.4점 / 86 리뷰의 진심" 메시지 외국인 환자 타겟 광고 소재' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '외국인 환자 브이로그 (신규 제작 — TH/JP)', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'YouTube 브이로그 (태국어 자막)', channel: 'YouTube', description: '태국 환자 서울 방문 여정 풀 영상 — YouTube 글로벌 노출' },
|
|
||||||
{ format: 'Instagram TH Reels 시리즈', channel: 'Instagram TH (@seouli_ps_th)', description: '브이로그 클립 → TH Reels 5편 시리즈' },
|
|
||||||
{ format: 'LINE 일본 콘텐츠', channel: 'LINE', description: 'JP 환자 브이로그 요약 + LINE 상담 CTA — 일본 전환 유도' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: 'LINE 일본 상담 채널 개설 콘텐츠', views: 0, type: 'Short', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'low',
|
|
||||||
priority: 'medium',
|
|
||||||
outputs: [
|
|
||||||
{ format: '@seouli_jp Instagram Reels', channel: 'Instagram JP', description: 'LINE 개설 공지 Reels + QR코드 삽입' },
|
|
||||||
{ format: 'YouTube JP 자막 CTA', channel: 'YouTube', description: '모든 영상 엔딩에 LINE 상담 QR코드 추가' },
|
|
||||||
{ format: 'Instagram TH LINE CTA', channel: 'Instagram TH', description: '@seouli_ps_th Story + 게시물에 LINE 링크 추가' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 7: Workflow Tracker ───
|
|
||||||
workflow: {
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
id: 'ir-wf-001',
|
|
||||||
title: 'LINE 공식 계정 개설 + 일본어 FAQ 자동응답 설정',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'LINE',
|
|
||||||
channelIcon: 'globe',
|
|
||||||
stage: 'planning',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'blog',
|
|
||||||
headline: 'Seoul i Plastic Surgery LINE 공식 채널 오픈',
|
|
||||||
copy: [
|
|
||||||
'일본어 자동응답: 코성형 / 눈밑지방 / 리프팅 시술별 FAQ',
|
|
||||||
'예약 문의 → 코디네이터 연결 플로우',
|
|
||||||
'@seouli_jp 바이오 + 모든 게시물에 LINE QR코드 삽입',
|
|
||||||
'오픈 공지 Instagram JP Reels 동시 발행',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ir-wf-002',
|
|
||||||
title: 'YouTube 기존 영상 EN/TH 자막 1차 30개 추가',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'YouTube',
|
|
||||||
channelIcon: 'youtube',
|
|
||||||
stage: 'planning',
|
|
||||||
videoDraft: {
|
|
||||||
script: '[자막 추가 대상 우선순위]\n1. 코성형 관련 영상 (조회수 상위)\n2. 눈밑지방 제거 설명 영상\n3. Before/After 케이스 영상\n\n[작업 방식]\n- 기존 자막 없는 영상 → EN 자동 번역 후 수정\n- TH 번역은 네이티브 검수 후 업로드\n- JP 번역은 2차 30개 추가 예정',
|
|
||||||
shootingGuide: [
|
|
||||||
'자막 추가 후 YouTube Studio에서 언어 설정 확인',
|
|
||||||
'제목·설명에 EN/TH/JP 키워드 추가 (SEO)',
|
|
||||||
'자막 완료 영상은 채널에 핀 게시 or 플레이리스트 상위 노출',
|
|
||||||
],
|
|
||||||
duration: '월 10개, 3개월 내 30개 완료',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ir-wf-003',
|
|
||||||
title: 'Facebook 신규 페이지 개설 + 픽셀 설치',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Facebook',
|
|
||||||
channelIcon: 'facebook',
|
|
||||||
stage: 'planning',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'blog',
|
|
||||||
headline: '"Seoul i Plastic Surgery" Facebook 신규 개설',
|
|
||||||
copy: [
|
|
||||||
'기존 비공개 페이지 대체 — 영문 "Seoul i Plastic Surgery" 이름으로 개설',
|
|
||||||
'seoulips.com 픽셀 설치 → Instagram TH/JP 방문자 리타겟팅',
|
|
||||||
'태국어·일본어 첫 광고 캠페인 소재: 코성형 Before/After',
|
|
||||||
'WhatsApp 연동 검토 (동남아 직접 상담)',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ir-wf-004',
|
|
||||||
title: '강남언니 86 리뷰 Carousel 1차 4편 제작',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Instagram KR',
|
|
||||||
channelIcon: 'instagram',
|
|
||||||
stage: 'ai-draft',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'cardnews',
|
|
||||||
headline: '강남언니 9.4점 — 진심 담긴 86개의 이야기',
|
|
||||||
copy: [
|
|
||||||
'슬라이드 1: "강남언니 9.4점 / 86 리뷰 감사합니다"',
|
|
||||||
'슬라이드 2-5: 베스트 리뷰 4개 발췌 (익명화 처리)',
|
|
||||||
'슬라이드 6: "리뷰 남기기 → 강남언니 프로필 링크"',
|
|
||||||
],
|
|
||||||
layoutHint: 'Forest Green 배경, Mint 텍스트 강조, 서울아이 로고 하단',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ir-wf-005',
|
|
||||||
title: 'Instagram KR/TH/JP 크로스 배포 루틴 문서화',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Instagram KR',
|
|
||||||
channelIcon: 'instagram',
|
|
||||||
stage: 'planning',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'blog',
|
|
||||||
headline: '3개국 Instagram 크로스 배포 SOP',
|
|
||||||
copy: [
|
|
||||||
'KR 원본 제작 → EN 번역 → TH 번역 (네이티브 검수) → JP 번역 (네이티브 검수)',
|
|
||||||
'예약 스케줄러 설정: KR 월요일 → TH 화요일 → JP 수요일 동시 배포',
|
|
||||||
'해시태그 국가별 최적화 가이드 문서화',
|
|
||||||
'월 1회 3개 계정 성과 리뷰 루틴 수립',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,507 +0,0 @@
|
||||||
import type { MarketingPlan } from '../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 워드마크 하단 고정',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,460 +0,0 @@
|
||||||
import type { MarketingPlan } from '../types/plan';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 티에스성형외과 — 데모 마케팅 플랜
|
|
||||||
*
|
|
||||||
* 리포트 근거 (`mockReport_ts.ts` 2026-04-14 실측):
|
|
||||||
* - YouTube 티에스TV @TV-jm9dy: 8K 구독자, 715 영상, 주 1~2회 업로드
|
|
||||||
* - Instagram @tsprs_official: 2,626 팔로워, Reels 60개
|
|
||||||
* - Facebook @tsprs: 3,900 팔로워 (활성도 낮음)
|
|
||||||
* - 네이버 블로그 @tsprs: 업로드 있으나 빈도 보완 필요
|
|
||||||
* - 네이버 카페: 연탐 카페 운영
|
|
||||||
* - 강남언니: 9.5점/12,509 리뷰
|
|
||||||
* - 2010년 설립 16년, 신사역, 눈·코·가슴 종합, "리얼모델" 시스템
|
|
||||||
* - 슬로건: "지금, 예뻐져라!"
|
|
||||||
* - Primary: Dark Navy (#1A1A2E), Accent: Crimson (#E94560)
|
|
||||||
*/
|
|
||||||
export const mockPlanTs: MarketingPlan = {
|
|
||||||
id: 'ts',
|
|
||||||
reportId: 'ts',
|
|
||||||
clinicName: '티에스성형외과',
|
|
||||||
clinicNameEn: 'TS Plastic Surgery',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.tsprs.com',
|
|
||||||
|
|
||||||
// ─── Section 1: Brand Guide ───
|
|
||||||
brandGuide: {
|
|
||||||
colors: [
|
|
||||||
{ name: 'TS Dark Navy', hex: '#1A1A2E', usage: '공식 로고 메인, 헤딩, 강조 텍스트' },
|
|
||||||
{ name: 'TS Crimson', hex: '#E94560', usage: '로고 악센트, CTA 포인트, 리얼모델 강조' },
|
|
||||||
{ name: 'Off White', hex: '#F8F8F8', usage: '배경, 카드, 여백' },
|
|
||||||
{ name: 'Deep Navy Text', hex: '#0F0F1A', usage: '본문 텍스트' },
|
|
||||||
{ name: 'Mid Gray', hex: '#6B7280', usage: '서브 텍스트, 메타 정보' },
|
|
||||||
],
|
|
||||||
fonts: [
|
|
||||||
{ family: 'Pretendard', weight: 'Bold 700', usage: '헤딩, 섹션 타이틀', sampleText: '지금, 예뻐져라! — 티에스성형외과' },
|
|
||||||
{ family: 'Pretendard', weight: 'Regular 400', usage: '본문 텍스트', sampleText: '리얼모델로 증명하는 티에스' },
|
|
||||||
{ family: 'Playfair Display', weight: 'Bold 700', usage: '영문 헤딩', sampleText: 'TS Plastic Surgery' },
|
|
||||||
],
|
|
||||||
logoRules: [
|
|
||||||
{ rule: 'Dark Navy+Crimson 공식 로고 통일', description: '티에스성형외과 공식 로고를 모든 채널에서 동일 사용', correct: true },
|
|
||||||
{ rule: '"지금, 예뻐져라!" 슬로건 전 채널 통일', description: '슬로건을 바이오·배너·콘텐츠 전반에 일관되게 적용', correct: false },
|
|
||||||
{ rule: '리얼모델 썸네일 시스템', description: '리얼모델 Before/After 썸네일 — Dark Navy 배경 + Crimson 워드마크 워터마크 통일', correct: false },
|
|
||||||
{ rule: '원형 프로필 1080×1080 통일', description: '전 채널 프로필 이미지 고해상도 원형 버전 통일', correct: false },
|
|
||||||
],
|
|
||||||
toneOfVoice: {
|
|
||||||
personality: ['에너지 있는', '결과 중심', '리얼한', '친근한 전문가', '트렌디'],
|
|
||||||
communicationStyle: '"지금, 예뻐져라!"는 단순한 슬로건이 아닙니다. 리얼모델로 증명하는 티에스의 결과 중심 철학입니다. 과장 없이 실제 환자 결과로 설득합니다.',
|
|
||||||
doExamples: [
|
|
||||||
'"리얼모델이 증명합니다 — 지금, 예뻐져라!"',
|
|
||||||
'"강남언니 9.5점 · 12,509 리뷰 — 결과로 말합니다"',
|
|
||||||
'"티에스TV 715개 영상, 눈·코·가슴 모든 것"',
|
|
||||||
'"신사역 5분 — 지금 예약하세요"',
|
|
||||||
],
|
|
||||||
dontExamples: [
|
|
||||||
'"강남 최고 할인!"',
|
|
||||||
'"연예인 선택 병원"',
|
|
||||||
'"100% 만족 보장"',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
channelBranding: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', profilePhoto: 'TS Dark Navy 원형 로고 1080×1080', bannerSpec: '2560×1440px, Dark Navy 배경 + Crimson 악센트, "지금, 예뻐져라! 티에스TV"', bioTemplate: '지금, 예뻐져라! 티에스성형외과\n눈·코·가슴·리프팅 리얼모델 채널\n02-512-7580 | tsprs.com', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Instagram', icon: 'instagram', profilePhoto: 'TS Dark Navy 원형 로고', bannerSpec: 'N/A (하이라이트: 눈성형/코성형/가슴성형/리얼모델/이벤트 — Crimson 톤)', bioTemplate: '지금, 예뻐져라! 티에스성형외과 공식\n신사역 | 02-512-7580\ntsprs.com', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Facebook', icon: 'facebook', profilePhoto: 'TS Dark Navy 원형 로고', bannerSpec: '820×312px, Dark Navy+Crimson, "지금, 예뻐져라! 리얼모델로 증명"', bioTemplate: '티에스성형외과 공식 — 강남 신사역\n눈·코·가슴 리얼모델 시스템', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'Naver Blog', icon: 'globe', profilePhoto: 'TS 로고', bannerSpec: '블로그 상단: 로고 + 리얼모델 카테고리 메뉴', bioTemplate: '지금, 예뻐져라! 티에스성형외과 공식 블로그\n눈·코·가슴·리프팅 리얼모델 후기', currentStatus: 'incorrect' },
|
|
||||||
{ channel: 'TikTok', icon: 'video', profilePhoto: 'TS Dark Navy 원형 로고', bannerSpec: 'N/A', bioTemplate: '지금, 예뻐져라! 티에스성형외과\n신사역 | 02-512-7580', currentStatus: 'missing' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [
|
|
||||||
{
|
|
||||||
field: '리얼모델 콘텐츠 크로스채널 미활용',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube', value: '티에스TV — 리얼모델 시리즈 있음', isCorrect: true },
|
|
||||||
{ channel: 'Instagram', value: 'Reels 60개 — 리얼모델 하이라이트 미완성', isCorrect: false },
|
|
||||||
{ channel: 'Naver Blog', value: '리얼모델 연계 포스팅 부족', isCorrect: false },
|
|
||||||
{ channel: '연탐 카페', value: '후기 있으나 SNS 연동 없음', isCorrect: false },
|
|
||||||
],
|
|
||||||
impact: '리얼모델 콘텐츠가 YouTube에서 강점이나 Instagram·Blog·카페 연동 체계 없음',
|
|
||||||
recommendation: 'YouTube 리얼모델 → Instagram Reel → Blog 임베드 → 카페 후기 연동 파이프라인 구축',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: 'SEO 최적화 현황',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube 타이틀', value: 'SEO 메타데이터 최적화 미흡', isCorrect: false },
|
|
||||||
{ channel: 'YouTube 썸네일', value: '통일 시스템 없음', isCorrect: false },
|
|
||||||
{ channel: 'Naver Blog', value: '업로드 있으나 키워드 전략 미흡', isCorrect: false },
|
|
||||||
],
|
|
||||||
impact: '715개 영상 대비 구독자 8K — SEO·썸네일 최적화만으로 즉각 개선 가능',
|
|
||||||
recommendation: 'YouTube 715개 영상 SEO 메타데이터 일괄 최적화 + 리얼모델 썸네일 시스템 구축',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 2: Channel Strategies ───
|
|
||||||
channelStrategies: [
|
|
||||||
{
|
|
||||||
channelId: 'youtube', channelName: 'YouTube (티에스TV)', icon: 'youtube',
|
|
||||||
currentStatus: '티에스TV — 8K 구독자, 715 영상, 주 1~2회 업로드',
|
|
||||||
targetGoal: '20K 구독자 / 12개월, 주 3회 업로드 + SEO 전면 최적화',
|
|
||||||
contentTypes: ['리얼모델 Before/After 롱폼', 'Shorts (715 영상 재편집)', 'SEO 최적화 타이틀 시리즈'],
|
|
||||||
postingFrequency: '주 3회 (Shorts 2 + 롱폼 1)',
|
|
||||||
tone: '"지금, 예뻐져라!" — 리얼모델 에너지 + 전문의 신뢰',
|
|
||||||
formatGuidelines: [
|
|
||||||
'715개 영상 SEO 메타데이터 일괄 최적화 (P0)',
|
|
||||||
'썸네일: Dark Navy 배경 + Crimson 워드마크 + 리얼모델 Before/After 통일',
|
|
||||||
'타이틀 패턴: "강남 눈코가슴 리얼모델 ___"',
|
|
||||||
'Shorts: 715 영상에서 200개 추출 목표',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'instagram', channelName: 'Instagram', icon: 'instagram',
|
|
||||||
currentStatus: '@tsprs_official — 2,626 팔로워, Reels 60개 (확장 여지)',
|
|
||||||
targetGoal: '15K 팔로워 / 12개월, Reels 100개+ 달성',
|
|
||||||
contentTypes: ['Reels (YouTube Shorts 동시)', '리얼모델 Before/After Carousel', '연탐 카페 후기 카루셀'],
|
|
||||||
postingFrequency: '일 1회 + Stories 일 2개',
|
|
||||||
tone: '"지금, 예뻐져라!" — 에너지 있는 리얼모델 중심',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Reels: YouTube Shorts 동시 배포',
|
|
||||||
'하이라이트: 눈성형/코성형/가슴성형/리얼모델/이벤트 재구성',
|
|
||||||
'연탐 카페 후기 → Instagram Carousel로 재편집',
|
|
||||||
'해시태그: #티에스성형외과 #리얼모델 #지금예뻐져라 #강남눈코가슴',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'interest',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'facebook', channelName: 'Facebook', icon: 'facebook',
|
|
||||||
currentStatus: '@tsprs — 3,900 팔로워, 활성도 낮음',
|
|
||||||
targetGoal: 'Instagram 크로스포스팅 자동화 + Pixel 리타겟 세팅',
|
|
||||||
contentTypes: ['Instagram 자동 크로스포스팅', '리타겟 광고 소재'],
|
|
||||||
postingFrequency: '주 2-3회 (자동 연동)',
|
|
||||||
tone: '리얼모델 결과 중심 — 20~40대 여성 타겟',
|
|
||||||
formatGuidelines: [
|
|
||||||
'Instagram 콘텐츠 자동 연동',
|
|
||||||
'Pixel 광고: 눈·코·가슴 관심사 타겟',
|
|
||||||
'카카오톡 상담 버튼 전 페이지 플로팅',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'conversion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'naver_blog', channelName: 'Naver Blog', icon: 'globe',
|
|
||||||
currentStatus: '@tsprs — 업로드 있으나 빈도·키워드 전략 미흡',
|
|
||||||
targetGoal: '주 3회로 상향, 12개월 내 월 20,000 방문자',
|
|
||||||
contentTypes: ['리얼모델 SEO 포스트', 'YouTube 영상 임베드+설명', '눈·코·가슴 시술 가이드'],
|
|
||||||
postingFrequency: '주 3회',
|
|
||||||
tone: '"강남 눈코가슴 리얼모델", "티에스성형외과 후기" 키워드 중심',
|
|
||||||
formatGuidelines: [
|
|
||||||
'2,000자 이상 SEO 최적화',
|
|
||||||
'리얼모델 YouTube 영상 임베드 + 텍스트 설명',
|
|
||||||
'핵심 키워드: "강남 눈성형", "티에스성형외과", "리얼모델 성형"',
|
|
||||||
'연탐 카페 후기 → 블로그 변환 연동',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'consideration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'naver_cafe', channelName: '연탐 네이버 카페', icon: 'users',
|
|
||||||
currentStatus: '연탐 카페 운영 중 — SNS 연동 미흡',
|
|
||||||
targetGoal: '카페 후기 SNS 연동 파이프라인 구축',
|
|
||||||
contentTypes: ['카페 후기 → Instagram Carousel 변환', '시술별 Q&A 활성화'],
|
|
||||||
postingFrequency: '주 2회 (Q&A 답변 + 후기 공유)',
|
|
||||||
tone: '친밀하고 소통하는 — 커뮤니티 매니저 톤',
|
|
||||||
formatGuidelines: [
|
|
||||||
'카페 베스트 후기 → Instagram·Blog 재편집 파이프라인',
|
|
||||||
'시술별 Q&A 게시판 활성화 (눈/코/가슴)',
|
|
||||||
'카페 후기 작성 인센티브 제도 검토',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'loyalty',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'gangnamunni', channelName: '강남언니', icon: 'star',
|
|
||||||
currentStatus: '9.5점/10, 12,509 리뷰 — 응답 전략 미흡',
|
|
||||||
targetGoal: '리뷰 응답률 80%, 15,000 리뷰 / 12개월',
|
|
||||||
contentTypes: ['리뷰 응답', '시술 정보 최신화'],
|
|
||||||
postingFrequency: '리뷰 응답 일 단위',
|
|
||||||
tone: '진심 어린 의료진 답변',
|
|
||||||
formatGuidelines: [
|
|
||||||
'응답률 50%(3개월) → 80%(12개월)',
|
|
||||||
'12,509 리뷰 중 50개 선별 → SNS Carousel',
|
|
||||||
'부정 리뷰 24시간 내 응답',
|
|
||||||
],
|
|
||||||
priority: 'P0',
|
|
||||||
customerJourneyStage: 'loyalty',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
channelId: 'tiktok', channelName: 'TikTok (신규)', icon: 'video',
|
|
||||||
currentStatus: '계정 없음',
|
|
||||||
targetGoal: '10K 팔로워 / 12개월 — 20~30대 첫 수술 고민층',
|
|
||||||
contentTypes: ['YouTube Shorts 크로스포스팅', '리얼모델 Before/After 틱톡'],
|
|
||||||
postingFrequency: '주 5회 (Shorts 동시 배포)',
|
|
||||||
tone: '"지금, 예뻐져라!" — 트렌디, 에너지 있는',
|
|
||||||
formatGuidelines: [
|
|
||||||
'715 영상 Shorts 추출 → TikTok 동시',
|
|
||||||
'트렌딩 사운드 + 자막 필수',
|
|
||||||
'의료광고법 준수',
|
|
||||||
],
|
|
||||||
priority: 'P1',
|
|
||||||
customerJourneyStage: 'awareness',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 3: Content Strategy ───
|
|
||||||
contentStrategy: {
|
|
||||||
pillars: [
|
|
||||||
{
|
|
||||||
title: '리얼모델로 증명',
|
|
||||||
description: '"지금, 예뻐져라!" 슬로건의 핵심 — 실제 리얼모델 Before/After 결과 중심 콘텐츠',
|
|
||||||
relatedUSP: 'Real Model Verification System',
|
|
||||||
exampleTopics: ['리얼모델 눈성형 6개월 후 솔직 후기', '리얼모델 코성형 과정 브이로그', '가슴성형 리얼모델 — 보형물 선택부터 회복까지'],
|
|
||||||
color: '#E94560',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '눈·코·가슴 전문성',
|
|
||||||
description: '티에스의 3대 핵심 시술 — 각 시술별 심층 교육 콘텐츠',
|
|
||||||
relatedUSP: 'Eyes, Nose & Breast Expertise',
|
|
||||||
exampleTopics: ['눈성형 유형별 가이드', '코성형 재수술 예방 팁', '가슴 보형물 종류와 선택'],
|
|
||||||
color: '#1A1A2E',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '12,509 리뷰의 신뢰',
|
|
||||||
description: '강남언니 9.5점 12,509 리뷰와 연탐 카페 후기를 콘텐츠화',
|
|
||||||
relatedUSP: 'Verified Patient Reviews',
|
|
||||||
exampleTopics: ['강남언니 베스트 리뷰 카루셀', '연탐 카페 후기 TOP 10', '리얼모델 수술 후 6개월 추적'],
|
|
||||||
color: '#6B7280',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'SEO & 검색 유입',
|
|
||||||
description: '715개 영상 자산의 SEO 최적화와 블로그 검색 상위 전략',
|
|
||||||
relatedUSP: 'Search Engine Visibility',
|
|
||||||
exampleTopics: ['"강남 눈성형 추천" 검색 1위 전략', '티에스성형외과 블로그 키워드 맵', 'YouTube SEO 타이틀 패턴'],
|
|
||||||
color: '#F8F8F8',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
typeMatrix: [
|
|
||||||
{ format: 'YouTube Long-form (리얼모델)', channels: ['YouTube'], frequency: '월 4편', purpose: '리얼모델 케이스 — 결과 신뢰 구축' },
|
|
||||||
{ format: 'Shorts / Reels', channels: ['YouTube', 'Instagram', 'TikTok'], frequency: '주 5개', purpose: '715 영상 자산 재활용, 20~40대 도달' },
|
|
||||||
{ format: 'Carousel (리뷰+후기)', channels: ['Instagram'], frequency: '주 2회', purpose: '12,509 강남언니 + 연탐 카페 사회적 증거화' },
|
|
||||||
{ format: 'Blog Post (SEO)', channels: ['Naver Blog'], frequency: '주 3회', purpose: '"강남 눈코가슴" 검색 상위 확보' },
|
|
||||||
{ format: 'Stories', channels: ['Instagram'], frequency: '일 2개', purpose: '리얼모델 일상·시술 비하인드' },
|
|
||||||
{ format: 'Ad Creative', channels: ['Facebook', 'Instagram'], frequency: '월 4개', purpose: '20~40대 여성 타겟 리타겟' },
|
|
||||||
],
|
|
||||||
workflow: [
|
|
||||||
{ step: 1, name: 'SEO 일괄 최적화', description: '715개 YouTube 영상 타이틀·설명·태그 SEO 재작성', owner: 'SEO 담당 + AI', duration: '2주 (1회성)' },
|
|
||||||
{ step: 2, name: '리얼모델 기획', description: '신규 리얼모델 모집 + 케이스 선정 (눈/코/가슴 각 1건)', owner: '마케팅 매니저', duration: '2주' },
|
|
||||||
{ step: 3, name: '콘텐츠 제작', description: '리얼모델 촬영 + Shorts 추출 + 카루셀 제작', owner: '콘텐츠 팀', duration: '3-5일' },
|
|
||||||
{ step: 4, name: '의료 검수', description: '의료진 정확성 + 광고법 체크', owner: '의료진', duration: '1일' },
|
|
||||||
{ step: 5, name: '비주얼 마감', description: 'Dark Navy+Crimson 썸네일 통일, 자막', owner: '디자인', duration: '1일' },
|
|
||||||
{ step: 6, name: '크로스채널 배포', description: 'YouTube + Instagram + TikTok + Blog 동시 + UTM', owner: '마케팅 매니저', duration: '당일' },
|
|
||||||
],
|
|
||||||
repurposingSource: '리얼모델 눈성형 브이로그 롱폼 (10분)',
|
|
||||||
repurposingOutputs: [
|
|
||||||
{ format: 'YouTube Long-form', channel: 'YouTube', description: '리얼모델 풀 브이로그 (Dark Navy 썸네일)' },
|
|
||||||
{ format: 'Shorts 3-5개', channel: 'YouTube / Instagram / TikTok', description: '수술 전·중·후 핵심 구간 클립 3채널 동시' },
|
|
||||||
{ format: 'Carousel', channel: 'Instagram', description: '리얼모델 Before/After + 후기 카드뉴스' },
|
|
||||||
{ format: 'Blog Post', channel: 'Naver Blog', description: '리얼모델 브이로그 → SEO 리뷰 포스트 (영상 임베드)' },
|
|
||||||
{ format: '연탐 카페 공유', channel: 'Naver Cafe', description: '카페 시술 후기 게시판 공유' },
|
|
||||||
{ format: 'Ad Creative', channel: 'Facebook / Instagram', description: '리얼모델 하이라이트 + "지금, 예뻐져라!" CTA' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 4: Content Calendar ───
|
|
||||||
calendar: {
|
|
||||||
weeks: [
|
|
||||||
{
|
|
||||||
weekNumber: 1, label: 'Week 1: SEO 최적화 착수 & 리얼모델 시동',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '리얼모델 눈성형 브이로그 #1 — "지금, 예뻐져라!" 티에스TV' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: '프로필 리뉴얼 + 리얼모델 Reel #1 (눈성형 전후)' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 눈성형 Q&A — 쌍꺼풀 vs 비절개' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남 눈성형 가이드 — 티에스 리얼모델이 증명합니다' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 강남언니 12,509 리뷰 베스트 5' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 보형물 Q&A' },
|
|
||||||
{ dayOfWeek: 5, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '티에스성형외과 후기 — 강남언니 9.5점의 비밀' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 2, label: 'Week 2: 코성형 리얼모델 주간',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 리얼모델 코성형 — 상담부터 회복까지' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 코성형 리얼모델 Before/After' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 재수술 피하는 법' },
|
|
||||||
{ dayOfWeek: 2, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '코성형 종류와 선택 — 티에스 리얼모델 케이스' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 연탐 카페 코성형 베스트 후기' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 코성형 6개월 후 — 리얼 후기' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 코성형 리얼모델 상담 CTA' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 3, label: 'Week 3: 가슴성형 리얼모델 주간',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 리얼모델 가슴성형 — 보형물 선택 가이드' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 가슴성형 리얼모델 Before/After' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '가슴성형 보형물 종류 완전 가이드 — 티에스 리얼모델' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 가슴성형 회복 기간 현실' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 가슴·눈·코 동시 리얼모델 비교' },
|
|
||||||
{ dayOfWeek: 4, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 지금, 예뻐져라! — 이달의 리얼모델' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '가슴성형 연탐 카페 후기 모음 — 티에스성형외과' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
weekNumber: 4, label: 'Week 4: 전환 & 카카오 상담 강화',
|
|
||||||
entries: [
|
|
||||||
{ dayOfWeek: 0, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: '롱폼: 티에스성형외과 — 리얼모델로 증명하는 16년' },
|
|
||||||
{ dayOfWeek: 0, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '첫 성형 상담 준비 — 티에스성형외과 신사역 가이드' },
|
|
||||||
{ dayOfWeek: 1, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Reel: 신사역 티에스성형외과 시설 투어' },
|
|
||||||
{ dayOfWeek: 2, channel: 'YouTube', channelIcon: 'youtube', contentType: 'video', title: 'Shorts: 이달의 리얼모델 TOP 3' },
|
|
||||||
{ dayOfWeek: 3, channel: 'Instagram', channelIcon: 'instagram', contentType: 'social', title: 'Carousel: 카카오톡 상담 예약 3단계' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Facebook', channelIcon: 'facebook', contentType: 'ad', title: '광고: 월말 CTA — "지금, 예뻐져라!"' },
|
|
||||||
{ dayOfWeek: 4, channel: 'Naver Blog', channelIcon: 'globe', contentType: 'blog', title: '강남언니 12,509 리뷰 — 티에스성형외과 9.5점의 증거' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
monthlySummary: [
|
|
||||||
{ type: 'video', label: '영상 (롱폼+Shorts)', count: 14, color: '#1A1A2E' },
|
|
||||||
{ type: 'blog', label: '블로그', count: 8, color: '#E94560' },
|
|
||||||
{ type: 'social', label: 'Instagram', count: 8, color: '#6B7280' },
|
|
||||||
{ type: 'ad', label: '광고', count: 2, color: '#F8F8F8' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 5: Asset Collection ───
|
|
||||||
assetCollection: {
|
|
||||||
assets: [
|
|
||||||
{ id: 'a1', source: 'youtube', sourceLabel: '티에스TV', type: 'video', title: '715개 영상 아카이브', description: '2018년 이래 눈·코·가슴 716개 영상 — SEO 최적화 + Shorts 추출 우선', repurposingSuggestions: ['SEO 일괄 최적화 (P0)', 'Shorts 200개 추출', 'Instagram Reels', 'TikTok 동시', 'Blog 임베드'], status: 'collected' },
|
|
||||||
{ id: 'a2', source: 'social', sourceLabel: '강남언니', type: 'text', title: '강남언니 리뷰 12,509건', description: '9.5점/10 — 눈·코·가슴 케이스 중심, 티에스의 최대 사회적 증거', repurposingSuggestions: ['50개 선별 → Carousel 시리즈', 'Instagram Stories', '광고 소셜프루프', 'Blog 후기'], status: 'pending' },
|
|
||||||
{ id: 'a3', source: 'blog', sourceLabel: '연탐 카페', type: 'text', title: '연탐 네이버 카페 후기', description: '카페 시술별 후기 자산 — SNS 연동 미흡', repurposingSuggestions: ['Carousel 재편집', 'Blog 변환', 'Instagram Stories'], status: 'pending' },
|
|
||||||
{ id: 'a4', source: 'social', sourceLabel: 'Instagram', type: 'photo', title: '@tsprs_official 게시물 1,500개', description: '2,626 팔로워, Reels 60개 누적', repurposingSuggestions: ['고성과 Reel 재배포', 'Carousel 재편집', 'TikTok 크로스'], status: 'collected' },
|
|
||||||
{ id: 'a5', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '신사역 본원 시설 사진', description: '본원 내외부 고화질', repurposingSuggestions: ['Instagram 시설 Reel', 'YouTube B-roll', '블로그 위치 안내'], status: 'collected' },
|
|
||||||
{ id: 'a6', source: 'homepage', sourceLabel: '홈페이지', type: 'text', title: '눈·코·가슴·리프팅 시술 설명', description: '시술별 상세 텍스트', repurposingSuggestions: ['블로그 SEO 소스', 'Carousel 텍스트', '광고 카피'], status: 'collected' },
|
|
||||||
{ id: 'a7', source: 'homepage', sourceLabel: '홈페이지', type: 'photo', title: '리얼모델 Before/After 갤러리', description: '눈·코·가슴 리얼모델 전후 — 동의서 보유', repurposingSuggestions: ['Instagram B/A 시리즈', 'YouTube 롱폼 소스', '광고 소재'], status: 'collected' },
|
|
||||||
{ id: 'a8', source: 'homepage', sourceLabel: '홈페이지', type: 'video', title: '브랜드 영상 "지금, 예뻐져라!" (제작 필요)', description: '리얼모델 시스템 소개 브랜드 영상 신규 제작', repurposingSuggestions: ['YouTube 채널 트레일러', 'Instagram 브랜드 Reel', '웹사이트 히어로'], status: 'needs_creation' },
|
|
||||||
],
|
|
||||||
youtubeRepurpose: [
|
|
||||||
{ title: '눈성형 리얼모델 브이로그 #1', views: 0, type: 'Long', repurposeAs: ['Shorts 5개 추출', 'Instagram Reel', '카페 공유', 'Blog 임베드'] },
|
|
||||||
{ title: '코성형 Before/After 케이스', views: 0, type: 'Long', repurposeAs: ['Shorts 3개', 'Carousel', 'Blog'] },
|
|
||||||
{ title: '가슴성형 보형물 Q&A', views: 0, type: 'Long', repurposeAs: ['Shorts 추출', 'TikTok 동시', 'Blog'] },
|
|
||||||
{ title: '리얼모델 이달의 케이스', views: 0, type: 'Short', repurposeAs: ['Instagram Reel', 'TikTok', '카페'] },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
// ─── Section 6: Repurposing Proposals ───
|
|
||||||
repurposingProposals: [
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '715 영상 SEO 최적화 + Shorts 200개 추출', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'high',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Shorts 200개 (전체)', channel: 'YouTube / Instagram / TikTok', description: '715 영상 → 리얼모델·시술별 Shorts 추출, 3채널 동시' },
|
|
||||||
{ format: 'SEO 타이틀 재작성', channel: 'YouTube', description: '"강남 눈코가슴 리얼모델" 패턴 715개 일괄 적용' },
|
|
||||||
{ format: 'Blog 임베드 포스트 50개', channel: 'Naver Blog', description: '영상 + 텍스트 가이드 구조 블로그 변환' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '강남언니 12,509 리뷰 + 연탐 카페 후기 콘텐츠화', views: 12509, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'high',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Carousel 20개', channel: 'Instagram', description: '시술별 리얼 후기 카드뉴스 — 익명화 처리' },
|
|
||||||
{ format: '광고 소재', channel: 'Facebook / Instagram', description: '"9.5점 리얼모델 검증" 소셜프루프 광고' },
|
|
||||||
{ format: 'Blog 후기 포스트', channel: 'Naver Blog', description: '케이스별 상세 후기 변환' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sourceVideo: { title: '리얼모델 가슴성형 브이로그 (신규 제작)', views: 0, type: 'Long', repurposeAs: [] },
|
|
||||||
estimatedEffort: 'medium',
|
|
||||||
priority: 'medium',
|
|
||||||
outputs: [
|
|
||||||
{ format: 'Shorts 5개', channel: 'YouTube / TikTok', description: '수술 전·중·후 핵심 구간 — "지금, 예뻐져라!" 오프닝' },
|
|
||||||
{ format: 'Carousel', channel: 'Instagram', description: '가슴성형 리얼모델 Before/After 카드뉴스' },
|
|
||||||
{ format: 'Blog Post', channel: 'Naver Blog', description: '리얼모델 가슴성형 SEO 후기 포스트' },
|
|
||||||
{ format: 'Ad Creative', channel: 'Facebook / Instagram', description: '리얼모델 결과 + "지금, 예뻐져라!" CTA 광고' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
// ─── Section 7: Workflow Tracker ───
|
|
||||||
workflow: {
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
id: 'wf-001',
|
|
||||||
title: '리얼모델 눈성형 Shorts — "지금, 예뻐져라!"',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'YouTube Shorts',
|
|
||||||
channelIcon: 'youtube',
|
|
||||||
stage: 'ai-draft',
|
|
||||||
videoDraft: {
|
|
||||||
script: `[인트로 — 0~3초]\n"지금, 예뻐져라!"\n(Before → After 전환)\n\n[본문 — 3~25초]\n"티에스성형외과 리얼모델 눈성형."\n"수술 전과 후, 6개월의 변화를 직접 보여드립니다."\n"강남언니 9.5점 · 12,509 리뷰가 증명합니다."\n\n[CTA — 25~30초]\n"지금 상담 예약 — 카카오톡 @tsprs"`,
|
|
||||||
shootingGuide: [
|
|
||||||
'715 영상 중 리얼모델 눈성형 베스트 컷 추출',
|
|
||||||
'Dark Navy+Crimson 워터마크 하단 고정',
|
|
||||||
'한글 자막 필수',
|
|
||||||
'리얼모델 동의서 확인 + 비식별화 옵션',
|
|
||||||
],
|
|
||||||
duration: '30초',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-002',
|
|
||||||
title: '강남언니 리얼 후기 5선 Carousel',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Instagram',
|
|
||||||
channelIcon: 'instagram',
|
|
||||||
stage: 'review',
|
|
||||||
userNotes: '연탐 카페 후기도 포함해서 만들어주세요',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'cardnews',
|
|
||||||
headline: '지금, 예뻐져라! — 강남언니 12,509 리뷰 중 진심 5개',
|
|
||||||
copy: [
|
|
||||||
'[카드 1] "리얼모델 보고 결정했는데, 딱 그대로 됐어요" — 눈성형',
|
|
||||||
'[카드 2] "티에스가 결과로 먼저 보여줘서 믿었습니다" — 코성형',
|
|
||||||
'[카드 3] "연탐 카페에서 후기 보고 결정 — 후회 없습니다" — 가슴성형',
|
|
||||||
'[카드 4] "카카오 상담부터 수술까지 빠르고 친절했어요"',
|
|
||||||
'[카드 5] 강남언니 9.5점 · 티에스성형외과 — 지금, 예뻐져라!',
|
|
||||||
],
|
|
||||||
layoutHint: '5장 세로형, Dark Navy+Crimson, 마지막 카드에 카카오 상담 CTA',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-003',
|
|
||||||
title: '강남 눈성형 가이드 — SEO 블로그 (리얼모델)',
|
|
||||||
contentType: 'image-text',
|
|
||||||
channel: 'Naver Blog',
|
|
||||||
channelIcon: 'globe',
|
|
||||||
stage: 'planning',
|
|
||||||
imageTextDraft: {
|
|
||||||
type: 'blog',
|
|
||||||
headline: '강남 눈성형 추천 — 티에스성형외과 리얼모델이 직접 증명합니다',
|
|
||||||
copy: [
|
|
||||||
'"지금, 예뻐져라!" — 이 슬로건은 리얼모델의 실제 결과에서 나왔습니다.',
|
|
||||||
'티에스성형외과는 2010년 신사역에서 시작해 16년간 눈·코·가슴에 집중했습니다.',
|
|
||||||
'강남언니 9.5점 / 12,509 리뷰, 연탐 네이버 카페 — 환자가 만든 신뢰입니다.',
|
|
||||||
'티에스TV 715개 영상에서 실제 수술 과정을 직접 확인하세요.',
|
|
||||||
],
|
|
||||||
layoutHint: '1200px 썸네일 + 2,000자, 키워드: 강남 눈성형, 티에스성형외과, 리얼모델 성형',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'wf-004',
|
|
||||||
title: '리얼모델 코성형 롱폼 — 티에스TV',
|
|
||||||
contentType: 'video',
|
|
||||||
channel: 'YouTube',
|
|
||||||
channelIcon: 'youtube',
|
|
||||||
stage: 'approved',
|
|
||||||
scheduledDate: '2026-04-21',
|
|
||||||
videoDraft: {
|
|
||||||
script: `[오프닝]\n"지금, 예뻐져라! 티에스성형외과입니다."\n"오늘은 리얼모델 코성형 — 상담부터 6개월 후까지 공개합니다."\n\n[Phase 1: 상담]\n"어떤 코를 원하는지 먼저 들었습니다."\n\n[Phase 2: 수술 과정]\n(그래픽 + B-roll 삽입)\n\n[Phase 3: 회복]\n"1주 차, 1개월 차, 6개월 차 — 변화를 직접 보여드립니다."\n\n[클로징]\n"강남언니 12,509 리뷰 · 티에스성형외과 — 지금, 예뻐져라!"`,
|
|
||||||
shootingGuide: [
|
|
||||||
'리얼모델 동의 확인 + 촬영 일정 조율',
|
|
||||||
'Dark Navy+Crimson 인트로/아웃트로 6초',
|
|
||||||
'한글 자막 필수',
|
|
||||||
'6개월 추적 촬영 일정 사전 확정',
|
|
||||||
],
|
|
||||||
duration: '10분',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,439 +0,0 @@
|
||||||
import type { MarketingPlan } from '../types/plan';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 원진성형외과 — 데모 마케팅 플랜
|
|
||||||
*
|
|
||||||
* 리포트 근거 (`mockReport_wonjin.ts` 2026-04-14 실측):
|
|
||||||
* - YouTube @wjwonjin: 14.1K 구독자, 350 영상, 주 3~5회 (Shorts 활발)
|
|
||||||
* - Instagram: @wonjin_official 23.4K (KR), @wonjin_ps 18K (KR 서브), @wj_cosmetic (글로벌)
|
|
||||||
* - Facebook @KwonjinPS: 19K (EN, 국제 환자)
|
|
||||||
* - 네이버 블로그 @popokpop: 업로드 저조
|
|
||||||
* - 강남언니: 9.3점/11,846 리뷰 (강남 상위 5%)
|
|
||||||
* - 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분',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
import type { MarketingReport } from '../types/report';
|
import type { MarketingReport } from '../types/report';
|
||||||
|
|
||||||
// Last verified: 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 = {
|
export const mockReport: MarketingReport = {
|
||||||
id: 'view-clinic',
|
id: 'view-clinic',
|
||||||
createdAt: '2026-04-28',
|
createdAt: '2026-04-13',
|
||||||
targetUrl: 'https://www.viewclinic.com',
|
targetUrl: 'https://www.viewclinic.com',
|
||||||
overallScore: 62,
|
overallScore: 62,
|
||||||
|
|
||||||
|
|
@ -22,7 +19,7 @@ export const mockReport: MarketingReport = {
|
||||||
reviewCount: 1805,
|
reviewCount: 1805,
|
||||||
},
|
},
|
||||||
overallRating: 9.5,
|
overallRating: 9.5,
|
||||||
totalReviews: 19177,
|
totalReviews: 19030,
|
||||||
priceRange: { min: '97,900', max: '13,200,000+', currency: '₩' },
|
priceRange: { min: '97,900', max: '13,200,000+', currency: '₩' },
|
||||||
certifications: [
|
certifications: [
|
||||||
'수술실 CCTV',
|
'수술실 CCTV',
|
||||||
|
|
@ -64,11 +61,11 @@ export const mockReport: MarketingReport = {
|
||||||
},
|
},
|
||||||
|
|
||||||
channelScores: [
|
channelScores: [
|
||||||
{ channel: 'YouTube', icon: 'youtube', score: 68, maxScore: 100, status: 'warning', headline: '104K 구독자, 주 2-3회 업로드, 누적 1,035만 조회 (2주 +1.9%)' },
|
{ channel: 'YouTube', icon: 'youtube', score: 68, maxScore: 100, status: 'warning', headline: '104K 구독자, 주 2-3회 업로드, 최근 조회수 하락' },
|
||||||
{ channel: 'Instagram KR', icon: 'instagram', score: 32, maxScore: 100, status: 'critical', headline: '14,047 팔로워, Reels 0개, 모델 프사' },
|
{ channel: 'Instagram KR', icon: 'instagram', score: 32, maxScore: 100, status: 'critical', headline: '14K 팔로워, Reels 0개, 모델 프사' },
|
||||||
{ channel: 'Instagram EN', icon: 'instagram', score: 62, maxScore: 100, status: 'warning', headline: '70,537 팔로워, Reels 활발, 외국인 환자 중심' },
|
{ channel: 'Instagram EN', icon: 'instagram', score: 62, maxScore: 100, status: 'warning', headline: '70K 팔로워, Reels 활발, 외국인 환자 중심' },
|
||||||
{ channel: 'Facebook', icon: 'facebook', score: 38, maxScore: 100, status: 'critical', headline: 'KR 254명 방치, EN 88K 활발, 3개 페이지 분산' },
|
{ channel: 'Facebook', icon: 'facebook', score: 38, maxScore: 100, status: 'critical', headline: 'KR 253명 방치, EN 88K 활발, 3개 페이지 분산' },
|
||||||
{ channel: '강남언니', icon: 'star', score: 96, maxScore: 100, status: 'excellent', headline: '9.5점/10, 19,177 리뷰, 고객평가우수병원' },
|
{ channel: '강남언니', icon: 'star', score: 96, maxScore: 100, status: 'excellent', headline: '9.5점/10, 19,030 리뷰, 고객평가우수병원' },
|
||||||
{ channel: 'Website', icon: 'globe', score: 65, maxScore: 100, status: 'warning', headline: 'Footer SNS 5개 연결, 트래킹 6개, SEO 기본 설정 양호' },
|
{ channel: 'Website', icon: 'globe', score: 65, maxScore: 100, status: 'warning', headline: 'Footer SNS 5개 연결, 트래킹 6개, SEO 기본 설정 양호' },
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
@ -76,13 +73,13 @@ export const mockReport: MarketingReport = {
|
||||||
channelName: '뷰성형외과 VIEW Plastic Surgery',
|
channelName: '뷰성형외과 VIEW Plastic Surgery',
|
||||||
handle: '@ViewclinicKR',
|
handle: '@ViewclinicKR',
|
||||||
subscribers: 104000,
|
subscribers: 104000,
|
||||||
totalVideos: 1100,
|
totalVideos: 1064,
|
||||||
totalViews: 10348571,
|
totalViews: 9952722,
|
||||||
weeklyViewGrowth: { absolute: 197925, percentage: 1.91 },
|
weeklyViewGrowth: { absolute: 67097, percentage: 4.09 },
|
||||||
estimatedMonthlyRevenue: { min: 499, max: 1000 },
|
estimatedMonthlyRevenue: { min: 499, max: 1000 },
|
||||||
avgVideoLength: '4.4분',
|
avgVideoLength: '4.4분',
|
||||||
uploadFrequency: '주 2~3회',
|
uploadFrequency: '주 2~3회',
|
||||||
channelCreatedDate: '2015-06-28',
|
channelCreatedDate: '2015-06-29',
|
||||||
subscriberRank: '#570K',
|
subscriberRank: '#570K',
|
||||||
channelDescription: '💜뷰성형외과💜\nVIEW가 예술이다! ✨\n19층 규모의 안전스마트 빌딩\n환자의 관점에서 생각하고\n환자의 입장에서 아름다움의 가치를 찾습니다.',
|
channelDescription: '💜뷰성형외과💜\nVIEW가 예술이다! ✨\n19층 규모의 안전스마트 빌딩\n환자의 관점에서 생각하고\n환자의 입장에서 아름다움의 가치를 찾습니다.',
|
||||||
linkedUrls: [
|
linkedUrls: [
|
||||||
|
|
@ -130,9 +127,9 @@ export const mockReport: MarketingReport = {
|
||||||
handle: '@viewplastic',
|
handle: '@viewplastic',
|
||||||
language: 'KR',
|
language: 'KR',
|
||||||
label: '국내 (한국어)',
|
label: '국내 (한국어)',
|
||||||
posts: 1429,
|
posts: 1420,
|
||||||
followers: 14047,
|
followers: 14000,
|
||||||
following: 3774,
|
following: 3822,
|
||||||
category: 'Health/beauty',
|
category: 'Health/beauty',
|
||||||
profileLink: 'litt.ly/viewplasticsurgery',
|
profileLink: 'litt.ly/viewplasticsurgery',
|
||||||
highlights: ['ABOUT VIEW', '수술정보', '모델 모집', 'VIEW EVENT', '진료안내'],
|
highlights: ['ABOUT VIEW', '수술정보', '모델 모집', 'VIEW EVENT', '진료안내'],
|
||||||
|
|
@ -145,9 +142,9 @@ export const mockReport: MarketingReport = {
|
||||||
handle: '@view_plastic_surgery',
|
handle: '@view_plastic_surgery',
|
||||||
language: 'EN',
|
language: 'EN',
|
||||||
label: '국제 (영어)',
|
label: '국제 (영어)',
|
||||||
posts: 2578,
|
posts: 2553,
|
||||||
followers: 70537,
|
followers: 70000,
|
||||||
following: 2849,
|
following: 2840,
|
||||||
category: 'Health/beauty',
|
category: 'Health/beauty',
|
||||||
profileLink: 'litt.ly/viewplasticsurgeryenglish',
|
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'],
|
highlights: ['Katerina', 'Mathilde', 'Kyle & Spizee', 'Chef Rush', 'Thet San', 'Yuri', 'Liposuction', 'Why VIEW?', 'Diana', 'Anti Aging', 'Julie', 'Male', 'Stem Cell', 'Dermatology'],
|
||||||
|
|
@ -174,7 +171,7 @@ export const mockReport: MarketingReport = {
|
||||||
pageName: '뷰성형외과',
|
pageName: '뷰성형외과',
|
||||||
language: 'KR',
|
language: 'KR',
|
||||||
label: '국내 (한국어)',
|
label: '국내 (한국어)',
|
||||||
followers: 254,
|
followers: 253,
|
||||||
following: 0,
|
following: 0,
|
||||||
category: '성형외과 의사',
|
category: '성형외과 의사',
|
||||||
bio: '예쁨이 일상이 되는 순간! #뷰성형외과',
|
bio: '예쁨이 일상이 되는 순간! #뷰성형외과',
|
||||||
|
|
@ -194,7 +191,7 @@ export const mockReport: MarketingReport = {
|
||||||
pageName: 'View Plastic Surgery',
|
pageName: 'View Plastic Surgery',
|
||||||
language: 'EN',
|
language: 'EN',
|
||||||
label: '국제 (영어)',
|
label: '국제 (영어)',
|
||||||
followers: 88333,
|
followers: 88000,
|
||||||
following: 11,
|
following: 11,
|
||||||
category: '건강/뷰티',
|
category: '건강/뷰티',
|
||||||
bio: 'Official Account by VIEW Partners',
|
bio: 'Official Account by VIEW Partners',
|
||||||
|
|
@ -286,10 +283,10 @@ export const mockReport: MarketingReport = {
|
||||||
|
|
||||||
otherChannels: [
|
otherChannels: [
|
||||||
{ name: '카카오톡', status: 'active', details: '플러스친구 @뷰성형외과의원 — 상담 전용 채널', url: 'https://pf.kakao.com/_xbtVxjl' },
|
{ 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: '공식 블로그 활성 — 총 550개 게시글, 월 2~3회 포스팅, 최근 2026.4.8 업로드', 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: '네이버 플레이스', status: 'active', details: '별점 4.41/5, 방문자리뷰 777개, 블로그리뷰 1,480개, 성형외과 전문의 14명', url: 'https://m.place.naver.com/hospital/11709005' },
|
||||||
{ name: 'TikTok', status: 'not_found', details: '계정 없음 또는 비활성' },
|
{ 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: '9.5점/10, 19,030 리뷰, 25 의료진, 고객평가우수병원', url: 'https://www.gangnamunni.com/hospitals/189' },
|
||||||
{ name: '네이버 카페', status: 'active', details: '"뷰성형외과 성형의 모든것" — 회원 5,984명, 비공개 카페, 시술별 Q&A/전후비교/수술후기 20개 게시판 운영', url: 'https://cafe.naver.com/bluectcom2' },
|
{ 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: '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' },
|
{ name: 'Facebook TH', status: 'inactive', details: '태국 파트너 페이지 14K 팔로워, 2024.7월 이후 방치', url: 'https://www.facebook.com/viewplasticsurgery' },
|
||||||
|
|
@ -399,8 +396,8 @@ export const mockReport: MarketingReport = {
|
||||||
],
|
],
|
||||||
newChannelProposals: [
|
newChannelProposals: [
|
||||||
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층 도달, YouTube Shorts 동시 배포' },
|
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층 도달, YouTube Shorts 동시 배포' },
|
||||||
{ channel: '네이버 블로그 강화', priority: 'P0', rationale: '현재 551개 게시글, 월 2~3회 → 주 2회로 빈도 상향, SEO 핵심' },
|
{ channel: '네이버 블로그 강화', priority: 'P0', rationale: '현재 550개 게시글, 월 2~3회 → 주 2회로 빈도 상향, SEO 핵심' },
|
||||||
{ channel: '네이버 플레이스 최적화', priority: 'P0', rationale: '4.41점/776리뷰 — 리뷰 응답률/사진 최적화 필요' },
|
{ channel: '네이버 플레이스 최적화', priority: 'P0', rationale: '4.41점/777리뷰 — 리뷰 응답률/사진 최적화 필요' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,384 +0,0 @@
|
||||||
import type { MarketingReport } from '../types/report';
|
|
||||||
import { mockReport } from './mockReport';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 바노바기성형외과의원 — 데모 리포트
|
|
||||||
*
|
|
||||||
* 실측 (2026-04-14):
|
|
||||||
* - 강남언니: 9.2/10, 6,853 리뷰, 의료진 4명, 2000년 설립 (https://www.gangnamunni.com/hospitals/23)
|
|
||||||
* - YouTube @banobagips (UC2lzYQ5kXBK0gkVDe5StZzQ): 구독자 13K, 영상 925개
|
|
||||||
* - Naver Blog @banobagips: 마지막 포스트 2023-04-21 (사실상 방치)
|
|
||||||
* - 주소: 서울 강남구 논현로 517
|
|
||||||
*
|
|
||||||
* Instagram @banobagi_ps · Facebook @BanobagiPlasticSurgery 는 Firecrawl 차단으로
|
|
||||||
* 추정치 반영 (캡션에 명시). 다음 세션에서 Chrome MCP 로 실측 교체 예정.
|
|
||||||
*/
|
|
||||||
export const mockReportBanobagi: MarketingReport = {
|
|
||||||
...mockReport,
|
|
||||||
id: 'banobagi',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.banobagi.com',
|
|
||||||
overallScore: 58,
|
|
||||||
|
|
||||||
clinicSnapshot: {
|
|
||||||
...mockReport.clinicSnapshot,
|
|
||||||
name: '바노바기성형외과의원',
|
|
||||||
nameEn: 'Banobagi Plastic Surgery Clinic',
|
|
||||||
established: '2000',
|
|
||||||
yearsInBusiness: 26,
|
|
||||||
staffCount: 4,
|
|
||||||
leadDoctor: {
|
|
||||||
name: '반재중',
|
|
||||||
credentials: '바노바기성형외과 대표원장',
|
|
||||||
rating: 9.2,
|
|
||||||
reviewCount: 6853,
|
|
||||||
},
|
|
||||||
overallRating: 9.2,
|
|
||||||
totalReviews: 6853,
|
|
||||||
priceRange: { min: '150,000', max: '12,000,000+', currency: '₩' },
|
|
||||||
certifications: [
|
|
||||||
'마취과 전문의 상주',
|
|
||||||
'여성 의사 진료',
|
|
||||||
'분야별 공동 진료',
|
|
||||||
'시술 후 관리',
|
|
||||||
'의료진 실명 공개',
|
|
||||||
'본관 6층 + 별관 5층 규모',
|
|
||||||
],
|
|
||||||
mediaAppearances: ['강남언니 6,853 리뷰', '안면윤곽 전문센터'],
|
|
||||||
medicalTourism: ['외국인 전용 서비스', '영문/중문 상담 지원'],
|
|
||||||
location: '서울 강남구 논현로 517 (역삼동) 바노바기',
|
|
||||||
nearestStation: '2호선 역삼역 · 강남역',
|
|
||||||
phone: '02-1588-6508',
|
|
||||||
domain: 'banobagi.com',
|
|
||||||
source: 'registry' as const,
|
|
||||||
registryData: {
|
|
||||||
district: '강남',
|
|
||||||
branches: '본점 1개 (본관+별관)',
|
|
||||||
brandGroup: '종합 성형외과',
|
|
||||||
naverPlaceUrl: 'https://m.place.naver.com/hospital/11655270',
|
|
||||||
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/23',
|
|
||||||
googleMapsUrl: 'https://maps.google.com/?q=바노바기성형외과',
|
|
||||||
},
|
|
||||||
logoImages: {
|
|
||||||
circle: '/assets/clients/banobagi/logo-circle.png',
|
|
||||||
horizontal: '/assets/clients/banobagi/logo-horizontal.png',
|
|
||||||
korean: '/assets/clients/banobagi/logo-korean.png',
|
|
||||||
},
|
|
||||||
brandColors: {
|
|
||||||
primary: '#1A1A1A',
|
|
||||||
accent: '#C8A96A',
|
|
||||||
text: '#1A1A1A',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
channelScores: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', score: 45, maxScore: 100, status: 'critical', headline: '구독자 13K, 영상 925개 누적됐으나 최근 조회수 저조' },
|
|
||||||
{ channel: 'Instagram', icon: 'instagram', score: 55, maxScore: 100, status: 'warning', headline: '@banobagi_ps — 4,183 팔로워, 게시물 꾸준' },
|
|
||||||
{ channel: 'Facebook', icon: 'facebook', score: 35, maxScore: 100, status: 'critical', headline: '@BanobagiPlasticSurgery — 16,000 팔로워, KR 활성도 낮음' },
|
|
||||||
{ channel: '강남언니', icon: 'star', score: 88, maxScore: 100, status: 'excellent', headline: '9.2점/10, 6,853 리뷰, 강남 상위권 — 리뷰 반응 전략 필요' },
|
|
||||||
{ channel: 'Website', icon: 'globe', score: 60, maxScore: 100, status: 'warning', headline: 'banobagi.com 운영 양호, Footer SNS 연결 존재 — 트래킹 고도화 필요' },
|
|
||||||
{ channel: '네이버 블로그', icon: 'globe', score: 25, maxScore: 100, status: 'critical', headline: '마지막 포스트 2023-04-21 — 2년 이상 방치' },
|
|
||||||
],
|
|
||||||
|
|
||||||
youtubeAudit: {
|
|
||||||
...mockReport.youtubeAudit,
|
|
||||||
channelName: 'BANOBAGI PLASTIC SURGERY',
|
|
||||||
handle: '@banobagips',
|
|
||||||
subscribers: 13000,
|
|
||||||
totalVideos: 925,
|
|
||||||
totalViews: 4200000,
|
|
||||||
weeklyViewGrowth: { absolute: 1200, percentage: 0.3 },
|
|
||||||
estimatedMonthlyRevenue: { min: 50, max: 180 },
|
|
||||||
avgVideoLength: '3.2분',
|
|
||||||
uploadFrequency: '비정기 (최근 6개월 저조)',
|
|
||||||
channelCreatedDate: '2013-08-15',
|
|
||||||
subscriberRank: '',
|
|
||||||
channelDescription: 'Protect and nurture your true beauty. Banobagi Plastic Surgery — Board Certified Plastic Surgeon, 517 Nonhyeon-ro, Gangnam-gu, Seoul.',
|
|
||||||
linkedUrls: [
|
|
||||||
{ label: '바노바기 홈페이지', url: 'banobagi.com' },
|
|
||||||
],
|
|
||||||
playlists: [
|
|
||||||
'안면윤곽',
|
|
||||||
'눈성형',
|
|
||||||
'코성형',
|
|
||||||
'가슴성형',
|
|
||||||
'지방체형',
|
|
||||||
'리프팅/동안성형',
|
|
||||||
],
|
|
||||||
topVideos: [],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: '영상 대비 구독자 전환율 낮음', detail: '925개 영상 누적됐으나 구독자 13K — 영상당 구독자 전환 매우 저조', severity: 'critical', evidenceIds: ['yt-channel'] },
|
|
||||||
{ category: '업로드 빈도 저하', detail: '최근 6개월 업로드 빈도 급감 — 알고리즘 노출 감소', severity: 'critical' },
|
|
||||||
{ category: '영문 브랜딩', detail: '채널 설명이 영문 위주 — 한국 시장 타겟팅 약함', severity: 'warning' },
|
|
||||||
{ category: '콘텐츠 카테고리화', detail: '재생목록 기본 구성 있음 — 썸네일/메타데이터 최적화 시 개선 여지', severity: 'warning' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
instagramAudit: {
|
|
||||||
accounts: [
|
|
||||||
{
|
|
||||||
handle: '@banobagi_ps',
|
|
||||||
language: 'KR',
|
|
||||||
label: '공식 계정',
|
|
||||||
posts: 2000,
|
|
||||||
followers: 4183,
|
|
||||||
following: 150,
|
|
||||||
category: 'Health/beauty',
|
|
||||||
profileLink: 'banobagi.com',
|
|
||||||
highlights: ['안면윤곽', '눈성형', '코성형', '가슴성형', '리뷰'],
|
|
||||||
reelsCount: 10,
|
|
||||||
contentFormat: 'Before/After + 카드뉴스 혼합',
|
|
||||||
profilePhoto: '바노바기 블랙+골드 로고',
|
|
||||||
bio: '바노바기성형외과 공식 계정 · 02-1588-6508 · banobagi.com (실측치 수집 진행 중)',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'Reels 활용 저조', detail: 'Reels 수가 카드뉴스 대비 현저히 적음 — 알고리즘 노출 불이익', severity: 'critical' },
|
|
||||||
{ category: 'YouTube ↔ Instagram 연동 부재', detail: 'YouTube 925개 영상 자산이 Instagram Reels 로 재활용되지 않음', severity: 'critical' },
|
|
||||||
{ category: '실측 데이터 수집 차단', detail: 'Firecrawl/공개 스크래핑 차단 — Chrome MCP 로 실측 교체 예정', severity: 'warning' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
facebookAudit: {
|
|
||||||
pages: [
|
|
||||||
{
|
|
||||||
url: 'facebook.com/BanobagiPlasticSurgery',
|
|
||||||
pageName: 'Banobagi Plastic Surgery',
|
|
||||||
language: 'EN',
|
|
||||||
label: '국제 공식',
|
|
||||||
followers: 16000,
|
|
||||||
following: 0,
|
|
||||||
category: '성형외과 의사',
|
|
||||||
bio: 'Banobagi Plastic Surgery — Korean Premium Plastic Surgery Clinic',
|
|
||||||
logo: '공식 (블랙+골드)',
|
|
||||||
logoDescription: '블랙 배경 + 골드 "BANOBAGI" 워드마크 로고 — 공식 브랜드 자산',
|
|
||||||
link: 'banobagi.com',
|
|
||||||
linkedDomain: 'banobagi.com',
|
|
||||||
reviews: 0,
|
|
||||||
recentPostAge: '추정 1주 이내',
|
|
||||||
hasWhatsApp: true,
|
|
||||||
postFrequency: '월 2~4회',
|
|
||||||
topContentType: 'Before/After + 영문 시술 정보',
|
|
||||||
engagement: '게시물당 좋아요 10~80개 (추정)',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'KR 네이티브 페이지 부재', detail: '국제 페이지만 운영 — 한국 사용자 접근성 낮음', severity: 'critical' },
|
|
||||||
{ category: '브랜드 콘텐츠 단조', detail: 'Before/After 위주 — 환자 여정/스토리/FAQ 콘텐츠 부족', severity: 'warning' },
|
|
||||||
{ category: '실측 데이터 수집 차단', detail: 'Firecrawl 차단 — Chrome MCP 로 실측 교체 예정', severity: 'warning' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [
|
|
||||||
{
|
|
||||||
field: '로고',
|
|
||||||
values: [
|
|
||||||
{ channel: 'YouTube', value: 'BANOBAGI 영문 워드마크', isCorrect: true },
|
|
||||||
{ channel: 'Instagram', value: '바노바기 블랙+골드 로고', isCorrect: true },
|
|
||||||
{ channel: 'Facebook', value: '블랙+골드 워드마크', isCorrect: true },
|
|
||||||
{ channel: 'Website', value: '블랙+골드 공식 로고', isCorrect: true },
|
|
||||||
],
|
|
||||||
impact: '브랜드 시각 아이덴티티는 상대적으로 일관됨 — 컬러/폰트 가이드 강화 여지',
|
|
||||||
recommendation: '채널별 프로필 이미지 해상도 재검증 + 가로형/원형 버전 통일',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
consolidationRecommendation: 'Facebook 국제 페이지(16K 실측) 유지하되, 한국 시장 전용 페이지 신규 개설 또는 Instagram KR 집중으로 전환 권장. 현재 상태는 한국 환자 유입 채널로 기능 안 함.',
|
|
||||||
},
|
|
||||||
|
|
||||||
otherChannels: [
|
|
||||||
{ name: '네이버 블로그', status: 'inactive', details: '공식 블로그 — 마지막 포스트 2023-04-21 (2년 이상 방치)', url: 'https://blog.naver.com/banobagips' },
|
|
||||||
{ name: '강남언니', status: 'active', details: '9.2점/10, 6,853 리뷰, 의료진 4명, 2000년 설립', url: 'https://www.gangnamunni.com/hospitals/23' },
|
|
||||||
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중 — 리뷰 응답률 최적화 필요', url: 'https://m.place.naver.com/hospital/11655270' },
|
|
||||||
{ name: 'TikTok', status: 'not_found', details: '계정 없음 또는 비활성' },
|
|
||||||
{ name: '카카오톡', status: 'active', details: '대표번호 02-1588-6508 연동', url: 'https://banobagi.com' },
|
|
||||||
],
|
|
||||||
|
|
||||||
websiteAudit: {
|
|
||||||
primaryDomain: 'banobagi.com',
|
|
||||||
additionalDomains: [],
|
|
||||||
snsLinksOnSite: true,
|
|
||||||
snsLinksDetail: [
|
|
||||||
{ platform: 'YouTube', url: 'https://www.youtube.com/c/banobagips', location: 'Footer' },
|
|
||||||
{ platform: 'Instagram', url: 'https://www.instagram.com/banobagi_ps/', location: 'Footer' },
|
|
||||||
{ platform: 'Facebook', url: 'https://www.facebook.com/BanobagiPlasticSurgery', location: 'Footer' },
|
|
||||||
{ platform: 'Naver Blog', url: 'https://blog.naver.com/banobagips', location: 'Footer' },
|
|
||||||
],
|
|
||||||
trackingPixels: [
|
|
||||||
{ name: 'Facebook Pixel', installed: true, details: '설치 확인' },
|
|
||||||
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
|
|
||||||
{ name: 'Naver Site Verification', installed: true },
|
|
||||||
],
|
|
||||||
mainCTA: '전화 상담 + 온라인 예약',
|
|
||||||
},
|
|
||||||
|
|
||||||
problemDiagnosis: [
|
|
||||||
{
|
|
||||||
category: '콘텐츠 자산의 저활용',
|
|
||||||
detail: 'YouTube 925개 영상 · Instagram 2,000개 게시물 자산이 축적됐으나 채널 간 크로스포스팅·재활용 체계 부재. 영상당 평균 조회수가 구독자 대비 현저히 낮음.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '네이버 블로그 2년 이상 방치',
|
|
||||||
detail: '마지막 포스트 2023-04-21 — SEO 자산이 완전히 잠자고 있음. 강남언니 유입 환자가 "바노바기 후기" 검색 시 공식 블로그가 노출되지 않음.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '한국 시장용 SNS 채널 약화',
|
|
||||||
detail: 'Facebook 이 국제 페이지 위주, YouTube/Instagram 의 한국어 네이티브 콘텐츠 부족. 강남언니 6,853 리뷰 규모 대비 SNS 존재감이 비례하지 않음.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
transformation: {
|
|
||||||
...mockReport.transformation,
|
|
||||||
brandIdentity: [
|
|
||||||
{ area: '로고', asIs: '블랙+골드 워드마크 (대체로 일관)', toBe: '가로형/원형 버전 규격화 + 고해상도 재발급' },
|
|
||||||
{ area: '컬러 팔레트', asIs: '블랙+골드 기조', toBe: 'Primary: Deep Black (#1A1A1A) + Accent Gold (#C8A96A) 체계 명문화' },
|
|
||||||
{ area: '프로필 사진', asIs: '채널별 해상도 편차', toBe: '모든 채널 동일 원형 로고 1080x1080 사용' },
|
|
||||||
{ area: '바이오 메시지', asIs: '영문 위주', toBe: '"26년 강남 대표 성형외과 — 바노바기" 한/영 통일' },
|
|
||||||
{ area: '해시태그', asIs: '비체계적', toBe: '#바노바기성형외과 #Banobagi #강남성형외과 #안면윤곽전문' },
|
|
||||||
],
|
|
||||||
platformStrategies: [
|
|
||||||
{
|
|
||||||
platform: 'YouTube',
|
|
||||||
icon: 'youtube',
|
|
||||||
currentMetric: '13K subscribers · 925 videos',
|
|
||||||
targetMetric: '30K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: 'Shorts 대량 재편집', detail: '925개 기존 영상에서 Shorts 200개 추출' },
|
|
||||||
{ strategy: '업로드 빈도 복구', detail: '주 2회 고정 (Shorts 1 + 롱폼 격주)' },
|
|
||||||
{ strategy: '썸네일 시스템화', detail: '블랙+골드 워드마크 워터마크 통일' },
|
|
||||||
{ strategy: '한글 타이틀 A/B 테스트', detail: '영문 설명 → 한글 + 영문 병기' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
platform: 'Instagram',
|
|
||||||
icon: 'instagram',
|
|
||||||
currentMetric: '4,183 followers',
|
|
||||||
targetMetric: '60K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: 'Reels 주 5개', detail: 'YouTube Shorts 와 동시 배포' },
|
|
||||||
{ strategy: '리뷰 스토리화', detail: '강남언니 6,853 리뷰 중 선별 → 카루셀 콘텐츠' },
|
|
||||||
{ strategy: 'Before/After 체계화', detail: '시술별 카테고리 하이라이트 재구성' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
platform: '네이버 블로그',
|
|
||||||
icon: 'globe',
|
|
||||||
currentMetric: '마지막 포스트 2023-04-21',
|
|
||||||
targetMetric: '주 2회 게시',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: '즉시 재가동', detail: '6월 내 주 2회 정기 포스팅 시작' },
|
|
||||||
{ strategy: 'YouTube 영상 블로그 임베드', detail: '시술별 영상 + 텍스트 가이드 구조' },
|
|
||||||
{ strategy: 'SEO 키워드 맵', detail: '"바노바기 후기/안면윤곽/V라인" 검색 상위 전략' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
websiteImprovements: [
|
|
||||||
{ area: 'SNS 링크', asIs: 'Footer 만 존재', toBe: 'Header 에도 주요 SNS 아이콘 추가' },
|
|
||||||
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 관련 영상 임베드' },
|
|
||||||
{ area: '블로그 허브', asIs: '웹사이트 ↔ 네이버블로그 연결 약함', toBe: '홈페이지에 블로그 최신 글 피드 배치' },
|
|
||||||
],
|
|
||||||
newChannelProposals: [
|
|
||||||
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층 도달, YouTube Shorts 동시 배포' },
|
|
||||||
{ channel: '네이버 블로그 재가동', priority: 'P0', rationale: '2년 이상 방치 자산 — SEO 복구 최우선' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
roadmap: [
|
|
||||||
{
|
|
||||||
month: 1,
|
|
||||||
title: 'Foundation',
|
|
||||||
subtitle: '기반 복구',
|
|
||||||
tasks: [
|
|
||||||
{ task: '브랜드 로고/컬러 가이드 명문화 (블랙+골드)', completed: false },
|
|
||||||
{ task: '전 채널 프로필/배너 고해상도 재발급', completed: false },
|
|
||||||
{ task: '네이버 블로그 재가동 — 6월 내 주 2회 시작', completed: false },
|
|
||||||
{ task: '925개 YouTube 영상 → Shorts 추출 작업 착수', completed: false },
|
|
||||||
{ task: '강남언니 리뷰 6,853개 중 50개 선별 → SNS 콘텐츠화', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 2,
|
|
||||||
title: 'Content Engine',
|
|
||||||
subtitle: '콘텐츠 엔진 가동',
|
|
||||||
tasks: [
|
|
||||||
{ task: 'YouTube Shorts 주 2회 업로드 시작', completed: false },
|
|
||||||
{ task: 'Instagram Reels 주 5회 업로드 시작', completed: false },
|
|
||||||
{ task: '네이버 블로그 시술 가이드 10편 게시', completed: false },
|
|
||||||
{ task: 'TikTok 계정 개설 + Shorts 동시 배포', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 3,
|
|
||||||
title: 'Optimization',
|
|
||||||
subtitle: '최적화 & 광고',
|
|
||||||
tasks: [
|
|
||||||
{ task: '콘텐츠 성과 분석 리포트 v1', completed: false },
|
|
||||||
{ task: '고성과 콘텐츠 기반 Instagram/Facebook 광고 세팅', completed: false },
|
|
||||||
{ task: '네이버 플레이스 리뷰 응답률 최적화', completed: false },
|
|
||||||
{ task: 'KPI 리뷰: 구독자/팔로워 성장률, 상담 전환 추적', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
kpiDashboard: [
|
|
||||||
{ metric: 'YouTube 구독자', current: '13K', target3Month: '16K', target12Month: '30K' },
|
|
||||||
{ metric: 'YouTube Shorts 업로드', current: '비정기', target3Month: '주 2회', target12Month: '주 3회' },
|
|
||||||
{ metric: 'Instagram 팔로워', current: '4,183', target3Month: '38K', target12Month: '60K' },
|
|
||||||
{ metric: 'Instagram Reels 평균 조회수', current: '낮음', target3Month: '5,000', target12Month: '20,000' },
|
|
||||||
{ metric: '네이버 블로그 포스팅 빈도', current: '방치 (2023-04)', target3Month: '주 2회', target12Month: '주 3회' },
|
|
||||||
{ metric: '강남언니 리뷰', current: '6,853', target3Month: '7,200', target12Month: '8,500' },
|
|
||||||
{ metric: '강남언니 리뷰 응답률', current: '미측정', target3Month: '50%', target12Month: '80%' },
|
|
||||||
{ metric: '콘텐츠 → 상담 전환', current: '측정 불가', target3Month: 'UTM 추적 시작', target12Month: '월 30건' },
|
|
||||||
],
|
|
||||||
|
|
||||||
screenshots: [
|
|
||||||
{
|
|
||||||
id: 'yt-channel',
|
|
||||||
url: '/assets/clients/banobagi/screenshots/yt-channel.png',
|
|
||||||
channel: 'YouTube',
|
|
||||||
capturedAt: '2026-04-14T10:00:00Z',
|
|
||||||
caption: 'YouTube @banobagips — 구독자 13K, 영상 925개 누적',
|
|
||||||
sourceUrl: 'https://www.youtube.com/c/banobagips',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ig-profile',
|
|
||||||
url: '/assets/clients/banobagi/screenshots/ig-profile.png',
|
|
||||||
channel: 'Instagram',
|
|
||||||
capturedAt: '2026-04-14T10:02:00Z',
|
|
||||||
caption: 'Instagram @banobagi_ps — 공식 계정 (실측 수집 진행 중)',
|
|
||||||
sourceUrl: 'https://www.instagram.com/banobagi_ps/',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'fb-page',
|
|
||||||
url: '/assets/clients/banobagi/screenshots/fb-page.png',
|
|
||||||
channel: 'Facebook',
|
|
||||||
capturedAt: '2026-04-14T10:03:00Z',
|
|
||||||
caption: 'Facebook @BanobagiPlasticSurgery — 국제 공식 페이지 (실측 수집 진행 중)',
|
|
||||||
sourceUrl: 'https://www.facebook.com/BanobagiPlasticSurgery',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'gangnamunni',
|
|
||||||
url: '/assets/clients/banobagi/screenshots/gangnamunni.png',
|
|
||||||
channel: '강남언니',
|
|
||||||
capturedAt: '2026-04-14T10:04:00Z',
|
|
||||||
caption: '강남언니 — 9.2점/10, 6,853 리뷰, 의료진 4명, 2000년 설립',
|
|
||||||
sourceUrl: 'https://www.gangnamunni.com/hospitals/23',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'website-homepage',
|
|
||||||
url: '/assets/clients/banobagi/screenshots/website-homepage.png',
|
|
||||||
channel: 'Website',
|
|
||||||
capturedAt: '2026-04-14T10:05:00Z',
|
|
||||||
caption: 'banobagi.com — 공식 홈페이지',
|
|
||||||
sourceUrl: 'https://www.banobagi.com',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'naver-blog',
|
|
||||||
url: '/assets/clients/banobagi/screenshots/naver-blog.png',
|
|
||||||
channel: '네이버 블로그',
|
|
||||||
capturedAt: '2026-04-14T10:06:00Z',
|
|
||||||
caption: '네이버 블로그 @banobagips — 마지막 포스트 2023-04-21 (2년 이상 방치)',
|
|
||||||
sourceUrl: 'https://blog.naver.com/banobagips',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
@ -1,339 +0,0 @@
|
||||||
import type { MarketingReport } from '../types/report';
|
|
||||||
import { mockReport } from './mockReport';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 그랜드성형외과 — 데모 리포트
|
|
||||||
*
|
|
||||||
* 실측 (2026-04-14):
|
|
||||||
* - YouTube @grandsurgery_QnA: 구독자 2.37K, 영상 332개, 업로드 ~0/week
|
|
||||||
* - 주력: 안면거상·리프팅·코성형 Q&A 콘텐츠, 이세환 원장
|
|
||||||
* - 강남구 압구정 위치 (압구정로)
|
|
||||||
* - Instagram @grand_korea · Facebook @grandps.korea · Blog grandprs
|
|
||||||
* - 강남언니 평점/리뷰 수 실측 예정
|
|
||||||
*/
|
|
||||||
export const mockReportGrand: MarketingReport = {
|
|
||||||
...mockReport,
|
|
||||||
id: 'grand',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.grandsurgery.com',
|
|
||||||
overallScore: 42,
|
|
||||||
|
|
||||||
clinicSnapshot: {
|
|
||||||
...mockReport.clinicSnapshot,
|
|
||||||
name: '그랜드성형외과',
|
|
||||||
nameEn: 'Grand Plastic Surgery',
|
|
||||||
established: '2005',
|
|
||||||
yearsInBusiness: 21,
|
|
||||||
staffCount: 3,
|
|
||||||
leadDoctor: {
|
|
||||||
name: '이세환',
|
|
||||||
credentials: '그랜드성형외과 대표원장 · 안면거상 전문',
|
|
||||||
rating: 9.8,
|
|
||||||
reviewCount: 1533,
|
|
||||||
},
|
|
||||||
overallRating: 9.8,
|
|
||||||
totalReviews: 1533,
|
|
||||||
priceRange: { min: '200,000', max: '15,000,000+', currency: '₩' },
|
|
||||||
certifications: [
|
|
||||||
'성형외과 전문의',
|
|
||||||
'안면거상·리프팅 전문센터',
|
|
||||||
'분야별 집중 수술',
|
|
||||||
],
|
|
||||||
mediaAppearances: ['강남언니 1,533 리뷰', '유튜브 Q&A 전문 채널'],
|
|
||||||
medicalTourism: ['외국인 상담 지원'],
|
|
||||||
location: '서울 강남구 압구정로 (압구정역)',
|
|
||||||
nearestStation: '3호선 압구정역',
|
|
||||||
phone: '02-547-5100',
|
|
||||||
domain: 'grandps.com',
|
|
||||||
source: 'registry' as const,
|
|
||||||
registryData: {
|
|
||||||
district: '강남',
|
|
||||||
branches: '본점 1개',
|
|
||||||
brandGroup: '안면거상·리프팅 전문',
|
|
||||||
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/62',
|
|
||||||
googleMapsUrl: 'https://maps.google.com/?q=그랜드성형외과',
|
|
||||||
},
|
|
||||||
logoImages: {
|
|
||||||
circle: '/assets/clients/grand/logo-circle.png',
|
|
||||||
horizontal: '/assets/clients/grand/logo-horizontal.png',
|
|
||||||
korean: '/assets/clients/grand/logo-korean.png',
|
|
||||||
},
|
|
||||||
brandColors: {
|
|
||||||
primary: '#1B3A6B',
|
|
||||||
accent: '#4A90D9',
|
|
||||||
text: '#1B3A6B',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
channelScores: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', score: 28, maxScore: 100, status: 'critical', headline: '구독자 2.37K — 332개 영상 대비 전환율 매우 저조, 업로드 사실상 중단' },
|
|
||||||
{ channel: 'Instagram', icon: 'instagram', score: 40, maxScore: 100, status: 'critical', headline: '@grand_korea — 4,013 팔로워, Reels 활용 미흡' },
|
|
||||||
{ channel: 'Facebook', icon: 'facebook', score: 30, maxScore: 100, status: 'critical', headline: '@grandps.korea — 26,000 팔로워, 활성도 낮음' },
|
|
||||||
{ channel: '강남언니', icon: 'star', score: 72, maxScore: 100, status: 'warning', headline: '9.8점/10, 1,533 리뷰 — 응답 전략 부재' },
|
|
||||||
{ channel: 'Website', icon: 'globe', score: 55, maxScore: 100, status: 'warning', headline: 'grandps.com 운영 중 — SNS 연동·트래킹 고도화 필요' },
|
|
||||||
{ channel: '네이버 블로그', icon: 'globe', score: 35, maxScore: 100, status: 'critical', headline: 'blog.naver.com/grandprs — 최근 업로드 저조' },
|
|
||||||
],
|
|
||||||
|
|
||||||
youtubeAudit: {
|
|
||||||
...mockReport.youtubeAudit,
|
|
||||||
channelName: '그랜드성형외과Q&A',
|
|
||||||
handle: '@grandsurgery_QnA',
|
|
||||||
subscribers: 2370,
|
|
||||||
totalVideos: 332,
|
|
||||||
totalViews: 850000,
|
|
||||||
weeklyViewGrowth: { absolute: 400, percentage: 0.1 },
|
|
||||||
estimatedMonthlyRevenue: { min: 5, max: 25 },
|
|
||||||
avgVideoLength: '3.6분',
|
|
||||||
uploadFrequency: '~0/week (사실상 중단)',
|
|
||||||
channelCreatedDate: '2017-03-01',
|
|
||||||
subscriberRank: '',
|
|
||||||
channelDescription: '그랜드성형외과 Q&A 채널 — 안면거상·코성형·가슴성형 전문 의료 콘텐츠',
|
|
||||||
linkedUrls: [{ label: '그랜드성형외과', url: 'grandps.com' }],
|
|
||||||
playlists: ['그랜드 성형Q&A', '그랜드한 성형 정보', '성형 브이로그', '수술 후 주의사항'],
|
|
||||||
topVideos: [],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: '구독자 전환율 극히 낮음', detail: '332개 영상 누적, 구독자 2.37K — 영상 1개당 평균 구독자 7명 수준', severity: 'critical', evidenceIds: ['yt-channel'] },
|
|
||||||
{ category: '업로드 사실상 중단', detail: '최근 업로드 빈도 주 0회 — YouTube 알고리즘 완전 이탈', severity: 'critical' },
|
|
||||||
{ category: 'Q&A 포맷 과다', detail: '짧은 Q&A 위주로 Shorts·Before/After 포맷 전환 필요', severity: 'warning' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
instagramAudit: {
|
|
||||||
accounts: [
|
|
||||||
{
|
|
||||||
handle: '@grand_korea',
|
|
||||||
language: 'KR',
|
|
||||||
label: '공식 계정',
|
|
||||||
posts: 800,
|
|
||||||
followers: 4013,
|
|
||||||
following: 200,
|
|
||||||
category: 'Health/beauty',
|
|
||||||
profileLink: 'grandps.com',
|
|
||||||
highlights: ['안면거상', '코성형', '가슴성형', '눈성형', '후기'],
|
|
||||||
reelsCount: 20,
|
|
||||||
contentFormat: '시술 설명 + Q&A 카드뉴스',
|
|
||||||
profilePhoto: '그랜드성형외과 공식 로고',
|
|
||||||
bio: '그랜드성형외과 공식 계정 · 압구정 · grandps.com',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'Reels 비중 낮음', detail: '카드뉴스·이미지 위주 — Reels 알고리즘 혜택 미활용', severity: 'critical' },
|
|
||||||
{ category: 'YouTube 자산 미활용', detail: '332개 영상이 Instagram Reels로 재편집되지 않음', severity: 'critical' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
facebookAudit: {
|
|
||||||
pages: [
|
|
||||||
{
|
|
||||||
url: 'facebook.com/grandps.korea',
|
|
||||||
pageName: 'Grand Plastic Surgery',
|
|
||||||
language: 'KR',
|
|
||||||
label: '공식',
|
|
||||||
followers: 26000,
|
|
||||||
following: 0,
|
|
||||||
category: '성형외과',
|
|
||||||
bio: '그랜드성형외과 공식 Facebook',
|
|
||||||
logo: '공식 로고',
|
|
||||||
logoDescription: '그랜드성형외과 공식 로고',
|
|
||||||
link: 'grandps.com',
|
|
||||||
linkedDomain: 'grandps.com',
|
|
||||||
reviews: 0,
|
|
||||||
recentPostAge: '추정 수주 이내',
|
|
||||||
hasWhatsApp: false,
|
|
||||||
postFrequency: '월 2~4회',
|
|
||||||
topContentType: '시술 정보 + 이벤트',
|
|
||||||
engagement: '게시물당 좋아요 5~30개 (추정)',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'Facebook 콘텐츠 빈도 저하', detail: '팔로워 26,000명 — 유의미한 규모이나 콘텐츠 업로드 빈도 낮음', severity: 'warning' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [],
|
|
||||||
consolidationRecommendation: 'Facebook을 유지하되 YouTube·Instagram 우선 집중 권장.',
|
|
||||||
},
|
|
||||||
|
|
||||||
otherChannels: [
|
|
||||||
{ name: '네이버 블로그', status: 'unknown', details: '공식 블로그 운영 중 — 최근 업로드 저조', url: 'https://blog.naver.com/grandprs' },
|
|
||||||
{ name: '강남언니', status: 'active', details: '9.8점/10, 1,533 리뷰 · 안면거상 전문병원', url: 'https://www.gangnamunni.com/hospitals/62' },
|
|
||||||
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중', url: 'https://map.naver.com/v5/search/그랜드성형외과' },
|
|
||||||
{ name: 'TikTok', status: 'not_found', details: '계정 없음 또는 비활성' },
|
|
||||||
],
|
|
||||||
|
|
||||||
websiteAudit: {
|
|
||||||
primaryDomain: 'grandps.com',
|
|
||||||
additionalDomains: [],
|
|
||||||
snsLinksOnSite: true,
|
|
||||||
snsLinksDetail: [
|
|
||||||
{ platform: 'YouTube', url: 'https://www.youtube.com/channel/UCU2o_aHqsNFuqwtdzVM3xbQ', location: 'Footer' },
|
|
||||||
{ platform: 'Instagram', url: 'https://www.instagram.com/grand_korea', location: 'Footer' },
|
|
||||||
{ platform: 'Facebook', url: 'https://www.facebook.com/grandps.korea', location: 'Footer' },
|
|
||||||
{ platform: 'Naver Blog', url: 'https://blog.naver.com/grandprs', location: 'Footer' },
|
|
||||||
],
|
|
||||||
trackingPixels: [
|
|
||||||
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
|
|
||||||
{ name: 'Naver Site Verification', installed: true },
|
|
||||||
],
|
|
||||||
mainCTA: '전화 상담 + 온라인 예약',
|
|
||||||
},
|
|
||||||
|
|
||||||
problemDiagnosis: [
|
|
||||||
{
|
|
||||||
category: 'YouTube 332개 영상 자산 완전 방치',
|
|
||||||
detail: '6년간 누적된 332개 Q&A 영상이 구독자 2.37K에 그침. 업로드 중단 상태로 알고리즘 완전 이탈. Shorts 재편집 시 즉시 노출 회복 가능성.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '전 채널 콘텐츠 빈도 급감',
|
|
||||||
detail: 'YouTube·Instagram·Blog 모두 업로드 빈도가 현저히 줄어 신규 환자 유입 경로가 거의 없는 상태.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '안면거상 전문성이 SNS에 미반영',
|
|
||||||
detail: '이세환 원장의 안면거상 전문성은 오프라인에서 입증됐으나 SNS/YouTube에서 전문가 포지셔닝 콘텐츠가 부족.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
transformation: {
|
|
||||||
...mockReport.transformation,
|
|
||||||
brandIdentity: [
|
|
||||||
{ area: '로고', asIs: '공식 로고 존재', toBe: '가로형/원형 고해상도 버전 표준화' },
|
|
||||||
{ area: '컬러', asIs: '블루 계열', toBe: 'Primary: Navy Blue (#1B3A6B) + Accent: Sky Blue (#4A90D9) 명문화' },
|
|
||||||
{ area: '전문성 포지셔닝', asIs: '일반 성형외과', toBe: '"압구정 안면거상·리프팅 전문" 명확화' },
|
|
||||||
],
|
|
||||||
platformStrategies: [
|
|
||||||
{
|
|
||||||
platform: 'YouTube',
|
|
||||||
icon: 'youtube',
|
|
||||||
currentMetric: '2.37K subscribers · 332 videos',
|
|
||||||
targetMetric: '10K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: 'Shorts 재편집 즉시 시작', detail: '332개 영상에서 Shorts 100개 추출 · 안면거상 특화' },
|
|
||||||
{ strategy: '주 2회 업로드 재개', detail: 'Q&A Shorts + 롱폼 안면거상 케이스 교차' },
|
|
||||||
{ strategy: '이세환 원장 전문가 시리즈', detail: '"압구정 안면거상 전문의가 말하는" 브랜디드 시리즈' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
platform: 'Instagram',
|
|
||||||
icon: 'instagram',
|
|
||||||
currentMetric: '4,013 followers',
|
|
||||||
targetMetric: '25K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: 'Before/After Reels 주 4회', detail: 'YouTube Shorts와 동시 배포' },
|
|
||||||
{ strategy: '강남언니 리뷰 스토리화', detail: '1,533 리뷰 중 선별 → 카루셀' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
platform: '네이버 블로그',
|
|
||||||
icon: 'globe',
|
|
||||||
currentMetric: '업로드 저조',
|
|
||||||
targetMetric: '주 2회 게시',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: '안면거상 SEO 전략', detail: '"압구정 안면거상", "딥플레인 거상" 키워드 집중' },
|
|
||||||
{ strategy: 'YouTube 임베드 블로그', detail: '영상 + 텍스트 설명 구조' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
websiteImprovements: [
|
|
||||||
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 관련 Q&A 영상 임베드' },
|
|
||||||
{ area: 'SNS 링크', asIs: 'Footer만', toBe: 'Header에 YouTube 아이콘 추가' },
|
|
||||||
],
|
|
||||||
newChannelProposals: [
|
|
||||||
{ channel: 'TikTok', priority: 'P1', rationale: '30~40대 안면거상 고민층, YouTube Shorts 동시 배포' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
roadmap: [
|
|
||||||
{
|
|
||||||
month: 1,
|
|
||||||
title: 'Foundation',
|
|
||||||
subtitle: '채널 재가동',
|
|
||||||
tasks: [
|
|
||||||
{ task: 'YouTube Shorts 재편집 착수 (332개 → Shorts 50개)', completed: false },
|
|
||||||
{ task: '이세환 원장 전문가 시리즈 기획', completed: false },
|
|
||||||
{ task: 'Instagram Reels 주 3회 업로드 시작', completed: false },
|
|
||||||
{ task: '네이버 블로그 주 2회 재가동', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 2,
|
|
||||||
title: 'Content Engine',
|
|
||||||
subtitle: '콘텐츠 엔진',
|
|
||||||
tasks: [
|
|
||||||
{ task: 'YouTube Shorts 주 3회 업로드', completed: false },
|
|
||||||
{ task: '안면거상 Before/After 시리즈 10편', completed: false },
|
|
||||||
{ task: '강남언니 리뷰 응답률 50% 달성', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 3,
|
|
||||||
title: 'Optimization',
|
|
||||||
subtitle: '최적화',
|
|
||||||
tasks: [
|
|
||||||
{ task: '성과 리포트 v1 — 구독자·팔로워 성장률 측정', completed: false },
|
|
||||||
{ task: 'Instagram·Facebook 유료 광고 세팅', completed: false },
|
|
||||||
{ task: 'KPI 리뷰 및 전략 조정', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
kpiDashboard: [
|
|
||||||
{ metric: 'YouTube 구독자', current: '2.37K', target3Month: '4K', target12Month: '10K' },
|
|
||||||
{ metric: 'YouTube Shorts 업로드', current: '사실상 0/week', target3Month: '주 3회', target12Month: '주 4회' },
|
|
||||||
{ metric: 'Instagram 팔로워', current: '4,013', target3Month: '8K', target12Month: '20K' },
|
|
||||||
{ metric: '네이버 블로그 포스팅', current: '저조', target3Month: '주 2회', target12Month: '주 3회' },
|
|
||||||
{ metric: '강남언니 리뷰', current: '1,533', target3Month: '1,700', target12Month: '2,500' },
|
|
||||||
{ metric: '강남언니 리뷰 응답률', current: '미측정', target3Month: '50%', target12Month: '80%' },
|
|
||||||
],
|
|
||||||
|
|
||||||
screenshots: [
|
|
||||||
{
|
|
||||||
id: 'yt-channel',
|
|
||||||
url: '/assets/clients/grand/screenshots/yt-channel.png',
|
|
||||||
channel: 'YouTube',
|
|
||||||
capturedAt: '2026-04-14T10:00:00Z',
|
|
||||||
caption: '그랜드성형외과Q&A @grandsurgery_QnA — 구독자 2.37K, 영상 332개, 업로드 ~0/week',
|
|
||||||
sourceUrl: 'https://www.youtube.com/channel/UCU2o_aHqsNFuqwtdzVM3xbQ',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ig-profile',
|
|
||||||
url: '/assets/clients/grand/screenshots/ig-profile.png',
|
|
||||||
channel: 'Instagram',
|
|
||||||
capturedAt: '2026-04-14T10:02:00Z',
|
|
||||||
caption: 'Instagram @grand_korea — 4,013 팔로워',
|
|
||||||
sourceUrl: 'https://www.instagram.com/grand_korea/',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'fb-page',
|
|
||||||
url: '/assets/clients/grand/screenshots/fb-page.png',
|
|
||||||
channel: 'Facebook',
|
|
||||||
capturedAt: '2026-04-14T10:03:00Z',
|
|
||||||
caption: 'Facebook @grandps.korea — 26,000 팔로워',
|
|
||||||
sourceUrl: 'https://www.facebook.com/grandps.korea',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'gangnamunni',
|
|
||||||
url: '/assets/clients/grand/screenshots/gangnamunni.png',
|
|
||||||
channel: '강남언니',
|
|
||||||
capturedAt: '2026-04-14T10:04:00Z',
|
|
||||||
caption: '강남언니 — 그랜드성형외과 9.8점, 1,533 리뷰',
|
|
||||||
sourceUrl: 'https://www.gangnamunni.com/hospitals/62',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'website-homepage',
|
|
||||||
url: '/assets/clients/grand/screenshots/website-homepage.png',
|
|
||||||
channel: 'Website',
|
|
||||||
capturedAt: '2026-04-14T10:05:00Z',
|
|
||||||
caption: 'grandps.com — 공식 홈페이지',
|
|
||||||
sourceUrl: 'https://www.grandps.com',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'naver-blog',
|
|
||||||
url: '/assets/clients/grand/screenshots/naver-blog.png',
|
|
||||||
channel: '네이버 블로그',
|
|
||||||
capturedAt: '2026-04-14T10:06:00Z',
|
|
||||||
caption: '네이버 블로그 @grandprs — 최근 업로드 저조',
|
|
||||||
sourceUrl: 'https://blog.naver.com/grandprs',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
@ -1,347 +0,0 @@
|
||||||
import type { MarketingReport } from '../types/report';
|
|
||||||
import { mockReport } from './mockReport';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 이룸성형외과 (서울아이) — 데모 리포트
|
|
||||||
*
|
|
||||||
* 실측 (2026-04-14):
|
|
||||||
* - YouTube @SEOULiPS. (서울아이 Seoul i Plastic Surgery): 구독자 322명, 영상 155개
|
|
||||||
* - Instagram: @seoulips (KR) · @seouli_ps_th (태국) · @seouli_jp (일본)
|
|
||||||
* - Facebook: 서울아이성형외과 페이지
|
|
||||||
* - Blog: blog.naver.com/seoulips · 카페: cafe.naver.com/seoulips
|
|
||||||
* - 홈페이지: seoulips.com (seoulipsmedical.com도 운영)
|
|
||||||
* - 특징: 코성형·눈밑지방·실리프팅 전문, KR/TH/JP 3개국 다국어 계정
|
|
||||||
*/
|
|
||||||
export const mockReportIrum: MarketingReport = {
|
|
||||||
...mockReport,
|
|
||||||
id: 'irum',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.seoulips.com',
|
|
||||||
overallScore: 35,
|
|
||||||
|
|
||||||
clinicSnapshot: {
|
|
||||||
...mockReport.clinicSnapshot,
|
|
||||||
name: '이룸성형외과 (서울아이)',
|
|
||||||
nameEn: 'Seoul i Plastic Surgery',
|
|
||||||
established: '2015',
|
|
||||||
yearsInBusiness: 11,
|
|
||||||
staffCount: 3,
|
|
||||||
leadDoctor: {
|
|
||||||
name: '서울아이 의료진',
|
|
||||||
credentials: '서울아이성형외과 · 코성형·눈밑지방·리프팅 전문',
|
|
||||||
rating: 9.4,
|
|
||||||
reviewCount: 86,
|
|
||||||
},
|
|
||||||
overallRating: 9.4,
|
|
||||||
totalReviews: 86,
|
|
||||||
priceRange: { min: '100,000', max: '8,000,000+', currency: '₩' },
|
|
||||||
certifications: [
|
|
||||||
'성형외과 전문의',
|
|
||||||
'코성형·눈밑지방 전문',
|
|
||||||
'한·태·일 다국어 상담',
|
|
||||||
'리팟레이저 도입',
|
|
||||||
],
|
|
||||||
mediaAppearances: ['강남언니 86 리뷰', '태국·일본 외국인 환자 특화'],
|
|
||||||
medicalTourism: ['태국어·일본어 Instagram 계정 운영', '외국인 전용 코디네이터'],
|
|
||||||
location: '서울 강남구 (강남역 인근)',
|
|
||||||
nearestStation: '2호선 강남역',
|
|
||||||
phone: '02-555-0900',
|
|
||||||
domain: 'seoulips.com',
|
|
||||||
source: 'registry' as const,
|
|
||||||
registryData: {
|
|
||||||
district: '강남',
|
|
||||||
branches: '본점 1개',
|
|
||||||
brandGroup: '코성형·외국인 환자 특화',
|
|
||||||
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/839',
|
|
||||||
googleMapsUrl: 'https://maps.google.com/?q=서울아이성형외과',
|
|
||||||
},
|
|
||||||
logoImages: {
|
|
||||||
circle: '/assets/clients/irum/logo-circle.png',
|
|
||||||
horizontal: '/assets/clients/irum/logo-horizontal.png',
|
|
||||||
korean: '/assets/clients/irum/logo-korean.png',
|
|
||||||
},
|
|
||||||
brandColors: {
|
|
||||||
primary: '#0D4F3C',
|
|
||||||
accent: '#2ECC71',
|
|
||||||
text: '#0D4F3C',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
channelScores: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', score: 18, maxScore: 100, status: 'critical', headline: '@SEOULiPS. — 구독자 322명 · 155개 영상 · 성장 정체' },
|
|
||||||
{ channel: 'Instagram', icon: 'instagram', score: 52, maxScore: 100, status: 'warning', headline: '3개국 계정 운영 (KR/TH/JP) — 강점, 채널간 연계 전략 부재' },
|
|
||||||
{ channel: 'Facebook', icon: 'facebook', score: 10, maxScore: 100, status: 'critical', headline: '서울아이성형외과 페이지 — 비공개/삭제 상태 확인됨' },
|
|
||||||
{ channel: '강남언니', icon: 'star', score: 65, maxScore: 100, status: 'warning', headline: '9.4점/10, 86 리뷰 — 리뷰 응답·마케팅 활용 미흡' },
|
|
||||||
{ channel: 'Website', icon: 'globe', score: 45, maxScore: 100, status: 'warning', headline: 'seoulips.com 운영 — 다국어 랜딩 최적화 필요' },
|
|
||||||
{ channel: '네이버 블로그', icon: 'globe', score: 38, maxScore: 100, status: 'critical', headline: 'blog.naver.com/seoulips — 업로드 저조' },
|
|
||||||
],
|
|
||||||
|
|
||||||
youtubeAudit: {
|
|
||||||
...mockReport.youtubeAudit,
|
|
||||||
channelName: '서울아이 Seoul i Plastic Surgery',
|
|
||||||
handle: '@SEOULiPS.',
|
|
||||||
subscribers: 322,
|
|
||||||
totalVideos: 155,
|
|
||||||
totalViews: 180000,
|
|
||||||
weeklyViewGrowth: { absolute: 200, percentage: 0.1 },
|
|
||||||
estimatedMonthlyRevenue: { min: 0, max: 10 },
|
|
||||||
avgVideoLength: '4.5분',
|
|
||||||
uploadFrequency: '비정기 (월 1~2회)',
|
|
||||||
channelCreatedDate: '2019-06-01',
|
|
||||||
subscriberRank: '',
|
|
||||||
channelDescription: '안전하고 바른 성형을 위해 서울아이는 항상 노력합니다. — 코성형·눈밑지방·실리프팅',
|
|
||||||
linkedUrls: [{ label: '서울아이성형외과', url: 'seoulipsmedical.com' }],
|
|
||||||
playlists: ['Before & After', '리얼모델', '1분 지식', '전문의가 알려주는 성형'],
|
|
||||||
topVideos: [],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'YouTube 성장 사실상 정체', detail: '155개 영상, 구독자 322명 — 영상당 평균 구독자 2명 미만. YouTube 전략 전면 재설계 필요', severity: 'critical', evidenceIds: ['yt-channel'] },
|
|
||||||
{ category: '다국어 YouTube 콘텐츠 부재', detail: '태국·일본 Instagram 계정 운영 중이나 YouTube에는 다국어 자막/콘텐츠 없음', severity: 'critical' },
|
|
||||||
{ category: '전문의 Q&A 콘텐츠 발굴 필요', detail: '코성형·눈밑지방 전문성을 YouTube에서 전달하는 교육 콘텐츠 부재', severity: 'warning' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
instagramAudit: {
|
|
||||||
accounts: [
|
|
||||||
{
|
|
||||||
handle: '@seoulips',
|
|
||||||
language: 'KR',
|
|
||||||
label: 'KR 공식',
|
|
||||||
posts: 600,
|
|
||||||
followers: 826,
|
|
||||||
following: 200,
|
|
||||||
category: 'Health/beauty',
|
|
||||||
profileLink: 'seoulips.com',
|
|
||||||
highlights: ['코성형', '눈밑지방', '리프팅', '후기', '이벤트'],
|
|
||||||
reelsCount: 30,
|
|
||||||
contentFormat: 'Before/After + 시술 설명',
|
|
||||||
profilePhoto: '서울아이 공식 로고',
|
|
||||||
bio: '서울아이성형외과 KR 공식',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
handle: '@seouli_ps_th',
|
|
||||||
language: 'EN',
|
|
||||||
label: '태국',
|
|
||||||
posts: 200,
|
|
||||||
followers: 5000,
|
|
||||||
following: 100,
|
|
||||||
category: 'Health/beauty',
|
|
||||||
profileLink: 'seoulips.com',
|
|
||||||
highlights: [],
|
|
||||||
reelsCount: 15,
|
|
||||||
contentFormat: '태국어 시술 정보',
|
|
||||||
profilePhoto: '서울아이 로고',
|
|
||||||
bio: '서울아이성형외과 태국 채널',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'Instagram 다국어 강점 미최적화', detail: 'KR/TH/JP 3개 계정 운영은 강점이나 채널 간 콘텐츠 공유 체계 없음', severity: 'warning' },
|
|
||||||
{ category: 'Reels 부족', detail: '국제 계정에서 Reels 활용이 낮아 알고리즘 노출 손실', severity: 'critical' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
facebookAudit: {
|
|
||||||
pages: [
|
|
||||||
{
|
|
||||||
url: 'facebook.com/서울아이성형외과-105199207892670',
|
|
||||||
pageName: '서울아이성형외과',
|
|
||||||
language: 'KR',
|
|
||||||
label: '공식',
|
|
||||||
followers: 0,
|
|
||||||
following: 0,
|
|
||||||
category: '성형외과',
|
|
||||||
bio: '서울아이성형외과 Facebook (비공개/삭제 상태)',
|
|
||||||
logo: '공식 로고',
|
|
||||||
logoDescription: '서울아이성형외과 로고',
|
|
||||||
link: 'seoulips.com',
|
|
||||||
linkedDomain: 'seoulips.com',
|
|
||||||
reviews: 0,
|
|
||||||
recentPostAge: '추정 수주 이내',
|
|
||||||
hasWhatsApp: false,
|
|
||||||
postFrequency: '월 1~3회',
|
|
||||||
topContentType: '시술 정보',
|
|
||||||
engagement: '게시물당 좋아요 5~20개 (추정)',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'Facebook 채널 비공개/삭제', detail: '공식 페이지 접근 불가 확인 — 외국인 환자 FB 채널 신규 개설 필요', severity: 'critical' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [],
|
|
||||||
consolidationRecommendation: 'Facebook 공식 페이지 비공개/삭제 확인 — 외국인 환자 광고 채널로 신규 페이지 개설 후 태국·일본어 타겟 광고 세팅 필요.',
|
|
||||||
},
|
|
||||||
|
|
||||||
otherChannels: [
|
|
||||||
{ name: '네이버 블로그', status: 'unknown', details: '공식 블로그 운영 중 — 업로드 저조', url: 'https://blog.naver.com/seoulips' },
|
|
||||||
{ name: '네이버 카페', status: 'active', details: '서울아이 카페 운영 중', url: 'https://cafe.naver.com/seoulips' },
|
|
||||||
{ name: '강남언니', status: 'active', details: '9.4점/10, 86 리뷰', url: 'https://www.gangnamunni.com/hospitals/839' },
|
|
||||||
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중', url: 'https://map.naver.com/v5/search/서울아이성형외과' },
|
|
||||||
],
|
|
||||||
|
|
||||||
websiteAudit: {
|
|
||||||
primaryDomain: 'seoulips.com',
|
|
||||||
additionalDomains: [{ domain: 'seoulipsmedical.com', purpose: '영문 홈페이지' }],
|
|
||||||
snsLinksOnSite: true,
|
|
||||||
snsLinksDetail: [
|
|
||||||
{ platform: 'YouTube', url: 'https://www.youtube.com/channel/UCYcssdFunRLmD8b376Y6ykg', location: 'Footer' },
|
|
||||||
{ platform: 'Instagram', url: 'https://www.instagram.com/seoulips/', location: 'Footer' },
|
|
||||||
{ platform: 'Facebook', url: 'https://www.facebook.com/서울아이성형외과-105199207892670/', location: 'Footer' },
|
|
||||||
{ platform: 'Naver Blog', url: 'https://blog.naver.com/seoulips', location: 'Footer' },
|
|
||||||
],
|
|
||||||
trackingPixels: [
|
|
||||||
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
|
|
||||||
],
|
|
||||||
mainCTA: '전화 상담 + 카카오톡',
|
|
||||||
},
|
|
||||||
|
|
||||||
problemDiagnosis: [
|
|
||||||
{
|
|
||||||
category: 'YouTube 성장 완전 정체 — 즉각적 전략 재설계 필요',
|
|
||||||
detail: '155개 영상 누적, 구독자 322명. 태국·일본 인스타그램 계정을 운영하는 글로벌 강점이 YouTube에 전혀 반영 안 됨. 다국어 자막 추가만으로도 즉시 도달 확장 가능.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '다국어 SNS 강점의 크로스채널 미연계',
|
|
||||||
detail: 'KR·TH·JP 3개 Instagram 계정이라는 희귀한 강점이 있으나 YouTube·Blog·강남언니와 연동 없음. 채널 간 시너지 0% 상태.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '외국인 환자 디지털 전환 경로 부재',
|
|
||||||
detail: '태국·일본 계정 팔로워가 있으나 예약·상담으로 이어지는 랜딩 경로가 다국어로 준비되지 않음. 유입 대비 전환 극히 낮을 것으로 추정.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
transformation: {
|
|
||||||
...mockReport.transformation,
|
|
||||||
brandIdentity: [
|
|
||||||
{ area: '브랜드 아이덴티티', asIs: '서울아이 / 이룸 혼용', toBe: '"Seoul i Plastic Surgery" 영문 브랜드 통일 + 다국어 로고 버전 제작' },
|
|
||||||
{ area: '컬러', asIs: '미확인', toBe: 'Primary: Forest Green (#0D4F3C) + Accent: Mint (#2ECC71) 명문화' },
|
|
||||||
{ area: '글로벌 포지셔닝', asIs: '국내 위주', toBe: '"서울 강남 K-Beauty 전문 — 태국·일본 환자 환영"' },
|
|
||||||
],
|
|
||||||
platformStrategies: [
|
|
||||||
{
|
|
||||||
platform: 'YouTube',
|
|
||||||
icon: 'youtube',
|
|
||||||
currentMetric: '322 subscribers · 155 videos',
|
|
||||||
targetMetric: '3K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: '다국어 자막 추가', detail: '기존 155개 영상에 EN/TH/JP 자막 추가 → 즉시 글로벌 노출' },
|
|
||||||
{ strategy: '주 2회 업로드 정착', detail: '코성형·눈밑지방 전문의 Q&A + 외국인 환자 브이로그' },
|
|
||||||
{ strategy: 'Shorts 전환', detail: '기존 영상에서 Shorts 50개 추출' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
platform: 'Instagram',
|
|
||||||
icon: 'instagram',
|
|
||||||
currentMetric: 'KR @seoulips 826명 (실측) · TH/JP 계정 운영 중',
|
|
||||||
targetMetric: '@seoulips KR 30K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: '계정 간 콘텐츠 연계 자동화', detail: 'KR → TH/JP 번역 배포 파이프라인 구축' },
|
|
||||||
{ strategy: 'Reels 주 5회 (전 계정)', detail: 'YouTube Shorts 동시 다국어 배포' },
|
|
||||||
{ strategy: '86 리뷰 콘텐츠화', detail: '강남언니 리뷰 → Instagram Story' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
websiteImprovements: [
|
|
||||||
{ area: '다국어 랜딩페이지', asIs: '한국어 위주', toBe: 'TH·JP 전용 랜딩페이지 제작' },
|
|
||||||
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 다국어 자막 영상 임베드' },
|
|
||||||
],
|
|
||||||
newChannelProposals: [
|
|
||||||
{ channel: 'LINE (일본)', priority: 'P0', rationale: '일본 환자 전환 채널 — 현재 일본 인스타는 있으나 직접 상담 경로 없음' },
|
|
||||||
{ channel: 'TikTok', priority: 'P1', rationale: '태국/동남아 10~20대 도달, Shorts 동시 배포' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
roadmap: [
|
|
||||||
{
|
|
||||||
month: 1,
|
|
||||||
title: 'Foundation',
|
|
||||||
subtitle: '다국어 기반',
|
|
||||||
tasks: [
|
|
||||||
{ task: '브랜드 아이덴티티 통일 (Seoul i 영문 브랜드)', completed: false },
|
|
||||||
{ task: '기존 YouTube 영상 EN/TH 자막 추가 (우선 30개)', completed: false },
|
|
||||||
{ task: 'Instagram KR/TH/JP 크로스 배포 루틴 구축', completed: false },
|
|
||||||
{ task: '강남언니 86 리뷰 SNS 콘텐츠화', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 2,
|
|
||||||
title: 'Content Engine',
|
|
||||||
subtitle: '글로벌 노출',
|
|
||||||
tasks: [
|
|
||||||
{ task: 'YouTube 주 2회 업로드 정착 (다국어 자막 포함)', completed: false },
|
|
||||||
{ task: 'TikTok 계정 개설 + Shorts 동시 배포', completed: false },
|
|
||||||
{ task: '태국·일본어 랜딩페이지 v1 제작', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 3,
|
|
||||||
title: 'Optimization',
|
|
||||||
subtitle: '전환 추적',
|
|
||||||
tasks: [
|
|
||||||
{ task: '국가별 환자 유입·전환율 분석', completed: false },
|
|
||||||
{ task: 'Facebook 태국·일본 광고 캠페인 시작', completed: false },
|
|
||||||
{ task: 'KPI 리뷰', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
kpiDashboard: [
|
|
||||||
{ metric: 'YouTube 구독자', current: '322', target3Month: '800', target12Month: '3,000' },
|
|
||||||
{ metric: 'YouTube 업로드 빈도', current: '월 1~2회', target3Month: '주 2회', target12Month: '주 3회' },
|
|
||||||
{ metric: 'Instagram @seoulips 팔로워', current: '826', target3Month: '3K', target12Month: '10K' },
|
|
||||||
{ metric: 'Instagram 태국(@seouli_ps_th) 팔로워', current: '~5K', target3Month: '8K', target12Month: '15K' },
|
|
||||||
{ metric: '강남언니 리뷰', current: '86', target3Month: '1,000', target12Month: '1,500' },
|
|
||||||
{ metric: '외국인 환자 전환', current: '측정 불가', target3Month: '랜딩 UTM 시작', target12Month: '월 15건' },
|
|
||||||
],
|
|
||||||
|
|
||||||
screenshots: [
|
|
||||||
{
|
|
||||||
id: 'yt-channel',
|
|
||||||
url: '/assets/clients/irum/screenshots/yt-channel.png',
|
|
||||||
channel: 'YouTube',
|
|
||||||
capturedAt: '2026-04-14T10:00:00Z',
|
|
||||||
caption: '서울아이 Seoul i @SEOULiPS. — 구독자 322명, 영상 155개',
|
|
||||||
sourceUrl: 'https://www.youtube.com/channel/UCYcssdFunRLmD8b376Y6ykg',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ig-profile',
|
|
||||||
url: '/assets/clients/irum/screenshots/ig-profile.png',
|
|
||||||
channel: 'Instagram',
|
|
||||||
capturedAt: '2026-04-14T10:02:00Z',
|
|
||||||
caption: 'Instagram @seoulips — 826 팔로워 (KR 공식)',
|
|
||||||
sourceUrl: 'https://www.instagram.com/seoulips/',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'fb-page',
|
|
||||||
url: '/assets/clients/irum/screenshots/fb-page.png',
|
|
||||||
channel: 'Facebook',
|
|
||||||
capturedAt: '2026-04-14T10:03:00Z',
|
|
||||||
caption: 'Facebook 서울아이성형외과 — 페이지 비공개/삭제 확인',
|
|
||||||
sourceUrl: 'https://www.facebook.com/서울아이성형외과-105199207892670/',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'gangnamunni',
|
|
||||||
url: '/assets/clients/irum/screenshots/gangnamunni.png',
|
|
||||||
channel: '강남언니',
|
|
||||||
capturedAt: '2026-04-14T10:04:00Z',
|
|
||||||
caption: '강남언니 — 이룸(서울아이)성형외과 9.4점, 86 리뷰',
|
|
||||||
sourceUrl: 'https://www.gangnamunni.com/hospitals/839',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'website-homepage',
|
|
||||||
url: '/assets/clients/irum/screenshots/website-homepage.png',
|
|
||||||
channel: 'Website',
|
|
||||||
capturedAt: '2026-04-14T10:05:00Z',
|
|
||||||
caption: 'seoulips.com — 공식 홈페이지',
|
|
||||||
sourceUrl: 'https://www.seoulips.com',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'naver-blog',
|
|
||||||
url: '/assets/clients/irum/screenshots/naver-blog.png',
|
|
||||||
channel: '네이버 블로그',
|
|
||||||
capturedAt: '2026-04-14T10:06:00Z',
|
|
||||||
caption: '네이버 블로그 @seoulips — 업로드 저조',
|
|
||||||
sourceUrl: 'https://blog.naver.com/seoulips',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
@ -1,392 +0,0 @@
|
||||||
import type { MarketingReport } from '../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, details: 'GA4 + GTM 정상 운영' },
|
|
||||||
{ name: 'Meta Pixel', installed: true, details: 'Facebook/Instagram 광고 픽셀 설치 완료' },
|
|
||||||
{ name: 'Naver Analytics', installed: true, details: '네이버 검색광고 전환 추적' },
|
|
||||||
{ name: 'TikTok Pixel', installed: false, details: '미설치 — 도입 권장' },
|
|
||||||
],
|
|
||||||
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',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
@ -1,331 +0,0 @@
|
||||||
import type { MarketingReport } from '../types/report';
|
|
||||||
import { mockReport } from './mockReport';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 티에스성형외과 — 데모 리포트
|
|
||||||
*
|
|
||||||
* 실측 (2026-04-14):
|
|
||||||
* - YouTube 티에스TV (@TV-jm9dy): 구독자 8K, 영상 715개, 주 1~2회 업로드
|
|
||||||
* - 주력: 눈·코·가슴 종합, 신사역 강남구
|
|
||||||
* - Instagram: @tsprs_official · Facebook: @tsprs
|
|
||||||
* - Blog: blog.naver.com/tsprs
|
|
||||||
* - 홈페이지: tsprs.com (tsprs.co.kr 오류 확인 → tsprs.com이 올바른 URL)
|
|
||||||
* - 강남언니: 평점/리뷰 실측 예정
|
|
||||||
*/
|
|
||||||
export const mockReportTs: MarketingReport = {
|
|
||||||
...mockReport,
|
|
||||||
id: 'ts',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.tsprs.com',
|
|
||||||
overallScore: 55,
|
|
||||||
|
|
||||||
clinicSnapshot: {
|
|
||||||
...mockReport.clinicSnapshot,
|
|
||||||
name: '티에스성형외과',
|
|
||||||
nameEn: 'TS Plastic Surgery',
|
|
||||||
established: '2010',
|
|
||||||
yearsInBusiness: 16,
|
|
||||||
staffCount: 5,
|
|
||||||
leadDoctor: {
|
|
||||||
name: 'TS 성형팀',
|
|
||||||
credentials: '티에스성형외과 의료진 · 눈·코·가슴 종합',
|
|
||||||
rating: 9.5,
|
|
||||||
reviewCount: 12509,
|
|
||||||
},
|
|
||||||
overallRating: 9.5,
|
|
||||||
totalReviews: 12509,
|
|
||||||
priceRange: { min: '100,000', max: '10,000,000+', currency: '₩' },
|
|
||||||
certifications: [
|
|
||||||
'성형외과 전문의',
|
|
||||||
'눈·코·가슴 종합 성형',
|
|
||||||
'리얼모델 시스템',
|
|
||||||
],
|
|
||||||
mediaAppearances: ['강남언니 12,509 리뷰', '유튜브 리얼모델 콘텐츠'],
|
|
||||||
medicalTourism: ['외국인 상담 지원 (인도네시아 인플루언서 방문 기록)'],
|
|
||||||
location: '서울 강남구 신사동 (신사역)',
|
|
||||||
nearestStation: '3호선 신사역',
|
|
||||||
phone: '02-512-7580',
|
|
||||||
domain: 'tsprs.com',
|
|
||||||
source: 'registry' as const,
|
|
||||||
registryData: {
|
|
||||||
district: '강남',
|
|
||||||
branches: '본점 1개',
|
|
||||||
brandGroup: '눈·코·가슴 종합 성형',
|
|
||||||
gangnamUnniUrl: 'https://www.gangnamunni.com/hospitals/116',
|
|
||||||
googleMapsUrl: 'https://maps.google.com/?q=티에스성형외과',
|
|
||||||
},
|
|
||||||
logoImages: {
|
|
||||||
circle: '/assets/clients/ts/logo-circle.png',
|
|
||||||
horizontal: '/assets/clients/ts/logo-horizontal.png',
|
|
||||||
korean: '/assets/clients/ts/logo-korean.png',
|
|
||||||
},
|
|
||||||
brandColors: {
|
|
||||||
primary: '#1A1A2E',
|
|
||||||
accent: '#E94560',
|
|
||||||
text: '#1A1A2E',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
channelScores: [
|
|
||||||
{ channel: 'YouTube', icon: 'youtube', score: 58, maxScore: 100, status: 'warning', headline: '티에스TV 구독자 8K · 715개 영상 — 활발하나 전환율 개선 필요' },
|
|
||||||
{ channel: 'Instagram', icon: 'instagram', score: 62, maxScore: 100, status: 'warning', headline: '@tsprs_official — 리얼모델 콘텐츠 강점, Reels 빈도 증대 필요' },
|
|
||||||
{ channel: 'Facebook', icon: 'facebook', score: 38, maxScore: 100, status: 'critical', headline: '@tsprs — 3,900 팔로워, 활성도 낮음' },
|
|
||||||
{ channel: '강남언니', icon: 'star', score: 78, maxScore: 100, status: 'warning', headline: '9.5점/10, 12,509 리뷰 — 응답 전략 강화 필요' },
|
|
||||||
{ channel: 'Website', icon: 'globe', score: 60, maxScore: 100, status: 'warning', headline: 'tsprs.com 운영 — SNS 연동 및 트래킹 개선 여지' },
|
|
||||||
{ channel: '네이버 블로그', icon: 'globe', score: 45, maxScore: 100, status: 'warning', headline: 'blog.naver.com/tsprs — 업로드 있으나 빈도 보완 필요' },
|
|
||||||
],
|
|
||||||
|
|
||||||
youtubeAudit: {
|
|
||||||
...mockReport.youtubeAudit,
|
|
||||||
channelName: '티에스TV',
|
|
||||||
handle: '@TV-jm9dy',
|
|
||||||
subscribers: 8000,
|
|
||||||
totalVideos: 715,
|
|
||||||
totalViews: 5200000,
|
|
||||||
weeklyViewGrowth: { absolute: 3000, percentage: 0.6 },
|
|
||||||
estimatedMonthlyRevenue: { min: 40, max: 150 },
|
|
||||||
avgVideoLength: '3.2분',
|
|
||||||
uploadFrequency: '주 1~2회',
|
|
||||||
channelCreatedDate: '2018-01-01',
|
|
||||||
subscriberRank: '',
|
|
||||||
channelDescription: '지금, 예뻐져라! 티에스성형외과 — 눈·코·가슴·리프팅 전문',
|
|
||||||
linkedUrls: [{ label: '티에스성형외과', url: 'tsprs.com' }],
|
|
||||||
playlists: ['티에스 Real Model', '티에스 Lab', '티에스 Play', '티에스 소개'],
|
|
||||||
topVideos: [],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: '구독자 전환율 낮음', detail: '715개 영상 대비 구독자 8K — Shorts와 롱폼 균형 재조정 필요', severity: 'warning', evidenceIds: ['yt-channel'] },
|
|
||||||
{ category: '리얼모델 콘텐츠 강점 활용 미흡', detail: '리얼모델 시리즈가 강점이나 검색 최적화·썸네일 시스템화가 부족', severity: 'warning' },
|
|
||||||
{ category: '업로드 일관성 유지', detail: '주 1~2회 업로드 — 주 3회로 상향 시 알고리즘 노출 증가 기대', severity: 'warning' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
instagramAudit: {
|
|
||||||
accounts: [
|
|
||||||
{
|
|
||||||
handle: '@tsprs_official',
|
|
||||||
language: 'KR',
|
|
||||||
label: '공식 계정',
|
|
||||||
posts: 1500,
|
|
||||||
followers: 2626,
|
|
||||||
following: 250,
|
|
||||||
category: 'Health/beauty',
|
|
||||||
profileLink: 'tsprs.com',
|
|
||||||
highlights: ['눈성형', '코성형', '가슴성형', '리얼모델', '이벤트'],
|
|
||||||
reelsCount: 60,
|
|
||||||
contentFormat: 'Reels + 리얼모델 Before/After',
|
|
||||||
profilePhoto: '티에스성형외과 공식 로고',
|
|
||||||
bio: '지금, 예뻐져라! 티에스성형외과 @tsprs_official',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'Reels 비중 확대 여지', detail: '60개 Reels — 목표 100개+ 달성 시 알고리즘 노출 2배 기대', severity: 'warning' },
|
|
||||||
{ category: '리얼모델 계정 연계', detail: 'YouTube 리얼모델 브이로그 → Instagram 하이라이트 연계 미흡', severity: 'warning' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
facebookAudit: {
|
|
||||||
pages: [
|
|
||||||
{
|
|
||||||
url: 'facebook.com/tsprs',
|
|
||||||
pageName: 'TS Plastic Surgery',
|
|
||||||
language: 'KR',
|
|
||||||
label: '공식',
|
|
||||||
followers: 3900,
|
|
||||||
following: 0,
|
|
||||||
category: '성형외과',
|
|
||||||
bio: '티에스성형외과 공식 Facebook — 강남 신사역',
|
|
||||||
logo: '공식 로고',
|
|
||||||
logoDescription: '티에스성형외과 공식 로고',
|
|
||||||
link: 'tsprs.com',
|
|
||||||
linkedDomain: 'tsprs.com',
|
|
||||||
reviews: 0,
|
|
||||||
recentPostAge: '추정 수주 이내',
|
|
||||||
hasWhatsApp: false,
|
|
||||||
postFrequency: '월 2~4회',
|
|
||||||
topContentType: '이벤트 + 시술 정보',
|
|
||||||
engagement: '게시물당 좋아요 10~50개 (추정)',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
diagnosis: [
|
|
||||||
{ category: 'Facebook 활성도 낮음', detail: 'Instagram에 집중된 콘텐츠 전략 — Facebook 공동 배포 검토', severity: 'warning' },
|
|
||||||
],
|
|
||||||
brandInconsistencies: [],
|
|
||||||
consolidationRecommendation: 'Facebook은 Instagram 콘텐츠 자동 연동으로 최소 유지, 주력은 YouTube·Instagram 집중.',
|
|
||||||
},
|
|
||||||
|
|
||||||
otherChannels: [
|
|
||||||
{ name: '네이버 블로그', status: 'active', details: '공식 블로그 운영 중 — 빈도 보완 필요', url: 'https://blog.naver.com/tsprs' },
|
|
||||||
{ name: '강남언니', status: 'active', details: '9.5점/10, 12,509 리뷰', url: 'https://www.gangnamunni.com/hospitals/116' },
|
|
||||||
{ name: '네이버 까페', status: 'active', details: '연탐 네이버 카페 운영', url: 'https://cafe.naver.com/yeuntalk' },
|
|
||||||
{ name: '네이버 플레이스', status: 'active', details: '플레이스 운영 중', url: 'https://map.naver.com/v5/search/티에스성형외과' },
|
|
||||||
],
|
|
||||||
|
|
||||||
websiteAudit: {
|
|
||||||
primaryDomain: 'tsprs.com',
|
|
||||||
additionalDomains: [],
|
|
||||||
snsLinksOnSite: true,
|
|
||||||
snsLinksDetail: [
|
|
||||||
{ platform: 'YouTube', url: 'https://www.youtube.com/@TV-jm9dy', location: 'Footer' },
|
|
||||||
{ platform: 'Instagram', url: 'https://www.instagram.com/tsprs_official/', location: 'Footer' },
|
|
||||||
{ platform: 'Facebook', url: 'https://www.facebook.com/tsprs', location: 'Footer' },
|
|
||||||
{ platform: 'Naver Blog', url: 'https://blog.naver.com/tsprs', location: 'Footer' },
|
|
||||||
],
|
|
||||||
trackingPixels: [
|
|
||||||
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
|
|
||||||
{ name: 'Naver Site Verification', installed: true },
|
|
||||||
],
|
|
||||||
mainCTA: '전화 상담 + 카카오톡 상담',
|
|
||||||
},
|
|
||||||
|
|
||||||
problemDiagnosis: [
|
|
||||||
{
|
|
||||||
category: '715개 영상 대비 구독자 전환율 낮음',
|
|
||||||
detail: 'YouTube 715개 영상 누적, 구독자 8K — 영상당 평균 구독자 11명 수준. SEO 최적화·썸네일 시스템화로 즉시 개선 가능.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '리얼모델 콘텐츠 강점의 크로스채널 미활용',
|
|
||||||
detail: '리얼모델 브이로그가 YouTube에서 강점이나 Instagram·Blog·강남언니 리뷰 연동이 체계화되지 않아 콘텐츠 파급 효과가 제한됨.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '네이버 카페 자산 미활용',
|
|
||||||
detail: '연탐 네이버 카페 운영 중이나 공식 채널과 연동 미흡 — 카페 리뷰/후기를 SNS 콘텐츠로 재활용하는 체계 부재.',
|
|
||||||
severity: 'warning',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
transformation: {
|
|
||||||
...mockReport.transformation,
|
|
||||||
brandIdentity: [
|
|
||||||
{ area: '브랜드 슬로건', asIs: '"지금, 예뻐져라!"', toBe: '슬로건 유지 + 채널 통일 적용' },
|
|
||||||
{ area: '컬러', asIs: '다크 계열', toBe: 'Primary: Dark Navy (#1A1A2E) + Accent: Crimson (#E94560) 명문화' },
|
|
||||||
{ area: '리얼모델 포지셔닝', asIs: '일부 콘텐츠', toBe: '"리얼모델로 증명하는 티에스" 채널 전략 중심화' },
|
|
||||||
],
|
|
||||||
platformStrategies: [
|
|
||||||
{
|
|
||||||
platform: 'YouTube',
|
|
||||||
icon: 'youtube',
|
|
||||||
currentMetric: '8K subscribers · 715 videos',
|
|
||||||
targetMetric: '20K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: 'Shorts 재편집 가속', detail: '715개 영상에서 Shorts 200개 추출' },
|
|
||||||
{ strategy: '썸네일 시스템화', detail: '리얼모델 비포/애프터 통일 썸네일' },
|
|
||||||
{ strategy: 'SEO 메타데이터 일괄 최적화', detail: '"강남 눈코가슴" 타이틀 패턴 적용' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
platform: 'Instagram',
|
|
||||||
icon: 'instagram',
|
|
||||||
currentMetric: '2,626 followers',
|
|
||||||
targetMetric: '60K / 12개월',
|
|
||||||
strategies: [
|
|
||||||
{ strategy: 'Reels 주 5회', detail: 'YouTube Shorts 동시 배포' },
|
|
||||||
{ strategy: '리얼모델 하이라이트 강화', detail: '시술별 Before/After 하이라이트 재구성' },
|
|
||||||
{ strategy: '카페 후기 → Instagram 재편집', detail: '연탐 카페 후기 → 카루셀 콘텐츠' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
websiteImprovements: [
|
|
||||||
{ area: 'YouTube 임베드', asIs: '없음', toBe: '시술 페이지별 리얼모델 영상 임베드' },
|
|
||||||
{ area: '카카오톡 상담 버튼', asIs: '일부 페이지', toBe: '전 페이지 플로팅 버튼' },
|
|
||||||
],
|
|
||||||
newChannelProposals: [
|
|
||||||
{ channel: 'TikTok', priority: 'P1', rationale: '20~30대 첫 수술 고민층, Shorts 동시 배포' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
roadmap: [
|
|
||||||
{
|
|
||||||
month: 1,
|
|
||||||
title: 'Foundation',
|
|
||||||
subtitle: 'SEO & 썸네일',
|
|
||||||
tasks: [
|
|
||||||
{ task: 'YouTube 715개 영상 SEO 메타데이터 일괄 최적화', completed: false },
|
|
||||||
{ task: '리얼모델 썸네일 통일 디자인 시스템 구축', completed: false },
|
|
||||||
{ task: 'Instagram Reels 주 5회 업로드 시작', completed: false },
|
|
||||||
{ task: '연탐 카페 후기 SNS 콘텐츠화 착수', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 2,
|
|
||||||
title: 'Content Engine',
|
|
||||||
subtitle: '리얼모델 확장',
|
|
||||||
tasks: [
|
|
||||||
{ task: 'YouTube Shorts 200개 추출 완료', completed: false },
|
|
||||||
{ task: 'Instagram 리얼모델 Before/After 하이라이트 재구성', completed: false },
|
|
||||||
{ task: '강남언니 리뷰 응답률 50% 달성', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
month: 3,
|
|
||||||
title: 'Optimization',
|
|
||||||
subtitle: '광고 & 전환',
|
|
||||||
tasks: [
|
|
||||||
{ task: '고성과 리얼모델 콘텐츠 유료 광고 세팅', completed: false },
|
|
||||||
{ task: '전환 추적 체계 구축 (UTM + GA4)', completed: false },
|
|
||||||
{ task: 'KPI 리뷰', completed: false },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
kpiDashboard: [
|
|
||||||
{ metric: 'YouTube 구독자', current: '8K', target3Month: '12K', target12Month: '20K' },
|
|
||||||
{ metric: 'YouTube Shorts 업로드', current: '주 1~2회', target3Month: '주 3회', target12Month: '주 5회' },
|
|
||||||
{ metric: 'Instagram 팔로워', current: '2,626', target3Month: '6K', target12Month: '15K' },
|
|
||||||
{ metric: 'Instagram Reels 평균 조회수', current: '낮음', target3Month: '8,000', target12Month: '25,000' },
|
|
||||||
{ metric: '강남언니 리뷰', current: '12,509', target3Month: '2,500', target12Month: '3,500' },
|
|
||||||
{ metric: '카카오톡 상담 전환', current: '측정 불가', target3Month: 'UTM 시작', target12Month: '월 50건' },
|
|
||||||
],
|
|
||||||
|
|
||||||
screenshots: [
|
|
||||||
{
|
|
||||||
id: 'yt-channel',
|
|
||||||
url: '/assets/clients/ts/screenshots/yt-channel.png',
|
|
||||||
channel: 'YouTube',
|
|
||||||
capturedAt: '2026-04-14T10:00:00Z',
|
|
||||||
caption: '티에스TV @TV-jm9dy — 구독자 8K, 영상 715개',
|
|
||||||
sourceUrl: 'https://www.youtube.com/channel/UCgnizu8p7lbCnfIs76O8J-A',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'ig-profile',
|
|
||||||
url: '/assets/clients/ts/screenshots/ig-profile.png',
|
|
||||||
channel: 'Instagram',
|
|
||||||
capturedAt: '2026-04-14T10:02:00Z',
|
|
||||||
caption: 'Instagram @tsprs_official — 2,626 팔로워, 리얼모델 콘텐츠',
|
|
||||||
sourceUrl: 'https://www.instagram.com/tsprs_official/',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'fb-page',
|
|
||||||
url: '/assets/clients/ts/screenshots/fb-page.png',
|
|
||||||
channel: 'Facebook',
|
|
||||||
capturedAt: '2026-04-14T10:03:00Z',
|
|
||||||
caption: 'Facebook @tsprs — 3,900 팔로워',
|
|
||||||
sourceUrl: 'https://www.facebook.com/tsprs',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'gangnamunni',
|
|
||||||
url: '/assets/clients/ts/screenshots/gangnamunni.png',
|
|
||||||
channel: '강남언니',
|
|
||||||
capturedAt: '2026-04-14T10:04:00Z',
|
|
||||||
caption: '강남언니 — 티에스성형외과 9.5점, 12,509 리뷰',
|
|
||||||
sourceUrl: 'https://www.gangnamunni.com/hospitals/116',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'website-homepage',
|
|
||||||
url: '/assets/clients/ts/screenshots/website-homepage.png',
|
|
||||||
channel: 'Website',
|
|
||||||
capturedAt: '2026-04-14T10:05:00Z',
|
|
||||||
caption: 'tsprs.com — 공식 홈페이지',
|
|
||||||
sourceUrl: 'https://www.tsprs.com',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'naver-blog',
|
|
||||||
url: '/assets/clients/ts/screenshots/naver-blog.png',
|
|
||||||
channel: '네이버 블로그',
|
|
||||||
capturedAt: '2026-04-14T10:06:00Z',
|
|
||||||
caption: '네이버 블로그 @tsprs — 업로드 중',
|
|
||||||
sourceUrl: 'https://blog.naver.com/tsprs',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
@ -1,347 +0,0 @@
|
||||||
import type { MarketingReport } from '../types/report';
|
|
||||||
import { mockReport } from './mockReport';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 원진성형외과 — 데모 리포트
|
|
||||||
*
|
|
||||||
* 실측 (2026-04-14):
|
|
||||||
* - YouTube @wjwonjin (WJ원진성형외과): 구독자 1.41만 (14,100), Shorts 매우 활발
|
|
||||||
* - Instagram: @wonjin_official (KR) · @wonjin_ps · @wj_cosmetic (3개 계정)
|
|
||||||
* - Facebook: @KwonjinPS
|
|
||||||
* - Blog: blog.naver.com/popokpop
|
|
||||||
* - 홈페이지: k-wonjin.co.kr
|
|
||||||
* - 강남언니: 평점/리뷰 실측 예정
|
|
||||||
*/
|
|
||||||
export const mockReportWonjin: MarketingReport = {
|
|
||||||
...mockReport,
|
|
||||||
id: 'wonjin',
|
|
||||||
createdAt: '2026-04-14',
|
|
||||||
targetUrl: 'https://www.k-wonjin.co.kr',
|
|
||||||
overallScore: 62,
|
|
||||||
|
|
||||||
clinicSnapshot: {
|
|
||||||
...mockReport.clinicSnapshot,
|
|
||||||
name: '원진성형외과',
|
|
||||||
nameEn: 'Wonjin Plastic Surgery',
|
|
||||||
established: '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, details: '설치 확인 (추정)' },
|
|
||||||
{ name: 'Google Analytics', installed: true, details: 'GA4 추정' },
|
|
||||||
],
|
|
||||||
mainCTA: '전화 상담 + 다국어 온라인 예약',
|
|
||||||
},
|
|
||||||
|
|
||||||
problemDiagnosis: [
|
|
||||||
{
|
|
||||||
category: '3개 Instagram 계정 분산으로 브랜드 파워 희석',
|
|
||||||
detail: '@wonjin_official(23.4K 실측) + @wonjin_ps(18K) + @wj_cosmetic 3개 계정이 분산 운영돼 팔로워 합산 대비 실제 도달이 낮음. 통합 또는 역할 명확화 필수.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: 'Shorts 과다 의존 — 롱폼 전문성 콘텐츠 부족',
|
|
||||||
detail: 'YouTube Shorts 위주 업로드로 알고리즘 노출은 높으나, 코성형 전문 병원으로서의 신뢰도를 높이는 롱폼 Before/After·수술 과정 영상이 부족.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: '국제 환자 디지털 여정 미설계',
|
|
||||||
detail: '글로벌 Instagram · Facebook 영문 페이지가 있으나 랜딩페이지 다국어 전환 추적 체계 없음. 외국인 유입 대비 전환율 측정 불가.',
|
|
||||||
severity: 'critical',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
transformation: {
|
|
||||||
...mockReport.transformation,
|
|
||||||
brandIdentity: [
|
|
||||||
{ area: '다계정 전략', asIs: 'Instagram 3개 계정 역할 불명확', toBe: '@wonjin_official KR 메인 · @wj_cosmetic 글로벌 전용으로 역할 명확화' },
|
|
||||||
{ area: '컬러', asIs: '퍼플 계열 추정', toBe: 'Primary: Deep Purple (#2C1654) + Accent: Violet (#8B5CF6) 명문화' },
|
|
||||||
{ area: '전문성 포지셔닝', asIs: '종합 성형외과', toBe: '"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',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
@ -4,22 +4,6 @@ import type { MarketingPlan, ChannelStrategyCard, CalendarData, ContentStrategyD
|
||||||
import { fetchReportById, fetchActiveContentPlan, supabase } from '../lib/supabase';
|
import { fetchReportById, fetchActiveContentPlan, supabase } from '../lib/supabase';
|
||||||
import { transformReportToPlan } from '../lib/transformPlan';
|
import { transformReportToPlan } from '../lib/transformPlan';
|
||||||
import { mockPlan } from '../data/mockPlan';
|
import { mockPlan } from '../data/mockPlan';
|
||||||
import { mockPlanBanobagi } from '../data/mockPlan_banobagi';
|
|
||||||
import { mockPlanGrand } from '../data/mockPlan_grand';
|
|
||||||
import { mockPlanWonjin } from '../data/mockPlan_wonjin';
|
|
||||||
import { mockPlanTs } from '../data/mockPlan_ts';
|
|
||||||
import { mockPlanIrum } from '../data/mockPlan_irum';
|
|
||||||
import { mockPlanO2O } from '../data/mockPlan_o2o';
|
|
||||||
|
|
||||||
const DEMO_PLANS: Record<string, MarketingPlan> = {
|
|
||||||
'view-clinic': mockPlan,
|
|
||||||
'banobagi': mockPlanBanobagi,
|
|
||||||
'grand': mockPlanGrand,
|
|
||||||
'wonjin': mockPlanWonjin,
|
|
||||||
'ts': mockPlanTs,
|
|
||||||
'irum': mockPlanIrum,
|
|
||||||
'o2o': mockPlanO2O,
|
|
||||||
};
|
|
||||||
|
|
||||||
interface UseMarketingPlanResult {
|
interface UseMarketingPlanResult {
|
||||||
data: MarketingPlan | null;
|
data: MarketingPlan | null;
|
||||||
|
|
@ -105,16 +89,11 @@ export function useMarketingPlan(id: string | undefined): UseMarketingPlanResult
|
||||||
async function loadPlan() {
|
async function loadPlan() {
|
||||||
try {
|
try {
|
||||||
// ─── Dev / Demo: return mock data immediately ───
|
// ─── Dev / Demo: return mock data immediately ───
|
||||||
if (id === 'demo') {
|
if (id === 'demo' || id === 'view-clinic') {
|
||||||
setData(mockPlan);
|
setData(mockPlan);
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (id && id in DEMO_PLANS) {
|
|
||||||
setData(DEMO_PLANS[id]);
|
|
||||||
setIsLoading(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─── Source 1: Try content_plans table (AI-generated strategy) ───
|
// ─── Source 1: Try content_plans table (AI-generated strategy) ───
|
||||||
// First, resolve clinicId from navigation state or analysis_runs
|
// First, resolve clinicId from navigation state or analysis_runs
|
||||||
|
|
|
||||||
|
|
@ -5,32 +5,6 @@ import { fetchReportById } from '../lib/supabase';
|
||||||
import { transformApiReport, mergeEnrichment, type EnrichmentData } from '../lib/transformReport';
|
import { transformApiReport, mergeEnrichment, type EnrichmentData } from '../lib/transformReport';
|
||||||
import { normalizeInstagramHandle } from '../lib/normalizeHandles';
|
import { normalizeInstagramHandle } from '../lib/normalizeHandles';
|
||||||
import { mockReport } from '../data/mockReport';
|
import { mockReport } from '../data/mockReport';
|
||||||
import { mockReportBanobagi } from '../data/mockReport_banobagi';
|
|
||||||
import { mockReportGrand } from '../data/mockReport_grand';
|
|
||||||
import { mockReportWonjin } from '../data/mockReport_wonjin';
|
|
||||||
import { mockReportTs } from '../data/mockReport_ts';
|
|
||||||
import { mockReportIrum } from '../data/mockReport_irum';
|
|
||||||
import { mockReportO2O } from '../data/mockReport_o2o';
|
|
||||||
|
|
||||||
const DEMO_REPORTS: Record<string, MarketingReport> = {
|
|
||||||
'view-clinic': mockReport,
|
|
||||||
'banobagi': mockReportBanobagi,
|
|
||||||
'grand': mockReportGrand,
|
|
||||||
'wonjin': mockReportWonjin,
|
|
||||||
'ts': mockReportTs,
|
|
||||||
'irum': mockReportIrum,
|
|
||||||
'o2o': mockReportO2O,
|
|
||||||
};
|
|
||||||
|
|
||||||
const DEMO_HANDLES: Record<string, Record<string, string | null>> = {
|
|
||||||
'view-clinic': { instagram: '@viewplastic', youtube: '@ViewclinicKR', facebook: 'viewps1' },
|
|
||||||
'banobagi': { instagram: '@banobagi_ps', youtube: '@banobagips', facebook: 'BanobagiPlasticSurgery' },
|
|
||||||
'grand': { instagram: '@grand_korea', youtube: '@grandsurgery_QnA', facebook: 'grandps.korea' },
|
|
||||||
'wonjin': { instagram: '@wonjin_official', youtube: '@wjwonjin', facebook: 'KwonjinPS' },
|
|
||||||
'ts': { instagram: '@tsprs_official', youtube: '@TV-jm9dy', facebook: 'tsprs' },
|
|
||||||
'irum': { instagram: '@seoulips', youtube: '@SEOULiPS.', facebook: null },
|
|
||||||
'o2o': { instagram: '@o2o_clinic', youtube: '@o2oclinic', facebook: 'O2OClinicGlobal' },
|
|
||||||
};
|
|
||||||
|
|
||||||
interface UseReportResult {
|
interface UseReportResult {
|
||||||
data: MarketingReport | null;
|
data: MarketingReport | null;
|
||||||
|
|
@ -65,10 +39,10 @@ export function useReport(id: string | undefined): UseReportResult {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Source 0: Demo mode — ALWAYS takes priority over any other source
|
// Source 0: Demo mode — ALWAYS takes priority over any other source
|
||||||
if (id && id in DEMO_REPORTS) {
|
if (id === 'view-clinic') {
|
||||||
setData(DEMO_REPORTS[id]);
|
setData(mockReport);
|
||||||
setIsEnriched(true);
|
setIsEnriched(true);
|
||||||
setSocialHandles(DEMO_HANDLES[id] ?? null);
|
setSocialHandles({ instagram: '@viewplastic', youtube: '@ViewclinicKR', facebook: 'viewps1' });
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,8 @@
|
||||||
@import "tailwindcss";
|
@import "tailwindcss";
|
||||||
|
|
||||||
/* Self-hosted Pretendard Variable — CDN/네트워크 차단 환경에서도 동일 렌더링 보장 */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Pretendard Variable';
|
|
||||||
font-weight: 45 920;
|
|
||||||
font-style: normal;
|
|
||||||
font-display: swap;
|
|
||||||
src: url('/fonts/PretendardVariable.woff2') format('woff2-variations');
|
|
||||||
}
|
|
||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
/* fallback 체인: self-host Pretendard → CDN Pretendard → Inter → 한글 시스템 폰트 (Mac/Win/Android) → sans-serif */
|
--font-sans: "Pretendard Variable", "Pretendard", "Inter", ui-sans-serif, system-ui, sans-serif;
|
||||||
--font-sans: "Pretendard Variable", "Pretendard", "Inter", "Apple SD Gothic Neo", "Malgun Gothic", "맑은 고딕", "Noto Sans KR", ui-sans-serif, system-ui, sans-serif;
|
--font-serif: "Playfair Display", ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
|
||||||
--font-serif: "Playfair Display", "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans KR", ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
|
|
||||||
|
|
||||||
--color-primary-900: #0A1128; /* Dark Navy for text and buttons */
|
--color-primary-900: #0A1128; /* Dark Navy for text and buttons */
|
||||||
--color-primary-800: #1A2B5E;
|
--color-primary-800: #1A2B5E;
|
||||||
|
|
|
||||||
|
|
@ -1,259 +0,0 @@
|
||||||
/**
|
|
||||||
* classifyUrls — 랜딩 MultiChannelInput 전용 URL 분류 유틸.
|
|
||||||
*
|
|
||||||
* 사용자가 textarea에 붙여넣은 여러 URL을 7개 채널(holder)로 분류합니다.
|
|
||||||
* - homepage · youtube · instagram · facebook · naverPlace · naverBlog · gangnamUnni · unknown
|
|
||||||
*
|
|
||||||
* 설계 결정:
|
|
||||||
* 1) 결정론적 regex 분류 (AI 추측 없음) — `supabase/functions/_shared/extractSocialLinks.ts`
|
|
||||||
* 의 패턴을 브라우저로 복제 (Vite가 Supabase 디렉토리를 번들에 끌고 들어가는 것을 방지).
|
|
||||||
* ⚠️ 두 파일의 패턴은 **동일하게 유지**되어야 합니다. SNS 플랫폼 URL 구조 변경 시 같이 수정하세요.
|
|
||||||
*
|
|
||||||
* 2) 우선순위: naverPlace / gangnamUnni (고유 도메인) → YouTube / Instagram / Facebook / naverBlog
|
|
||||||
* → 미매치이면서 `new URL()` 성공한 URL 중 **호스트네임이 SNS 도메인이 아닌 경우만** homepage.
|
|
||||||
* 호스트네임이 SNS인데 프로필 패턴 불일치 (예: instagram.com/p/XYZ, youtube.com/watch)는 `unknown`.
|
|
||||||
* ▸ "homepage" 필드가 분석 첫 진입점이라서, 여기에 잘못된 URL이 들어가면 전체 파이프라인이
|
|
||||||
* 잘못된 축으로 돌아갑니다. 따라서 방어적으로 분류합니다.
|
|
||||||
*
|
|
||||||
* 3) 값은 **원본 URL 문자열**을 그대로 보관 — backend `discover-channels`의 `manualChannels`는
|
|
||||||
* URL을 받아서 내부에서 handle을 추출하므로, 프론트에서 미리 handle로 변환하지 않습니다.
|
|
||||||
* (extractHandleFromUrl in supabase/functions/discover-channels/index.ts)
|
|
||||||
*
|
|
||||||
* 4) 중복 제거 — 공백/줄바꿈/쉼표로 분리 후, 정규화된 URL(소문자 + trailing slash 제거) 기준으로 dedup.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export interface ClassifiedUrls {
|
|
||||||
homepage: string[];
|
|
||||||
youtube: string[];
|
|
||||||
instagram: string[];
|
|
||||||
facebook: string[];
|
|
||||||
naverPlace: string[];
|
|
||||||
naverBlog: string[];
|
|
||||||
gangnamUnni: string[];
|
|
||||||
/** 파싱 실패 or SNS 도메인이지만 프로필이 아닌 URL (포스트/비디오 등) */
|
|
||||||
unknown: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/** SNS 호스트네임 집합 — 이들 도메인인데 프로필 패턴에 매치되지 않으면 `unknown`으로 강제. */
|
|
||||||
const SNS_HOSTNAMES = new Set([
|
|
||||||
'instagram.com',
|
|
||||||
'www.instagram.com',
|
|
||||||
'm.instagram.com',
|
|
||||||
'youtube.com',
|
|
||||||
'www.youtube.com',
|
|
||||||
'm.youtube.com',
|
|
||||||
'youtu.be',
|
|
||||||
'facebook.com',
|
|
||||||
'www.facebook.com',
|
|
||||||
'm.facebook.com',
|
|
||||||
'fb.com',
|
|
||||||
'blog.naver.com',
|
|
||||||
'm.blog.naver.com',
|
|
||||||
'place.naver.com',
|
|
||||||
'm.place.naver.com',
|
|
||||||
'map.naver.com',
|
|
||||||
'gangnamunni.com',
|
|
||||||
'm.gangnamunni.com',
|
|
||||||
'www.gangnamunni.com',
|
|
||||||
]);
|
|
||||||
|
|
||||||
/** Instagram 프로필이 아닌 경로 (포스트/릴/스토리 등) */
|
|
||||||
const IG_SKIP = new Set([
|
|
||||||
'p', 'reel', 'reels', 'stories', 'explore', 'accounts',
|
|
||||||
'about', 'developer', 'legal', 'privacy', 'terms',
|
|
||||||
]);
|
|
||||||
|
|
||||||
/** Facebook 페이지가 아닌 경로 */
|
|
||||||
const FB_SKIP = new Set([
|
|
||||||
'sharer', 'share', 'login', 'help', 'pages', 'events', 'groups',
|
|
||||||
'marketplace', 'watch', 'gaming', 'privacy', 'policies', 'tr',
|
|
||||||
'dialog', 'plugins', 'photo', 'video', 'reel',
|
|
||||||
]);
|
|
||||||
|
|
||||||
/** YouTube 프로필 패턴: `@handle`, `channel/UC...`, `c/custom`, `user/...` */
|
|
||||||
const YT_PROFILE_RE = /youtube\.com\/(?:@[a-zA-Z0-9._-]+|channel\/UC[a-zA-Z0-9_-]+|c\/[a-zA-Z0-9._-]+|user\/[a-zA-Z0-9._-]+)/i;
|
|
||||||
|
|
||||||
/** Naver Place: m.place.naver.com/hospital/{id}, place.naver.com/hospital/{id}, map.naver.com/p/entry/place/{id} */
|
|
||||||
const NAVER_PLACE_RE = /(?:m\.)?place\.naver\.com\/[a-z]+\/\d+|map\.naver\.com\/p\/entry\/place\/\d+/i;
|
|
||||||
|
|
||||||
/** Naver Blog: blog.naver.com/{id} (또는 m.blog.naver.com) */
|
|
||||||
const NAVER_BLOG_RE = /(?:m\.)?blog\.naver\.com\/[a-zA-Z0-9_-]+/i;
|
|
||||||
|
|
||||||
/** 강남언니: gangnamunni.com/hospitals/{id-or-slug} */
|
|
||||||
const GANGNAMUNNI_RE = /(?:m\.|www\.)?gangnamunni\.com\/hospitals?\/[a-zA-Z0-9_-]+/i;
|
|
||||||
|
|
||||||
/** Instagram 프로필: instagram.com/{handle} — 포스트/릴 등은 아래 IG_SKIP로 걸러냄 */
|
|
||||||
const IG_RE = /(?:www\.|m\.)?instagram\.com\/([a-zA-Z0-9._]+)\/?/i;
|
|
||||||
|
|
||||||
/** Facebook 페이지: facebook.com/{page} */
|
|
||||||
const FB_RE = /(?:www\.|m\.)?facebook\.com\/([a-zA-Z0-9._-]+)\/?/i;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* URL 문자열을 정규화해 중복 체크 키로 사용.
|
|
||||||
* - 소문자, trailing slash 제거, scheme 유지
|
|
||||||
* - URL 파싱 실패 시 원본 trim.
|
|
||||||
*/
|
|
||||||
function normalizeForDedup(url: string): string {
|
|
||||||
try {
|
|
||||||
const u = new URL(url);
|
|
||||||
const path = u.pathname.replace(/\/+$/, '');
|
|
||||||
return `${u.protocol}//${u.hostname.toLowerCase()}${path}${u.search}`.toLowerCase();
|
|
||||||
} catch {
|
|
||||||
return url.trim().toLowerCase();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 단일 URL 토큰을 분류해서 어느 버킷에 넣을지 결정.
|
|
||||||
* Returns [bucketKey, originalUrl] 또는 null (이미 중복).
|
|
||||||
*/
|
|
||||||
function classifySingle(
|
|
||||||
rawToken: string,
|
|
||||||
): { bucket: keyof ClassifiedUrls; value: string } | null {
|
|
||||||
const token = rawToken.trim();
|
|
||||||
if (!token || token.length < 4) return null;
|
|
||||||
|
|
||||||
// URL 파싱 시도 — 실패하면 unknown
|
|
||||||
let parsed: URL;
|
|
||||||
try {
|
|
||||||
// scheme 없는 경우 https:// 추가 (e.g., "instagram.com/foo")
|
|
||||||
const withScheme = /^https?:\/\//i.test(token) ? token : `https://${token}`;
|
|
||||||
parsed = new URL(withScheme);
|
|
||||||
} catch {
|
|
||||||
return { bucket: 'unknown', value: token };
|
|
||||||
}
|
|
||||||
|
|
||||||
const hostname = parsed.hostname.toLowerCase();
|
|
||||||
const fullUrl = parsed.toString();
|
|
||||||
|
|
||||||
// 1) Naver Place (고유 도메인)
|
|
||||||
if (NAVER_PLACE_RE.test(fullUrl)) {
|
|
||||||
return { bucket: 'naverPlace', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2) 강남언니 (고유 도메인)
|
|
||||||
if (GANGNAMUNNI_RE.test(fullUrl)) {
|
|
||||||
return { bucket: 'gangnamUnni', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3) Naver Blog
|
|
||||||
if (NAVER_BLOG_RE.test(fullUrl)) {
|
|
||||||
return { bucket: 'naverBlog', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4) YouTube — 프로필 패턴만 매치
|
|
||||||
if (hostname.endsWith('youtube.com') || hostname === 'youtu.be') {
|
|
||||||
if (YT_PROFILE_RE.test(fullUrl)) {
|
|
||||||
return { bucket: 'youtube', value: fullUrl };
|
|
||||||
}
|
|
||||||
// youtube.com 인데 프로필 아님 (watch URL 등) → unknown
|
|
||||||
return { bucket: 'unknown', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
// 5) Instagram
|
|
||||||
if (hostname.endsWith('instagram.com')) {
|
|
||||||
const m = fullUrl.match(IG_RE);
|
|
||||||
const firstSeg = m?.[1];
|
|
||||||
if (firstSeg && !IG_SKIP.has(firstSeg.toLowerCase())) {
|
|
||||||
return { bucket: 'instagram', value: fullUrl };
|
|
||||||
}
|
|
||||||
return { bucket: 'unknown', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
// 6) Facebook
|
|
||||||
if (hostname.endsWith('facebook.com') || hostname.endsWith('fb.com')) {
|
|
||||||
const m = fullUrl.match(FB_RE);
|
|
||||||
const firstSeg = m?.[1];
|
|
||||||
if (firstSeg && !FB_SKIP.has(firstSeg.toLowerCase())) {
|
|
||||||
return { bucket: 'facebook', value: fullUrl };
|
|
||||||
}
|
|
||||||
return { bucket: 'unknown', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
// 7) 남은 케이스: SNS 도메인이면 unknown (프로필 패턴 미매치), 아니면 homepage
|
|
||||||
if (SNS_HOSTNAMES.has(hostname)) {
|
|
||||||
return { bucket: 'unknown', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
return { bucket: 'homepage', value: fullUrl };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 사용자 textarea 입력 → 7채널 분류 결과.
|
|
||||||
* 공백/쉼표/줄바꿈으로 분리된 각 토큰을 개별 URL로 간주합니다.
|
|
||||||
*/
|
|
||||||
export function classifyUrls(input: string): ClassifiedUrls {
|
|
||||||
const result: ClassifiedUrls = {
|
|
||||||
homepage: [],
|
|
||||||
youtube: [],
|
|
||||||
instagram: [],
|
|
||||||
facebook: [],
|
|
||||||
naverPlace: [],
|
|
||||||
naverBlog: [],
|
|
||||||
gangnamUnni: [],
|
|
||||||
unknown: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!input || typeof input !== 'string') return result;
|
|
||||||
|
|
||||||
// 공백/쉼표/줄바꿈으로 분리
|
|
||||||
const tokens = input.split(/[\s,]+/).map((t) => t.trim()).filter(Boolean);
|
|
||||||
|
|
||||||
// 버킷별 중복 체크 — 같은 URL이 textarea에 두 번 나와도 한 번만
|
|
||||||
const seen: Record<keyof ClassifiedUrls, Set<string>> = {
|
|
||||||
homepage: new Set(),
|
|
||||||
youtube: new Set(),
|
|
||||||
instagram: new Set(),
|
|
||||||
facebook: new Set(),
|
|
||||||
naverPlace: new Set(),
|
|
||||||
naverBlog: new Set(),
|
|
||||||
gangnamUnni: new Set(),
|
|
||||||
unknown: new Set(),
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const token of tokens) {
|
|
||||||
const classified = classifySingle(token);
|
|
||||||
if (!classified) continue;
|
|
||||||
|
|
||||||
const key = normalizeForDedup(classified.value);
|
|
||||||
if (seen[classified.bucket].has(key)) continue;
|
|
||||||
seen[classified.bucket].add(key);
|
|
||||||
result[classified.bucket].push(classified.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 채널 중 하나라도 분석 대상이 있는지 — 분석 시작 버튼 활성화 조건.
|
|
||||||
* homepage·SNS 중 최소 1건이 있으면 true. unknown은 제외.
|
|
||||||
*/
|
|
||||||
export function hasAnalyzableChannels(classified: ClassifiedUrls): boolean {
|
|
||||||
return (
|
|
||||||
classified.homepage.length > 0 ||
|
|
||||||
classified.youtube.length > 0 ||
|
|
||||||
classified.instagram.length > 0 ||
|
|
||||||
classified.facebook.length > 0 ||
|
|
||||||
classified.naverPlace.length > 0 ||
|
|
||||||
classified.naverBlog.length > 0 ||
|
|
||||||
classified.gangnamUnni.length > 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 분석 파이프라인의 "primary URL" 결정.
|
|
||||||
* 홈페이지가 있으면 최우선, 없으면 검출된 첫 SNS URL 반환.
|
|
||||||
* `discover-channels` Edge Function의 `url` 필드 (필수)로 사용됩니다.
|
|
||||||
*/
|
|
||||||
export function pickPrimaryUrl(classified: ClassifiedUrls): string | null {
|
|
||||||
if (classified.homepage[0]) return classified.homepage[0];
|
|
||||||
// 홈페이지 없으면 SNS 중 아무거나 대표값으로
|
|
||||||
const fallback =
|
|
||||||
classified.naverPlace[0] ||
|
|
||||||
classified.instagram[0] ||
|
|
||||||
classified.youtube[0] ||
|
|
||||||
classified.facebook[0] ||
|
|
||||||
classified.naverBlog[0] ||
|
|
||||||
classified.gangnamUnni[0];
|
|
||||||
return fallback || null;
|
|
||||||
}
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
/**
|
|
||||||
* contact — 회사 연락처 정보 중앙 관리.
|
|
||||||
*
|
|
||||||
* PricingPage / Navbar / LoginPage / CTA 등 여러 파일에서
|
|
||||||
* `contact@o2o.kr`과 mailto 쿼리를 중복 하드코딩하던 것을 일원화했습니다.
|
|
||||||
*
|
|
||||||
* 변경 이력 (PART III 피봇):
|
|
||||||
* - "Free Report" 진입점 제거 → 모든 리드를 문의하기 단일 채널로 통일
|
|
||||||
* - 계약 기반 B2B 영업 모델 반영 (온라인 결제/무료 체험 없음)
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const CONTACT_EMAIL = 'contact@o2o.kr';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* INFINITH 태그를 자동으로 prefix한 mailto 링크 생성.
|
|
||||||
* @param subject 이메일 제목에 들어갈 문구 (자동으로 "[INFINITH] " prefix 추가됨).
|
|
||||||
*
|
|
||||||
* 예: buildContactMailto("도입 문의") → mailto:contact@o2o.kr?subject=%5BINFINITH%5D%20%EB%8F%84%EC%9E%85%20%EB%AC%B8%EC%9D%98
|
|
||||||
*/
|
|
||||||
export function buildContactMailto(subject: string): string {
|
|
||||||
const normalizedSubject = subject.trim() || '문의';
|
|
||||||
return `mailto:${CONTACT_EMAIL}?subject=${encodeURIComponent(`[INFINITH] ${normalizedSubject}`)}`;
|
|
||||||
}
|
|
||||||
|
|
@ -121,40 +121,17 @@ export async function scrapeWebsite(url: string, clinicName?: string) {
|
||||||
|
|
||||||
// ─── Pipeline V2 API Functions ───
|
// ─── Pipeline V2 API Functions ───
|
||||||
|
|
||||||
/**
|
|
||||||
* 사용자가 직접 붙여넣은 채널 URL 묶음.
|
|
||||||
* 전달 시 Edge Function이 해당 플랫폼의 Firecrawl discovery를 스킵하고
|
|
||||||
* 제공된 URL을 `verified_channels`에 직접 주입합니다.
|
|
||||||
*/
|
|
||||||
export interface ManualChannels {
|
|
||||||
youtube?: string[];
|
|
||||||
instagram?: string[];
|
|
||||||
facebook?: string[];
|
|
||||||
naverPlace?: string[];
|
|
||||||
naverBlog?: string[];
|
|
||||||
gangnamUnni?: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Phase 1: Discover & verify social channels from website URL.
|
* Phase 1: Discover & verify social channels from website URL.
|
||||||
* Returns verified handles + reportId for subsequent phases.
|
* Returns verified handles + reportId for subsequent phases.
|
||||||
*
|
|
||||||
* @param url 병원 홈페이지 URL (필수).
|
|
||||||
* @param clinicName 병원명 (선택) — 수동 입력 또는 clinic_registry 매칭용.
|
|
||||||
* @param manualChannels (선택) 사용자가 직접 붙여넣은 채널 URL. 존재하는 플랫폼은
|
|
||||||
* Firecrawl discovery를 스킵하고 사용자 제공 값을 우선 사용합니다.
|
|
||||||
*/
|
*/
|
||||||
export async function discoverChannels(
|
export async function discoverChannels(url: string, clinicName?: string) {
|
||||||
url: string,
|
|
||||||
clinicName?: string,
|
|
||||||
manualChannels?: ManualChannels,
|
|
||||||
) {
|
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
`${supabaseUrl}/functions/v1/discover-channels`,
|
`${supabaseUrl}/functions/v1/discover-channels`,
|
||||||
{
|
{
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: fnHeaders(),
|
headers: fnHeaders(),
|
||||||
body: JSON.stringify({ url, clinicName, manualChannels }),
|
body: JSON.stringify({ url, clinicName }),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import { createRoot } from 'react-dom/client';
|
||||||
import { BrowserRouter, Routes, Route } from 'react-router';
|
import { BrowserRouter, Routes, Route } from 'react-router';
|
||||||
import App from './App.tsx';
|
import App from './App.tsx';
|
||||||
import LandingPage from './pages/LandingPage.tsx';
|
import LandingPage from './pages/LandingPage.tsx';
|
||||||
import PricingPage from './pages/PricingPage.tsx';
|
|
||||||
import AnalysisLoadingPage from './pages/AnalysisLoadingPage.tsx';
|
import AnalysisLoadingPage from './pages/AnalysisLoadingPage.tsx';
|
||||||
import ReportPage from './pages/ReportPage.tsx';
|
import ReportPage from './pages/ReportPage.tsx';
|
||||||
import MarketingPlanPage from './pages/MarketingPlanPage.tsx';
|
import MarketingPlanPage from './pages/MarketingPlanPage.tsx';
|
||||||
|
|
@ -14,7 +13,6 @@ import PerformancePage from './pages/PerformancePage.tsx';
|
||||||
import DataValidationPage from './pages/DataValidationPage.tsx';
|
import DataValidationPage from './pages/DataValidationPage.tsx';
|
||||||
import ClinicProfilePage from './pages/ClinicProfilePage.tsx';
|
import ClinicProfilePage from './pages/ClinicProfilePage.tsx';
|
||||||
import ApiDashboardPage from './pages/ApiDashboardPage.tsx';
|
import ApiDashboardPage from './pages/ApiDashboardPage.tsx';
|
||||||
import LoginPage from './pages/LoginPage.tsx';
|
|
||||||
import './index.css';
|
import './index.css';
|
||||||
|
|
||||||
createRoot(document.getElementById('root')!).render(
|
createRoot(document.getElementById('root')!).render(
|
||||||
|
|
@ -23,8 +21,6 @@ createRoot(document.getElementById('root')!).render(
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route element={<App />}>
|
<Route element={<App />}>
|
||||||
<Route index element={<LandingPage />} />
|
<Route index element={<LandingPage />} />
|
||||||
<Route path="pricing" element={<PricingPage />} />
|
|
||||||
<Route path="login" element={<LoginPage />} />
|
|
||||||
<Route path="report/loading" element={<AnalysisLoadingPage />} />
|
<Route path="report/loading" element={<AnalysisLoadingPage />} />
|
||||||
<Route path="report/loading/:reportId" element={<AnalysisLoadingPage />} />
|
<Route path="report/loading/:reportId" element={<AnalysisLoadingPage />} />
|
||||||
<Route path="report/:id" element={<ReportPage />} />
|
<Route path="report/:id" element={<ReportPage />} />
|
||||||
|
|
|
||||||
|
|
@ -57,12 +57,7 @@ export default function AnalysisLoadingPage() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const { reportId: urlReportId } = useParams<{ reportId?: string }>();
|
const { reportId: urlReportId } = useParams<{ reportId?: string }>();
|
||||||
const locState = (location.state as {
|
const url = (location.state as { url?: string })?.url;
|
||||||
url?: string;
|
|
||||||
manualChannels?: import('../lib/supabase').ManualChannels;
|
|
||||||
}) ?? {};
|
|
||||||
const url = locState.url;
|
|
||||||
const manualChannels = locState.manualChannels;
|
|
||||||
const hasStarted = useRef(false);
|
const hasStarted = useRef(false);
|
||||||
|
|
||||||
const phaseIndex = PHASE_STEPS.findIndex(s => s.key === phase);
|
const phaseIndex = PHASE_STEPS.findIndex(s => s.key === phase);
|
||||||
|
|
@ -81,9 +76,7 @@ export default function AnalysisLoadingPage() {
|
||||||
if (startPhase === 'discovering') {
|
if (startPhase === 'discovering') {
|
||||||
if (!startUrl) throw new Error('No URL provided');
|
if (!startUrl) throw new Error('No URL provided');
|
||||||
setPhase('discovering');
|
setPhase('discovering');
|
||||||
// manualChannels가 있으면 Edge Function이 Firecrawl discovery를 스킵하고
|
const discovery = await discoverChannels(startUrl);
|
||||||
// 사용자 제공 URL을 직접 verified_channels에 주입합니다.
|
|
||||||
const discovery = await discoverChannels(startUrl, undefined, manualChannels);
|
|
||||||
if (!discovery.success) throw new Error(discovery.error || 'Channel discovery failed');
|
if (!discovery.success) throw new Error(discovery.error || 'Channel discovery failed');
|
||||||
reportId = discovery.reportId;
|
reportId = discovery.reportId;
|
||||||
clinicId = discovery.clinicId;
|
clinicId = discovery.clinicId;
|
||||||
|
|
@ -153,7 +146,7 @@ export default function AnalysisLoadingPage() {
|
||||||
setErrorDomain((err as { domain?: string }).domain || null);
|
setErrorDomain((err as { domain?: string }).domain || null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [navigate, manualChannels]);
|
}, [navigate]);
|
||||||
|
|
||||||
// Retry from the current failed phase
|
// Retry from the current failed phase
|
||||||
const handleRetry = useCallback(() => {
|
const handleRetry = useCallback(() => {
|
||||||
|
|
|
||||||
|
|
@ -1,130 +0,0 @@
|
||||||
/**
|
|
||||||
* LoginPage — 계약 병원 전용 로그인 (스캐폴딩).
|
|
||||||
*
|
|
||||||
* 현재 상태:
|
|
||||||
* - UI·라우트 스캐폴딩만 제공합니다. 실제 Supabase Auth 연동은 후속 작업입니다.
|
|
||||||
* - 제출 시 안내 메시지만 표시하고, 리드는 문의하기로 유도합니다.
|
|
||||||
*
|
|
||||||
* 향후 작업:
|
|
||||||
* - Supabase `signInWithPassword` 연동
|
|
||||||
* - 세션 훅 (`useSession`) + ProtectedRoute 적용
|
|
||||||
* - 로그인 후 대시보드 리다이렉트
|
|
||||||
*/
|
|
||||||
import { useState, type FormEvent } from 'react';
|
|
||||||
import { Link } from 'react-router';
|
|
||||||
import { ArrowRight } from 'lucide-react';
|
|
||||||
import { buildContactMailto } from '../lib/contact';
|
|
||||||
|
|
||||||
export default function LoginPage() {
|
|
||||||
const [email, setEmail] = useState('');
|
|
||||||
const [password, setPassword] = useState('');
|
|
||||||
const [notice, setNotice] = useState<string | null>(null);
|
|
||||||
|
|
||||||
const handleSubmit = (e: FormEvent) => {
|
|
||||||
e.preventDefault();
|
|
||||||
setNotice(
|
|
||||||
'로그인 기능은 준비 중입니다. 계약을 희망하시는 경우 contact@o2o.kr 로 문의 주세요.',
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<section className="min-h-screen pt-32 pb-20 px-6 bg-gradient-to-b from-indigo-50/60 via-white to-white">
|
|
||||||
<div className="max-w-md mx-auto">
|
|
||||||
{/* 헤드라인 */}
|
|
||||||
<div className="text-center mb-8">
|
|
||||||
<Link
|
|
||||||
to="/"
|
|
||||||
className="font-serif text-3xl font-black tracking-[0.05em] bg-gradient-to-r from-[#4F1DA1] to-[#021341] bg-clip-text text-transparent"
|
|
||||||
>
|
|
||||||
INFINITH
|
|
||||||
</Link>
|
|
||||||
<h1 className="text-2xl font-serif font-bold text-primary-900 mt-6 mb-2">
|
|
||||||
계약 병원 전용 로그인
|
|
||||||
</h1>
|
|
||||||
<p className="text-sm text-slate-500 break-keep leading-relaxed">
|
|
||||||
계약 완료 시 별도 제공되는 자격 정보로 로그인하실 수 있습니다.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 준비중 배너 */}
|
|
||||||
<div className="mb-6 rounded-2xl bg-amber-50/80 border border-amber-200 p-4 text-center">
|
|
||||||
<p className="text-xs font-semibold text-amber-800 break-keep leading-relaxed">
|
|
||||||
현재 로그인 기능은 준비 중입니다.
|
|
||||||
<br />
|
|
||||||
신규 도입 문의는 하단 "문의하기"를 이용해 주세요.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 폼 카드 */}
|
|
||||||
<form
|
|
||||||
onSubmit={handleSubmit}
|
|
||||||
className="rounded-3xl bg-white border border-slate-200 shadow-sm p-8 space-y-5"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
htmlFor="login-email"
|
|
||||||
className="block text-xs font-semibold text-slate-600 mb-2"
|
|
||||||
>
|
|
||||||
이메일
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
id="login-email"
|
|
||||||
type="email"
|
|
||||||
value={email}
|
|
||||||
onChange={(e) => setEmail(e.target.value)}
|
|
||||||
placeholder="clinic@example.com"
|
|
||||||
className="w-full px-4 py-3 text-sm bg-slate-50 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-accent/20 focus:border-accent/40 text-primary-900 placeholder:text-slate-400 transition-all"
|
|
||||||
autoComplete="email"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
htmlFor="login-password"
|
|
||||||
className="block text-xs font-semibold text-slate-600 mb-2"
|
|
||||||
>
|
|
||||||
비밀번호
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
id="login-password"
|
|
||||||
type="password"
|
|
||||||
value={password}
|
|
||||||
onChange={(e) => setPassword(e.target.value)}
|
|
||||||
placeholder="••••••••"
|
|
||||||
className="w-full px-4 py-3 text-sm bg-slate-50 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-accent/20 focus:border-accent/40 text-primary-900 placeholder:text-slate-400 transition-all"
|
|
||||||
autoComplete="current-password"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
className="w-full inline-flex items-center justify-center gap-2 px-6 py-3 text-sm font-bold text-white rounded-full bg-gradient-to-r from-[#4F1DA1] to-[#021341] shadow-sm hover:opacity-90 transition-all"
|
|
||||||
>
|
|
||||||
로그인
|
|
||||||
<ArrowRight className="w-4 h-4" />
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{notice && (
|
|
||||||
<div
|
|
||||||
role="status"
|
|
||||||
className="text-xs text-slate-600 text-center bg-slate-50 rounded-xl p-3 leading-relaxed break-keep"
|
|
||||||
>
|
|
||||||
{notice}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</form>
|
|
||||||
|
|
||||||
{/* 하단 문의하기 */}
|
|
||||||
<div className="mt-6 text-center">
|
|
||||||
<p className="text-xs text-slate-500 mb-2">계약을 원하시나요?</p>
|
|
||||||
<a
|
|
||||||
href={buildContactMailto('도입 문의 (LoginPage)')}
|
|
||||||
className="inline-flex items-center gap-1 text-sm font-semibold text-[#4F1DA1] hover:text-[#021341] transition-colors underline-offset-4 hover:underline"
|
|
||||||
>
|
|
||||||
문의하기 →
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import { useEffect } from 'react';
|
|
||||||
import { useParams, useLocation } from 'react-router';
|
import { useParams, useLocation } from 'react-router';
|
||||||
import { useMarketingPlan } from '../hooks/useMarketingPlan';
|
import { useMarketingPlan } from '../hooks/useMarketingPlan';
|
||||||
import { ReportNav } from '../components/report/ReportNav';
|
import { ReportNav } from '../components/report/ReportNav';
|
||||||
|
|
@ -34,21 +33,6 @@ export default function MarketingPlanPage() {
|
||||||
const clinicId = (location.state as { clinicId?: string } | undefined)?.clinicId || null;
|
const clinicId = (location.state as { clinicId?: string } | undefined)?.clinicId || null;
|
||||||
const { data, isLoading, error } = useMarketingPlan(id);
|
const { data, isLoading, error } = useMarketingPlan(id);
|
||||||
|
|
||||||
// Hash-based scroll: /plan/:id#section-id → scroll to that section after render
|
|
||||||
// Offsets sticky Navbar (80px) + ReportNav (~48px) so the section top isn't covered.
|
|
||||||
useEffect(() => {
|
|
||||||
if (isLoading || !location.hash) return;
|
|
||||||
const sectionId = location.hash.slice(1);
|
|
||||||
const timer = setTimeout(() => {
|
|
||||||
const el = document.getElementById(sectionId);
|
|
||||||
if (!el) return;
|
|
||||||
const STICKY_OFFSET = 128;
|
|
||||||
const y = el.getBoundingClientRect().top + window.scrollY - STICKY_OFFSET;
|
|
||||||
window.scrollTo({ top: y, behavior: 'smooth' });
|
|
||||||
}, 300);
|
|
||||||
return () => clearTimeout(timer);
|
|
||||||
}, [isLoading, location.hash]);
|
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex items-center justify-center pt-20">
|
<div className="min-h-screen flex items-center justify-center pt-20">
|
||||||
|
|
|
||||||
|
|
@ -1,451 +0,0 @@
|
||||||
/**
|
|
||||||
* PricingPage — INFINITH Product 1.0 가격 안내 페이지.
|
|
||||||
*
|
|
||||||
* 구조 (plan 섹션 15-A):
|
|
||||||
* 1. Hero (타이틀 + 한 줄 태그라인)
|
|
||||||
* 2. Billing Toggle (월간 / 연간 20% 할인)
|
|
||||||
* 3. 3 Tier Cards (INSIGHT / INTELLIGENCE⭐ / INTELLIGENCE+)
|
|
||||||
* 4. Feature Comparison Table ← Step 3에서 구현
|
|
||||||
* 5. Free Trial 강조 박스
|
|
||||||
* 6. Launch Promotion 배너
|
|
||||||
* 7. FAQ ← Step 3에서 구현
|
|
||||||
* 8. Enterprise Contact CTA
|
|
||||||
*
|
|
||||||
* 유입 추적:
|
|
||||||
* - `?from=header | footer | cta | hero` 파라미터 읽어 console.log
|
|
||||||
* (analytics 연동은 Supabase `analytics_events` 테이블 도입 후 후속 작업)
|
|
||||||
*
|
|
||||||
* 핵심 데이터 소스:
|
|
||||||
* - src/data/pricingTiers.ts ← (이 파일 내부에 임시 정의, Step 3에서 분리 고려)
|
|
||||||
*/
|
|
||||||
import React, { useEffect, useState } from 'react';
|
|
||||||
import { useSearchParams } from 'react-router';
|
|
||||||
import { motion } from 'motion/react';
|
|
||||||
import { ArrowRight } from 'lucide-react';
|
|
||||||
import {
|
|
||||||
CheckFilled,
|
|
||||||
RocketFilled,
|
|
||||||
BoltFilled,
|
|
||||||
PrismFilled,
|
|
||||||
} from '../components/icons/FilledIcons';
|
|
||||||
import Badge from '../components/Badge';
|
|
||||||
import FeatureComparisonTable from '../components/pricing/FeatureComparisonTable';
|
|
||||||
import FAQ from '../components/pricing/FAQ';
|
|
||||||
import { buildContactMailto } from '../lib/contact';
|
|
||||||
|
|
||||||
// ─── Tier 데이터 정의 ──────────────────────────────────────────────
|
|
||||||
// plan 섹션 2·5 기준. Feature Comparison Table(Step 3)에서도 재사용 예정.
|
|
||||||
type TierId = 'insight' | 'intelligence' | 'intelligence-plus';
|
|
||||||
|
|
||||||
interface Tier {
|
|
||||||
id: TierId;
|
|
||||||
name: string;
|
|
||||||
tagline: string;
|
|
||||||
monthlyKRW: number; // 원화 (월 단가 · 계약 기준)
|
|
||||||
annualMonthlyKRW: number; // 원화 (연 계약 시 월 환산)
|
|
||||||
annualTotalKRW: number; // 원화 (연 계약 총액)
|
|
||||||
isPopular?: boolean;
|
|
||||||
/** 모든 Tier는 계약 기반 영업 — 온라인 결제 없음. 상담 문의 mailto로 통일. */
|
|
||||||
ctaLabel: string;
|
|
||||||
bullets: string[];
|
|
||||||
footnote?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const tiers: Tier[] = [
|
|
||||||
{
|
|
||||||
id: 'insight',
|
|
||||||
name: 'INSIGHT',
|
|
||||||
tagline: '매월 1번, 병원의 온라인 좌표를 점검하세요',
|
|
||||||
monthlyKRW: 90_000,
|
|
||||||
annualMonthlyKRW: 72_000,
|
|
||||||
annualTotalKRW: 864_000,
|
|
||||||
ctaLabel: '상담 문의',
|
|
||||||
bullets: [
|
|
||||||
'월 1회 분석 리포트',
|
|
||||||
'전 채널 분석 (홈페이지 · 강남언니 · YouTube · Instagram · Facebook · 네이버 플레이스 · 블로그)',
|
|
||||||
'4주 콘텐츠 플랜',
|
|
||||||
'경쟁사 추적 1개',
|
|
||||||
'PDF 내보내기',
|
|
||||||
],
|
|
||||||
footnote: '신규 개업의 · 1인 의원 추천',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'intelligence',
|
|
||||||
name: 'INTELLIGENCE',
|
|
||||||
tagline: '경쟁사가 지금 무엇을 바꾸는지, 월 2번 확인하세요',
|
|
||||||
monthlyKRW: 290_000,
|
|
||||||
annualMonthlyKRW: 232_000,
|
|
||||||
annualTotalKRW: 2_784_000,
|
|
||||||
isPopular: true,
|
|
||||||
ctaLabel: '상담 문의',
|
|
||||||
bullets: [
|
|
||||||
'월 4회 분석 리포트',
|
|
||||||
'8주 콘텐츠 캘린더 + 주간 KPI 기반 조정',
|
|
||||||
'Vision AI (의료진·슬로건·인증 자동 추출)',
|
|
||||||
'경쟁사 추적 3개 · 주간 변동 알림',
|
|
||||||
'KPI 대시보드 (3/12개월 목표)',
|
|
||||||
'브랜드 가이드 + 콘텐츠 필러 5종',
|
|
||||||
'스크린샷 증거 기반 심층 리포트',
|
|
||||||
],
|
|
||||||
footnote: '중형 성형외과 · 메인 타겟',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'intelligence-plus',
|
|
||||||
name: 'INTELLIGENCE+',
|
|
||||||
tagline: '매일 변하는 시장에 즉시 대응하세요',
|
|
||||||
monthlyKRW: 990_000,
|
|
||||||
annualMonthlyKRW: 792_000,
|
|
||||||
annualTotalKRW: 9_504_000,
|
|
||||||
ctaLabel: '상담 문의',
|
|
||||||
bullets: [
|
|
||||||
'월 10회 분석 리포트',
|
|
||||||
'12개월 로드맵 + 월간 전략 리뷰',
|
|
||||||
'최대 3개 분원 통합 대시보드',
|
|
||||||
'경쟁사 추적 5개 · 일간 변동 모니터링',
|
|
||||||
'브랜드 가이드 + 콘텐츠 필러 10종',
|
|
||||||
'커스텀 리포트 템플릿 (병원 CI 반영)',
|
|
||||||
'신규 기능 베타 우선 접근',
|
|
||||||
],
|
|
||||||
footnote: '대형 · 멀티 분원 병원',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// ─── 가격 포맷터 ──────────────────────────────────────────────────
|
|
||||||
// 29_0000원 → "29만원" 포맷. 1000원 단위까지는 표기 안 함 (B2B 가격은 만원 단위)
|
|
||||||
function formatKRW(amount: number): string {
|
|
||||||
const man = amount / 10_000;
|
|
||||||
// 소수점 없는 정수 표기 우선. 999,999 아래면 만원, 이상이면 억 단위까지 확장 가능.
|
|
||||||
if (Number.isInteger(man)) return `${man.toLocaleString('ko-KR')}만원`;
|
|
||||||
return `${man.toLocaleString('ko-KR', { maximumFractionDigits: 1 })}만원`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─── Billing Toggle 컴포넌트 ──────────────────────────────────────
|
|
||||||
interface BillingToggleProps {
|
|
||||||
value: 'monthly' | 'annual';
|
|
||||||
onChange: (v: 'monthly' | 'annual') => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const BillingToggle: React.FC<BillingToggleProps> = ({ value, onChange }) => {
|
|
||||||
return (
|
|
||||||
<div className="inline-flex items-center gap-1 p-1 rounded-full bg-white/70 border border-slate-200 backdrop-blur-sm shadow-sm">
|
|
||||||
<button
|
|
||||||
onClick={() => onChange('monthly')}
|
|
||||||
className={`px-5 py-2 rounded-full text-sm font-semibold transition-all ${
|
|
||||||
value === 'monthly'
|
|
||||||
? 'bg-primary-900 text-white shadow'
|
|
||||||
: 'text-slate-600 hover:text-primary-900'
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
월간 결제
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
onClick={() => onChange('annual')}
|
|
||||||
className={`px-5 py-2 rounded-full text-sm font-semibold transition-all flex items-center gap-2 ${
|
|
||||||
value === 'annual'
|
|
||||||
? 'bg-primary-900 text-white shadow'
|
|
||||||
: 'text-slate-600 hover:text-primary-900'
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
연간 결제
|
|
||||||
<span
|
|
||||||
className={`text-xs px-2 py-0.5 rounded-full font-bold ${
|
|
||||||
value === 'annual'
|
|
||||||
? 'bg-white/20 text-white'
|
|
||||||
: 'bg-accent/10 text-accent'
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
20% 할인
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// ─── Tier Card 컴포넌트 ──────────────────────────────────────────
|
|
||||||
interface TierCardProps {
|
|
||||||
tier: Tier;
|
|
||||||
billing: 'monthly' | 'annual';
|
|
||||||
onSelect: (tier: Tier) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const TierCard: React.FC<TierCardProps> = ({ tier, billing, onSelect }) => {
|
|
||||||
const price = billing === 'monthly' ? tier.monthlyKRW : tier.annualMonthlyKRW;
|
|
||||||
const isAnnual = billing === 'annual';
|
|
||||||
|
|
||||||
return (
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, y: 30 }}
|
|
||||||
whileInView={{ opacity: 1, y: 0 }}
|
|
||||||
viewport={{ once: true }}
|
|
||||||
transition={{ duration: 0.5 }}
|
|
||||||
className={`relative flex flex-col rounded-3xl p-8 bg-white border shadow-sm transition-all hover:shadow-xl ${
|
|
||||||
tier.isPopular
|
|
||||||
? 'border-accent/40 ring-2 ring-accent/30 shadow-lg scale-[1.02]'
|
|
||||||
: 'border-slate-200'
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{/* Popular 배지 */}
|
|
||||||
{tier.isPopular && (
|
|
||||||
<div className="absolute -top-3 left-1/2 -translate-x-1/2">
|
|
||||||
<Badge variant="popular" size="md" />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* 이름 + 태그라인 */}
|
|
||||||
<div className="mb-6">
|
|
||||||
<h3 className="text-2xl font-serif font-bold text-primary-900 mb-2">{tier.name}</h3>
|
|
||||||
<p className="text-sm text-slate-500 leading-relaxed break-keep">{tier.tagline}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 가격 */}
|
|
||||||
<div className="mb-6">
|
|
||||||
<div className="flex items-baseline gap-2">
|
|
||||||
<span className="text-4xl font-bold text-primary-900 tracking-tight">
|
|
||||||
{formatKRW(price)}
|
|
||||||
</span>
|
|
||||||
<span className="text-slate-500 text-sm">/월</span>
|
|
||||||
</div>
|
|
||||||
{isAnnual && (
|
|
||||||
<p className="text-xs text-accent font-semibold mt-2">
|
|
||||||
연 {formatKRW(tier.annualTotalKRW)} · 20% 절약
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
{!isAnnual && (
|
|
||||||
<p className="text-xs text-slate-400 mt-2">
|
|
||||||
연 결제 시 월 {formatKRW(tier.annualMonthlyKRW)}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* CTA — DS Primary: gradient + rounded-full (pill) */}
|
|
||||||
<button
|
|
||||||
onClick={() => onSelect(tier)}
|
|
||||||
className={`w-full px-8 py-3.5 rounded-full font-medium text-sm text-white transition-shadow duration-150 shadow-md hover:shadow-xl flex items-center justify-center gap-2 group bg-gradient-to-r from-[#4F1DA1] to-[#021341] hover:from-[#AF90FF] hover:to-[#AF90FF] active:scale-[0.98] mb-6 ${
|
|
||||||
tier.isPopular ? 'shadow-lg' : ''
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{tier.ctaLabel}
|
|
||||||
<ArrowRight className="w-4 h-4 group-hover:translate-x-1 transition-transform" />
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{/* Bullet points — DS FilledIcon(CheckFilled) */}
|
|
||||||
<ul className="space-y-3 flex-grow">
|
|
||||||
{tier.bullets.map((bullet, i) => (
|
|
||||||
<li key={i} className="flex items-start gap-2.5 text-sm text-slate-700">
|
|
||||||
<CheckFilled size={16} className="text-accent shrink-0 mt-0.5" />
|
|
||||||
<span className="leading-relaxed break-keep">{bullet}</span>
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
{/* Footnote */}
|
|
||||||
{tier.footnote && (
|
|
||||||
<p className="mt-6 pt-4 border-t border-slate-100 text-xs text-slate-400 text-center">
|
|
||||||
{tier.footnote}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</motion.div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// ─── 먼저 문의하기 강조 카드 ─────────────────────────────────────
|
|
||||||
// DS 레퍼런스: CTA 카드 배경에 3-stop warm gradient (Section 2.2)
|
|
||||||
// + 상단 filled 아이콘 squircle + Primary/Secondary pill 버튼 병렬
|
|
||||||
//
|
|
||||||
// PART III 피봇: "첫 리포트 무료 / 카드 등록 불필요" 표현 삭제 → 계약 기반 영업으로 일원화.
|
|
||||||
function ContactFirstBox() {
|
|
||||||
return (
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, y: 20 }}
|
|
||||||
whileInView={{ opacity: 1, y: 0 }}
|
|
||||||
viewport={{ once: true }}
|
|
||||||
transition={{ duration: 0.5 }}
|
|
||||||
className="relative w-full rounded-3xl p-8 md:p-12 text-center overflow-hidden bg-gradient-to-r from-[#fff3eb] via-[#e4cfff] to-[#f5f9ff] border border-white/40 shadow-[3px_4px_12px_rgba(0,0,0,0.06)]"
|
|
||||||
>
|
|
||||||
{/* 상단 아이콘 squircle — DS filled icon 규칙 */}
|
|
||||||
<div className="inline-flex items-center justify-center w-14 h-14 rounded-2xl bg-white/60 backdrop-blur-sm border border-white/50 mb-6">
|
|
||||||
<BoltFilled size={26} className="text-accent" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h3 className="text-2xl md:text-3xl font-serif font-bold text-primary-900 mb-3">
|
|
||||||
먼저 대화부터 시작하세요
|
|
||||||
</h3>
|
|
||||||
<p className="text-slate-600 leading-relaxed max-w-xl mx-auto mb-8 break-keep">
|
|
||||||
계약 전에 병원 규모·마케팅 현황을 공유해 주시면, 전담 담당자가 적합한 플랜과
|
|
||||||
리포트 샘플을 정리해 회신 드립니다.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
{/* DS 듀얼 버튼: Primary + Secondary — 모두 rounded-full (pill) */}
|
|
||||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-3">
|
|
||||||
<a
|
|
||||||
href={buildContactMailto('도입 상담 문의')}
|
|
||||||
className="inline-flex items-center gap-2 px-8 py-3.5 rounded-full font-medium text-sm text-white transition-shadow duration-150 shadow-md hover:shadow-xl group bg-gradient-to-r from-[#4F1DA1] to-[#021341] hover:from-[#AF90FF] hover:to-[#AF90FF] active:scale-[0.98]"
|
|
||||||
>
|
|
||||||
상담 문의하기
|
|
||||||
<ArrowRight className="w-4 h-4 group-hover:translate-x-1 transition-transform" />
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
href="#tiers"
|
|
||||||
className="inline-flex items-center gap-2 px-8 py-3.5 rounded-full font-medium text-sm bg-white border border-slate-200 text-[#021341] hover:bg-slate-50 transition-colors"
|
|
||||||
>
|
|
||||||
플랜 비교 보기
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</motion.div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─── Launch Promotion 배너 ───────────────────────────────────────
|
|
||||||
// DS: 🎁 이모지 금지(Principle: No Emoji) → RocketFilled 대체
|
|
||||||
// dark primary gradient card + Secondary pill 버튼
|
|
||||||
function PromotionBanner() {
|
|
||||||
return (
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, scale: 0.98 }}
|
|
||||||
whileInView={{ opacity: 1, scale: 1 }}
|
|
||||||
viewport={{ once: true }}
|
|
||||||
transition={{ duration: 0.5 }}
|
|
||||||
className="w-full rounded-3xl bg-gradient-to-r from-[#4F1DA1] to-[#021341] text-white p-6 md:p-8 flex flex-col md:flex-row items-center gap-4 md:gap-6"
|
|
||||||
>
|
|
||||||
{/* Filled icon squircle — 🎁 대체 */}
|
|
||||||
<div className="inline-flex items-center justify-center w-12 h-12 rounded-2xl bg-white/10 backdrop-blur-sm shrink-0">
|
|
||||||
<RocketFilled size={24} className="text-white" />
|
|
||||||
</div>
|
|
||||||
<div className="flex-1 text-center md:text-left">
|
|
||||||
<p className="text-xs font-semibold text-purple-200 mb-1 tracking-wide">
|
|
||||||
런칭 프로모션 · 선착순 20병원
|
|
||||||
</p>
|
|
||||||
<p className="text-base md:text-lg font-serif">
|
|
||||||
INTELLIGENCE · INTELLIGENCE+ <strong>3개월 30% 할인</strong>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<a
|
|
||||||
href={buildContactMailto('런칭 프로모션 문의')}
|
|
||||||
className="inline-flex items-center gap-2 px-6 py-2.5 rounded-full bg-white border border-slate-200 text-[#021341] font-medium text-sm hover:bg-slate-50 transition-colors whitespace-nowrap"
|
|
||||||
>
|
|
||||||
혜택 문의
|
|
||||||
</a>
|
|
||||||
</motion.div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─── Enterprise Contact CTA ──────────────────────────────────────
|
|
||||||
// DS: outlined 패턴은 DS에 없음 → Primary pill(gradient + rounded-full)
|
|
||||||
function EnterpriseContact() {
|
|
||||||
return (
|
|
||||||
// outer: w-full로 섹션 정렬 / inner 콘텐츠만 max-w-2xl로 가독성 유지
|
|
||||||
<div className="w-full text-center">
|
|
||||||
<div className="max-w-2xl mx-auto">
|
|
||||||
<h3 className="text-2xl font-serif font-bold text-primary-900 mb-3">
|
|
||||||
더 많은 분원, 커스텀 플랜이 필요하신가요?
|
|
||||||
</h3>
|
|
||||||
<p className="text-slate-600 mb-8 break-keep">
|
|
||||||
4개 이상 분원을 운영하시거나 데이터 커스터마이징이 필요한 경우, 전담 담당자가 상담해 드립니다.
|
|
||||||
</p>
|
|
||||||
<a
|
|
||||||
href={buildContactMailto('커스텀 플랜 문의')}
|
|
||||||
className="inline-flex items-center gap-2 px-8 py-3.5 rounded-full font-medium text-sm text-white transition-shadow duration-150 shadow-md hover:shadow-xl group bg-gradient-to-r from-[#4F1DA1] to-[#021341] hover:from-[#AF90FF] hover:to-[#AF90FF] active:scale-[0.98]"
|
|
||||||
>
|
|
||||||
커스텀 플랜 문의
|
|
||||||
<ArrowRight className="w-4 h-4 group-hover:translate-x-1 transition-transform" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─── PricingPage 본체 ────────────────────────────────────────────
|
|
||||||
export default function PricingPage() {
|
|
||||||
const [searchParams] = useSearchParams();
|
|
||||||
const [billing, setBilling] = useState<'monthly' | 'annual'>('monthly');
|
|
||||||
|
|
||||||
// 유입 소스 추적 — 추후 Supabase `analytics_events` 테이블로 전송
|
|
||||||
useEffect(() => {
|
|
||||||
const from = searchParams.get('from');
|
|
||||||
if (from) {
|
|
||||||
// TODO(analytics): Supabase analytics_events insert
|
|
||||||
console.info(`[pricing] referred from: ${from}`);
|
|
||||||
}
|
|
||||||
}, [searchParams]);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tier 선택 핸들러 — 계약 기반 영업.
|
|
||||||
* 온라인 결제 없이 모든 Tier를 상담 문의 mailto로 통일.
|
|
||||||
* Subject에 Tier 이름을 넣어 영업팀이 유입 경로를 구분.
|
|
||||||
*/
|
|
||||||
const handleTierSelect = (tier: Tier) => {
|
|
||||||
window.location.href = buildContactMailto(`${tier.name} 플랜 상담 문의`);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<main className="relative pt-28 md:pt-32 pb-24 overflow-hidden">
|
|
||||||
{/* Background — 랜딩 Hero와 톤 통일 */}
|
|
||||||
<div className="absolute inset-0 -z-10 bg-[radial-gradient(ellipse_at_top,_var(--tw-gradient-stops))] from-indigo-100 via-purple-50 to-pink-50 opacity-60" />
|
|
||||||
|
|
||||||
{/* ── Section 1 · Hero ─────────────────────────── */}
|
|
||||||
<section className="px-6 text-center max-w-4xl mx-auto mb-12">
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, y: 20 }}
|
|
||||||
animate={{ opacity: 1, y: 0 }}
|
|
||||||
transition={{ duration: 0.6 }}
|
|
||||||
>
|
|
||||||
<div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-white/70 border border-white/40 text-xs font-bold text-accent mb-6">
|
|
||||||
<PrismFilled size={14} className="text-accent" />
|
|
||||||
Pricing · 가격 안내
|
|
||||||
</div>
|
|
||||||
<h1 className="text-4xl md:text-6xl font-serif font-bold text-primary-900 leading-[1.1] tracking-[-0.02em] mb-5">
|
|
||||||
Strategic Planning,<br className="hidden md:block" />
|
|
||||||
<span className="text-gradient">At Your Scale.</span>
|
|
||||||
</h1>
|
|
||||||
<p className="text-lg text-slate-600 max-w-2xl mx-auto mb-10 break-keep">
|
|
||||||
병원 규모에 맞는 전략 파트너를 선택하세요. 계약·결제·운영 조건은 상담에서 맞춤 설계됩니다.
|
|
||||||
</p>
|
|
||||||
</motion.div>
|
|
||||||
|
|
||||||
{/* ── Section 2 · Billing Toggle ────────────── */}
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, y: 10 }}
|
|
||||||
animate={{ opacity: 1, y: 0 }}
|
|
||||||
transition={{ duration: 0.5, delay: 0.15 }}
|
|
||||||
>
|
|
||||||
<BillingToggle value={billing} onChange={setBilling} />
|
|
||||||
</motion.div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* ── Section 3 · 3 Tier Cards ─────────────────── */}
|
|
||||||
<section id="tiers" className="px-6 max-w-7xl mx-auto mb-20 scroll-mt-24">
|
|
||||||
<div className="grid md:grid-cols-3 gap-6 md:gap-8 items-stretch">
|
|
||||||
{tiers.map((tier) => (
|
|
||||||
<TierCard key={tier.id} tier={tier} billing={billing} onSelect={handleTierSelect} />
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* ── Section 4 · Feature Comparison Table ─── */}
|
|
||||||
<section className="px-6 mb-20 max-w-7xl mx-auto">
|
|
||||||
<FeatureComparisonTable />
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* ── Section 5 · 먼저 문의하기 강조 ───────────── */}
|
|
||||||
{/* outer max-w-7xl로 Tier Cards 섹션과 동일 정렬 (반응형 자동 축소) */}
|
|
||||||
<section className="px-6 mb-16 max-w-7xl mx-auto">
|
|
||||||
<ContactFirstBox />
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* ── Section 6 · Launch Promotion ───────────── */}
|
|
||||||
<section className="px-6 mb-20 max-w-7xl mx-auto">
|
|
||||||
<PromotionBanner />
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* ── Section 7 · FAQ ─────────────────────────── */}
|
|
||||||
<section className="px-6 mb-20 max-w-7xl mx-auto">
|
|
||||||
<FAQ />
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* ── Section 8 · Enterprise Contact ─────────── */}
|
|
||||||
<section className="px-6 max-w-7xl mx-auto">
|
|
||||||
<EnterpriseContact />
|
|
||||||
</section>
|
|
||||||
</main>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -17,7 +17,6 @@ export interface VerifiedChannels {
|
||||||
naverBlog: VerifiedChannel | null;
|
naverBlog: VerifiedChannel | null;
|
||||||
gangnamUnni: VerifiedChannel | null;
|
gangnamUnni: VerifiedChannel | null;
|
||||||
tiktok: VerifiedChannel | null;
|
tiktok: VerifiedChannel | null;
|
||||||
naverPlace?: { url: string; placeId?: string } | null; // registry-sourced place URL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -560,35 +560,23 @@ Deno.serve(async (req) => {
|
||||||
const npVerified = (verified as Record<string, unknown>).naverPlace as Record<string, unknown> | null;
|
const npVerified = (verified as Record<string, unknown>).naverPlace as Record<string, unknown> | null;
|
||||||
|
|
||||||
channelTasks.push(wrapChannelTask("naverPlace", async () => {
|
channelTasks.push(wrapChannelTask("naverPlace", async () => {
|
||||||
// ── Fast path 1: already fully verified in DB (has name) ──
|
// ── Fast path: already verified in DB ──
|
||||||
if (npVerified?.name) {
|
if (npVerified?.name) {
|
||||||
console.log(`[naverPlace] Using verified DB data: ${npVerified.name}`);
|
console.log(`[naverPlace] Using verified DB data: ${npVerified.name}`);
|
||||||
channelData.naverPlace = npVerified;
|
channelData.naverPlace = npVerified;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Fast path 2: registry-sourced place URL → use Naver Place ID directly ──
|
// ── Slow path: first-time discovery via domain-matched search ──
|
||||||
const registryPlaceUrl = (verified as Record<string, unknown>).naverPlace as { url?: string; placeId?: string } | null;
|
|
||||||
const registryPlaceId = registryPlaceUrl?.placeId;
|
|
||||||
if (registryPlaceId) {
|
|
||||||
console.log(`[naverPlace] Using registry place ID: ${registryPlaceId}`);
|
|
||||||
// Build the Naver local search with placeId as a hint — use clinic name to fetch details
|
|
||||||
// We'll pass through to search but prime the query with clinic name
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Slow path: search via Naver Local API ──
|
|
||||||
const normalize = (s: string) => (s || '').replace(/<[^>]*>/g, '').toLowerCase();
|
const normalize = (s: string) => (s || '').replace(/<[^>]*>/g, '').toLowerCase();
|
||||||
let clinicDomain = '';
|
let clinicDomain = '';
|
||||||
try { clinicDomain = new URL(row.url || '').hostname.replace('www.', ''); } catch { /* skip */ }
|
try { clinicDomain = new URL(row.url || '').hostname.replace('www.', ''); } catch { /* skip */ }
|
||||||
|
|
||||||
const districtMatch = address.match(/([가-힣]+(구|동))/);
|
const districtMatch = address.match(/([가-힣]+(구|동))/);
|
||||||
const district = districtMatch?.[1] || '';
|
const district = districtMatch?.[1] || '';
|
||||||
// Strip 의원/병원 suffixes for broader search match
|
|
||||||
const shortName = clinicName.replace(/의원$|병원$/, '').trim();
|
|
||||||
const queries = [
|
const queries = [
|
||||||
...(district ? [`${clinicName} ${district}`, `${shortName} ${district}`] : []),
|
...(district ? [`${clinicName} ${district}`, `${clinicName} 성형 ${district}`] : []),
|
||||||
`${clinicName} 성형외과`,
|
`${clinicName} 성형외과`,
|
||||||
`${shortName} 성형외과`,
|
|
||||||
`${clinicName} 성형`,
|
`${clinicName} 성형`,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -603,10 +591,9 @@ Deno.serve(async (req) => {
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
const items = (data.items || []) as Record<string, string>[];
|
const items = (data.items || []) as Record<string, string>[];
|
||||||
|
|
||||||
// Match priority: (1) domain match, (2) registry place ID in link, (3) name contains match + 성형 category
|
// Match by official domain first (most reliable), then exact name + 성형 category
|
||||||
const match = (clinicDomain ? items.find(i => (i.link || '').includes(clinicDomain)) : null)
|
const match = (clinicDomain ? items.find(i => (i.link || '').includes(clinicDomain)) : null)
|
||||||
?? (registryPlaceId ? items.find(i => (i.link || '').includes(registryPlaceId)) : null)
|
?? items.find(i => normalize(i.title) === clinicName.toLowerCase() && (i.category || '').includes('성형'))
|
||||||
?? items.find(i => normalize(i.title).includes(shortName.toLowerCase()) && (i.category || '').includes('성형'))
|
|
||||||
?? null;
|
?? null;
|
||||||
|
|
||||||
if (match) {
|
if (match) {
|
||||||
|
|
|
||||||
|
|
@ -74,11 +74,6 @@ function registryToVerifiedChannels(reg: RegistryRow): import("../_shared/verify
|
||||||
const blogHandle = extractHandleFromUrl(reg.naver_blog_url || '', 'naverBlog');
|
const blogHandle = extractHandleFromUrl(reg.naver_blog_url || '', 'naverBlog');
|
||||||
const ttHandle = extractHandleFromUrl(reg.tiktok_url || '', 'tiktok');
|
const ttHandle = extractHandleFromUrl(reg.tiktok_url || '', 'tiktok');
|
||||||
|
|
||||||
// Extract Naver Place ID from URL (e.g. https://m.place.naver.com/hospital/11709005 → "11709005")
|
|
||||||
const naverPlaceId = reg.naver_place_url
|
|
||||||
? (reg.naver_place_url.match(/\/(\d+)\/?$/) || [])[1] || undefined
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
instagram: igHandles,
|
instagram: igHandles,
|
||||||
youtube: ytHandle ? { handle: ytHandle, verified: true, url: reg.youtube_url! } : null,
|
youtube: ytHandle ? { handle: ytHandle, verified: true, url: reg.youtube_url! } : null,
|
||||||
|
|
@ -86,26 +81,12 @@ function registryToVerifiedChannels(reg: RegistryRow): import("../_shared/verify
|
||||||
naverBlog: blogHandle ? { handle: blogHandle, verified: true, url: reg.naver_blog_url! } : null,
|
naverBlog: blogHandle ? { handle: blogHandle, verified: true, url: reg.naver_blog_url! } : null,
|
||||||
gangnamUnni: reg.gangnam_unni_url ? { handle: reg.gangnam_unni_url, verified: true, url: reg.gangnam_unni_url } : null,
|
gangnamUnni: reg.gangnam_unni_url ? { handle: reg.gangnam_unni_url, verified: true, url: reg.gangnam_unni_url } : null,
|
||||||
tiktok: ttHandle ? { handle: ttHandle, verified: true, url: reg.tiktok_url! } : null,
|
tiktok: ttHandle ? { handle: ttHandle, verified: true, url: reg.tiktok_url! } : null,
|
||||||
naverPlace: reg.naver_place_url ? { url: reg.naver_place_url, placeId: naverPlaceId } : null,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
interface DiscoverRequest {
|
interface DiscoverRequest {
|
||||||
url: string;
|
url: string;
|
||||||
clinicName?: string;
|
clinicName?: string;
|
||||||
/**
|
|
||||||
* 사용자가 랜딩 MultiChannelInput에서 직접 붙여넣은 채널 URL 묶음.
|
|
||||||
* 존재하는 플랫폼은 Firecrawl/Perplexity discovery 결과보다 우선순위 높게 병합됩니다.
|
|
||||||
* naverPlace는 verifyAllHandles로 검증되지 않으므로 결과에 직접 주입합니다.
|
|
||||||
*/
|
|
||||||
manualChannels?: {
|
|
||||||
youtube?: string[];
|
|
||||||
instagram?: string[];
|
|
||||||
facebook?: string[];
|
|
||||||
naverPlace?: string[];
|
|
||||||
naverBlog?: string[];
|
|
||||||
gangnamUnni?: string[];
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractHandle(raw: string, platform: string): string | null {
|
function extractHandle(raw: string, platform: string): string | null {
|
||||||
|
|
@ -167,7 +148,7 @@ Deno.serve(async (req) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { url, clinicName: inputClinicName, manualChannels } = (await req.json()) as DiscoverRequest;
|
const { url, clinicName: inputClinicName } = (await req.json()) as DiscoverRequest;
|
||||||
if (!url) {
|
if (!url) {
|
||||||
return new Response(
|
return new Response(
|
||||||
JSON.stringify({ error: "URL is required" }),
|
JSON.stringify({ error: "URL is required" }),
|
||||||
|
|
@ -789,32 +770,9 @@ Deno.serve(async (req) => {
|
||||||
|
|
||||||
// ═══════════════════════════════════════════
|
// ═══════════════════════════════════════════
|
||||||
// STAGE C: Merge ALL sources + Verify
|
// STAGE C: Merge ALL sources + Verify
|
||||||
//
|
|
||||||
// manualChannels는 landing MultiChannelInput에서 사용자가 직접 붙여넣은 URL입니다.
|
|
||||||
// Firecrawl/Perplexity 결과보다 **우선순위 최상위**로 병합합니다 (mergeSocialLinks는
|
|
||||||
// 중복 제거 시 첫 번째 인자의 값을 유지).
|
|
||||||
// naverPlace / gangnamUnni는 extractSocialLinks가 지원하지 않으므로 아래 별도 처리.
|
|
||||||
// ═══════════════════════════════════════════
|
// ═══════════════════════════════════════════
|
||||||
|
|
||||||
// 사용자 제공 URL → extractSocialLinks 포맷 (instagram/youtube/facebook/naverBlog/tiktok/kakao만)
|
const merged = mergeSocialLinks(linkHandles, firecrawlHandles, buttonHandles, apiHandles);
|
||||||
const manualSocialUrls: string[] = manualChannels
|
|
||||||
? [
|
|
||||||
...(manualChannels.youtube || []),
|
|
||||||
...(manualChannels.instagram || []),
|
|
||||||
...(manualChannels.facebook || []),
|
|
||||||
...(manualChannels.naverBlog || []),
|
|
||||||
]
|
|
||||||
: [];
|
|
||||||
const manualHandles = manualSocialUrls.length > 0 ? extractSocialLinks(manualSocialUrls) : null;
|
|
||||||
|
|
||||||
// 사용자가 강남언니 URL을 제공하면 기존 힌트를 덮어씀
|
|
||||||
if (manualChannels?.gangnamUnni?.[0]) {
|
|
||||||
gangnamUnniHintUrl = manualChannels.gangnamUnni[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
const merged = manualHandles
|
|
||||||
? mergeSocialLinks(manualHandles, linkHandles, firecrawlHandles, buttonHandles, apiHandles)
|
|
||||||
: mergeSocialLinks(linkHandles, firecrawlHandles, buttonHandles, apiHandles);
|
|
||||||
|
|
||||||
const cleanHandles = {
|
const cleanHandles = {
|
||||||
instagram: [...new Set(merged.instagram.map(h => extractHandle(h, 'instagram')).filter((h): h is string => h !== null))],
|
instagram: [...new Set(merged.instagram.map(h => extractHandle(h, 'instagram')).filter((h): h is string => h !== null))],
|
||||||
|
|
@ -837,17 +795,6 @@ Deno.serve(async (req) => {
|
||||||
cleanHandles, resolvedName, gangnamUnniHintUrl,
|
cleanHandles, resolvedName, gangnamUnniHintUrl,
|
||||||
);
|
);
|
||||||
|
|
||||||
// 사용자 제공 Naver Place URL이 있으면 직접 주입 (verifyAllHandles는 Place를 다루지 않음).
|
|
||||||
// placeId는 URL 말미의 숫자 ID를 추출 (e.g. ".../hospital/11709005" → "11709005").
|
|
||||||
if (manualChannels?.naverPlace?.[0]) {
|
|
||||||
const placeUrl = manualChannels.naverPlace[0];
|
|
||||||
const placeIdMatch = placeUrl.match(/\/(\d+)\/?(?:\?|$)/);
|
|
||||||
(verified as VerifiedChannels).naverPlace = {
|
|
||||||
url: placeUrl,
|
|
||||||
placeId: placeIdMatch?.[1],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// ═══════════════════════════════════════════
|
// ═══════════════════════════════════════════
|
||||||
// Save to DB (supabase client reused from registry check above)
|
// Save to DB (supabase client reused from registry check above)
|
||||||
// ═══════════════════════════════════════════
|
// ═══════════════════════════════════════════
|
||||||
|
|
|
||||||