APPEARS · Scope & Fee Proposal2026.06.19 · Quotation & Agreement
APPEARS BRAND BUILDERS · BUILD · SCALE · EXIT

[MOSO]
STAY OS

멀티-OTA AI 위탁운영 SaaS 구축 · 운영견적서 및 계약서
FOR · 클라이언트
무해 / 대표 명훈
PROJECT
MOSO 플랫폼 전체 — BI·웹·콘솔·호스트SaaS·청소앱·온이AI·프라이싱·하드웨어·마케팅·전자서명
DATE
2026. 06. 19
QUOTE #
APR-20260619-MOSO
Prepared by Song Hyun-Woo · CEO Director, Appears Design
john316@appears.kr · 010-3974-8785 · 서울 마포구 토정로2길 18, 202호
https://appears.kr/contractMOSO · 01
APPEARS · MOSO제안 요약 · 시스템 아키텍처

제안 요약

어피어즈가 무엇을, 어떻게 구축하는가

어피어즈는 MOSO(모두의숙소)를 "콘텐츠만 주면 등록·다국어 응대·예약·청소·정산·가격최적화까지 한 곳에서 도는" 숙박 위탁운영 SaaS로, 브랜드(BI)부터 웹·콘솔·호스트 앱·AI·하드웨어·마케팅까지 한 팀이 통합 설계·개발·배포·인수인계한다. 일반 에이전시처럼 로고나 웹만 납품하는 게 아니라, 감각이 매출·운영·채널·조직으로 번역되는 운영 OS 전체를 코드로 짓는다. 핵심은 ①사람 손이 아니라 코드가 24/7 도는 자동화(Cloudflare Worker+Cron 상주), ②밀도 45-21-10 완판 가격엔진(직접 개발·단위테스트 17/17 통과·실거래 학습 폐루프)이라는 해자, ③한국어만 하는 40~50대 호스트도 외국인 전화·카톡·예약·정산을 다국어 AI '온이'에게 위임하게 만드는 진입 쐐기다. 이미 마스터 콘솔·가격엔진·인스타 카드뉴스·상주 수집기를 실제로 빌드·배포한 상태에서, 본 견적은 그 위에 10개 모듈을 정식 제품으로 완성하는 통합 개발 범위와 비용을 정의한다.

시스템 아키텍처

레일(온다·Beds24) · 두뇌(콘솔·엔진·온이) · 접점(호스트SaaS·청소앱·키오스크·CCTV)
■ 1계층 — 레일(빌린다 / 사서 쓴다): OTA 연결과 실시간 동기화·중복예약 차단·결제·정산 원천 데이터를 담당하는 외부 백본. 한국 OTA(야놀자·여기어때·네이버)는 [온다(ONDA)] 채널매니저로, 글로벌 OTA(에어비앤비·부킹·아고다·트립)는 [Beds24/Hostaway]로 연결한다. 직접 OTA 폴링은 정책상 불가하므로 우리는 폴링엔진을 만들지 않고, 레일의 webhook(수초)만 받아 두뇌로 흘린다. → MOSO는 이 레일 위에 얹히는 운영·지능 레이어다. ■ 2계층 — 두뇌(우리가 만든다): 들어온 데이터를 판단·결정·응대로 바꾸는 자율 코어. 세 엔진이 Cloudflare Worker+Cron+KV 위에서 사람·브라우저 없이 상주한다. · [마스터 콘솔] — 전 시설·전 채널·정산·점유·성장 그래프를 한 화면에 모으는 운영 본부. CRM과 11단계 영업퍼널, 시장 인텔리전스(실측 점유·컴프 가격)를 품는다. · [다이내믹 프라이싱 엔진(decideV2)] — 밀도 45-21-10 사다리 + 실측 점유·페이스·요일·경쟁밴드로 매물별 권장가를 자율 산출(Cron */5)하고, 실거래 sold-event를 EWMA로 학습하는 폐루프. 결정가는 레일로 다시 송출(라이트백)된다. · [온이 AI] — 6개국어 게스트 대화·인바운드 전화(OpenAI Realtime+Twilio)·전 플랫폼 자동응대를 호스트별 설정대로 처리하고, 신뢰도<기준이면 보정·KB를 키우는 학습 루프. ■ 3계층 — 접점(사람이 닿는 곳): 두뇌의 결정을 호스트·청소·게스트가 실제로 쓰는 인터페이스. · [호스트 SaaS] — 가입·세팅 자동화, 커미션, 모바일 대시보드, 메신저. · [청소관리자 앱] — 쏘카형 PWA로 배차·사진검수·정산. · [무인 키오스크 + 도어락(솔리티) + CCTV] — 무인 체크인과 현장 운영을 하드웨어로 연동. · [퍼널·웹사이트 + 마케팅 엔진] — 호스트를 끌어오는 입구(웹 스킨 15종·전자서명). ■ 데이터 흐름(한 줄): OTA → [레일: 온다/Beds24] → [두뇌: 콘솔·프라이싱 엔진·온이] → 권장가·응대·정산 결정 → [접점: 호스트앱·청소앱·키오스크·CCTV·게스트] → 실거래·실응대 데이터가 다시 두뇌로 들어가 학습. 상주 주체는 Claude 루프가 아니라 Cloudflare 배포 서비스이고, AI는 그 안의 부품이다.
https://appears.kr/contractMOSO · 02
APPEARS · MOSO개발 모듈 상세 견적

개발 모듈 ① ~ ⑩

각 모듈 — 범위 · 품목(바텀업) · 백엔드/프론트 · 와이어프레임 · 서버·보안

MOSO 브랜딩 · BI 시스템

온다를 벤치마킹하되 베끼지 않는다. 멀티-OTA AI 위탁운영이라는 신(新)카테고리를 단번에 이해시키는 독자 브랜드 정체성 — 로고·BI·컬러·타이포·로고 변주·전접점 적용 가이드·인스타그램 세팅까지, 콘솔과 호스트 앱과 인스타가 한 사람이 만든 것처럼 보이게 하는 시각 시스템 풀스택.

₩6,000,000

MOSO(모두의숙소) 운영사 브랜드의 시각 정체성을 0에서 락(lock)까지 구축한다. 핵심 전제: MOSO는 '플랫폼(에어비앤비·부킹·야놀자 등 1,116개 실매물을 한 화면에서 운영)'이면서 동시에 '사람 손길(청소·신고증 검증·버틀러 CX)'인 하이브리드다. 이 이중성을 시각화하는 것이 브랜딩의 제1과제 — 차갑게 똑똑한 기계와 따뜻한 호스피탈리티가 한 마크 안에 공존해야 한다. 무해온·다락서울(소비자 숙소 브랜드)과는 위계가 분리되며, MOSO는 그 위에 서는 '운영 엔진'의 마스터 브랜드로 설계한다(엔도서/하우스오브브랜드 하이브리드 아키텍처).

(1) 브랜드 전략·디스커버리: 온다(ONDA, 채널매니저 백본)·에어비앤비·미스터멘션·H2O 호스피탈리티 등 경쟁/벤치마크 4종 시각 해부 → MOSO만의 포지셔닝 좌표(축: 자동화↔호스피탈리티 / 매스↔프리미엄) 확정. 브랜드 키워드 3개, 무드보드 2종(콘솔의 '트레이딩 터미널' 무드 + 호스트의 '안심·맡김' 무드)을 한 시스템으로 봉합.

(2) 버벌 아이덴티티: MOSO/모두의숙소 네이밍 정합성 정리, 영문 표기 규칙(MOSO 전 대문자, 'Moso' 금지), 한 줄 슬로건 시스템 — 마스터 태그라인("콘텐츠만 주세요. 운영은 다 합니다") + 상황별 서브 카피 5종(인스타 bio·콘솔 헤더·OG·명함·계약서 푸터). '온이(Oni)' AI 페르소나의 보이스 톤 1p.

(3) 로고: 워드마크(전용 디스플레이 산세리프 기반 커스텀 자소 손질 '모두의숙소' + 'MOSO') + 심볼(현재 콘솔의 '모소' 모노그램을 정식 심볼로 승격·정제) 동시 설계. 3개 시안 루트(① 픽셀/그리드형=플랫폼성, ② 한옥 처마·온돌 곡선형=호스피탈리티, ③ 모노그램 컨테인먼트형) → 1개 확정 후 벡터 정밀 락.

(4) 로고 변주(Lockup) 풀팩: 가로형·세로형·심볼 단독·워드마크 단독·역상(다크 콘솔용)·1색 모노·최소크기·안전여백·금지사용(8종 Don'ts).

(5) 컬러 시스템: 코어(네이비 #1d3557 · 미드 #457b9d · 파우더 #a8dadc · 아이스 #eef5f7) 정식 토큰화 + 시맨틱(성공/경고/위험/엠버) + OTA 채널 컬러 락(에어비앤비 #ff5a5f·부킹 #003580·아고다 #5b2d90·야놀자 #f23f5b·여기어때 #1ec800·네이버 #03c75a — 멀티채널 UI에서 채널 식별성을 위한 표준) + WCAG AA 대비 검증표.

(6) 타이포그래피: 로고전용 커스텀 디스플레이 + 본문 Pretendard 9단 타입스케일 + 숫자 tabular-nums(정산·가격·관측수 정렬용) + 한/영/일/중 다국어 폰트 폴백 규칙(공통기반 6개국어 대응).

(7) 브랜드 적용·확장: 온이 AI 페르소나 비주얼(아바타/말풍선 스타일), 등급 배지·인증마크 시스템(시그니처/셀렉티드/스테이), 그래픽 모티프·패턴, 콘솔/채널 아이콘 26종 세트.

(8) 브랜드 가이드라인 문서(디지털 PDF 40p+) + 인스타그램 브랜드 세팅(프로필·하이라이트 커버 9·9분할 그리드 피드 템플릿) + OG/파비콘/앱아이콘 멀티해상도 + 자산 패키징·핸드오프(벡터 락·웹폰트·디자인 토큰 JSON·Figma 라이브러리). 모든 원본·소스 소유권은 클라(무해) 이전.

품목 · 세부단가수량합계
브랜드 전략·디스커버리 워크숍경쟁/벤치마크 4종(온다·에어비앤비·미스터멘션·H2O) 시각 해부, 포지셔닝 좌표(자동화↔호스피탈리티 / 매스↔프리미엄) 확정, 브랜드 키워드 3개, 무드보드 2종(트레이딩 터미널 무드 + 안심·맡김 무드) 봉합. 진행: 1회 정렬 워크숍 + 디렉션 덱₩700,0001 LOT₩700,000
버벌 아이덴티티 · 슬로건 시스템MOSO/모두의숙소 네이밍 정합성, 영문 표기 규칙(전 대문자), 마스터 태그라인 + 상황별 서브카피 5종(bio·콘솔 헤더·OG·명함·계약서 푸터), 온이(Oni) AI 페르소나 보이스 톤 1p₩450,0001 LOT₩450,000
로고 디자인 (워드마크 + 모소 심볼)전용 디스플레이 산세리프 기반 커스텀 자소 손질 워드마크('모두의숙소'+'MOSO')와 모소 모노그램 심볼 동시 설계. 3개 시안 루트(픽셀그리드형·처마온돌곡선형·모노그램형) 제시 → 1개 확정 후 벡터 정밀 락(곡률·자간·옵티컬 보정)₩1,100,0001 LOT₩1,100,000
로고 변주(Lockup) 풀팩가로형·세로형·심볼단독·워드마크단독·역상(다크 콘솔용)·1색 모노·최소크기 규격·안전여백(클리어스페이스)·금지사용 8종(Don'ts). 각 변주 SVG+PNG 동시 출력₩550,0001 LOT₩550,000
컬러 시스템 · 토큰화코어 4색(네이비#1d3557·미드#457b9d·파우더#a8dadc·아이스#eef5f7) + 시맨틱 4색 + OTA 채널 컬러 락 6종 + WCAG AA 대비 검증표. HEX/RGB/HSL/CMYK 전 변환 + CSS 변수/디자인 토큰 JSON 산출₩420,0001 LOT₩420,000
타이포그래피 시스템로고전용 커스텀 디스플레이 + 본문 Pretendard 9단 타입스케일 + 숫자 tabular-nums(정산·가격·관측수 정렬) + 한/영/일/중 다국어 폰트 폴백 규칙. 라인하이트·자간·반응형 clamp 스펙 표₩380,0001 LOT₩380,000
브랜드 적용 — 온이 페르소나 + 등급 배지·인증마크온이 AI 아바타·말풍선 스타일 정의, 등급 배지 시스템(시그니처/셀렉티드/스테이) 비주얼 락, 무해온·다락서울 위 마스터 브랜드 위계(엔도서) 규칙도 1p₩480,0001 LOT₩480,000
그래픽 모티프·패턴 + 아이콘 세트 26종브랜드 그래픽 모티프(플랫폼 그리드+호스피탈리티 곡선 융합) + 패턴 2종 + 콘솔/채널/기능 아이콘 26종 라인 세트(대시·시장·숙소·가격·정산·온보딩·OTA 6채널 등). 1.7px 스트로크 통일₩360,0001 LOT₩360,000
브랜드 가이드라인 문서 (디지털 40p+)로고 사용규정·컬러·타이포·모티프·아이콘·배지·보이스·금지사용·접점별 예시까지 수록한 디지털 브랜드 매뉴얼 PDF. 신규 디자이너/외주가 룰만 보고 동일 결과 내도록 작성₩520,0001 LOT₩520,000
인스타그램 브랜드 세팅프로필(아바타·bio·액션버튼) 락 + 스토리 하이라이트 커버 9종 + 9분할(3x3) 그리드 피드 템플릿 + 카드뉴스 캐러셀 마스터 프레임(커버/본문/임팩트/CTA 4역할). 본 견적 별도 제작 콘텐츠와 호환되는 템플릿 키트₩480,0001 LOT₩480,000
OG·소셜 비주얼 + 파비콘/앱아이콘 멀티해상도OG/트위터 카드 비주얼(콘솔·랜딩·캠페인 3종) + 파비콘(16~512px) + iOS/Android 앱 아이콘(네이티브 맥앱·PWA용) + 카톡/링크 프리뷰 이미지 + theme-color 규격₩280,0001 LOT₩280,000
브랜드 자산 패키징·핸드오프 (소유권 이전)벡터 마스터 락(AI/SVG/EPS), 래스터 전 사이즈, 웹폰트 셀프호스팅 셋, 디자인 토큰 JSON, Figma 라이브러리(컴포넌트·스타일), 폴더 구조 README. 전 원본·소스 무해 소유권 이전₩280,0001 LOT₩280,000
소계₩6,000,000

백엔드 구조

  • 브랜딩 모듈은 자산 중심이라 무거운 백엔드는 없으나, '브랜드를 코드로 박제'하는 최소 인프라를 둔다.
  • Supabase Storage 버킷 `brand-assets`(public-read CDN + signed-write) — 로고 변주·아이콘·OG·웹폰트 정본 호스팅, 버전 폴더링(/v1, /v1.1).
  • 테이블 `brand_tokens`(id, token_key, category[color|type|space|radius], value_hex, value_rgb, value_hsl, value_cmyk, wcag_pair, updated_at) — 디자인 토큰을 DB 단일소스로 두고 콘솔/앱/인스타 템플릿이 동일 값을 참조.
  • 테이블 `brand_assets`(id, kind[logo|icon|og|favicon|pattern], variant, file_path, mime, w, h, version, checksum) — 자산 매니페스트.
  • 테이블 `brand_guideline_sections`(견적 단계엔 정적, 추후 콘솔 내 가이드 뷰어로 확장 여지).
  • API/엣지: GET `/api/brand/tokens.css`(토큰→CSS 변수 자동 생성·캐시), GET `/api/brand/tokens.json`(앱·Figma 동기화용), GET `/api/og?title=&kind=`(Cloudflare Worker가 OG 이미지를 SVG→PNG 동적 생성, 캠페인별 텍스트 합성).
  • 서비스: `brandTokenSync`(토큰 변경 시 콘솔/앱/인스타 템플릿 캐시 무효화), `faviconGen`(원본 1장→멀티해상도 파생 배치).
  • 전부 공통기반(Supabase Realtime·Auth·RLS) 위에 얹어, 추후 브랜드 토큰 수정이 전 접점에 실시간 전파되게 설계.

프론트엔드 구조

  • 페이지 `brand-guideline`(디지털 브랜드 매뉴얼 단일 HTML, PDF 동시 출력) — 섹션: 로고/변주/컬러/타이포/모티프/아이콘/배지/보이스/Don'ts/접점예시. 좌측 스티키 네비 + IntersectionObserver 현재섹션 하이라이트(기존 moso-insta 패턴 재사용).
  • 컴포넌트: `<LogoLockup variant>`(가로/세로/심볼/역상 props로 자동 출력), `<ColorSwatch>`(클릭 시 HEX 복사·대비비 표시), `<TypeScaleRow>`, `<IconGrid>`(26종), `<TierBadge tier>`(시그니처/셀렉티드/스테이), `<OniAvatar>`+`<OniBubble>`(온이 페르소나), `<ChannelTag channel>`(OTA 6채널 컬러칩).
  • 인스타 키트 페이지: `<FeedGridPreview>`(3x3 목업), `<HighlightCover ×9>`, `<CarouselFrame role>`(cover/body/impact/cta).
  • 토큰 소비: 모든 컴포넌트가 `/api/brand/tokens.css`의 CSS 변수만 참조(하드코딩 색상 금지) → 브랜드 단일소스 원칙을 프론트에서도 강제.
  • 반응형: 기존 시스템대로 468px(인스타)·780px(문서)·풀폭(콘솔) 3브레이크포인트. PWA·SEO/OG 메타 공통기반 적용.

와이어프레임 설계

화면
핵심 화면 5종을 SVG로 그릴 수 있게 레이아웃을 명시한다.
브랜드 가이드 표지(다크)
화면 비율 세로형(A4). 최상단 얇은 라벨 바('BRAND IDENTITY SYSTEM · 2026 · 대외비'), 가운데 상단에 모소 심볼(라운드 사각 안 '모소' 모노그램) 크게, 그 아래 워드마크 '모두의숙소 / MOSO' 2단, 그 아래 한 줄 태그라인('콘텐츠만 주세요. 운영은 다 합니다'). 하단 1/4 지점에 가로 풀폭 컬러 스트립 6칸(네이비·미드·파우더·아이스 + 성공·경고). 배경은 네이비→짙은남색 그라데이션, 우하단에 반투명 큰 원 모티프 1개. 푸터에 'Appears Design × 무해' 잠금줄.
로고 변주 시트
흰 배경, 상단 섹션 타이틀 'LOGO LOCKUPS'. 2×4 그리드 8칸. 각 칸: 상단에 변주명 라벨(가로형/세로형/심볼/워드마크/역상/1색/최소크기/클리어스페이스), 가운데 해당 로고 형태(역상 칸만 네이비 배경), 클리어스페이스 칸은 로고 주위에 점선 여백 박스+'X' 단위 표기, 최소크기 칸은 24px 옆에 치수선. 하단에 빨강 헤더의 'DON'TS' 가로 띠 4칸(찌그러뜨리기·색변경·회전·그림자 — 각 칸 금지 아이콘에 빨간 사선).
컬러 시스템
흰 배경 2단. 상단 'CORE' 행: 큰 색칩 4개 가로, 각 칩 아래 이름/HEX/RGB/대비비(AA✓). 중단 'SEMANTIC' 행: 작은 칩 4개(성공·경고·위험·엠버). 하단 'OTA CHANNELS' 행: 6개 채널 칩(에어비앤비·부킹·아고다·야놀자·여기어때·네이버) 각 브랜드색+로고텍스트. 우측 좁은 칼럼에 'A11Y' 박스 — 흑/백 텍스트를 네이비/파우더 위에 얹은 가독 샘플 4줄.
인스타그램 프로필 + 9그리드
모바일 프레임(좁은 세로). 상단 앱바('모두의숙소' 로고+아이콘). 그 아래 프로필 영역: 좌측 원형 아바타(네이비 그라데이션+모소), 우측 통계 3칸(게시물·팔로워·팔로잉). 이름줄 '모두의숙소'+인증 체크 배지, 카테고리 '숙박 위탁운영 · AI 자동운영', bio 2줄, 링크줄('moso.kr · 1:1 무료 진단'), 액션버튼 3개(팔로우·메시지····). 하이라이트 커버 5개 원형 가로 스크롤(서비스·요금·후기·체험·문의). 최하단 3×9 피드 그리드(9분할 마스터 이미지가 3×3으로 쪼개진 모습 + 캐러셀 커버 썸네일 혼합).
브랜드 적용 접점 몽타주
흰 배경, 4분할 카드. ①콘솔 헤더(다크 사이드바에 모소 마크+'MOSO Console'+'● 엔진 라이브' 배지). ②호스트 네이티브 맥앱 아이콘(라운드 스퀘어). ③온이 채팅 말풍선 2개(게스트 회색/온이 네이비, 다국어 텍스트). ④등급 배지 3종(시그니처 금색·셀렉티드·스테이) 가로 나열. 각 카드 좌상단 번호 라벨, 카드 사이 균일 간격.

서버 · 보안

  • 자산 무결성: `brand_assets.checksum`(SHA-256)으로 CDN 자산 변조 검출, 정본은 immutable 버전 폴더(/v1.1)로만 교체(덮어쓰기 금지) → 외주·디자이너가 임의 교체해도 추적 가능.
  • Storage RLS: `brand-assets` 버킷 read=public(CDN), write=service_role + 디자이너 롤(`role=designer`)만, 삭제는 owner(무해)만.
  • 토큰 API: `/api/brand/tokens.*`는 read-only·강캐시(Cache-Control immutable + ETag), 쓰기는 Supabase Auth JWT + RLS로 디자이너/오너만.
  • OG 동적생성 Worker: title 파라미터 XSS/길이 sanitize(SVG 텍스트 이스케이프), 화이트리스트 kind만 허용, 응답 캐시로 남용 차단.
  • 폰트 라이선스 가드: Pretendard(OFL) + 전용 디스플레이 셀프호스팅은 라이선스 적합, 가이드 문서에 라이선스 고지 섹션 포함(클라 리스크 차단).
  • 소유권/이전: 전 원본(AI/SVG/Figma)·소스코드·Supabase 프로젝트는 공통기반 합의대로 무해 소유권 이전 — 핸드오프 시 Storage 버킷·테이블·Figma 팀 권한을 클라 계정으로 transfer, Appears는 접근권 회수.
  • 상표: 워드마크/심볼 최종본은 상표 출원 가능 형식(고해상 벡터·흑백 출원본)으로 별도 산출.

동작 프로세스

1) 킥오프·디스커버리: 무해 대표(명훈)·송현우 정렬 워크숍 1회 → 포지셔닝 좌표·키워드 3개·무드보드 2종 합의. 2) 버벌 락: 네이밍 규칙·태그라인·서브카피 5종·온이 보이스 승인. 3) 로고 탐색: 3개 시안 루트 제시 → 1개 선택 → 벡터 정밀 락(곡률·옵티컬). 4) 시스템 구축: 선택 로고 기준으로 변주 8종 → 컬러 토큰화 → 타입스케일 → 모티프·아이콘 26종 순으로 전개(이전 단계 승인이 다음 단계 입력). 5) 적용·확장: 온이 페르소나·등급 배지·인증마크 → 콘솔/맥앱/인스타 접점 목업으로 검증(실제 빌드된 콘솔·인스타에 얹어 정합성 확인). 6) 문서화: 토큰을 `brand_tokens` DB에 입력 → `/api/brand/tokens.css·json` 자동 생성 → 가이드 문서가 그 토큰을 소비(문서와 코드가 어긋날 수 없는 구조). 7) 인스타 세팅: 프로필·하이라이트 9·9그리드 템플릿 적용 + OG/파비콘/앱아이콘 멀티해상도 출력. 8) 핸드오프: 벡터 락·웹폰트·토큰 JSON·Figma·README 패키징 → Storage·테이블·Figma 권한 무해 이전 → 상표 출원본 별도 전달. 검수: 각 마일스톤(2·3·5·6단계) 클라 서면 승인 게이트, 결제는 계약금/중도금/잔금 구조 연동.

전환형 퍼널 + 정식 웹사이트 (Conversion Funnel + Official Website)

호스트가 "맡길 수밖에 없게" 만드는 전환 퍼널 1채(AI 무료진단 위젯 내장)와, 야놀자·놀유니버스 매각 테이블에 올릴 격을 갖춘 정식 브랜드 웹사이트 1채를 6개국어·SEO·PWA로 구축하고, 들어온 리드를 마스터콘솔로 흘려보내는 서버·보안 라인까지 완성한다.

₩12,000,000

■ A. 전환형 퍼널 웹 (moso.kr — 메인 1채, 원페이지 스크롤형) 모듈 ④ 마케팅 자동화(인스타 카드뉴스 봇 30덱·메타 무료 퍼널)가 만들어낸 트래픽이 떨어지는 "착지 지점". 카드뉴스의 모든 CTA("1:1 무료 진단", "콘텐츠만 주세요, 운영은 다 합니다", "내 숙소 맡기기", "한 달 무료")가 향하는 단 하나의 전환 페이지다. 목적은 단 하나 — 방문한 호스트를 "무료 진단 신청 리드"로 전환시키는 것. 페이지 자체가 영업사원이다(1:1 영업은 한계, 외부 퍼널로 호스트가 제 발로 들어오게 만든다는 블루프린트 11장 전략의 코드화).

구성: ① 히어로(문제 후킹 "새벽 2시, 또 폰을 켜셨죠" + 단일 CTA) ② 통증 단면(호스트의 24시간 — 새벽 외국어 응대·청소 펑크·정산 두통을 시간축으로) ③ 해결 한 줄("호스트는 한국어만, 나머지는 전부 자동") ④ AI 숙소 무료진단 위젯(핵심 전환 엔진 — 아래 별도) ⑤ 온이(AI) 실연 — 다국어 응대 채팅 데모 ⑥ 작동 원리 4스텝(콘텐츠만 주면 → 등록·다국어응대·가격·청소·정산 자동) ⑦ 신뢰 증거(청소 사진 인증·투명 정산·운영 데이터 해자) ⑧ 자주 묻는 질문(위탁=뺏김 아님·수수료·내 숙소 색 유지 — 카드뉴스 "오해 4가지"의 웹 버전) ⑨ 최종 전환 블록 + 리드 폼.

■ B. 정식 웹사이트 (moso.co.kr 또는 about.moso.kr — 메인 1채 + 하위 페이지 군) 퍼널이 "전환 깔때기"라면 이건 "회사의 얼굴". 제품을 바로 막 오픈하지 않고 제대로 브랜딩해서 초기 고객 100~1,000명 확보 후, 야놀자·놀유니버스 등과 정식 미팅·매각 테이블에 올릴 때 보여줄 격을 갖춘 사이트(블루프린트 로드맵). 투자자·파트너·언론·B2B 호스트가 "이 회사 진짜구나"를 느끼게.

구성(메인 + 하위 6): 메인(브랜드 메시지 "당신의 숙소를 비워두지 않습니다. 맡기면, 알아서 채워집니다." 풀스크린 히어로) · /product(제품 — 멀티-OTA 원툴·온이·완판 가격엔진·청소 투명노출을 제품 스크린샷과 함께) · /how(작동 원리 — 온보딩~정산 플로우) · /pricing-trust(수수료 구조·정산 투명성) · /experience(체험 8종 — 한과·김장·광장시장 투어, B2C 확장의 쇼윈도) · /company(회사·비전·3단계 로드맵 "브랜드 > 위탁 자동화 > 커머스 > 플랫폼화") · /contact·/legal(연락·법적고지·약관·개인정보처리방침·통신판매중개 면책).

■ C. AI 숙소 무료진단 위젯 (두 웹 공통 핵심 자산, 퍼널 전환 엔진) 카드뉴스의 "자가진단 체크리스트·진료 차트·자가진단 Q4" 컨셉을 인터랙티브 웹앱으로. 호스트가 5~7문항(외국어 문의 응대속도·주말/평일 가격 자동화·청소 연동·다채널 노출·정산 자동화 등)에 답하면 → 실시간으로 "내 숙소 자동화 점수"(0~100)와 "월 예상 누수 매출"을 계산해 시각화하고 → 점수가 나온 순간 "이 빈칸을 모두의숙소가 다 채웁니다 → 무료 진단 신청"으로 전환. 점수 계산 로직은 모듈 ①의 가격엔진(decideV2) 시그널과 모듈 ③ 마스터콘솔의 시장 인텔리전스(지역 EWMA 시세)를 끌어와, 입력한 지역·평수 기준 "당신 숙소는 시장가 대비 X% 낮게 운영 중"까지 보여주는 — 단순 설문이 아니라 데이터 백킹된 진단.

[명시적 제외 — 별도 모듈] 마스터콘솔·트레이딩터미널·온이 엔진 자체(모듈 ①·③) / 인스타 카드뉴스 봇·메타 광고 운영(모듈 ④) / 실제 OTA 채널 연동·청소 배차 시스템(운영 모듈). 본 모듈은 "공개 웹 + 리드 유입 + 그 리드를 콘솔로 넘기는 파이프"까지.

품목 · 세부단가수량합계
정보설계(IA) · 전환 카피라이팅 · 디자인 시스템 정의퍼널/웹 2채 전체 사이트맵·와이어플로우, 카드뉴스 30덱 후킹 카피의 웹 전환 카피 재설계(히어로·통증·CTA), MOSO 브랜드 디자인 토큰 확정(navy #1d3557·powder #a8dadc·전용 디스플레이 모소 로고), 타이포·그리드·컴포넌트 규칙서, 6개국어 카피 키 구조 설계₩1,450,0001 LOT₩1,450,000
전환 퍼널 메인 — 9섹션 원페이지 (디자인+퍼블리싱)히어로/통증단면/해결한줄/진단위젯존/온이실연/4스텝/신뢰증거/FAQ/최종전환 9개 섹션. 스크롤 인터랙션·진입 애니메이션·스티키 CTA·모바일 퍼스트 반응형. 섹션당 디자인+코딩 평균 18만원 × 9₩183,0009 LOT₩1,647,000
AI 숙소 무료진단 위젯 (인터랙티브 전환 엔진)5~7문항 스텝 위저드 UI, 실시간 자동화 점수(0~100) 게이지·월 누수매출 추정 시각화, 지역·평수 입력→시장 EWMA 시세 비교(decideV2/콘솔 연동), 결과→리드폼 전환 시퀀스, 결과 공유 OG 이미지 동적 생성₩1,303,0001 LOT₩1,303,000
리드 캡처 백엔드 — Supabase + 진단 스코어링 API (Worker)leads/diagnoses/utm 테이블 설계+RLS, 진단 채점·시세조회 엣지 함수(Cloudflare Worker), 리드 저장→마스터콘솔 온보딩 큐로 푸시, 스팸·봇 방어(Turnstile), 알림 웹훅(슬랙/카톡/이메일)₩1,200,0001 LOT₩1,200,000
정식 웹사이트 — 메인 + 하위 6페이지 (디자인+퍼블리싱)메인(풀스크린 브랜드 히어로) + product·how·experience·company·contact·legal. 페이지당 디자인+코딩 평균 25만원 × 7페이지₩250,0007 LOT₩1,750,000
다국어 i18n — 6개국어 (한·영·중·일 + 2)i18n 키 추출·런타임 로케일 스위처·언어별 라우팅(hreflang)·RTL 안전 처리·6개 언어 카피 적용·번역 검수 반영. 언어당 약 16.3만원 × 6₩163,0006 LOT₩978,000
SEO · OG · 구조화 데이터 · 사이트맵페이지별 메타·OG/트위터카드, JSON-LD(Organization·Service·FAQ·LocalBusiness·BreadcrumbList), 동적 sitemap.xml·robots.txt, canonical·hreflang, Lighthouse SEO 100 목표, GA4/검색콘솔/픽셀 연동₩720,0001 LOT₩720,000
PWA — 설치형 · 오프라인 · 푸시manifest·서비스워커·앱 아이콘 세트·오프라인 폴백·홈화면 설치 프롬프트(블루프린트 '허들 높게 PWA/앱화' 전략), 진단결과 캐시, 푸시 옵트인 기반₩640,0001 LOT₩640,000
법적 고지 · 약관 · 개인정보처리방침 · 통신판매중개 면책통신판매중개자 면책 고지(블루프린트 14장 법무), 위탁운영 약관, 개인정보처리방침(진단 데이터 수집·국외이전 동의), 쿠키 배너·동의 관리, 사업자정보 푸터 표준 블록₩480,0001 LOT₩480,000
리드 운영 어드민 — CRM 칸반 보드신규/연락중/진단완료/계약 단계 칸반, 리드 상세(진단 점수·지역·평수·UTM·응대 메모), 전환 퍼널 지표 대시보드, 마스터콘솔 온보딩 큐로 1클릭 승격, Supabase Auth + 역할 RLS₩880,0001 LOT₩880,000
반응형 QA · 크로스브라우저 · 성능 최적화iOS/안드로이드/데스크탑 실기기 QA, Safari·Chrome·삼성인터넷 호환, 이미지 WebP/AVIF·lazy·코드 스플리팅, Core Web Vitals(LCP<2.5s·INP<200ms·CLS<0.1) 튜닝, 접근성(WCAG AA) 패스₩560,0001 LOT₩560,000
배포 · 도메인 · CI · 인수인계Cloudflare Pages 배포·moso.kr/.co.kr 도메인·SSL·DNS, Git CI 자동배포·프리뷰, 소스코드+Supabase 프로젝트 소유권 클라 이전, 운영 매뉴얼·문서·1:1 핸드오프₩390,0001 LOT₩390,000
소계₩12,000,000

백엔드 구조

공통 기반(전 모듈 관통)을 그대로 사용. 이 모듈 전용 스키마:

• leads — 리드 마스터. id(uuid), created_at, status(enum: new/contacted/diagnosed/proposal/won/lost), name, phone, email, region(지역), property_type(한옥/펜션/아파트/게하), room_count, ota_channels(jsonb 현재 사용 채널), preferred_contact(카톡/전화), consent_privacy(bool), consent_marketing(bool), utm_source/medium/campaign/content(인스타 카드뉴스 어느 덱에서 왔는지 추적), referrer, landing_path, locale, assigned_to(uuid → admin), memo, score_snapshot(jsonb 진단 당시 점수).

• diagnoses — 진단 결과. id, lead_id(nullable; 폼 제출 전 익명 진단도 저장), created_at, answers(jsonb 7문항), automation_score(int 0~100), leak_revenue_est(int 월 추정 누수액), market_compare(jsonb: 입력 지역·평수의 시장 EWMA 시세 vs 추정 운영가), segment(번아웃/성장정체/확장준비 등), locale, session_id.

• market_cache — 진단 위젯이 참조하는 지역별 시세 캐시. region(PK), avg_price, demand_index, p25/p50/p75, source_badge(LIVE/WIRED/REAL/CALIB — 콘솔의 정직 4단계 배지 그대로), updated_at. 모듈 ③ 마스터콘솔/Worker가 5분 Cron으로 채우는 MOSO_KV를 미러링.

• lead_events — 리드 활동 타임라인(상태변경·연락·메모). id, lead_id, type, payload(jsonb), actor, created_at. RLS·감사용.

• experiences — 정식 웹 /experience 페이지 콘텐츠(체험 8종). slug, title_i18n(jsonb 6개국어), price(10000), duration, region, images(jsonb), active.

• i18n_strings(선택) — 카피 운영 테이블. key, locale, value, namespace. 또는 빌드타임 JSON(/locales/{lng}.json) 정적 번들 — 트래픽·SEO 위해 정적 우선, 운영 카피만 DB.

• page_meta — SEO 운영. path, locale, title, description, og_image, jsonld(jsonb), noindex(bool).

[RLS 정책]

- leads/diagnoses INSERT: anon 키로 허용하되 Turnstile 토큰 검증 통과 + rate-limit(IP·세션) 후에만. SELECT/UPDATE/DELETE: 인증된 admin 역할만(auth.jwt() role 체크). 호스트 본인 리드 재조회는 별도 매직링크 토큰.

- market_cache/experiences/page_meta SELECT: public(anon 읽기 전용). 쓰기: service_role(Worker)만.

- lead_events: admin read/write only.

- 모든 PII(phone/email) 컬럼은 RLS로 anon SELECT 완전 차단. 노출 필요 시 마스킹 뷰.

[API · 엣지 함수 — Cloudflare Worker(기존 moso-collector Worker에 라우트 증설)]

• POST /api/diagnose — 진단 채점. 입력(answers·region·property_type·room_count·locale) → market_cache 조회 → automation_score·leak_revenue_est·market_compare 산출(decideV2 시그널 재사용) → diagnoses INSERT(익명 허용) → 결과 JSON + 동적 OG 이미지 URL 반환. CORS·Turnstile 검증.

• POST /api/lead — 리드 생성. Turnstile 검증 → leads INSERT → diagnoses와 연결 → 알림 웹훅(슬랙/카톡 알림톡/이메일) → 마스터콘솔 온보딩 큐(KV/DB)로 푸시 → 200. 중복 전화/이메일 dedupe.

• GET /api/market?region= — 진단 위젯·웹이 쓰는 시세 조회(KV 캐시 우선, 5분 TTL).

• GET /og?score=&region= — 진단 결과 동적 OG 이미지(satori/SVG→PNG) — 카톡·인스타 공유 시 "내 숙소 자동화 점수 62점" 카드.

• POST /api/track — 퍼널 이벤트(섹션 노출·위젯 시작·이탈) 수집(전환 최적화용, 익명).

• GET /sitemap.xml · /robots.txt — 동적 생성(다국어 hreflang 포함).

• /api/i18n/* — 운영 카피 페치(정적 폴백).

[서비스 레이어]

- ScoringService: 진단 답변→점수. 가중치 테이블(응대속도 25·가격자동화 20·청소연동 15·다채널 20·정산 20)·시장비교 보정. 순수함수·결정론적·단위테스트(모듈 ① 가격엔진 17 PASS 패턴 계승).

- LeadPipeline: 리드 정규화·dedupe·UTM 귀속·콘솔 큐 푸시.

- NotifyService: 신규 리드 즉시 알림(알림톡 템플릿·이메일·슬랙). 실패 재시도 큐.

- MarketMirror: 모듈 ③ Worker의 MOSO_KV(지역 EWMA) → market_cache 동기화(Cron 또는 read-through).

- I18nService: 로케일 해석·폴백 체인(요청 언어→ko 기본).

- SeoService: page_meta·JSON-LD·hreflang·sitemap 빌드.

프론트엔드 구조

Astro 또는 Next(정적 우선 + 아일랜드 인터랙티브) · TypeScript · Tailwind(MOSO 디자인 토큰) · i18next/Astro-i18n · Supabase JS · Cloudflare Pages. SEO·속도 위해 콘텐츠는 SSG, 진단위젯·리드폼·온이데모만 클라이언트 아일랜드(부분 하이드레이션).

[A. 전환 퍼널 — 페이지 1 / 섹션 9 컴포넌트]

• HeroFunnel — 풀블리드 다크 히어로, 후킹 카피("새벽 2시, 또 폰을 켜셨죠"), 단일 1차 CTA, 스크롤 인디케이터, 신뢰 미니배지(누적 수집 1,116 매물·6개국어).

• PainTimeline — 호스트 24시간 시간축(새벽 응대→아침 청소→낮 가격→밤 정산), 스크롤 연동 하이라이트.

• SolutionOneLiner — "호스트는 한국어만, 나머지는 전부 자동" 대형 타이포 + before/after 토글.

• DiagnosisWidget(핵심 아일랜드) — 스텝 위저드(7문항), 라이브 게이지(0~100 SVG 도넛), 월 누수매출 카운트업, 지역·평수 입력→시장비교 바차트, 결과 카드 → CTA 전환. 상태머신·진행바·뒤로가기·중간이탈 복구.

• OniLiveDemo — 온이 다국어 응대 채팅 목업(영/중/일 말풍선 자동 타이핑), "이걸 24시간 자동으로" 캡션.

• HowItWorks4Step — 콘텐츠만 주면 → 등록·다국어응대·가격·청소·정산 4스텝 카드, 아이콘 애니메이션.

• TrustProof — 청소 사진 인증 갤러리(투명노출)·정산 리포트 샘플·"숙소 늘수록 똑똑해지는 데이터 해자" 차트.

• FaqObjections — 아코디언(위탁=뺏김 아님·수수료·내 숙소 색 유지·연락 안 됨 — 카드뉴스 "오해 4가지" 웹화).

• FinalConvert + LeadForm — 최종 카피 + 리드 폼(이름·연락처·지역·숙소유형·객실수·동의), 인라인 검증·제출 성공 시 "전담이 연락드립니다" 상태.

• 글로벌: StickyCtaBar(스크롤 시 하단 고정 "1:1 무료 진단"), LocaleSwitcher, FloatingKakao, A11y 스킵링크, ScrollProgress.

[B. 정식 웹사이트 — 메인 + 6 하위]

• SiteHeader(글래스 내비·언어·CTA) / SiteFooter(사업자정보·법적고지·SNS·6개국어).

• HomeHero — 풀스크린 "당신의 숙소를 비워두지 않습니다. 맡기면, 알아서 채워집니다." 브랜드 무드 + 제품 프리뷰 스크롤.

• ProductPage — 멀티-OTA 원툴·온이·완판가격엔진·청소투명노출을 콘솔 실스크린샷/모션으로(모듈 ③ 자산 재사용), 기능별 섹션.

• HowPage — 온보딩(아이디·주소만)→동기화→가격→응대→청소→정산 end-to-end 플로우 다이어그램.

• PricingTrustPage — 수수료 구조·정산 투명성·"빈 날 채워 더 번다" 시뮬 그래프.

• ExperiencePage — 체험 8종 카드 그리드(한과·김장·광장시장 투어), B2C 예약 관심 캡처.

• CompanyPage — 비전·3단계 로드맵(브랜드>위탁자동화>커머스>플랫폼화) 타임라인, 무해×Appears, 채용/파트너.

• ContactPage / LegalPages — 문의 폼·지도·연락, 약관·개인정보·통신판매중개 면책·쿠키정책.

[공통 컴포넌트 라이브러리] Button(primary/ghost)·Card·Accordion·Stepper·Gauge·StatCounter·BarChart·Toast·Modal·FormField(검증)·SkeletonLoader·OgImage·SeoHead·CookieConsent·LangPicker. 전부 토큰 기반 재사용.

[상태·데이터] 진단/리드는 React 아일랜드 로컬 상태 + Supabase JS. 시세는 SWR(엣지 캐시). 폼은 zod 스키마 검증. 다국어는 라우트 프리픽스(/en, /ja, /zh…) + hreflang.

와이어프레임 설계

■ W1 — 퍼널 히어로 (모바일) 최상단 좌측 "모소" 정사각 로고(powder 배경·navy 글자, 34px), 우측 햄버거+언어칩(KR). 그 아래 화면의 70% 높이를 차지하는 다크 네이비(#1d3557) 풀블리드 영역. 영역 중앙 약간 위: 작은 powder 색 아이라벨 "숙박 위탁운영 · AI 자동운영". 그 아래 대형 흰색 세리프성 헤드라인 2줄 "새벽 2시, / 또 폰을 켜셨죠" (좌측정렬, 자간 좁게). 헤드라인 아래 회색 서브 1줄 "외국인 문의·청소·정산… 혼자 다 하고 계셨잖아요." 그 아래 powder 색 풀폭 1차 CTA 버튼(높이 52px, 라운드 10px) "1:1 무료 진단 — 60초". 버튼 아래 3개 미니 신뢰배지 가로 나열(● 6개국어 AI / ● 누적매물 1,116 / ● 청소 사진인증). 히어로 최하단 중앙에 아래화살표 스크롤 인디케이터. 데스크탑: 헤드라인 좌측 55%, 우측 45%에 폰 목업(온이 채팅 화면) 비스듬히. ■ W2 — AI 무료진단 위젯 (모바일, 핵심 화면) 밝은 ice(#eef5f7) 배경 카드(라운드 16px, 그림자). 카드 상단: 작은 진행바(7스텝 중 ●●●○○○○ = 3/7)와 "내 숙소 자동화 진단" 타이틀. 중앙: 질문 1개 크게 "새벽 외국어 문의에 10분 안에 답하시나요?" + 라디오형 큰 선택칩 3개(예 / 가끔 / 아니오, 풀폭 세로 스택, 선택 시 navy 채움). 하단 좌측 "‹ 이전" 텍스트버튼, 우측 navy "다음 ›" 버튼. — 결과 단계 변형: 같은 카드에 상단 큰 도넛 게이지(SVG, 62/100, navy→powder 그라데이션 호) + 그 아래 "월 예상 누수 매출 ₩1,420,000"을 빨강 강조 카운트업, 그 아래 가로 막대 2개 비교("내 추정 운영가 ₩98,000" 회색 vs "성수 시장 중앙값 ₩141,000" navy) + 캡션 "성수 시장가 대비 30% 낮게 운영 중", 카드 최하단 powder 풀폭 CTA "이 빈칸, 모두의숙소가 다 채웁니다 → 무료 진단 신청". 데스크탑: 좌측 질문/결과, 우측에 점수 게이지+막대 패널 분리 2컬럼. ■ W3 — 리드 폼 / 최종 전환 (모바일) 상단 다크 네이비 띠에 흰 카피 "오늘 밤은 폰 끄고 주무세요." 아래 흰 배경 폼 카드: 라벨드 인풋 세로 스택 — 이름 / 연락처(전화) / 지역(드롭다운: 홍대·강남·성수·종로…) / 숙소 유형(칩: 한옥·펜션·아파트·게하) / 객실 수(스텝퍼) / 선호 연락(카톡·전화 토글). 그 아래 작은 체크박스 2개(개인정보 수집 동의*[필수] / 마케팅 수신 동의[선택]) + 회색 8pt "통신판매중개자로서 거래 당사자가 아니며…" 면책 한 줄. 최하단 navy 풀폭 제출버튼 "무료 진단 신청하기". 제출 성공 시 같은 카드가 체크 아이콘 + "전담 매니저가 24시간 내 연락드립니다"로 교체. 우하단 플로팅 카카오 버튼 상시. ■ W4 — 정식 웹 홈 히어로 (데스크탑) 상단 글래스 헤더(반투명 흰 블러): 좌 "모소" 로고, 중앙 내비(제품·작동원리·체험·회사·문의), 우 언어 셀렉터 + powder "무료 진단" 버튼. 헤더 아래 풀스크린(100vh) 히어로 — 배경은 절제된 한옥/숙소 무드 이미지 위 네이비 오버레이. 좌측 정렬 초대형 헤드라인 "당신의 숙소를 비워두지 않습니다." 다음 줄 powder 강조 "맡기면, 알아서 채워집니다." 아래 서브 1문장 + 2개 버튼(채움 "제품 보기" / 고스트 "회사 소개"). 우하단 작게 스크롤 유도 + "MOSO · 모두의숙소". 하단 경계에 파트너/채널 로고 스트립(에어비앤비·부킹·야놀자·여기어때 — 그레이스케일). ■ W5 — 제품 페이지 기능 섹션 (데스크탑, 반복 패턴) 지그재그 2컬럼 교차 레이아웃. 한 블록: 좌측 50% 콘솔 실스크린샷(라운드·그림자, 예—마스터콘솔 시장 인텔리전스 화면), 우측 50% 텍스트(작은 powder 아이라벨 "DYNAMIC PRICING" + 헤드 "별도 가격툴 없이, 운영 두뇌에 내장" + 3불릿 + 텍스트링크). 다음 블록은 좌우 반전(텍스트 좌·스크린샷 우). 4개 기능(멀티-OTA 원툴 / 온이 다국어 응대 / 완판 가격엔진 / 청소 투명노출) 반복. 섹션 사이 얇은 구분선. 모바일: 전부 1컬럼 세로 스택(이미지→텍스트 순). ■ W6 — 리드 운영 어드민 칸반 (데스크탑, 내부) 좌측 narrow 사이드바(모소 로고 + 메뉴: 리드보드·전환지표·체험문의·설정). 메인 상단 바: 타이틀 "리드 파이프라인" + 우측 검색·기간필터·"콘솔로 내보내기" 버튼. 본문 가로 스크롤 칸반 5컬럼(신규·연락중·진단완료·제안·계약), 각 컬럼 헤더에 카운트 뱃지. 카드: 호스트명 + 지역칩 + 자동화점수 도넛(미니) + UTM 출처(어느 카드뉴스 덱) + 최근 메모 + 담당 아바타. 카드 드래그로 단계 이동. 우측 슬라이드오버: 리드 상세(진단 답변 7개·점수·연락 타임라인·메모 입력·"온보딩 큐 승격" 버튼). 상단 KPI 띠: 방문→진단 전환율·진단→리드 전환율·이번주 신규 리드.

서버 · 보안

Cloudflare Pages(정적+엣지) + 기존 moso-collector Worker 확장(라우트 증설, 동일 계정·KV). Supabase(Postgres·Auth·Realtime·Storage). 전 구간 HTTPS·HSTS·자동 SSL.

[인증·권한]

- 공개 웹/퍼널: 인증 없음(SSG). 쓰기 경로(진단·리드·문의)만 Turnstile(Cloudflare 무료 캡차) 토큰 + 서버측 검증.

- 어드민(리드 CRM): Supabase Auth(이메일 매직링크 또는 OAuth) + 역할(admin/operator) 클레임. 미들웨어 게이트 + RLS 이중 방어.

- 호스트 본인 진단 재조회: 만료형 매직링크 토큰(서명·TTL), 세션 영속 안 함.

[RLS·데이터 보호] 위 backend의 RLS 정책 전면 적용. PII(전화·이메일) anon SELECT 완전 차단, 어드민도 마스킹 뷰 기본·상세는 권한 행에서만. 진단 익명 저장은 session_id로만(개인식별 분리). 개인정보 최소수집·동의 컬럼 강제(consent_privacy=false면 INSERT 거부 트리거).

[봇·남용 방어] ① Turnstile 전 쓰기 폼. ② Worker 단 rate-limit(IP·세션 슬라이딩 윈도, KV 카운터) — 진단 분당 N회·리드 시간당 M회. ③ 허니팟 필드 + 제출 최소 체류시간 검증. ④ dedupe(동일 전화/이메일 24h 병합). ⑤ Cloudflare WAF·DDoS(기본)·Bot Fight.

[입력·출력 보안] zod 스키마 서버검증, 파라미터라이즈드 쿼리(Supabase 클라이언트), 출력 이스케이프(XSS), CSP 헤더(script-src 화이트리스트)·X-Frame-Options·Referrer-Policy·Permissions-Policy. 동적 OG는 입력 sanitize 후 렌더.

[비밀·키 관리] 블루프린트 13장 원칙 계승 — 서비스 키·웹훅 시크릿·Hostaway/Beds24·알림톡 키는 코드·배포물에 절대 저장 안 함, Cloudflare/Supabase 환경변수(시크릿)로만. 클라(anon) 키만 프런트 노출, RLS로 보호. .env는 git 제외.

[개인정보·법무] 통신판매중개자 면책 고지(거래 당사자 아님) 전 페이지 푸터·폼 근접 노출. 개인정보처리방침(수집항목·목적·보유기간·국외이전(Cloudflare/Supabase 리전)·파기)·이용약관·쿠키 동의 배너(GA4/픽셀은 동의 후 로드). 진단 데이터 보유기간·삭제요청 경로 명시.

[관측·백업] Cloudflare Analytics·Workers Logs·Sentry(프런트 에러), Supabase 일일 백업·PITR. 알림 실패·전환율 급락 모니터링. 감사 로그(lead_events)로 누가 언제 리드 열람·수정.

[소유권 이전] 소스코드(Git 저장소)·Supabase 프로젝트·Cloudflare Pages/Worker·도메인 전부 무해(클라) 소유로 이관. 키·시크릿 로테이션 후 인계, 1:1 핸드오프 세션·운영 문서 제공.

동작 프로세스

① 모듈 ④ 인스타 카드뉴스(30덱)·메타 광고의 CTA 클릭 → moso.kr 도착(UTM 태깅: 어느 덱·어느 캠페인). ② 히어로 통증 후킹 → 스크롤하며 통증 공감 → 진단 위젯 진입. ③ 호스트가 7문항 응답 + 지역·평수 입력 → POST /api/diagnose → Worker가 market_cache(모듈 ③ EWMA 시세) 조회 + decideV2 시그널로 자동화 점수·월 누수매출·시장비교 산출 → diagnoses 익명 저장 → 결과 카드 렌더(게이지·누수액·"시장가 대비 30% 낮음"). ④ 결과 충격 → "이 빈칸 다 채웁니다" CTA → 리드 폼. ⑤ 폼 제출 → Turnstile·rate-limit·dedupe 통과 → POST /api/lead → leads INSERT(진단 연결) → NotifyService가 즉시 알림톡/슬랙으로 영업팀 호출 + 마스터콘솔 온보딩 큐로 푸시 → 화면 "24시간 내 연락" 전환. ⑥ 호스트는 결과 OG 카드(점수)를 카톡 공유 가능 → 2차 유입.

[흐름 2 — 리드 운영 → 콘솔 승격]

① 영업팀 어드민 로그인(매직링크) → 리드 칸반 보드. ② 신규 리드 카드(점수·지역·출처 덱·진단답변) 확인 → 슬라이드오버에서 상세·연락 → 단계 드래그(연락중→진단완료→제안→계약), 모든 변경 lead_events 감사 저장. ③ 계약 확정 리드 → "온보딩 큐 승격" 1클릭 → 모듈 ① 마스터콘솔 온보딩(아이디·주소만 입력 → 채널연결·가격엔진·청소라인 자동세팅)으로 인계. ④ 전환지표 대시보드가 방문→진단→리드→계약 퍼널 전환율·덱별 ROI 집계 → 모듈 ④ 카드뉴스 제작에 피드백.

[흐름 3 — 정식 웹사이트 브랜드·파트너 경로]

① 투자자·언론·B2B 호스트·OTA(야놀자·놀유니버스)가 검색/추천으로 moso.co.kr 도착 → 브랜드 히어로·제품·작동원리·회사 로드맵 열람(SSG 고속·SEO 상위·6개국어). ② 제품 페이지서 콘솔 실스크린샷·온이 데모·완판 가격엔진 그래프로 "진짜 작동하는 회사" 확인. ③ 체험 페이지(8종)서 B2C 확장 가능성 인지. ④ 문의 폼 또는 무료 진단 CTA로 전환 → 흐름 1·2와 동일 파이프. ⑤ PWA 설치 프롬프트로 "허들 높은" 앱 경험 제공(블루프린트 매각 전략 — 초기 100~1,000명 락인 후 매각 테이블).

[흐름 4 — 시세 데이터 동기화(백그라운드)]

모듈 ③ Worker의 5분 Cron이 지역 EWMA 시세를 MOSO_KV에 누적 → MarketMirror가 market_cache로 동기화 → 진단 위젯이 항상 최신 시장가로 비교(소스 배지 LIVE/WIRED/REAL/CALIB 정직 표기 그대로 노출). 맥/브라우저 꺼져도 서버가 계속 돈다.

마스터콘솔 CRM · 11단계 영업 퍼널 엔진 · 모바일 영업본부 · 10차 메일 자동화

미팅 전 리드 한 명이 들어온 순간부터 계약·고객 전환까지 — 11단계 파이프라인 위에서 자동으로 흐르고, 끊기지 않게 휴대폰으로 찌르고, 10차 메일이 알아서 따라붙는 어피어즈 전용 영업 운영체제(Sales OS).

₩15,000,000

기존 MOSO 마스터콘솔(시장 인텔리전스·전체 숙소·트레이딩 터미널·온이 실챗·다이내믹 프라이싱 decideV2)은 "이미 들어온 호스트를 운영"하는 두뇌다. 이 모듈 ③은 그 앞단 — "아직 고객이 아닌 사람을 고객으로 만드는" 영업 두뇌를 마스터콘솔 안에 새 탭(영업 CRM)으로 증설하고, 동일 자산을 휴대폰 전용 '모바일 영업본부' PWA로 동시 송출한다.

핵심은 11단계 영업 퍼널을 데이터 모델·자동화·UI 세 층 전부에서 일관되게 구현하는 것이다. 11단계 = ①미팅 전(리드 인입) → ②자격검증(스코어링) → ③중요 클라(핫리드 승격) → ④최초 컨택 → ⑤니즈 진단 → ⑥미팅 확정 → ⑦미팅 완료(상담록) → ⑧제안·견적 발송 → ⑨협상·검토 → ⑩계약(전자서명) → ⑪고객 전환(온보딩 인계). 각 단계는 진입조건·이탈조건·자동 트리거(메일·푸시·태스크 생성)·체류시간 SLA·다음 액션 추천을 갖는다.

리드는 5개 소스에서 자동 인입된다: (a) MOSO 랜딩/제안서 페이지의 "위탁 문의" 폼, (b) 견적서 빌더(contract.html)에서 생성된 견적 링크 열람·서명 이벤트, (c) 인스타·네이버 DM/문의(웹훅 또는 수동 퀵에드), (d) 1,116 실매물 수집 DB에서 '위탁 미계약' 호스트를 아웃바운드 타깃으로 끌어오기, (e) 명함 스캔/수동 입력. 인입 즉시 자동 스코어링(매물 규모·플랫폼 노출·응답성·지역 수요지수 연동)으로 ②자격검증을 통과하면 ③중요 클라로 승격하고 담당자에게 푸시한다.

영업 푸시 알림은 휴대폰과 실연동한다(Web Push VAPID + PWA, iOS 16.4+ 홈화면 추가 시 지원). "새 핫리드", "단계 SLA 임박(예: 제안 발송 후 3일 무응답)", "미팅 1시간 전", "견적 열람됨", "서명 완료" 같은 영업 결정적 순간을 실시간으로 손 안에 찌른다. 알림을 탭하면 모바일 영업본부의 해당 딜 카드로 딥링크된다.

CRM 메일 10차 퍼널은 단계별로 자동 발송되는 시퀀스 엔진이다. 리드가 특정 단계에 진입하면 사전 정의된 10개 템플릿(인트로 → 가치제안 → 케이스스터디 → 미팅 제안 → 리마인드 → 제안서 → 견적 → 소셜프루프 → 마감 임박 → 재활성화)이 지연·조건(열람/클릭/응답 시 분기·중단)에 따라 흐른다. 열람(트래킹 픽셀)·클릭(래핑 링크)·응답(회신 감지)을 기록해 단계 자동 전진과 스코어 가산에 반영한다.

모바일은 단순 반응형이 아니라 '엄지 운영'에 최적화된 별도 화면군이다 — 페이지 10개 이상(오늘 할 일, 파이프라인 칸반, 딜 상세, 빠른 리드 추가, 미팅 캘린더, 메일 시퀀스 모니터, 알림 인박스, 영업 대시보드, 활동 타임라인, 설정/팀)과 백엔드 서비스 10개 이상을 갖춘다. 모든 데이터는 Supabase(Realtime·Auth·RLS·동시성)에 적재되어 PC 마스터콘솔과 실시간 양방향 동기화된다. 산출물 소유권(소스·Supabase 프로젝트)은 계약상 클라(무해)에게 이전된다.

품목 · 세부단가수량합계
영업 CRM 데이터 모델 · Supabase 스키마 설계leads·deals·pipeline_stages(11)·stage_transitions(이력)·contacts·companies(매물/호스트)·activities·tasks·notes·attachments·lead_sources 등 14개 테이블 + 외래키·인덱스·뷰. 11단계 상태머신을 DB 제약(전이 규칙)으로 못박고 동시성(낙관적 락 version 컬럼)·소프트삭제 설계₩1,350,0001 LOT₩1,350,000
RLS 권한 정책 · 멀티테넌트 보안 설계역할(소유자/영업매니저/영업원/뷰어) × 11개 핵심 테이블 RLS 정책 작성·테스트. 담당자 본인 딜만 쓰기, 팀 전체 읽기, 감사로그 append-only. auth.uid() 기반 row 격리 + 서비스롤 분리₩900,0001 LOT₩900,000
11단계 파이프라인 상태머신 엔진(백엔드)단계별 진입/이탈 조건·자동 트리거·SLA 타이머·다음액션 추천 룰을 코드화한 stage-engine 서비스(Worker). 전이 시 자동 태스크 생성·메일 시퀀스 점화·푸시 발사·스코어 재계산을 오케스트레이션₩1,500,0001 LOT₩1,500,000
리드 인입 커넥터 5종(소스 통합)①문의폼 API ②견적빌더 이벤트(열람/서명 웹훅) ③인스타·네이버 DM 퀵에드/웹훅 ④1,116 실매물DB→아웃바운드 타깃 임포터 ⑤명함/수동 입력. 단가 28만 × 5소스₩280,0005 LOT₩1,400,000
리드 자동 스코어링 엔진매물 규모·플랫폼 노출·응답성·지역 수요지수(decideV2/REGIONS 연동)·행동(열람·클릭)을 가중합산해 0~100 핫스코어 산출, 임계 통과 시 ③중요클라 자동 승격. 가중치 튜닝 콘솔 포함₩1,100,0001 LOT₩1,100,000
CRM 10차 메일 시퀀스 엔진(백엔드)sequence/step/enrollment 모델 + 지연·조건분기·중단 로직 + Cron 디스패처. 단계 진입 시 자동 등록, 응답/열람 시 분기·정지₩1,250,0001 LOT₩1,250,000
메일 발송·추적 인프라 + 10종 템플릿 제작발송(Resend/SES 연동·도메인 인증 SPF/DKIM/DMARC)·열람 트래킹 픽셀·클릭 래핑·회신감지·바운스 처리 + 어피어즈 톤 반응형 HTML 템플릿 10종(인트로~재활성화) 카피·디자인₩190,00010 LOT₩1,900,000
휴대폰 푸시 알림 시스템(Web Push VAPID)VAPID 키·구독 관리·디바이스 토큰 테이블·발송 서비스·딥링크 페이로드. 6종 트리거(핫리드·SLA임박·미팅임박·견적열람·서명완료·@멘션) + 방해금지 시간·채널별 on/off₩1,150,0001 LOT₩1,150,000
PC 마스터콘솔 — 영업 CRM 탭 신설(프론트)기존 navy/powder 콘솔에 '영업' 탭 주입: 파이프라인 칸반(11열 드래그)·딜 상세 드로어·필터/검색·일괄작업·영업 대시보드 위젯. 기존 nav.insertBefore 패턴·디자인 토큰 그대로₩1,300,0001 LOT₩1,300,000
모바일 영업본부 PWA — 화면 10종 구축(프론트)오늘할일·칸반·딜상세·빠른리드추가·미팅캘린더·시퀀스모니터·알림인박스·대시보드·활동타임라인·설정. 엄지 최적화·오프라인 캐시·홈화면 설치. 단가 16.5만 × 10화면₩165,00010 LOT₩1,650,000
실시간 동기화 · 동시성 처리(Supabase Realtime)PC↔모바일 양방향 실시간 반영(딜 이동·새 활동·알림), 다중 영업원 동시편집 충돌 해소(낙관적 락 + presence), 낙관적 UI 업데이트·재연결 큐₩850,0001 LOT₩850,000
공통 기반 · 다국어 6개어 · SEO/OG · 법적고지 분담본 모듈 UI 6개어 리소스·OG카드·통신판매중개 면책 고지 연동·PWA manifest/SW. 전 모듈 공통기반의 ③모듈 귀속분₩520,0001 LOT₩520,000
통합 QA · 시나리오 E2E 테스트 · 영업팀 핸드오프11단계 전이 시나리오·시퀀스 분기·푸시 실수신(iOS/안드로이드)·RLS 침투 테스트 + 운영 매뉴얼·관리자 교육 1회₩480,0001 LOT₩480,000
소스코드 · Supabase 프로젝트 소유권 이전리포지토리·환경변수·Supabase 조직/프로젝트 이관, 인수인계 문서, 30일 하자보수₩650,0001 LOT₩650,000
소계₩15,000,000

백엔드 구조

- leads(id, source, source_ref, name, phone, email, company_id, listing_id, raw_payload jsonb, score int, stage_id fk, owner_id fk, status, created_at, version) — 인입 원장

- companies(id, name, biz_no, region, listing_count, platform_exposure jsonb, demand_index numeric) — 호스트/매물 주체(1,116 실매물 연동 키)

- contacts(id, company_id, name, role, phone, email, kakao_id, channel) — 담당자 다대일

- pipeline_stages(id 1~11, key, label_ko/en/ja/zh/vi/th, order, entry_rule jsonb, exit_rule jsonb, sla_hours int, color) — 11단계 정의(다국어 라벨 내장)

- deals(id, lead_id, company_id, title, amount_estimate, currency, stage_id fk, owner_id fk, probability int, expected_close date, quote_url, contract_url, lost_reason, created_at, updated_at, version)

- stage_transitions(id, deal_id, from_stage, to_stage, actor_id, reason, auto bool, dwell_seconds, created_at) — append-only 감사이력

- activities(id, deal_id, type[call/email/meeting/dm/note/system], direction, summary, payload jsonb, actor_id, occurred_at) — 타임라인 원천

- tasks(id, deal_id, owner_id, title, due_at, status, priority, auto_generated bool, source_trigger)

- notes(id, deal_id, author_id, body, pinned, created_at)

- attachments(id, deal_id, kind, url, name, size) — 명함·제안서·견적PDF

- lead_sources(id, key, label, config jsonb, active) — 커넥터 메타

- email_sequences(id, name, trigger_stage_id, active) / email_steps(id, sequence_id, step_no 1~10, template_key, delay_hours, send_condition jsonb, stop_condition jsonb) / email_enrollments(id, deal_id, sequence_id, current_step, status[active/paused/done/stopped], next_send_at) / email_events(id, enrollment_id, step_no, type[sent/open/click/reply/bounce], meta, at)

- push_subscriptions(id, user_id, endpoint, p256dh, auth, device, active) / notifications(id, user_id, type, title, body, deeplink, deal_id, read bool, sent_at)

- profiles(id=auth.uid, name, role[owner/manager/rep/viewer], avatar, dnd_window) — 팀/권한

[Postgres 뷰·함수]

- v_pipeline_board(단계별 딜 집계·금액합·평균체류), v_today_tasks(담당자 오늘 due), v_funnel_metrics(단계 전환율·이탈), fn_score_lead(스코어 계산), fn_advance_stage(전이+가드), 트리거: on stage change → enqueue 자동화

[Cloudflare Worker / API 엔드포인트]

- POST /api/leads/intake (5커넥터 공통 인입, source별 정규화) · POST /api/leads/score

- POST /api/deals · PATCH /api/deals/:id/stage (상태머신 가드+낙관락 version) · GET /api/board

- POST /api/sequences/enroll · Cron */15 /cron/sequence-dispatch (next_send_at 도래분 발송) · GET /api/track/open.gif · GET /api/track/click?u=

- POST /api/push/subscribe · POST /api/push/send(내부) · Cron /cron/sla-scan(단계 SLA 임박·미팅 임박 스캔→푸시)

- POST /webhook/quote (contract.html 열람·서명 이벤트 수신) · POST /webhook/dm(인스타/네이버) · POST /api/listings/import-target(실매물→리드)

- 견적빌더 /api/sign(기존)·SION_KV와 브리지: 서명 발생 시 deal stage→⑩ 자동 전진

[서비스 모듈]

stage-engine(전이·SLA·트리거 오케스트레이션) · scoring-service · sequence-engine(디스패처+분기) · mail-service(Resend/SES, SPF/DKIM/DMARC, 픽셀/래핑/바운스) · push-service(VAPID) · realtime-bridge · importer-service(실매물) · webhook-router

프론트엔드 구조

- 페이지/뷰: SalesDashboard(상단 KPI 4: 신규리드·핫리드·이번주 미팅·예상매출), PipelineBoard(11열 칸반, 가로 스크롤, 드래그앤드롭 전이), DealDrawer(우측 슬라이드, 상세+타임라인+메일+태스크 탭), LeadInbox(미배정 인입), SequenceMonitor(시퀀스별 진행·열람율·클릭율), FunnelChart(11단계 깔때기·전환율), SettingsPanel(스코어 가중치·시퀀스 편집·푸시규칙)

- 컴포넌트: StageColumn, DealCard(회사·금액·스코어 칩·SLA 신호등·담당 아바타), ScoreBadge(0~100 색구간), SlaPill(초록 적정/파랑 변동/황 임박, 기존 pmleg 색계), TimelineItem, EmailSequenceRow, KpiTile, TransitionToast, BulkActionBar, QuickFilter, DnDColumn

[모바일 영업본부 PWA — 화면 10종(별도 라우트, manifest-admin 계열, 하단 탭바)]

1. Today(오늘 할 일·임박 미팅·핫리드 푸시 요약) 2. Pipeline(세로 스와이프 칸반, 좌우로 단계 이동) 3. DealDetail(원탭 전화·카톡·메일, 단계 전진 버튼, 타임라인) 4. QuickAddLead(명함 카메라·음성메모·최소필드) 5. MeetingCalendar(주/일, 미팅 카드) 6. SequenceMonitor(모바일) 7. NotificationInbox(푸시 히스토리·딥링크) 8. MobileDashboard(스코어카드·펀넬 미니) 9. ActivityFeed(전사 활동 실시간) 10. Settings(알림 on/off·방해금지·계정)

- 컴포넌트: BottomTabBar, SwipeableDealCard, StageStepper, ThumbActionRow(전화/카톡/메일), PushBanner, MiniFunnel, FabQuickAdd, PullToRefresh, OfflineBadge

- 공통: 다국어 6개 i18n, OG/메타, 오프라인 캐시(Service Worker), 홈화면 설치 프롬프트

와이어프레임 설계

좌측 64px 글로벌 사이드nav(기존 콘솔), 그 옆 메인. 상단 바: 좌측 '영업 파이프라인' 타이틀 + 우측 [검색][담당자 필터][소스 필터][+ 리드]. 그 아래 KPI 스트립 4타일(신규리드/핫리드/이번주 미팅/예상매출, 각 큰 숫자+증감). 본문: 가로 스크롤 11개 컬럼, 각 컬럼 헤더=단계명+딜수 배지+금액합, 컬럼 폭 280px, 카드 세로 나열. 카드=회사명(굵게)·예상금액·스코어 칩(우상단 색원)·SLA 신호등 점·담당 아바타·마지막 활동 시간. 카드 드래그로 옆 컬럼 이동→전이 토스트. [화면2 · PC 딜 상세 드로어] 칸반 위에 우측에서 480px 슬라이드인. 헤더: 회사명+단계 배지+[단계 전진▸] 버튼. 상단 요약 행: 금액·확률·예상마감·담당. 탭 4개(개요/타임라인/메일/태스크). 개요=연락처·매물정보(실매물 연동)·메모핀. 타임라인=시간 역순 활동(콜·메일·시스템 자동). 메일=등록된 10차 시퀀스 진행 바(1~10 노드, 발송됨/열람/클릭 색) + 수동발송. 태스크=체크리스트+due. 하단 고정 액션바: [전화][카톡][메일][견적 링크][서명 링크]. [화면3 · 모바일 Today] 상단 인사+오늘 날짜, 우측 알림 벨(빨강 점). 섹션1 '지금 찌름'=핫리드 가로 카드 스와이프. 섹션2 '오늘 미팅'=시간순 리스트(시간·회사·장소·[지도]). 섹션3 '할 일'=체크박스 태스크(due 임박 빨강). 하단 탭바 5개(오늘/파이프라인/+/캘린더/더보기), 가운데 + 는 FAB(빠른 리드 추가). 당겨서 새로고침. [화면4 · 모바일 딜 상세] 상단 회사명+단계 스텝퍼(11점 진행, 현재 강조). 큰 액션 행 3버튼(📞전화/💬카톡/✉️메일) 엄지존. 그 아래 '다음 추천 액션' 카드(룰 기반, 예: "제안 발송 후 2일 경과 → 리마인드 메일") + [실행]. 스코어 게이지 0~100. 타임라인 세로. 하단 고정 [◂ 이전 단계][다음 단계 ▸]. [화면5 · 모바일 빠른 리드 추가] 풀스크린 시트. 상단 [명함 촬영] 큰 버튼(OCR 자동채움)·[음성메모]. 폼 최소필드: 이름·전화·회사·소스(드롭)·메모. 하단 [저장→파이프라인 ①]. 저장 즉시 스코어링→핫이면 배너. [화면6 · 메일 시퀀스 모니터] 상단 시퀀스 선택 드롭(예: '핫리드 10차'). 가로 진행 막대 10노드. 표: 딜별 행, 현재 step·다음 발송시각·열람/클릭 아이콘·[일시정지]. 상단 우측 요약(등록수·평균 열람율·응답율). [화면7 · 영업 대시보드/펀넬] 상단 기간 토글(주/월/분기). 좌: 11단계 가로 깔때기(폭=딜수, 옆 전환율 %). 우: 라인차트(주별 신규·계약). 하단 표: 담당자별 파이프라인 금액·전환율 랭킹. 색은 navy/powder 일관. [화면8 · 알림 인박스] 시간 역순 리스트, 타입 아이콘(핫리드/SLA/미팅/열람/서명). 미읽음 좌측 점. 탭→해당 딜 딥링크. 상단 [모두 읽음]·필터 칩.

서버 · 보안

Supabase Auth(이메일+OTP/매직링크), 영업팀 멤버만 가입(초대 도메인 화이트리스트). JWT 세션, 모바일 PWA는 refresh 토큰 보관(secure storage). 마스터콘솔 게이트(기존 john316 패턴)와 병행, 운영 전환 시 Auth로 일원화.

[권한·RLS] profiles.role 4단계(owner/manager/rep/viewer). 모든 핵심 테이블 RLS ON. rep=owner_id=auth.uid() row만 INSERT/UPDATE, 팀 SELECT 허용(manager/owner는 전체 쓰기). stage_transitions·activities·email_events·notifications는 append-only(UPDATE/DELETE 거부, 감사 무결성). 서비스롤 키는 Worker 서버측에만(클라 노출 금지), 클라이언트는 anon 키+RLS로만 접근. 가중치/시퀀스 편집은 manager+.

[전이·동시성 가드] PATCH /deals/:id/stage 는 (a) pipeline_stages.exit_rule 충족 검사 (b) version 낙관적 락(불일치 시 409→클라 리프레시) (c) 허용 전이표(11×11 인접행렬) 위반 거부. 동시 편집은 Realtime presence로 잠금 표시.

[웹훅 보안] /webhook/quote·/webhook/dm 는 HMAC 서명 검증(공유 시크릿)·타임스탬프 윈도우(리플레이 방지)·IP allowlist(가능 소스). 견적빌더 SION_KV 브리지는 내부 시크릿.

[메일 보안·전달성] 발신 도메인 SPF/DKIM/DMARC 정렬, 트래킹 링크는 서명된 토큰(위변조·오픈리다이렉트 차단), 수신거부(원클릭 unsubscribe)·바운스/콤플레인트 자동 정지(평판 보호), PII 최소수집.

[푸시 보안] VAPID 키 쌍(개인키 서버 보관), 구독 endpoint 사용자 귀속, 만료/410 자동 정리, 페이로드 최소화(민감정보 본문 제외, 딥링크 토큰).

[데이터 보호] 전 구간 HTTPS, 전화/이메일 등 PII 컬럼 접근 RLS 격리, 통신판매중개 면책 법적고지 연동(리드 동의·개인정보 처리방침 링크), 감사로그 보존. 비밀값은 Worker secret/환경변수(Wrangler), 레포에 평문 금지.

[소유권] 운영 안정화 후 Supabase 조직/프로젝트·소스 리포·도메인·시크릿 일체를 클라(무해)로 이관, 키 로테이션 가이드 제공.

동작 프로세스

5소스 중 하나에서 이벤트 발생(폼 제출/견적 열람/DM/실매물 타깃/명함) → POST /api/leads/intake 가 소스별 페이로드 정규화 후 leads 생성(stage ①미팅전) → fn_score_lead 즉시 호출(매물규모·노출·수요지수·행동 가중합) → 임계 통과 시 stage ②자격검증 자동 통과→③중요클라 승격 → stage-engine 이 (1)담당자 라운드로빈 배정 (2)push-service로 "새 핫리드" 발사 (3)email_enrollments 에 인트로 시퀀스 등록 → 담당자 휴대폰 알림 탭→모바일 딜상세 딥링크.

[흐름B · 컨택→미팅→상담(④~⑦)] 담당자 모바일에서 원탭 전화/카톡→activity 자동 기록(direction outbound), stage ④최초컨택 전진 → 니즈 진단 메모 입력 시 ⑤ → 캘린더에서 미팅 슬롯 확정 시 deals.expected_close·미팅 activity 생성, stage ⑥미팅확정 → SLA 스캐너 Cron 이 "미팅 1시간 전" 푸시 → 미팅 후 상담록 작성 시 ⑦미팅완료, 다음 추천 액션 카드 = "제안서 발송".

[흐름C · 제안→견적→협상(⑧~⑨)] ⑦에서 [견적 링크] 누르면 contract.html 빌더로 견적 생성·링크 deals.quote_url 저장, stage ⑧제안발송 + 제안 시퀀스 점화 → 고객이 견적 열람 시 /webhook/quote 수신→activity '열람'+score 가산+"견적 열람됨" 푸시 → 협상 메모/금액 조정 시 ⑨협상검토, SLA(예: 3일 무응답) 임박 시 자동 리마인드 메일+푸시.

[흐름D · 계약→고객전환(⑩→⑪)] 고객이 견적 링크 ?sign 에서 전자서명 완료→기존 /api/sign(SION_KV) 발생→브리지 웹훅이 deal stage ⑩계약 자동 전진+"서명 완료🎉" 푸시+계약 activity → 온보딩 인계 태스크 자동 생성(미팅·온이 세팅·청소 플로우) → 인계 완료 체크 시 ⑪고객전환, 해당 호스트가 기존 마스터콘솔 '전체 숙소'로 편입(운영 두뇌로 핸드오프). 펀넬 지표(v_funnel_metrics) 자동 갱신.

[흐름E · 10차 메일 디스패치(상시)] Cron */15 /cron/sequence-dispatch 가 next_send_at 도래한 enrollment 조회→send_condition 평가→mail-service 발송(픽셀+래핑)→email_events(sent) → 수신자 열람(open.gif)/클릭(track)/회신 감지 시 분기: 응답=시퀀스 stop+담당자 푸시, 미열람 N일=리마인드 step, 목표 행동 달성=stage 자동 전진. 모든 결과 Realtime 으로 PC·모바일 동시 반영.

호스트 SaaS — 가입·세팅 자동화·커미션·정산 대시보드·운영자 메신저

호스트가 로그인하고 숙소 정보만 넣으면 — 채널 자동가입·세팅·자동화가 걸리고, 커미션을 직접 고르고, 수익·예약·정산·CMS를 모바일 한 화면에서 보고, 운영자와 바로 대화하는 헤이딜러·토스급 셀프서브 호스트 앱.

₩14,000,000

MOSO에는 이미 '운영자(우리)의 두뇌'가 산다 — decideV2 다이내믹 프라이싱, fleet 시장수집, Worker 자율엔진(engineTick→/recommendations), 1,116 실매물, 마스터 콘솔. 모듈 ④는 그 위에 올리는 '호스트의 정문(正門)'이다. 호스트는 운영자 콘솔을 절대 보지 않는다. 호스트가 보는 것은 오직 이 앱 — 가입하고, 숙소를 등록하고, 커미션을 고르고, 돈과 예약과 정산을 확인하고, 운영자에게 말을 거는 셀프서브 SaaS. 헤이딜러(차 정보만 넣으면 견적·딜러 자동매칭)와 토스(잔액·내역·정산이 한 화면, 군더더기 0)의 UX 철학을 숙박 위탁운영에 이식한다.

[극한 범위 — 5개 기둥] ① 가입·온보딩(Heydealer Flow): 휴대폰 OTP/카카오/네이버 소셜 로그인 → 사업자 유형 선택(개인/간이/법인/외도민) → 숙소 추가 위저드(다음우편번호 API·숙소타입·객실수·편의시설·사진 업로드) → 신고증 업로드(공중위생/숙박업/외도민, 모듈 핵심 법적게이트, 미신고 매물 자동 거절) → 연동할 OTA 선택(에어비앤비·부킹·아고다·야놀자·여기어때·네이버) → Beds24/온다 채널매니저에 '자동 가입·매핑'(서버측 프로비저닝 잡) → 자동화 토글(다이내믹 프라이싱·온이 자동응대·청소 자동배차) ON → 약 7스텝 만에 운영 개시. 진행률 바·중간저장(Supabase row 단계 저장, 끊겨도 이어서)·각 스텝 검증. ② 커미션 선택(호스트가 직접 고르는 구조): 무료(0%·체험·기능제한)→베이직(1%)→프로(2%, 다이내믹+온이)→풀오토(3%, 청소·정산대행 포함) 티어 카드. 슬라이더로 '예상 월 수익 vs 커미션' 실시간 시뮬(자사 ADR·점유 실데이터 기반). 약정/해지·업/다운그레이드 신청(운영자 승인 큐로). 락인 장치(체험 8건+참가비 1만원, 명훈 합의). ③ 모바일 대시보드(Toss 홈): 상단 '이번 달 순수익' 큰 숫자 + 전월 대비 → 예약 현황(오늘 체크인/아웃·예약률 게이지·캘린더 히트맵) → 채널별 매출 도넛 → 정산 카드(다음 정산일·정산예정액·내역·세금계산서) → 성장 그래프(월별 GMV·점유·ADR 라인) → 다이내믹 프라이싱 '오늘 우리가 한 일'(엔진이 바꾼 가격 로그를 호스트 언어로 번역) → 온이가 처리한 문의 수. 전부 모바일 우선. ④ CMS(호스트 셀프 편집): 숙소 정보·사진·편의시설·하우스룰·체크인 안내·요금 베이스·최소박수·청소비·차단일(블록) 편집 → Beds24/온다로 즉시 라이트백(전 채널 동기화). '가격은 엔진에 위임 / 내가 직접' 토글. ⑤ 호스트↔운영자 메신저(백엔드 실시간): 인앱 채팅(텍스트·이미지·예약/정산 카드 첨부). 호스트가 '이번 주말 막아줘', '정산 언제?' 물으면 운영자(또는 온이 1차)가 답. 운영자측은 마스터 콘솔의 통합 인박스로 수신. 읽음·타이핑·푸시(웹푸시/FCM)·상담 티켓화.

[정직 경계 — 견적·UI에 그대로 반영] '자동가입'의 진실: OTA 직접 자동가입은 불가(에어비앤비 API 폐쇄). 실제 자동화되는 것은 채널매니저(Beds24/온다) 계정 프로비저닝 + 객실 매핑 + ARI 송출 배선이며, OTA 본계정 연결은 refresh token/초청코드 입력 반자동. 견적서·UI 카피 모두 이 경계를 지킨다(과장 금지). 이 모듈은 호스트가 만지는 SaaS 표면 + 그 뒤 프로비저닝 오케스트레이션에 한정(시장수집·엔진 두뇌는 타 모듈).

품목 · 세부단가수량합계
4.1 호스트 인증·계정휴대폰 OTP 로그인 + 카카오·네이버 소셜 OAuth + Supabase Auth 연동, 세션·리프레시 토큰, 호스트/운영자 역할 분리, 회원 탈퇴·재인증₩1,100,0001 LOT₩1,100,000
4.2 온보딩 위저드(7스텝)사업자유형→숙소추가(다음우편번호·숙소타입·객실·편의·사진 업로드 리사이즈)→신고증 업로드→OTA 선택→채널매니저 프로비저닝→자동화 토글→개시. 진행률·중간저장(단계별 Supabase row)·스텝검증·이어하기₩2,400,0001 LOT₩2,400,000
4.3 신고증 검증 게이트(법적)공중위생/숙박업/외도민 신고증 업로드·OCR 추출·미신고 매물 자동 거절·검토 상태머신(대기/승인/반려)·통신판매중개 면책 고지 동의 로깅. 형사 리스크 회피 구조의 UI화₩1,300,0001 LOT₩1,300,000
4.4 채널매니저 자동 프로비저닝 엔진Beds24 V2(초청코드/refresh token)·온다 ARI 어댑터로 호스트 계정·객실 자동 매핑 잡, 멱등·재시도·실패 백오프·매핑 검수 화면, 연동상태 배지(WIRED/LIVE). 서버측 오케스트레이션₩2,300,0001 LOT₩2,300,000
4.5 커미션 티어·시뮬레이터4티어 카드(0/1/2/3%)·'예상수익 vs 커미션' 실시간 슬라이더 시뮬(실 ADR·점유)·약정/해지·업다운그레이드 신청→운영자 승인 큐·락인(체험8건·참가비)₩1,300,0001 LOT₩1,300,000
4.6 모바일 대시보드(수익·예약·성장)이번달 순수익 히어로·예약현황(오늘 체크인아웃·예약률 게이지·캘린더 히트맵)·채널별 매출 도넛·성장 라인그래프(GMV/점유/ADR)·'엔진이 오늘 한 일' 로그 번역·온이 처리 문의수. 모바일 우선 차트₩1,700,0001 LOT₩1,700,000
4.7 정산 모듈(호스트뷰)다음 정산일·정산예정액·정산내역 타임라인·채널수수료/청소비/커미션 차감 분해·세금계산서(전자세금계산서 연계 훅)·정산 상태(예정/지급/보류)·CSV 영수증 다운로드₩1,500,0001 LOT₩1,500,000
4.8 CMS 셀프 편집 + 라이트백숙소정보·사진·편의·하우스룰·체크인안내·베이스요금·최소박수·청소비·차단일 편집 → Beds24/온다 즉시 라이트백(전채널 동기화)·'엔진 위임/직접' 가격 토글·변경 감사로그₩1,400,0001 LOT₩1,400,000
4.9 호스트↔운영자 메신저(실시간)Supabase Realtime 인앱 채팅·텍스트/이미지/예약·정산 카드 첨부·읽음·타이핑·티켓화·온이 1차응대 핸드오프. 운영자측은 마스터 콘솔 통합 인박스 수신₩1,300,0001 LOT₩1,300,000
4.10 푸시 알림·PWA웹푸시/FCM(예약 인입·정산 지급·운영자 메시지·이상감지)·PWA 설치(홈화면·오프라인 셸·앱아이콘)·알림 설정·딥링크₩700,0001 LOT₩700,000
4.11 다국어·접근성호스트 UI 6개국어(KO/EN/JA/ZH/FR/ES) i18n·외국인 호스트 대응·통화/날짜 로컬라이즈·기본 접근성(대비·폰트·터치타겟)₩500,0001 LOT₩500,000
4.12 통합 QA·E2E·배포·인수온보딩~정산 E2E 시나리오 테스트·반응형 회귀·CF Pages+Worker 배포·Supabase RLS 정책 검수·운영 핸드오프 문서·1개월 안정화 핫픽스₩500,0001 LOT₩500,000
소계₩14,000,000

백엔드 구조

hosts(id, auth_uid, phone, name, biz_type[personal/simple/corp/foreign_only], biz_no, ceo_name, addr, kakao_id, naver_id, created_at, locale) ·

properties(id, host_id FK, name, type[hanok/guesthouse/pension/saengsuk/motel...], rooms, address, lat, lng, amenities jsonb, house_rules text, checkin_info text, photos jsonb[], status[draft/pending/live/paused]) ·

licenses(id, property_id FK, kind[public_health/lodging/foreign_only], file_url, ocr_json jsonb, review_state[pending/approved/rejected], reviewer_note, verified_at) — 미신고 거절 게이트 ·

channel_connections(id, property_id FK, provider[beds24/onda], account_ref, room_map jsonb, ari_status[wired/live/error], last_sync_at, error_log jsonb) ·

ota_links(id, property_id FK, ota[airbnb/booking/agoda/yanolja/goodchoice/naver], external_listing_id, link_state[unlinked/pending/linked]) ·

commission_plans(id, host_id FK, tier[free/basic/pro/fullauto], rate_pct[0/1/2/3], started_at, ended_at, status[active/pending_change/cancelled], approved_by) ·

plan_change_requests(id, host_id FK, from_tier, to_tier, requested_at, decided_at, decision, operator_uid) — 운영자 승인 큐 ·

bookings(id, property_id FK, channel, guest_name, checkin, checkout, nights, gross_amount, channel_fee, status[confirmed/cancelled/completed], external_ref, created_at) — 채널매니저 webhook 인입 ·

settlements(id, host_id FK, period_start, period_end, gross, channel_fee, cleaning_fee, commission_amount, net_payout, state[scheduled/paid/held], payout_date, invoice_url) ·

settlement_lines(id, settlement_id FK, booking_id FK, type[revenue/channel_fee/cleaning/commission], amount) ·

threads(id, host_id FK, property_id, subject, status[open/closed], last_msg_at, assigned_operator) ·

messages(id, thread_id FK, sender[host/operator/oni], body text, attachments jsonb, read_at, created_at) ·

onboarding_progress(host_id FK, property_id, step, payload jsonb, updated_at) — 중간저장 ·

push_subscriptions(id, host_id FK, endpoint, keys jsonb, platform) ·

audit_log(id, actor, entity, entity_id, action, diff jsonb, at) — CMS 편집·승인 추적.

[API — Cloudflare Worker(기존 moso-collector 확장) + Supabase Edge/RPC]

Auth: POST /auth/otp(발송)·/auth/verify·/auth/social(kakao/naver 콜백).

Onboarding: POST /onboard/property·/onboard/license(업로드+OCR)·/onboard/step(중간저장)·GET /onboard/resume.

Provisioning(서버 오케스트레이션): POST /provision/connect{provider,property_id}→Beds24/온다 계정·객실 매핑 잡 enqueue, GET /provision/status, POST /provision/retry. 기존 moso-engine/beds24.js(Beds24 클래스 _token/_get/_post/toSoldEvents) + 신규 onda.js 어댑터 재사용.

Commission: GET /plans·POST /plan/select·POST /plan/change(→승인 큐).

Dashboard: GET /host/summary(순수익·예약률·채널매출·성장·엔진로그·온이건수, 기존 /occupancy·/ledger·/recommendations 집계).

Settlement: GET /settlements·GET /settlement/:id·GET /settlement/:id/invoice.

CMS: PUT /property/:id(편집→writeback)·POST /property/:id/block(차단일)·PUT /property/:id/pricing-mode. Writeback은 Beds24 setPrices/calendar PUT·온다 ARI POST.

Messenger: Supabase Realtime channel(threads/messages 구독)·POST /message·POST /thread/read·웹훅으로 운영자 콘솔 통합인박스 fan-out.

Push: POST /push/subscribe·내부 sendPush(webpush/FCM).

Webhook 수신: POST /webhook/beds24·/webhook/onda(예약 인입→bookings·settlement 집계→push).

[서비스/잡 — Worker Cron + Queue]

provisionWorker(큐 소비, 멱등 매핑·재시도) · settlementRoller(Cron daily, 기간별 정산 집계·net_payout 계산·invoice 생성) · pushDispatcher · bookingIngest(webhook→bookings→host_summary 캐시 무효화) · oniHandoff(메신저 무응답 N분→온이 1차응대, 기존 oniLive KB 재사용). 기존 자율엔진 체인(fleet→/ingest→engineTick→/recommendations, 기존 worker.js·engine_core.mjs)은 이 모듈의 '엔진이 한 일' 로그 소스로 read-only 소비.

프론트엔드 구조

페이지(라우트):

/login — OTP·소셜 로그인 ·

/onboarding — 7스텝 위저드(단일 플로우, 스텝 라우팅 /onboarding/[step]) ·

/home — 대시보드(기본 진입) ·

/properties·/properties/[id] — 숙소 목록·상세 ·

/properties/[id]/edit — CMS 편집 ·

/settlements·/settlements/[id] — 정산 목록·상세 ·

/plan — 커미션 티어·시뮬레이터 ·

/messages·/messages/[thread] — 메신저 ·

/settings — 알림·언어·계정.

컴포넌트:

- 인증: OtpInput, SocialButtons, BizTypePicker

- 온보딩: StepperBar(진행률), AddressSearch(다음우편번호), PropertyTypeGrid, AmenityChips, PhotoUploader(클라 리사이즈), LicenseUploader(드래그·OCR프리뷰·상태배지), OtaSelect, ProvisioningStatus(채널별 스피너·WIRED/LIVE 배지), AutomationToggles, ResumeBanner

- 커미션: TierCard×4, EarningsSlider(실시간 시뮬 그래프), PlanChangeSheet

- 대시보드: NetProfitHero(큰 숫자·전월대비), BookingTodayStrip(체크인/아웃), OccupancyGauge, CalendarHeatmap, ChannelDonut, GrowthLineChart, EngineActionLog('오늘 가격 이렇게 바꿨어요' 카드), OniHandledCounter

- 정산: SettlementCard(다음정산), SettlementTimeline, FeeBreakdownBar(수수료·청소·커미션 차감 시각화), InvoiceButton

- CMS: PropertyEditForm, BlockDateCalendar, PricingModeToggle(엔진위임/직접), SaveBar(라이트백 진행)

- 메신저: ThreadList, ChatView(버블·읽음·타이핑), AttachmentSheet(예약·정산 카드 첨부), MessageComposer

- 공통: PushPermissionPrompt, LangSwitcher(6개국어), LegalNoticeSheet(통신판매중개 면책), BottomTabBar(홈·숙소·정산·메시지·설정).

상태: Supabase 클라이언트 SDK(Auth·Realtime·RLS 자동), TanStack Query 캐시, 온보딩 로컬 드래프트→서버 동기화.

와이어프레임 설계

화면1 · 로그인(/login): 세로 중앙 정렬. 상단 1/3 지점 MOSO 로고(연꽃 심볼). 그 아래 'MOSO 호스트' 워드마크 + 서브카피 '숙소만 맡기세요. 나머지는 우리가.'. 중앙 휴대폰번호 인풋(국기+010 프리픽스) → 풀폭 '인증번호 받기' 버튼(브랜드 컬러). 그 아래 'OR' 디바이더. 카카오(노랑)·네이버(초록) 소셜 버튼 2개 가로. 하단 미니텍스트 '가입 시 통신판매중개 이용약관 동의'. 화면2 · 온보딩 위저드(/onboarding/[step]): 최상단 고정 StepperBar — 7개 점, 현재 3번째 채워짐 + '3/7 신고증 등록' 라벨, 우측 '임시저장' 텍스트버튼. 본문(신고증 스텝 예): 제목 '숙박 신고증을 올려주세요', 안내문 '미신고 숙소는 등록할 수 없어요(법적 보호)'. 점선 박스 업로더(아이콘+「파일 선택/촬영」). 업로드 후엔 썸네일+OCR 추출 결과 카드(신고번호·상호·소재지 자동인식) + 초록 체크 '검증 대기'. 하단 고정 바: 좌 '이전' 회색, 우 '다음' 브랜드 풀폭. 하단 외곽에 진행률 라인(43%). 화면3 · 커미션 선택(/plan): 상단 타이틀 '수수료를 직접 고르세요'. 가로 스크롤 4 TierCard(무료0%·베이직1%·프로2%·풀오토3%) — 카드마다 상단 티어명·큰 %·체크리스트(다이내믹/온이/청소/정산대행), 프로 카드에 '추천' 리본. 카드 아래 시뮬레이터 블록: '예상 월 순수익' 큰 숫자 + 좌우로 끄는 슬라이더(객실수·예상점유) → 그 아래 막대 2개 비교(총매출 vs 수수료 차감 후 순수익, 색 구분). 최하단 풀폭 '이 요금제로 시작' 버튼 + 미니텍스트 '체험 8건·언제든 변경'. 화면4 · 대시보드 홈(/home): 상단 인사 'OO님' + 알림벨(뱃지). 바로 아래 NetProfitHero 카드 — '이번 달 순수익' 라벨 + ₩큰숫자 + '▲ 전월 대비 +12%' 초록칩. 다음 행 2칸 미니카드(예약률 게이지 78% · 오늘 체크인 2/체크아웃 1). 아래 ChannelDonut(채널별 매출, 범례 에어비앤비·부킹·야놀자…). 아래 GrowthLineChart(최근 6개월 GMV 라인). 아래 EngineActionLog 카드: 제목 '오늘 엔진이 한 일' + 리스트('주말 +12% 인상', '평일 −8% 조정', '에어비앤비 단독→전채널 개방') 각 줄 아이콘. 최하단 고정 BottomTabBar 5탭(홈·숙소·정산·메시지·설정), 홈 활성. 화면5 · 정산 상세(/settlements/[id]): 상단 뒤로가기 + '6월 1차 정산'. 히어로 카드 '정산예정액 ₩X,XXX,XXX' + 상태칩 '6/25 지급예정'. 아래 FeeBreakdownBar — 가로 100% 스택바(총매출→채널수수료−·청소비−·커미션− = 순지급, 각 세그먼트 색+금액). 아래 SettlementTimeline 리스트(예약별 행: 게스트·채널·박수·금액). 하단 2버튼: '세금계산서' + 'CSV 내려받기'. 화면6 · 메신저(/messages/[thread]): 상단 운영자 아바타+이름+'온라인' 점. 채팅 영역 버블(운영자=좌 회색, 호스트=우 브랜드색), 중간에 첨부 카드 예시(예약 카드: 숙소·날짜·금액 미니). '읽음·오전 10:24' 타임스탬프, 하단 '운영자가 입력 중…' 인디케이터. 최하단 컴포저: 좌 + 첨부버튼(예약·정산 카드 시트)·텍스트 인풋·우 전송. 상단 우측 '온이 자동응대 켜짐' 토글 미니배지.

서버 · 보안

Supabase Auth(휴대폰 OTP + 카카오·네이버 OAuth). JWT 세션, 짧은 access + refresh 로테이션. 호스트/운영자/온이 역할 클레임 분리. 소셜 콜백은 Worker에서 state·PKCE 검증.

[권한·RLS — 핵심] 모든 테이블 RLS 강제. hosts/properties/bookings/settlements/threads/messages는 auth.uid()=host의 auth_uid인 행만 SELECT/UPDATE. 운영자 role은 service_role 또는 별도 정책으로 전 호스트 조회(콘솔 통합 인박스·승인 큐). plan_change_requests·license review_state는 호스트가 본인 신청 INSERT만, 승인 결정은 운영자 정책에서만 UPDATE. messages는 thread 소유자만 read/insert, 운영자 fan-out은 정책 예외. audit_log는 append-only(UPDATE/DELETE 차단).

[법적 게이트] 미신고 매물 차단: properties.status는 licenses.review_state='approved' 전까지 'live' 전이 불가(DB 트리거/RPC). 통신판매중개 면책 고지 동의는 가입 시 audit_log에 타임스탬프·약관버전 기록. 영업주체=호스트(B형) 구조 반영 — 매출은 운영사 통장 비경유, settlements는 집계·표시만(자금 직접 이동 없음, 자동 송금 미구현·표시 전용).

[시크릿·키] Beds24 refresh token·온다 자격증명·FCM 서버키·소셜 시크릿은 전부 Worker secret(코드 미저장, 기존 패턴 계승: env.BEDS24_REFRESH_TOKEN·HOSTAWAY_*). 호스트가 입력하는 OTA 토큰은 Supabase Vault/암호화 컬럼에 저장, 클라 노출 금지. INGEST_TOKEN류 내부 호출 토큰 검증(기존 worker.js 패턴).

[입력·업로드 보안] 신고증/사진 업로드는 서명 URL(Supabase Storage), MIME·용량 제한, 클라 리사이즈. OCR 결과는 신뢰경계 밖으로 취급(검토자 승인 필수). XSS 방지(메신저 본문 sanitize), CSRF(상태변경 토큰), 레이트리밋(OTP 발송·provision 재시도). webhook 수신은 서명 검증(Beds24/온다 시그니처).

[동시성·정합성] 채널매니저 라이트백·정산 집계는 멱등키. 더블부킹 창 최소화는 채널매니저(Beds24/온다) webhook 수초 동기화에 위임(자체 폴링엔진 미구축, 정직 경계). 정산 롤업은 booking 상태 확정분만.

[소유권 이전] 소스코드·Supabase 프로젝트(스키마·RLS·Edge)·Worker 전체 클라(무해온)로 이관. 키는 클라 계정 발급분 사용.

동작 프로세스

① 호스트가 /login에서 휴대폰 OTP 또는 카카오/네이버로 진입 → Supabase Auth가 hosts row 생성(없으면). ② /onboarding 스텝1 사업자유형 → 스텝2 숙소 추가(주소·타입·객실·편의·사진, 각 입력 즉시 onboarding_progress 저장) → 스텝3 신고증 업로드(서명URL→Storage→OCR→licenses INSERT, review_state=pending) → 스텝4 연동 OTA 선택 → 스텝5 POST /provision/connect → Worker가 provisionWorker 큐에 잡 적재 → Beds24 초청코드/refresh token(또는 온다)로 계정·객실 매핑 시도 → channel_connections.ari_status=wired, OTA 본계정은 토큰 입력 반자동 → 스텝6 자동화 토글(다이내믹·온이·청소) → 스텝7 개시. ③ 운영자가 콘솔 승인 큐에서 신고증 approved → 트리거가 properties.status=live 허용 → 라이브.

[운영 루프] 채널매니저 webhook(POST /webhook/beds24·onda)이 예약 인입 → bookings INSERT → host_summary 캐시 무효화 + pushDispatcher가 호스트에 '새 예약' 푸시 → 대시보드 /home의 NetProfitHero·예약률·채널도넛 갱신. 기존 자율엔진(engineTick cron→/recommendations)이 매물 권장가 산출 → CMS pricing-mode=engine이면 자동 라이트백 + EngineActionLog에 '오늘 한 일' 기록(호스트 언어로 번역).

[정산 플로우] settlementRoller(daily cron)가 기간 도래분 booking을 집계 → settlement_lines(매출·채널수수료·청소비·커미션) 생성 → net_payout 계산 → settlements.state=scheduled → 지급일 도래 시 paid + invoice_url(전자세금계산서 훅) → 호스트 푸시 → /settlements에 표시. 자금 자동 이동은 미구현(표시·집계 전용, B형 구조).

[커미션 변경] 호스트가 /plan에서 티어 변경 신청 → plan_change_requests INSERT(status=pending_change) → 운영자 콘솔 승인 큐 → 승인 시 commission_plans 갱신 → 다음 정산부터 새 rate 적용.

[메신저 플로우] 호스트가 /messages에서 전송 → messages INSERT → Supabase Realtime이 운영자 콘솔 통합 인박스로 fan-out + 운영자 푸시. 운영자 무응답 N분 → oniHandoff가 온이 1차응대(기존 oniLive 6개국어 KB) → 필요 시 운영자 에스컬레이션(threads.assigned_operator). 읽음·타이핑 Realtime 동기화.

청소관리자 앱 — 쏘카형 무로그인 PWA · 사진검수 · 1시간 지연 자동정산

링크 하나로 켜지는 청소사 전용 앱. 출근지 숙소를 앱이 직접 브리핑하고, 단계별 사진을 찍어 올리면 사람이 검수하고, OK 1시간 뒤 정산이 자동으로 꽂힌다 — 콘솔·호스트가 같은 화면을 실시간으로 본다.

₩7,000,000

청소 인력이 '설치도 가입도 없이' 카카오 알림톡으로 받은 매직링크 한 번으로 그날의 배차를 받고, 숙소별 출근 안내(공간 특징·디테일을 앱이 직접 설명)를 보고, 단계별 청소를 사진으로 인증해 올리면, 중간 검수자가 OK/반려를 누르고, OK 시점 +1시간 뒤 청소비가 자동 정산되는 '쏘카형' 운영 앱. 동일 데이터가 MOSO 마스터 콘솔(배차 보드)과 호스트 앱(안심 모니터) 양쪽에 실시간 미러링된다. 쏘카가 차 키 없이 폰만으로 차를 여는 것처럼, 청소사는 가입·앱스토어 없이 카톡 링크 한 번으로 그날의 일·동선·디테일·정산까지 끝낸다.

[왜 이 모듈인가 — 사업 맥락] 블루프린트 10장 '청소·운영 자동화'의 실물 구현체다. 무해의 위탁운영 핵심 약속은 "호스트는 한국어만, 청소·정산까지 우리가 다 한다"인데, 그 약속이 깨지는 단 하나의 지점이 현장 청소다. 청소사는 보통 (1) IT에 약한 중·고령 인력, (2) 여러 숙소를 하루에 도는 외주, (3) 앱 설치·로그인을 가장 싫어하는 집단이다. 따라서 이 앱의 설계 1원칙은 '제로 마찰'이다. 가입·비밀번호·앱스토어를 전부 제거하고, 카톡 링크→바로 오늘 할 일이라는 단 하나의 경로만 남긴다. 동시에 호스트·게스트에게 '사진 인증을 투명하게 노출'(블루프린트의 신뢰 해자)함으로써 재계약률을 끌어올린다.

[정직 경계 — 무엇이 자동이고 무엇이 사람인가] 자동: 배차 알림 발송, 출근 브리핑 생성, 사진 업로드·메타 기록, OK 후 정산 트리거(+1h), 알림톡 통지, 콘솔/호스트 미러링. 사람(반자동): 사진 검수(중간 검수자가 최종 OK), 펑크 시 대체 인력 최종 컨펌. 이 경계를 화면·문서에 라벨로 명시해 "다 자동"이라는 과장을 하지 않는다(블루프린트 13장 적대적 검증 기조 계승).

[범위 경계] 포함: 청소사 PWA 전체, 검수자 리뷰 콘솔, 정산 스케줄러·청소사 정산 화면, 콘솔/호스트 보딩 위젯, 알림톡 연동, 6개국어·접근성. 비포함(타 모듈/후속): 배차 '자동 매칭 알고리즘'의 고도화(본 모듈은 콘솔 수동배차+간이 자동배정까지), 청소사 급여 실지급(PG/이체 실행)은 정산 '확정·명세'까지만 — 실송금은 무해 회계 프로세스 또는 후속 결제모듈. 게스트 대면 CX(온이)는 모듈 ④.

품목 · 세부단가수량합계
무로그인 매직링크 인증·기기바인딩 세션청소사별 1회용 서명 토큰(JWT, 만료·재발급)으로 가입/비번 없이 입장. 첫 진입 시 기기 핑거프린트 바인딩→이후 같은 폰에서 무마찰 자동입장, 타 기기 접근 시 재인증. 토큰 탈취 대비 짧은 만료+롤링. 콘솔에서 청소사 1명 등록 시 영구 개인 링크 1개 자동 발급.₩540,0001 LOT₩540,000
청소사 PWA 셸 — 오프라인 캐시·홈화면 설치·웹푸시manifest.json+Service Worker(오프라인 우선, 지하·신축 약전계 현장 대비 큐잉·재전송). '홈 화면에 추가' 유도 배너, 풀스크린 standalone, iOS/안드 양대 대응. 미전송 사진은 로컬 IndexedDB에 보관 후 네트워크 복구 시 자동 동기화.₩420,0001 LOT₩420,000
오늘의 배차 카드 + 동선 최적 정렬입장 즉시 '오늘 OO건' 카드 리스트. 각 카드=숙소명·주소·체크아웃→체크인 마감시각·예상 소요·보수. 체크아웃 시각순/지도 동선순 정렬 토글, 지각 위험 카드 상단 핀. 단일객실 다수를 소수 인력이 도는 무해 운영 패턴(블루프린트 10장)에 맞춘 '다음 집까지 N분' 표시.₩470,0001 LOT₩470,000
숙소 출근 안내 — 공간 브리핑 디테일 엔진이 모듈의 심장. 숙소별 '공간 카드'를 앱이 직접 브리핑: 출입(도어록 번호·키박스 위치·엘리베이터), 공간 특징(평수·구조·복층 여부), 디테일 청소 포인트(한옥 마루결·원목 식기·루프탑 배수구 등 숙소 고유 주의), 비품 위치·보충 기준, 분리수거 규칙, 반려동물/흡연 흔적 체크. 사진+짧은 캡션 카드 스와이프. 콘솔에서 숙소당 1회 세팅하면 모든 배차에 자동 첨부.₩720,0001 LOT₩720,000
단계별 청소 체크리스트 + 진행상태 머신숙소 유형별 템플릿(스튜디오/독채/한옥/루프탑) 기반 단계 체크: 도착→환기→침구교체→욕실→주방→바닥→비품보충→최종점검→퇴근. 각 단계 토글, 일부 단계는 '사진 필수' 게이트(사진 없으면 다음 잠금). 상태머신(pending→in_progress→submitted→approved/rejected→settled)으로 데이터 정합성 보장. 기존 data.js cleaning 레코드(status·photos·checkout·checkin) 스키마 계승·확장.₩480,0001 LOT₩480,000
사진 촬영·압축·업로드 파이프라인(Before/After 슬롯)카메라 직촬(갤러리 첨부 차단 옵션으로 '현장 실촬영' 강제), 클라이언트 측 리사이즈·EXIF·WebP 압축으로 데이터·대역 절감, Supabase Storage 서명URL 직업로드(서버 우회로 비용·속도↑). 구역별 Before/After 슬롯 페어링, 업로드 진행바·실패 재시도, 썸네일 즉시 생성. 검수·호스트·게스트가 보는 단일 진실 소스.₩680,0001 LOT₩680,000
GPS·시각 메타 출퇴근 펀치 인증숙소 좌표 반경 지오펜스 안에서만 '청소 시작/완료' 펀치 가능(원격 허위완료 차단). 시작·완료 타임스탬프로 실작업 시간 산출→정산 검증·이상탐지(체크아웃 전 완료 등). 위치권한 거부 대비 폴백(검수자 수동승인). 호스트 안심 모니터에 '몇 시 입실·퇴실' 표시.₩340,0001 LOT₩340,000
검수자(중간 사람) 리뷰 콘솔 + 반려·재촬영 루프제출 큐를 검수자가 그리드로 일괄 검토: Before/After 나란히, 체크리스트 충족 여부, 펀치 시간·위치. 버튼=승인 / 부분반려(특정 구역만 재촬영 요청·코멘트) / 전체반려. 반려 시 청소사 앱에 알림톡+딥링크로 해당 구역만 재제출 루프. 승인 누른 순간이 정산 타이머 T0. 콘솔 청소 배차 보드(블루프린트 8장 '청소 배차 보드+사진 인증')에 내장.₩640,0001 LOT₩640,000
OK→1시간 지연 자동정산 스케줄러(Cron+큐)검수 승인 이벤트→정산 작업을 T0+60분 예약 큐에 적재. Cloudflare Worker Cron(기존 moso-collector */5 패턴 계승)이 만기 작업을 처리: 청소비 확정→청소사 정산원장 기재→호스트 정산(매출−수수료−청소비−운영료, 기존 settlement 스키마)에 비용 반영→알림톡 발송. 1시간 윈도우는 '승인 후 이의제기·반려 번복' 유예. 멱등 처리로 중복정산 방지, 취소 시 큐 회수.₩520,0001 LOT₩520,000
청소사 정산 명세·이력·누적 대시보드청소사 본인 화면: 이번 달 확정/대기 정산, 건별 명세(숙소·일자·금액·상태 타임라인 pending→approved→settled), 누적 수입 그래프, 펑크/반려 이력. 투명한 '내가 언제 얼마 받는지'로 인력 리텐션↑. CSV/이미지 내보내기. 무해 회계로 넘기는 월 마감 집계 export.₩390,0001 LOT₩390,000
카카오 알림톡 8종 발송 연동비즈메시지(알림톡) 템플릿 8종 설계·심사·연동: ①배정 통지 ②전일 리마인드 ③당일 출발 리마인드 ④검수 반려·재촬영 ⑤검수 승인 ⑥정산 확정 ⑦펑크 대체 호출 ⑧호스트용 청소완료 통지. 딥링크로 앱 해당 화면 바로 진입. 실패 시 SMS 폴백 경로 설계.₩460,0001 LOT₩460,000
콘솔·호스트 양방향 보딩(배차 보드+안심 위젯)동일 데이터를 두 곳에 미러링: (콘솔) 총관리자 청소 배차 보드—오늘 전 숙소 청소 상태 칸반(미배정·진행·검수대기·완료), 드래그 배차, 펑크 시 대체인력 호출. (호스트 앱) '메시지&청소 현황' 안심 모니터—내 숙소 청소 진행·완료 사진·시각을 읽기 전용으로. Supabase Realtime 구독으로 상태 변경이 양쪽에 즉시 반영.₩560,0001 LOT₩560,000
6개국어 i18n + 고령 작업자 접근성 UX공통 기반 6개국어(조선족·외국인 청소 인력 대비) i18n 적용. 고령·저시력 대비 큰 글씨·큰 터치타깃(48px+)·고대비 모드·아이콘+텍스트 병기·최소 단계 플로우. '한 손 엄지' 조작 동선, 햅틱/사운드 완료 피드백. 글 못 읽어도 사진·아이콘으로 진행 가능한 설계.₩250,0001 LOT₩250,000
Supabase 스키마·RLS·Storage·동시성 설계테이블(cleaners, cleaning_jobs, job_steps, job_photos, inspections, settlements, payout_ledger, notifications, space_briefs) 설계. RLS로 청소사는 '내 배차·내 정산'만, 검수자는 큐 전체, 호스트는 '내 숙소' 읽기전용. Storage 버킷 정책(서명URL·청소사별 폴더 격리). 동시 배차·중복 제출 동시성 락. 소유권 클라 이전 전제(소스·DB 무해 귀속).₩420,0001 LOT₩420,000
QA·실기기 현장 테스트·핸드오프 문서iOS·안드 실기기 교차 테스트, 약전계·오프라인 시나리오, 펀치/지오펜스 실측, 정산 타이머 경계 테스트. 청소사용 1장 사용설명(그림 중심)+검수자 SOP+콘솔 운영 가이드 핸드오프.₩110,0001 LOT₩110,000
소계₩7,000,000

백엔드 구조

1) cleaners — 청소사 마스터: id, name, phone, kakao_id, lang, device_fingerprint, magic_token_hash, active_link_slug, pay_rate_default, status(active/suspended). ※무로그인 식별 주체.

2) cleaning_jobs — 배차 단위: id, listing_id(FK 숙소), cleaner_id(FK), scheduled_date, checkout_at, checkin_deadline_at, pay_amount, status(pending/in_progress/submitted/approved/rejected/settled/cancelled), dispatched_at, started_at(펀치), finished_at(펀치), inspector_id, approved_at(=정산 T0), settle_due_at(=approved_at+1h), settled_at. ※기존 data.js의 cleaning{unit,date,worker,status,photos,checkout,checkin} 스키마를 정규화 확장.

3) job_steps — 단계 체크리스트 인스턴스: id, job_id(FK), step_key(arrive/ventilate/bedding/bath/kitchen/floor/restock/final), required_photo(bool), done(bool), done_at.

4) job_photos — 사진: id, job_id(FK), step_key, slot(before/after), storage_path, exif_taken_at, lat, lng, width/height, bytes, created_at.

5) inspections — 검수 기록: id, job_id(FK), inspector_id, decision(approve/partial_reject/reject), rejected_zones(jsonb), comment, created_at. ※approve가 정산 타이머 발화.

6) settlements — 호스트 월정산(기존 settlement{gross,commission,cleaning,fee,payout} 계승): id, listing_id, month, gross, commission, cleaning_cost, operation_fee, payout, finalized_at.

7) payout_ledger — 청소사 정산원장: id, cleaner_id, job_id, amount, state(pending/approved/settled/clawback), settle_due_at, settled_at. ※멱등키로 중복정산 차단.

8) notifications — 알림톡 발송 로그: id, target(cleaner/host), template_code(8종), job_id, sent_at, status(sent/failed/fallback_sms), deeplink.

9) space_briefs — 숙소 출근 브리핑: id, listing_id, access_info(jsonb: 도어록·키박스·엘베), features(jsonb: 평수·구조), detail_points(jsonb: 숙소 고유 주의), supplies(jsonb), photos(jsonb), updated_at. ※콘솔에서 숙소당 1회 세팅→전 배차 자동 첨부.

[API 엔드포인트 — Cloudflare Worker(기존 moso-collector 확장) + Supabase Edge/REST]

인증: GET /c/:slug (매직링크 진입→토큰 검증·기기 바인딩·세션 발급) · POST /auth/rebind (타기기 재인증).

청소사: GET /jobs/today (오늘 배차+동선) · GET /jobs/:id (상세+space_brief 조인) · POST /jobs/:id/start (지오펜스 검증 펀치) · POST /jobs/:id/step (단계 토글) · POST /jobs/:id/photo (서명URL 발급→직업로드 후 메타 커밋) · POST /jobs/:id/submit (제출, 상태→submitted) · GET /me/settlements (내 정산).

검수자: GET /review/queue · POST /review/:jobId (approve/partial_reject/reject) — approve 시 settle_due_at=now+1h 세팅 + 큐 적재.

스케줄러: scheduled() Cron */5 — settle_due_at<=now 인 payout_ledger 처리(멱등)→settlements 비용 반영→알림톡 발송. (기존 worker.js scheduled 패턴에 settleTick 추가.)

콘솔/호스트: GET /console/board (칸반 상태) · POST /console/dispatch (배차/재배차) · POST /console/standby-call (펑크 대체 호출) · GET /host/cleaning?listing=:id (안심 모니터 읽기전용).

알림톡: POST /notify (template_code+payload→비즈메시지 API, 실패 시 SMS 폴백).

[서비스/로직 레이어]

- DispatchService: 콘솔 수동배차 + 간이 자동배정(같은 동선·가용 청소사 우선). 동시 배차 락.

- BriefingService: space_briefs→배차별 브리핑 카드 조립.

- PhotoService: 서명URL 발급·EXIF/GPS 파싱·Before-After 페어링·썸네일.

- GeofenceService: 펀치 좌표 vs 숙소 좌표 반경 판정.

- InspectionService: 승인/반려 상태전이, 반려 구역만 재오픈.

- SettlementScheduler: T0+60m 지연 큐, 멱등 정산, 취소 시 회수(clawback).

- NotifyService: 알림톡 8종 템플릿 렌더+발송+폴백.

- RealtimeBridge: 상태변경→Supabase Realtime 채널 publish(콘솔·호스트 동시 갱신).

프론트엔드 구조

페이지: P1 매직링크 랜딩/세션 부트 · P2 오늘의 배차 리스트(카드+동선 정렬) · P3 숙소 출근 브리핑(공간 카드 스와이프) · P4 단계별 청소 체크리스트(사진 게이트) · P5 사진 촬영·업로드(Before/After 슬롯) · P6 제출 완료/검수 대기 · P7 반려 재촬영 화면 · P8 내 정산(명세·이력·누적 그래프) · P9 프로필/언어/설치 안내.

컴포넌트: JobCard, RouteSorter(시각순/동선순 토글), BriefCardSwiper, StepChecklist, PhotoSlot(B/A 페어), CameraCapture(직촬), UploadProgress, PunchButton(지오펜스 상태), StatusTimeline, SettlementRow, LangSwitcher, InstallPrompt, OfflineBanner, BigTouchButton(접근성 48px+).

[웹 — 검수자 리뷰 콘솔 (MOSO 마스터 콘솔 내 '청소 배차 보드' 탭 확장)]

페이지: 검수 큐(그리드) · 건별 검수 디테일(Before/After 병렬+체크리스트+펀치 메타) · 배차 칸반 보드(미배정/진행/검수대기/완료) · 펑크 대체 호출.

컴포넌트: ReviewQueueGrid, BeforeAfterCompare, ChecklistAudit, PunchMetaBadge(시각·위치), ApproveRejectBar(승인/부분반려/전체반려+코멘트), DispatchKanban(드래그 배차), StandbyCallModal, SettleTimerBadge(T0+1h 카운트다운).

[웹/앱 — 호스트 안심 모니터 (호스트 앱 '메시지&청소 현황' 위젯)]

컴포넌트: CleaningStatusWidget(내 숙소 진행/완료), CompletedPhotoGallery(읽기전용 Before/After), CleanTimeStamp(입·퇴실 시각), 재계약 신뢰용 '최근 청소 인증' 카드.

[디자인 시스템] 블루프린트 팔레트 계승(--navy #1d3557 / --mid #457b9d / --powder #a8dadc / --ice #eef5f7), Pretendard, 모바일 우선. 청소사 앱은 고대비·대형 터치·아이콘 병기로 별도 접근성 스킨.

와이어프레임 설계

모바일 세로. 상단 고정바: 좌측 '모소' 로고(디스플레이 서체)+우측 언어칩. 그 아래 인사 헤더 '정숙님, 오늘 3곳이에요' + 날짜. 정렬 토글(세그먼트): [체크아웃순][동선순]. 본문=세로 카드 스택. 각 카드: 좌측 숙소 썸네일(64px), 우측 본문—숙소명(굵게)·동 주소(작게)·하단 메타행 칩 3개(체크아웃 11:00 / 입실마감 15:00 / 보수 ₩50,000). 카드 우상단 상태 점(회색 대기/파랑 진행/초록 완료). 지각 위험 카드는 상단에 빨간 얇은 띠 '마감 임박'. 카드 전체 탭→브리핑. 하단 탭바 4개: 오늘 / 내 정산 / 알림 / 프로필. [화면 2 — 청소사 P3 '숙소 출근 브리핑'] 상단 뒤로가기+숙소명. 최상단 '출입 카드'(강조 박스, 자물쇠 아이콘): 도어록 1234*, 키박스 위치 사진, 엘베 정보. 아래 가로 스와이프 카드 덱(점 인디케이터): [공간 특징] 평수·복층 구조 / [디테일 주의] '한옥 마루는 물걸레 금지, 원목식기 식기세척기 금지' 같은 숙소 고유 경고(아이콘+사진) / [비품 위치·보충 기준] / [분리수거 규칙]. 각 카드는 사진 상단+캡션 하단. 최하단 큰 버튼(고정, 초록) '청소 시작' — 누르면 지오펜스 검사. [화면 3 — 청소사 P4+P5 '체크리스트+사진'] 상단 진행바(8단계 중 N). 세로 단계 리스트: 각 행=체크박스+단계명+(사진필수 단계는 카메라 뱃지). 사진필수 단계 탭→하단 시트로 PhotoSlot 열림: 좌 'Before' 슬롯/우 'After' 슬롯 나란히, 빈 슬롯은 점선+카메라 아이콘. 탭→카메라 직촬(갤러리 비활성)→촬영 후 썸네일+업로드 진행바. 두 슬롯 다 차면 단계 자동 체크·다음 잠금 해제. 하단 고정 '제출하기' 버튼은 모든 필수 단계 완료 전 비활성(회색)→완료 시 활성(네이비). [화면 4 — 검수자 리뷰 디테일(콘솔)] 데스크톱 2단. 좌측 큐 리스트(제출 시각순, 숙소·청소사). 우측 검수 패널: 상단 메타 바(숙소명·청소사·시작 11:14·완료 12:38·위치 ✔ 반경내). 중앙=구역별 Before/After 2열 그리드(욕실 전/후, 주방 전/후…), 클릭 시 확대. 우측 사이드=체크리스트 충족 표(8/8 ✔). 하단 고정 액션바: [승인](초록, 옆에 'T0+1h 정산' 안내)·[부분 반려](구역 선택+코멘트)·[전체 반려]. 승인 누르면 카운트다운 뱃지 '59:59 후 자동정산' 표시. [화면 5 — 콘솔 배차 칸반 보드] 4열 칸반: [미배정][진행중][검수대기][완료]. 각 카드=숙소·시각·청소사(미배정은 빈 아바타). 미배정 카드를 청소사 레인으로 드래그→배차. 우상단 '펑크 대체 호출' 버튼→가용 청소사 모달. 상단 요약칩: 오늘 총 12건·검수대기 3·완료 7·펑크 0. [화면 6 — 호스트 안심 모니터 위젯] 모바일 카드. 헤더 '오늘의 청소'. 진행 숙소: 상태 점+ '청소 중 · 12:10 시작'. 완료 숙소: '완료 · 12:38' + 가로 스크롤 Before/After 썸네일(탭 확대, 읽기전용). 하단 회색 주석 '사진은 청소사가 현장에서 직접 촬영·인증한 기록입니다'(신뢰 카피). [화면 7 — 청소사 내 정산] 상단 이번 달 큰 숫자(확정 ₩540,000 / 대기 ₩100,000). 아래 건별 리스트: 일자·숙소·금액+상태 타임라인 칩(승인됨→59분 후 정산 / 정산완료 ✔). 최하단 누적 수입 막대그래프(월별).

서버 · 보안

무로그인이되 무방비가 아님. 매직링크=청소사별 서명 토큰(짧은 만료+롤링 재발급). 첫 진입 시 기기 핑거프린트 바인딩→이후 같은 폰 무마찰, 타 기기/만료 시 알림톡으로 새 링크 재발급(POST /auth/rebind). 토큰은 코드/배포에 저장 금지, 해시만 DB 보관(기존 블루프린트 '키는 환경변수로만' 원칙 계승).

[권한 — Supabase RLS] 역할 3종 격리: 청소사=자기 cleaning_jobs·job_photos·payout_ledger만 read/write(다른 청소사 배차·정산 불가시), 검수자=검수 큐 전체 read+inspections write, 호스트=자기 listing의 청소 현황 read-only(쓰기 전면 차단). Storage 버킷은 청소사별 폴더 격리+서명URL 단기만료(사진 무단 열람 차단).

[현장 무결성] (1) GPS 지오펜스: 숙소 반경 밖 펀치 거부→원격 허위완료 차단. (2) 카메라 직촬 강제 옵션: 갤러리 첨부 차단으로 '딴 사진' 제출 방지, EXIF 촬영시각·좌표를 서버가 교차검증. (3) 펀치 시각 vs 체크아웃 시각 정합성 이상탐지(체크아웃 전 완료 등 플래그).

[정산 안전] 멱등키(job_id 기준)로 중복정산 원천 차단. 승인 후 1시간 유예 윈도우는 이의·반려 번복 안전장치—이 안에서 취소 시 큐 회수(clawback). 정산 트리거는 Cron 서버측에서만 발화(클라이언트가 정산 못 일으킴). 모든 정산 이벤트 감사로그(누가 언제 승인→정산).

[데이터·법무] 통신판매중개 면책 법적고지(공통 기반)·개인정보(청소사 연락처·위치·사진) 최소수집·보존기한·동의. 사진은 운영 인증 목적 한정, 게스트 식별정보 노출 금지(청소 사진에 게스트 소지품 마스킹 가이드). 소스코드·Supabase 프로젝트 소유권 무해 이전(공통 기반).

[가용성] PWA 오프라인 큐로 약전계 현장에서도 데이터 유실 없음. 알림톡 실패 시 SMS 폴백. Worker Cron은 내·대표가 꺼놔도 도는 상주 구조(기존 moso-collector 패턴).

동작 프로세스

콘솔에서 청소사 1명 등록→개인 매직링크 1개 자동 발급. 콘솔 배차 보드에서 '내일 OO숙소 11:00 체크아웃' 카드를 청소사에게 드래그 배차(또는 간이 자동배정). → cleaning_jobs(pending) 생성 + 알림톡 ①배정 통지 발송.

[B. 출근·진입] 청소 당일 아침 알림톡 ③출발 리마인드. 청소사가 링크 탭→(첫 진입만 기기바인딩)→바로 '오늘의 배차'. 카드 탭→숙소 출근 브리핑(앱이 출입·공간특징·디테일 주의·비품을 직접 설명). 현장 도착→하단 '청소 시작'→지오펜스 검증 통과→started_at 펀치, status=in_progress(콘솔 칸반 '진행중'으로 실시간 이동, 호스트 안심위젯 '청소 중' 표시).

[C. 청소·인증] 단계별 체크리스트 진행, 사진필수 단계는 Before/After 직촬 업로드(클라 압축→서명URL 직업로드→메타 커밋). 전 단계 완료→'제출'→finished_at 펀치, status=submitted, 검수 큐 적재.

[D. 검수(중간 사람)] 검수자 콘솔 큐에서 Before/After·체크리스트·펀치 메타 확인. 결정: (a)승인→approved_at=T0, settle_due_at=T0+1h, payout_ledger(pending) 적재, 알림톡 ⑤승인+⑧호스트 청소완료. (b)부분반려→해당 구역만 청소사 앱 재오픈+알림톡 ④, 청소사 재촬영→재제출→재검수 루프. (c)전체반려→재청소.

[E. 자동정산(+1h)] Worker Cron */5가 settle_due_at<=now 인 건 처리(멱등): payout_ledger→settled, settlements에 청소비 반영(매출−채널수수료−청소비−운영료=호스트 정산금, 기존 스키마), 알림톡 ⑥정산 확정(청소사)·정산 명세 갱신(호스트). 1시간 안에 이의·반려 번복 시 큐 회수.

[F. 펑크 대응] 배차 청소사가 펑크(미펀치/거절)→콘솔 알림→'펑크 대체 호출'로 가용 청소사에게 알림톡 ⑦→수락 시 재배차, 동선 재정렬.

[G. 미러링] 모든 상태전이는 Supabase Realtime으로 콘솔 배차 보드·호스트 안심 모니터에 즉시 반영—'맡기고 잊는다'를 실시간 화면으로 증명.

온이 AI — 다국어 음성통화 · 전(全)플랫폼 메시지 자동응대 · 호스트별 자동응대 설정

전 세계 언어로 전화를 받고(070 음성 AI), 에어비앤비·부킹·아고다·야놀자·여기어때·네이버 6채널의 게스트 메시지를 호스트의 말투 그대로 자동 응대하며, 판단이 필요한 건만 호스트에게 넘기는 — 숙소마다 따로 길들여지는 24시간 다국어 컨시어지 두뇌.

₩11,000,000

온이 AI는 무해(MOSO)가 위탁받은 전 숙소의 "게스트 응대 노동"을 사람 손 없이 대신하는 통합 두뇌다. 두 개의 입력 채널을 하나의 같은 뇌로 처리한다 — (A) 음성: 070 인터넷전화로 걸려오는 외국인/내국인 예약·문의 전화를 OpenAI Realtime(음성-투-음성) + Twilio Programmable Voice로 실시간 통역·응대하고, (B) 텍스트: 에어비앤비·부킹·아고다·야놀자·여기어때·네이버 6개 채널의 게스트 메시지를 채널매니저(Hostaway/온다) 웹훅으로 수신해 동일한 응답 엔진으로 자동 회신한다. 두 입력 모두 같은 컨텍스트(예약 정보·숙소 규칙·지식베이스·과거 대화)를 공유하므로, 게스트가 전화로 물었다가 채팅으로 다시 물어도 온이는 이미 안다.

핵심 설계 철학은 "숙소마다 사정이 다르다"이다. 따라서 온이는 단일 봇이 아니라, 호스트가 숙소별로 페르소나(따뜻한 집주인/프로페셔널 매니저/친근한 로컬 친구/감성 큐레이터)·말투·우선 언어·인사말·전용 규칙/FAQ·금지어·에스컬레이션 임계값·자동/수동 모드를 지정할 수 있는 "길들여지는 AI"다. 콘솔에는 이미 숙소 상세 → 온이 패널의 ⚙ 설정 모달과 '온이 브레인'(다국어 딥러닝 센터: 학습 대화 18,420건·자동응대율 88.4%·6개국어 커버리지·에스컬레이션 11.6%·숙소별 312/지역별 47/글로벌 1,840 지식베이스)이 빌드되어 있고, 이 모듈은 그 목업을 실제 동작하는 프로덕션 시스템으로 배선한다.

[범위에 포함] 1) 음성 AI 파이프라인: 070 인바운드 라우팅 → Twilio Media Streams ↔ OpenAI Realtime 양방향 오디오 브리지(Cloudflare Worker WebSocket relay) → 게스트 발화 언어 자동 감지(KO·EN·JA·ZH·FR·ES + 기타 폴백) → 숙소 컨텍스트 주입 → 음성 응대 → 통화 녹취·전사(STT)·요약·감정·해결여부 라벨링 → 미해결 시 호스트 콜백/SMS 에스컬레이션. 2) 텍스트 자동응대: 6채널 인박스 통합 수신(웹훅) → 언어 감지 → 의도 분류(체크인/주차/와이파이/연박/환불/반려동물/시설/맛집추천/컴플레인 등) → RAG(숙소별·지역별·글로벌 KB 검색) → 호스트 페르소나·말투로 응답 생성 → confidence 채점 → 임계값↑면 자동 발송, 임계값↓ 또는 금지 의도면 호스트 에스컬레이션. 3) 호스트별 설정: 숙소 단위 온이 프로필(페르소나·언어·인사말·규칙·금지어·근무시간·자동화 레벨·채널별 on/off·연박/환불/얼리체크인 정책 변수)을 저장·버전관리하고, 변경 즉시 양 채널(음성+텍스트)에 반영. 4) 학습 루프: 모든 대화를 학습데이터로 정규화 저장 → confidence·해결여부 라벨 → 호스트가 고친 답변이 곧 다음 라벨(휴먼-인-더-루프) → 숙소별/지역별 KB 자동 보강 → 언어별 자동응대율 상승. (모델 가중치 재학습이 아니라 RAG 지식베이스·few-shot 예시·프롬프트 정책의 누적 개선임을 정직하게 명시.) 5) 더블부킹·운영 연동: 멀티-OTA 겹침 탐지 시 온이가 다국어 사과·환불 안내·대체 숙소 제안 메시지를 자동 발송(모듈 ③ 동기화 엔진과 이벤트로 연동). 6) 안전장치: 금액 확약·환불 실행·법적 단정·개인정보 노출은 자동 발송 금지(항상 호스트 승인). 통신판매중개 면책 고지 자동 삽입.

[명시적 제외(별도 모듈/대표 부담)] - OpenAI/Twilio/STT/TTS API 사용료·070 회선료는 종량 과금으로 대표(무해) 계정 충전 — 우리는 배선·자율화만. 견적은 구축·연동·튜닝 공수. - 채널매니저(Hostaway/온다) 자체 구독료 및 메시지 API 권한 계약은 모듈 ③/공통 기반 소관(여기선 메시지 수신·발신 어댑터만 구현). - 음성 모델 자체의 파인튜닝(가중치 학습)은 범위 외 — 프롬프트·페르소나·RAG로 한국어 음성 품질을 끌어올린다.

품목 · 세부단가수량합계
온이 코어 응답 엔진 (단일 두뇌 · 음성/텍스트 공용)의도분류→RAG검색→페르소나 응답생성→confidence 채점→자동발송/에스컬레이션 분기까지 단일 파이프라인. 음성·텍스트가 같은 컨텍스트(예약·규칙·KB·과거대화)를 공유하는 통합 오케스트레이터. 프롬프트 정책·가드레일·function-calling(예약조회/캘린더/대체숙소) 설계 포함₩2,400,0001 LOT₩2,400,000
다국어 음성통화 AI 파이프라인 (070 + Twilio + OpenAI Realtime)070 인바운드 라우팅 → Twilio Media Streams ↔ OpenAI Realtime 양방향 오디오 브리지(Cloudflare Worker WebSocket relay, 바지인·턴테이킹·지터버퍼·끊김복구) → 발화언어 자동감지 → 숙소 컨텍스트 주입 → 실시간 음성 응대. 통화당 비용 가드·최대시간 컷오프 포함₩2,100,0001 LOT₩2,100,000
통화 후처리 (녹취·전사·요약·감정·해결여부)통화 녹음 저장(R2) → STT 전사 → 다국어 요약·핵심추출 → 감정/해결여부 라벨링 → 미해결 시 호스트 콜백·SMS 에스컬레이션 트리거 → 통화 타임라인 카드로 콘솔 표시₩820,0001 LOT₩820,000
6채널 메시지 인박스 통합 어댑터에어비앤비·부킹·아고다·야놀자·여기어때·네이버 게스트 메시지를 채널매니저(Hostaway/온다) 웹훅으로 수신·정규화하는 채널별 어댑터 6종(스레드 매핑·중복제거·발신 콜백·전달실패 재시도)₩260,0006 LOT₩1,560,000
언어 감지 + 6개국어 응대 튜닝 (KO·EN·JA·ZH·FR·ES)언어 자동감지 라우팅 + 언어별 톤·존대·이모지·문화 뉘앙스 프롬프트 셋. 한국어 음성 자연스러움 집중 튜닝. 기타 언어 폴백 처리₩150,0006 LOT₩900,000
지식베이스 RAG (숙소별·지역별·글로벌 3계층)숙소별 DB·지역별 DB·글로벌 FAQ 3계층 임베딩 인덱스(pgvector) + 검색 랭킹 + 근거 인용. 게스트 질문→근거 문서 매칭→환각 억제. 콘솔 KB 카운터(312/47/1,840) 실데이터 연동₩880,0001 LOT₩880,000
호스트별 온이 설정 (프로필·버전관리·즉시반영)숙소 단위 페르소나·우선언어·인사말·전용규칙/FAQ·금지어·근무시간·자동화레벨·채널별 on/off·정책변수(연박/환불/얼리체크인) 저장 스키마 + 변경 즉시 음성/텍스트 양 채널 반영 + 변경이력₩760,0001 LOT₩760,000
에스컬레이션 + 휴먼-인-더-루프 학습 루프confidence·금지의도 기반 자동/수동 분기 → 호스트 승인 대기열 → 호스트가 고친 답변을 다음 학습 라벨로 누적 → 언어별 자동응대율 상향. 콘솔 '온이 브레인' 학습피드·KPI 실연동₩620,0001 LOT₩620,000
안전·면책·가드레일 + 통합 QA/감리금액확약·환불실행·법적단정·개인정보 자동발송 차단(항상 승인), 통신판매중개 면책 자동삽입, 더블부킹 다국어 사과·대체숙소 자동제안(모듈③ 연동). 음성/6채널/6개국어 시나리오 통합 QA·부하·장애복구 테스트₩960,0001 LOT₩960,000
소계₩11,000,000

백엔드 구조

- oni_profiles: 숙소별 온이 설정. (id, listing_id FK, persona enum['warm_host','pro_manager','local_friend','curator'], primary_langs text[], greeting text, custom_rules text, banned_words text[], working_hours jsonb, automation_level enum['full_auto','review_first','off'], channel_toggles jsonb{airbnb,booking,agoda,yanolja,goodchoice,naver:bool}, policy_vars jsonb{late_checkout,parking,pet,extra_night_discount...}, confidence_threshold numeric, voice_enabled bool, voice_persona_id, updated_by, version int)

- oni_profile_versions: 위 설정의 변경 이력(감사·롤백용 append-only).

- conversations: 통합 대화 헤더. (id, listing_id, channel enum['airbnb','booking','agoda','yanolja','goodchoice','naver','voice'], external_thread_id, guest_name, guest_lang, reservation_id FK, status enum['open','auto_resolved','escalated','closed'], sentiment, started_at, last_msg_at)

- messages: 대화 턴. (id, conversation_id FK, direction enum['inbound','outbound'], from enum['guest','oni','host'], lang, body text, intent, confidence numeric, kb_citations jsonb, channel_message_id, delivery_status, created_at) — Realtime 구독 대상.

- voice_calls: 통화 레코드. (id, conversation_id FK, twilio_call_sid, from_number, to_did(070), lang_detected, duration_sec, recording_r2_key, transcript_id FK, summary, resolved bool, escalated bool, cost_estimate numeric)

- voice_transcripts: STT 전사 세그먼트(speaker, start_ms, end_ms, text, lang).

- escalations: 호스트 승인 대기열. (id, conversation_id, reason enum['low_confidence','banned_intent','money','complaint','unresolved_call','pet_policy'], proposed_reply text, status enum['pending','approved','edited','rejected'], host_reply text, resolved_at)

- knowledge_docs: RAG 3계층 지식. (id, scope enum['listing','region','global'], listing_id NULLABLE, region, lang, title, body, embedding vector(1536), source, confidence, hit_count) — pgvector 인덱스(ivfflat/hnsw).

- oni_learning_events: 학습 누적. (id, conversation_id, event_type enum['host_correction','new_faq','intent_pattern','curation'], lang, before, after, applied_to_kb_doc_id)

- oni_metrics_daily: 언어·숙소·채널별 일집계(convos, auto_rate, esc_rate, avg_confidence, p50/p90 응답시간) — 브레인 KPI 소스.

[API 엔드포인트 — Cloudflare Worker(서버측 자율 엔진)]

- POST /voice/incoming (Twilio webhook): 인바운드 070 콜 수신, TwiML로 Media Stream 시작.

- WSS /voice/stream: Twilio Media Streams ↔ OpenAI Realtime 오디오 릴레이(WebSocket, μ-law↔PCM 변환, 턴 감지).

- POST /voice/status (Twilio status callback): 통화 종료 시 녹취 fetch→R2 저장→STT→요약 파이프라인 큐잉.

- POST /webhooks/hostaway, POST /webhooks/onda: 6채널 게스트 메시지 인바운드 수신(서명검증).

- POST /oni/reply: 코어 응답 엔진(의도분류→RAG→생성→채점→분기). 음성·텍스트 공용 내부 호출.

- POST /channels/:platform/send: 채널매니저 경유 게스트 회신 발송(재시도·idempotency-key).

- GET/PUT /oni/profile/:listingId: 호스트 설정 조회·저장(버전 증가).

- GET /oni/inbox, POST /oni/escalation/:id/{approve,edit,reject}: 통합 인박스·승인 처리.

- POST /kb/search, POST /kb/upsert: RAG 검색·지식 갱신.

- GET /oni/metrics: 브레인 KPI·언어별 표·학습피드.

[서비스/잡 — 큐·크론]

- realtime-bridge(상주 WS): 통화 오디오 양방향 브리지.

- inbox-normalizer: 6채널 페이로드→messages 정규화·중복제거.

- reply-orchestrator: 의도분류·RAG·생성·채점·분기.

- escalation-router: 임계값·금지의도 판정→대기열·호스트 알림(SMS/푸시).

- learning-ingestor: host_correction→KB upsert·few-shot 갱신.

- call-postprocess: 녹취→STT→요약→감정→해결여부.

- metrics-rollup(크론): oni_metrics_daily 집계.

- embeddings-worker: knowledge_docs 임베딩 생성·재인덱싱.

프론트엔드 구조

1) 온이 브레인 (다국어 딥러닝 센터, 이미 목업 존재 → 실데이터 연동): KPI 4종(학습 대화·자동응대율·언어 커버리지·에스컬레이션) + 언어별 학습 현황 테이블(KO·EN·JA·ZH·FR·ES, 대화수·자동응대율 pill) + 학습 루프 4단계 + 지식베이스 3카드(숙소별/지역별/글로벌) + 최근 학습 실시간 피드.

2) 통합 인박스(신규): 좌측 대화 리스트(채널 컬러닷·언어·미해결 뱃지), 우측 대화 스레드(게스트/온이/호스트 말풍선·confidence·KB 인용·의도 태그). 채널·언어·상태 필터. '온이 자동응대 중…' 라이브 표시.

3) 호스트 승인 큐(신규): 에스컬레이션 카드 리스트 — 사유 뱃지(저신뢰/금액/컴플레인/반려동물/미해결통화)·온이 제안답변·[승인][수정 후 발송][반려]. 수정 발송분은 학습 라벨로 표시.

4) 통화 모니터(신규): 진행중 통화 라이브(언어·경과시간·실시간 전사 스트림) + 종료 통화 타임라인(녹취 재생·요약·감정·해결여부·에스컬레이션 여부).

5) 숙소 상세 → 온이 패널(이미 존재): 채널별 게스트 대화 실시간 + ⚙ '온이 설정' 진입.

[컴포넌트]

- OniConfigModal(이미 존재, 확장): 페르소나 토글(4종)·우선언어 멀티토글·인사말·전용규칙/FAQ 텍스트에어리어 + 신규: 금지어 칩, 근무시간 피커, 자동화 레벨(전자동/검토우선/끔), 채널별 토글 6종, 정책변수 슬라이더, 음성 on/off·음성 페르소나, confidence 임계 슬라이더, 버전 히스토리.

- ChatThread: 다국어 말풍선(온이=좌상단 '온이', 게스트='이름·언어'), confidence 미터·KB 인용 칩·의도 태그.

- EscalationCard, VoiceCallCard, LangLearningTable, KbCard, LiveTranscriptStream.

- OniToast(이미 존재): 숙소 리스트에서 신규 게스트 메시지 알림 팝업→클릭 시 해당 숙소 상세.

와이어프레임 설계

2단 분할. 상단 풀폭 헤더바: 좌측 "온이 통합 인박스" 타이틀 + ● 실시간 라이브칩(연두), 우측 필터칩 행(채널 6개 컬러닷 토글·언어 6개·상태 전체/미해결/자동해결/에스컬레이션). 좌측 컬럼(360px): 대화 리스트, 각 행 = [채널 컬러 세로바 4px][게스트명 굵게 + 언어 pill][마지막 메시지 1줄 말줄임][우측: 시각 + 미해결이면 주황 점]. 우측 컬럼(나머지): 상단 스레드 헤더(숙소명·채널 로고·게스트·예약기간), 중앙 말풍선 스크롤(온이=왼쪽 연파랑·하단에 confidence 막대+KB인용 칩, 게스트=오른쪽 회색·상단에 의도 태그), 하단 입력바(호스트 개입 입력 + [온이에게 맡기기] 토글). 빈 상태: 가운데 "온이가 응대 중인 대화가 없습니다". [화면 B — 호스트 승인 큐] 상단 헤더: "승인 대기 N건" + 사유별 카운트 칩. 본문 = 카드 세로 스택. 각 카드: 좌상단 사유 뱃지(저신뢰=주황/금액=빨강/컴플레인=빨강/반려동물=노랑/미해결통화=보라), 우상단 숙소명·채널·게스트 언어. 중앙: 게스트 원문(회색 인용블록) → 온이 제안답변(연파랑 박스 + confidence %). 하단 우측 버튼 3개: [승인·즉시발송](파랑 채움)·[수정 후 발송](테두리)·[반려](고스트). 수정 모드는 답변박스가 편집가능 텍스트에어리어로 전환되고 "이 수정은 학습 데이터로 누적됩니다" 캡션. [화면 C — 온이 설정 모달] 중앙 모달(560px). 제목 "온이 설정 · {숙소명}" + 서브 "숙소마다 사정이 다르니까요". 세로 폼: ①페르소나(4버튼 단일선택, 선택시 네이비 아웃라인) ②우선 언어(5~6 멀티토글) ③인사말(텍스트에어리어) ④이 숙소 전용 규칙·FAQ(텍스트에어리어) ⑤금지어(엔터로 칩 추가) ⑥근무시간(요일·시간 그리드, 시간외 자동응답 문구) ⑦자동화 레벨(전자동/검토우선/끔 세그먼트) ⑧채널별 on/off(6 토글, 각 채널 컬러닷) ⑨정책변수(얼리체크인 시각·주차·반려동물 추가비·연박할인 — 슬라이더/입력) ⑩음성 응대(on/off + 음성 페르소나 드롭다운 + confidence 임계 슬라이더). 하단 우측: [저장](저장시 '저장됨 ✓' 0.7s)·[닫기]. 모달 우상단 작은 "버전 v{n} · 이력" 링크. [화면 D — 통화 모니터] 상단 두 섹션. 위 "진행중 통화"(없으면 비표시): 좌측 큰 통화카드 = 발신번호 마스킹·감지언어 큰 국기/코드·경과시간 카운터(빨강 ●REC), 우측 실시간 전사 스트림(speaker별 줄, 타자 애니메이션). 아래 "종료 통화" 타임라인 리스트: 각 행 = [시각][언어 pill][소요 mm:ss][요약 1줄][해결=초록체크/미해결=주황][▶ 녹취 재생][에스컬레이션 뱃지(있으면)]. 행 펼치면 전체 전사 + 감정 라벨 + 연결된 텍스트 대화 점프. [화면 E — 온이 브레인(기존, 실데이터화)] 상단 KPI 4카드(학습 대화 강조 hl·자동응대율 up·언어 커버리지·에스컬레이션 warn). 2단: 좌 "언어별 학습 현황" 테이블(언어·대화수·자동응대율 pill: 88%↑초록/83~88 회색/그 이하 주황), 우 "학습 루프" 4스텝 카드. 하단 "지식베이스" 3카드(숙소별 312·지역별 47·글로벌 1,840, 큰 숫자) + "최근 학습 ●실시간" 피드(언어코드 칩 + 학습 내용 한 줄, 4초마다 누적).

서버 · 보안

- 음성·메시지 처리 전부 서버측 Worker에서 자율 동작(브라우저 의존 0). 070 콜과 6채널 웹훅이 들어오면 콘솔이 꺼져 있어도 온이가 응대.

- realtime-bridge는 Durable Object(또는 상주 WS Worker)로 통화별 세션 상태·턴 컨텍스트 유지. 통화 최대시간·통화당 비용 상한 가드로 폭주 차단.

[인증·키]

- OpenAI Realtime/STT, Twilio, 채널매니저 토큰은 전부 Worker Secrets(평문 코드·배포 금지). 대표(무해) 계정 충전키는 환경변수로만 주입.

- 모든 인바운드 웹훅(Twilio·Hostaway·온다) 서명/HMAC 검증 필수. Twilio는 X-Twilio-Signature, 채널매니저는 공유시크릿. 미검증 요청 403.

- 발신(게스트 회신·SMS)은 idempotency-key로 중복발송 차단, 재시도는 지수 백오프.

[RLS·권한 (Supabase)]

- 멀티테넌트 RLS: 호스트는 본인 listing_id에 연결된 conversations/messages/voice_calls/oni_profiles/escalations만 조회. MOSO 운영자(무해)는 전체. 정책은 listing→host 소유 매핑 기준.

- oni_profiles 저장은 소유 호스트 또는 운영자만, 변경은 oni_profile_versions에 append(롤백·감사).

- voice_transcripts·recording은 민감정보 → 서명 URL(만료)로만 접근, R2 비공개 버킷.

[안전 가드레일·법적]

- 자동 발송 금지군: 금액 확약·환불 실행·법적 단정·개인정보(타 게스트 정보·정확 주소 사전노출 등). 해당 의도 감지 시 무조건 escalations로(자동 발송 차단).

- banned_words·금지의도 필터를 생성 후단에 한 번 더 적용(프롬프트 우회 방지).

- 통신판매중개 면책 고지를 정책성 답변에 자동 삽입.

- PII 마스킹: 전사·로그에서 전화번호·예약자명 마스킹 저장 옵션. 데이터 보존기간·삭제(소유권 이전 대비) 정책.

- 동시성: 같은 스레드 중복응답 방지 락(대화 단위), Realtime 낙관적 갱신.

- 관측성: 통화·메시지·에스컬레이션·비용 메트릭 로깅, 실패 알림.

동작 프로세스

1) 외국인/내국인 게스트가 숙소 안내문의 070 번호로 전화 → 2) Twilio가 /voice/incoming 웹훅 호출 → 3) Worker가 TwiML로 Media Stream 개시, WSS /voice/stream 연결 → 4) realtime-bridge가 Twilio 오디오(μ-law)↔OpenAI Realtime(PCM) 양방향 릴레이, 첫 발화에서 언어 자동감지 → 5) 해당 to_did(070)로 숙소·예약·oni_profile·KB 컨텍스트 주입(페르소나·말투·규칙) → 6) 온이가 게스트 언어로 음성 응대(바지인·턴테이킹 처리), 필요 시 function-call로 예약조회/캘린더 빈자리/대체숙소 → 7) 통화 종료 → /voice/status로 녹취 R2 저장→STT 전사→다국어 요약·감정·해결여부 라벨 → 8) 미해결/금액·컴플레인이면 호스트에 SMS·푸시 에스컬레이션, 콘솔 통화 타임라인에 카드 표시.

[텍스트 메시지 흐름]

1) 게스트가 에어비앤비 등 6채널에서 메시지 전송 → 2) 채널매니저(Hostaway/온다) 웹훅이 /webhooks/*로 전달 → 3) 서명검증→inbox-normalizer가 messages로 정규화(스레드 매핑·중복제거) → 4) reply-orchestrator: 언어감지→의도분류→RAG(숙소별·지역별·글로벌 KB 검색·근거인용)→호스트 페르소나/말투로 응답 생성→confidence 채점 → 5) 분기: confidence≥임계 & 금지의도 아님 → /channels/:platform/send로 자동 회신(idempotency·재시도); 임계 미만 또는 금지의도(금액/환불/컴플레인/반려동물 등) → escalations 대기열 + 호스트 알림 → 6) 호스트가 승인/수정/반려 → 수정분은 learning-ingestor가 KB·few-shot에 누적 → 7) Realtime으로 콘솔 인박스·브레인 KPI 실시간 갱신.

[설정 반영 흐름]

호스트가 ⚙ 온이 설정에서 페르소나·말투·규칙·금지어·자동화레벨·채널토글·정책변수·음성 on/off 변경·저장 → oni_profiles 버전 증가 + oni_profile_versions 기록 → 다음 통화·메시지부터 음성/텍스트 양 채널에 즉시 반영.

[더블부킹 연동 흐름]

모듈③ 동기화 엔진이 멀티-OTA 겹침 탐지 이벤트 발행 → 온이가 선예약 보호 통지·나중 예약 환불 안내·다국어 사과·인근 동급 대체숙소 2곳 제안 메시지를 해당 채널로 자동 발송(단, 환불 실행 자체는 호스트/운영 승인).

[학습 누적 흐름]

모든 대화·통화가 학습데이터로 저장→confidence·해결여부 라벨→호스트 수정이 다음 라벨→숙소별/지역별 KB 자동 보강→언어별 자동응대율 상승(콘솔 브레인에 누적 표시). 모델 가중치 재학습이 아닌 RAG·few-shot·프롬프트 정책의 지속 개선임을 명시.

다이내믹 프라이싱 엔진 (decideV2 + 온다/Beds24 ARI 송출 · 전 플랫폼 자율 수율관리)

점유·페이스·요일·완판신호·딥러닝 폐루프를 단일 결정엔진(decideV2)으로 융합해 매물별 권장가를 산출하고, 온다/Beds24 채널매니저에 ARI 1건을 던져 6채널 가격을 동시에 자율 변동·기록하는 서버측 수율관리 엔진.

₩8,440,000

이 모듈은 MOSO의 '돈을 버는 두뇌'다. 하루에도 수십 번, 사람 손 없이 1,116개(+증가) 매물 각각에 대해 "오늘 이 방을, D-day 몇 일 남은 이 날짜에, 며칠 묶음(LOS)으로, 어느 채널에, 정확히 얼마에 걸어야 순이익을 지키면서 완판에 가장 가까운가"를 계산하고, 그 결정을 실제 OTA 가격으로 송출한다. 단순 룰베이스가 아니라 (a)실측 캘리브레이션 상수 + (b)4개 직교 신호 융합 + (c)베타-베르누이/EWMA 딥러닝 폐루프로 스스로 정밀해진다.

핵심은 이미 작동하는 결정엔진 decideV2(engine_core.mjs, 34KB, 8섹션, 무의존 ESM)를 (1)프로덕션 등급으로 경화(硬化)하고, (2)Supabase에 결정·이벤트·학습셀을 영속화하고, (3)온다(ONDA)/Beds24 채널매니저 어댑터로 실제 가격을 6채널 송출하고, (4)Cloudflare Worker cron이 사람 없이 24/7 자율 가동하게 만들고, (5)대표·운영자가 보고 승인/오버라이드하는 트레이딩 터미널 UI를 완성하는 것.

[현재 빌드 상태 — 정직 표기] 이미 실재(WIRED): decideV2 통합 엔진(점유 보정·페이스 앵커 선형보간·요일배수·압력융합 P∈[-1,+1]·시장밴드 percentile 배치·LOS/라스트미닛 레이어·경쟁 언더컷 매칭·Price Floor 순이익 불변식·4D버킷 504셀 EWMA 학습·계층적 shrinkage), Beds24 어댑터(셀프토큰→getBookings 학습연료→setPrices 송출), Worker engineTick(KV realocc→decideV2→recommendations SSOT, ±40% 단일사이클 가드), 가격추적기(헤드리스 가격커브 수집·diff로 sold-event 추출, 병렬 P=4 처리량), 트레이딩 터미널·rate-push UI(채널 cascade 송출 시뮬·ARI 페이로드 표시).

이번 모듈에서 완성(라이브 전환): 합성 sold-event→실예약 학습 전환(온다/Beds24/Hostaway 키 연동), 인메모리 _cells/_bandState Map→Supabase 영속(서버 재시작·다중 인스턴스 정합), 시뮬 송출→실 ARI 라이브 송출 + 송출검증 폐루프(pickup 재조회), 가드레일/서킷브레이커 정식화(가격 발작 방지), 대표 승인 워크플로우(auto/semi-auto/manual 3모드)·A/B 실험·백테스트·드리프트 알람. 즉 "코드는 있다"에서 "맡겨도 된다"로 끌어올리는 게 이 견적의 본질.

[왜 이게 1천만원에 가까운가 — 가치 논거] PriceLabs/Beyond/Wheelhouse 같은 RM SaaS는 매물당 월 $20~40(객실당 연 30~50만원). 1,116매물이면 연 3~5억의 외주비를 자체 엔진으로 내재화한다. 게다가 그들은 한국 OTA(야놀자·여기어때·네이버)를 못 다루고, 동(洞) 단위 실측밴드·요일 71.3%↔30.7% 수요편차·캘린더닫힘 보정점유 같은 한국형 미시구조를 모른다. 이 엔진은 그걸 1,116매물 실측으로 캘리브레이션했다. 공급가 ₩8,000,000은 'RM SaaS 영구 내재화 + 한국형 + 소유권 이전'의 1회성 대가다.

품목 · 세부단가수량합계
결정엔진 decideV2 프로덕션 경화기존 engine_core.mjs(8섹션·무의존 ESM)를 프로덕션 등급으로 경화: 입력 스키마 검증(zod), 결정론 보장 회귀 테스트(엔진 출력 스냅샷 고정), 에러바운더리(매물별 try/catch 격리로 1건 실패가 전체 중단 안 되게), 결정 1건당 trace 객체(어느 신호가 가격을 얼마 움직였나 attribution) 산출. 순수함수 단위테스트 120+ 케이스(점유·페이스·요일·신호 경계값).₩140,0007 LOT₩980,000
보정점유·페이스 앵커 캘리브레이션 파이프라인캘린더 연속런(CLOSED_RUN=21·AMBIG 8~20) 라벨링으로 캘린더닫힘/오너블록/실예약(STAY) 분리 → 가짜 고점유 차단. PACE_ANCHORS 15점(D0:58%~D90:13%, 데드존 D18:22%) 선형보간 + 동(洞)벤치 shrinkage(K=14). 1,116매물 실측 재집계로 앵커·벤치 주기 재캘리브레이션하는 node 파이프라인.₩135,0004 LOT₩540,000
압력 융합·시장밴드 배치 엔진4개 직교신호(occ 0.50·pace 0.35·dow 0.15 + demandSurge 0.30)를 P∈[-1,+1]로 융합, SIGNAL_BOUND ±0.33로 risk/normal/good 3분. 동별 p25/p50/p75 밴드(27개 동 실측+글로벌 폴백)에 targetPercentile(점유압·guestFav·superhost·momentum·페이스갭) 산출→interpBand 가격, PRICE_ELASTICITY 0.18 탄력 반영.₩130,0004 LOT₩520,000
완판신호·요일/LOS/라스트미닛 레이어향후 6주 금·토만 본 weekendTightness(미오픈 분모제외)=완판임박도, sellSignal(0.5·주말긴장+0.3·페이스비+0.2·점유비)≥0.75→RAISE 강제오버라이드. 요일 dowFactor(토×1.46·금×1.21·수×0.94), LOS 계단형 -15% flat, 라스트미닛 D≤14·1박·페이스 10pp뒤짐일때만 -25%.₩125,0003 LOT₩375,000
딥러닝 폐루프 — 4D버킷 EWMA + 베타-베르누이region×Dband(7)×LOS(3)×priceBand(3)=504셀. clearPrice 적응형 EWMA(seen<5:α0.45→0.12), bookProb 베타-베르누이(a0=b0=2), 계층적 shrinkage(SHRINK_K=8)로 콜드스타트 prior와 블렌드. learnFromEvents(sold-event 인제스트)·predictClearing(셀→부모 shrink) 구현·튜닝.₩150,0006 LOT₩900,000
Supabase 학습상태 영속화 (Map→DB)현재 인메모리 _cells(Map)·_bandState는 Worker 재시작·다중인스턴스에서 휘발·불일치. learning_cells(504셀 upsert·낙관적락 version)·band_state(EWMA 누적)·pace_anchors 테이블로 영속. 핫패스는 KV 캐시(5분 TTL)+DB write-behind. 동시성 충돌(같은 셀 동시 학습) 머지 전략.₩140,0005 LOT₩700,000
온다(ONDA) 채널매니저 ARI 어댑터온다 B2B 연동: 인증·room/rate-plan 매핑·ARI(Availability·Rates·Inventory) 송출 단건 페이로드 빌더. 1건 푸시로 에어비앤비·부킹·아고다·야놀자·여기어때·네이버 6채널 동시반영. 채널별 마크업(channelMarkup)·최소박·재고 동기화. 송출 멱등성(idempotency key)·재시도(지수백오프)·rate-limit 핸들링.₩145,0004 LOT₩580,000
Beds24 어댑터 라이브 전환 + 양방향 동기기존 beds24.js(셀프토큰·getBookings·setPrices) 라이브화: refreshToken→accessToken 캐시·만료갱신, getBookings modifiedSince 증분→toSoldEvents 정규화(date·dday·perNight·channel)=학습연료, setPrices(roomId·calendar[{from,to,price1,minStay,numAvail}]) 캘린더 일괄송출. 온다↔Beds24 듀얼백본 페일오버.₩135,0003 LOT₩405,000
가격 송출 오케스트레이터 + pickup 검증 폐루프recommendations(SSOT)→채널매니저 송출→N시간 뒤 잔여 재조회로 실제 pickup(예약 들어왔나) 확인→결과를 sold-event로 폐루프 환류. 송출 큐(매물×날짜대 평탄화·동시성 풀)·송출 트랜잭션 로그·부분실패 격리·드라이런 모드. 송출 전후 diff를 price_events에 기록(누가 언제 얼마→얼마).₩140,0004 LOT₩560,000
가드레일·서킷브레이커·이상감지단일사이클 ±40% 클램프(동네 이상치 과민반응 방지) 정식화, 일일 최대 변동폭·송출 빈도 throttle, Price Floor 순이익 불변식(청소비/최소박+가변비)/(1-수수료) 절대 사수. 이상감지 5종(경쟁 언더컷·수요급증·컴프 p25이탈·페이스급락·더블부킹)→자동 액션 or 운영자 에스컬레이션. 가격발작 감지시 전체 송출 동결(kill-switch).₩135,0004 LOT₩540,000
Worker 자율 cron 엔진 + KV SSOTCloudflare Worker scheduled(cron */5~매시): realocc 실점유 인제스트→매물별 decideV2→recommendations KV(SSOT) 서빙, ledger sold-event 학습 tick, 시장 EWMA tick. 사람·브라우저 없이 24/7 가동. /recommendations·/occupancy·/ledger·/learn 엔드포인트, /ingest(토큰가드) 노트북 헤드리스 점유 푸시 수신.₩130,0004 LOT₩520,000
트레이딩 터미널 UI (가격 엔진 + 송출 콘솔)관리자 가격엔진 뷰: 60일 D-day 곡선차트(권장가·플로어·페이스·신호점), D-day 결정테이블(단계·시그널·최소박·채널·권장가·플로어), 매물 드릴다운 트레이딩 터미널(채널별 호가·캘린더·가격변동로그·decideV2 reason 문자열). 가격송출 콘솔: ARI 경로 시각화·채널별 송출상태·실 페이로드 프리뷰·'지금 송출' 버튼.₩140,0004 LOT₩560,000
승인 워크플로우 (auto/semi/manual 3모드)매물·동·전체 단위로 송출 모드 설정: full-auto(엔진이 바로 송출), semi-auto(임계 초과 변동만 승인대기), manual(전건 대표 승인). 승인 큐 UI(권장가·변동률·근거·예상매출 영향), 1클릭 승인/반려/일괄, 승인 audit log, 슬랙/이메일 알림(드리프트·서킷브레이커 발동).₩130,0003 LOT₩390,000
백테스트·A/B 실험·드리프트 모니터링과거 price_curve·ledger로 엔진 결정 백테스트(가상 매출 vs 실제), 엔진 버전 A/B(매물 분할 송출→매출 비교), 학습 정확도/MAE 트래킹(buckets EWMA vs ground-truth), 모델 드리프트 알람(정확도 하락·셀 분포 이상). 주간 성과 리포트(점유·ADR·RevPAR·완판률) 자동집계.₩130,0003 LOT₩390,000
통합 테스트·부하·핸드오프 문서엔진→DB→채널매니저 E2E 시나리오 테스트, 1,116매물 배치 송출 부하/타임아웃 테스트, 키 회전·페일오버 리허설. 운영 런북(가드레일 임계 튜닝·서킷브레이커 해제·신규 채널 추가 가이드), decideV2 파라미터 사전(상수별 근거·실측출처), 소스/Supabase 소유권 이전 패키지.₩120,0004 LOT₩480,000
소계₩8,440,000

백엔드 구조

· listings_pricing — 매물별 프라이싱 메타. PK id. cols: name, dong, region, base_price, guest_fav(bool), superhost(bool), pricing_mode(enum: auto/semi/manual), default_min_nights, cost_cleaning, cost_variable, commission_rate, beds24_room_id, onda_room_id, active(bool), updated_at. (1,116행+증가)

· occupancy_snapshots — 보정점유 시계열. cols: listing_id(fk), snapshot_ts, occ_corr(보정점유%), occ_n(bookable일수), occ_raw, dong_bench, source(headless/beds24/manual), calendar_jsonb(refineSnapshotCalendar 라벨링 결과). 인덱스 (listing_id, snapshot_ts desc).

· price_decisions — decideV2 결정 1건마다 영속. cols: id, listing_id(fk), decided_at, dday, dow, nights(los), price, min_nights, channels(jsonb array), phase, signal, pressure(P), pace_target, occ_pct, target_pct, floor, undercut_flag, floored_hit, clearing_price, book_prob, reason(텍스트), trace_jsonb(신호별 가격기여 attribution). 인덱스 (listing_id, decided_at desc).

· price_events — 가격변동 이벤트(diff). cols: id, listing_id(fk), date_target, range_label, price_from, price_to, pct_change, source(engine/competitor/manual), event_type(raise/cut/hold), created_at. 동적가 학습연료·변동로그.

· sold_events — 실예약/거래 sold-event(학습연료). cols: id, listing_id(fk nullable), region, dong, date_target, dday(lead-time), per_night, nights, channel, success(bool), real(bool), synthetic(bool), source(beds24/hostaway/headless_diff), booked_at, ingested_at. UNIQUE(source, external_id)로 멱등.

· learning_cells — 4D버킷 504셀 EWMA 영속(Map→DB). PK bucket_key(region|Dband|LOS|priceBand). cols: clear_price, seen, beta_a(기본2), beta_b(기본2), version(낙관적락), updated_at. upsert + version 충돌 머지.

· band_state — 동(洞)별 시장밴드 EWMA 누적. PK dong. cols: p25, p50, p75, p50_prev, momentum, alpha, updated_at.

· pace_anchors / dong_bench / dow_index — 캘리브레이션 상수 테이블(코드 하드코딩→DB화로 재학습시 핫스왑). 버전·effective_from.

· rate_push_log — 채널매니저 송출 트랜잭션. cols: id, listing_id(fk), pushed_at, channel_manager(onda/beds24), payload_jsonb(ARI), status(queued/sent/confirmed/failed), idempotency_key(unique), retry_count, pickup_checked_at, pickup_result(jsonb), error. 멱등·재시도·pickup검증.

· approval_queue — semi/manual 승인 대기. cols: id, listing_id, decision_id(fk), proposed_price, current_price, pct_change, reason, revenue_impact_est, status(pending/approved/rejected/expired), approved_by, decided_at. RLS: 운영자·대표만.

· guardrail_config / circuit_breaker_state — 가드 임계(매물·동·전역 ±%·일일 최대변동·송출 throttle)와 발동상태(동결 플래그·트리거 사유·해제자).

· pricing_experiments — A/B·백테스트. cols: experiment_id, variant(A/B 엔진버전), listing_ids(jsonb), metric(revpar/occ/adr), result_jsonb, started_at, ended_at.

[API 엔드포인트 — Worker + Supabase Edge Functions]

· GET /recommendations — 서버엔진 산출 매물별 권장가 SSOT(현존). {ts, count, learned, listings:[{id,name,dong,occ,base,rec,signal,minNights,channels,reason}]}

· GET /occupancy — realocc 실점유(panelOcc·dongOcc·매물별). (현존)

· GET /ledger — 시장 거래원장(total·gmv·recent 60·byDong). (현존)

· GET /learn — 학습모델(buckets EWMA·accuracy·MAE·real/synthetic·source). (현존)

· POST /ingest — 헤드리스 점유·sold-event 푸시 수신(INGEST_TOKEN 가드). (현존)

· POST /decide — 단건 즉시 결정(매물·context)→decideV2 출력. (신규)

· POST /push — 채널매니저 실송출 오케스트레이션(매물·날짜대 큐·드라이런 플래그). (신규)

· POST /push/verify — N시간 후 pickup 재조회→sold-event 환류. (신규)

· POST /learn/ingest — Beds24/Hostaway/온다 실예약→sold_events→learnFromEvents. (신규)

· GET /predict — predictClearing(region·dday·los)→{clearPrice,bookProb,seen,conf}. (신규)

· POST /approve, /reject — 승인 큐 액션. (신규)

· POST /circuit/halt, /circuit/resume — kill-switch. (신규)

· GET /backtest, POST /experiment — 백테스트·A/B 트리거. (신규)

[서비스 모듈 — engine_core.mjs 무의존 코어 재사용]

· decideV2(listing, context) — 통합 결정(price·minNights·channels·reason·phase·signal·pressure·paceTarget·occPct·band·targetPct·floor·undercutFlag·flooredHit·clearing·los). 기존 함수 그대로 코어, DB I/O는 어댑터 래핑.

· learnFromEvents(soldEvents) / predictClearing(region,dday,los) — 폐루프(DB영속 래핑).

· refineSnapshotCalendar / occCorr / sellSignal / weekendTightness / paceTarget / dowFactor / interpBand / targetPercentile / priceFloor / phaseFor / regionFromDong — 보조 순수함수.

· ChannelManagerAdapter(onda|beds24) — 인증·ARI빌더·송출·재시도·멱등.

· GuardrailService — 클램프·throttle·서킷브레이커.

· LearningStore — Supabase 셀 upsert/조회 + KV 캐시 write-behind.

프론트엔드 구조

· /admin/pricing — 가격 엔진 메인(현존 'v-pricing'). 상단 60일 D-day 곡선차트(권장가 실선·플로어 점선·P1~P4 단계 배경밴드·신호점 빨강/초록), 하단 D-day 결정테이블(D-60/45/30/21/14/7/3/1행 × 단계·시그널·최소박·채널수·권장가·플로어).

· /admin/pricing/terminal/:id — 매물별 트레이딩 터미널. KPI 헤더(엔진 권장가·시장가 대비%·점유·신호), 채널별 다이내믹 가격·매출 패널(6채널 호가·▲상향/▼하향/―유지·매출=가격×점유×비중), 캘린더 히트맵(날짜별 권장가·예약상태·고아갭), 가격변동 로그피드, decideV2 reason 문자열 전개(점유·페이스·요일·압력·밴드분위·완판신호·LOS·언더컷·학습블렌드 한 줄씩).

· /admin/pricing/ratepush — 가격 송출 콘솔(현존 'ratepush'). ARI 경로 시각화(MOSO엔진→채널매니저→6채널 cascade), 채널별 송출상태 칩(대기→송출중→✓반영됨), 실 ARI 페이로드 프리뷰(Beds24 calendar/온다 ARI JSON), '지금 송출(시뮬/라이브)' 버튼·드라이런 토글.

· /admin/pricing/approvals — 승인 큐. 카드 리스트(매물·현재가→권장가·변동률·근거·예상매출영향·신호배지), 1클릭 승인/반려·일괄선택, 모드 필터(semi/manual), audit 타임라인.

· /admin/pricing/learning — 학습·실험 대시. buckets EWMA 바차트(D-band별 클리어링가·n수), accuracy/MAE 추이라인, 504셀 히트맵(seen·conf), A/B 실험 결과·드리프트 알람.

· /admin/pricing/guardrails — 가드 설정. 매물/동/전역 ±% 슬라이더·일일 최대변동·송출 throttle·서킷브레이커 상태등(정상/동결)·kill-switch 토글.

[컴포넌트]

· <DDayCurveChart> — SVG 60일 곡선(xs: D60→D0, 단계배경·플로어/권장가 라인·신호점). 기존 priceChart() 승격.

· <DecisionTable> — D-day 결정 테이블(pill: 단계/시그널 색상). 기존 priceTable() 승격.

· <ChannelQuoteBoard> — 6채널 호가·방향·매출 카드. 기존 채널패널 승격.

· <ReasonTrace> — decideV2 reason 파서→신호별 기여 칩(점유 X%·페이스 ±Ypp·요일×Z·압력→signal·밴드 N분위·완판 RAISE·LOS −15%·언더컷·학습 N건).

· <AriPayloadViewer> — 송출 페이로드 신택스 하이라이트(채널매니저별 포맷 토글).

· <ChannelCascade> — 송출상태 애니메이션(엔진→매니저→채널 순차 ✓).

· <ApprovalCard> / <ApprovalQueue> — 승인 카드·일괄액션.

· <BucketHeatmap> — 504셀 학습 히트맵(seen 농도·conf 테두리).

· <GuardrailPanel> — 임계 슬라이더·서킷 상태등.

· <PriceEventFeed> — 실시간 가격변동 로그(Supabase Realtime 구독).

· <BacktestRunner> / <ABResultChart> — 백테스트·실험 결과.

와이어프레임 설계

(가로 풀폭, 세로 2패널 스택) · 최상단: 페이지 타이틀 좌측 "가격 엔진" + 우측 회색 캡션 "밀도 다이내믹 프라이싱". 그 아래 가는 구분선. · 패널A(상단, 카드, 높이 ~260): 헤더 좌측 H3 "다이내믹 프라이싱 엔진" + 우측 작은 태그칩 "직접 개발 · PriceLabs 비의존". 헤더 아래 캡션 한 줄 "45-21-10 · 페이스 앵커 · Price Floor · GapFiller". 본문은 가로로 꽉 찬 SVG 라인차트: X축 좌→우 D-60에서 D-0(눈금 60·45·30·21·10·0), 배경에 4개 세로 단계밴드(좌 회색 P1 '캘린더보존'→연파랑 P2→연주황 P3→연분홍 P4 '완판', 각 밴드 상단에 단계명 작은 글씨). 두 라인: 하늘색 점선=플로어(아래), 남색 굵은 실선=권장가(위). 권장가 라인 위 신호점(빨강=risk·초록=good 원). 우상단 모서리에 작은 범례(권장가/플로어/위험/호재). · 패널B(하단, 카드): 헤더 H3 "D-Day 결정 테이블". 본문 가로스크롤 테이블, 컬럼 7개: D-Day(굵게 D-60..D-1) | 단계(회색 pill) | 시그널(빨강위험/초록호재/회색정상 pill) | 최소박(N박) | 채널(N개) | 권장가(굵게 ₩) | 플로어(흐린 회색 ₩). 8행(D60/45/30/21/14/7/3/1). [화면 2 — 매물 트레이딩 터미널 /admin/pricing/terminal/:id] (좌 본문 + 우 사이드 2단 그리드) · 상단 KPI 헤더 바: 가로 4칸 카드 — ①엔진 권장가(대형 ₩, 그 아래 작게 "시장 ₩XXX 대비 +N%") ②점유(보정 X%·n수·동벤치) ③신호(good/risk/normal 색배지 + 압력 P값) ④페이스(앞섬/뒤짐 Ypp, 기대 Z%). ①은 강조(hl) 배경. · 본문 좌측(넓음): "채널별 다이내믹 가격·매출" 패널. 6개 채널 행(에어비앤비·부킹·아고다·야놀자·여기어때·네이버) 각 행에 [채널명 | 호가 ₩ | 방향칩 ▲상향/▼하향/―유지 | 점유비중% | 예상매출 ₩(가격×30×점유×비중)]. 그 아래 "캘린더 히트맵": 7열(일~토) × 5~6주 그리드, 각 셀=날짜+권장가, 색=예약(회색)/오픈(흰)/고아갭(주황테두리)/완판임박(빨강농도). · 본문 우측 사이드: 상단 "결정 근거(decideV2)" 패널 — reason 문자열을 칩 리스트로 세로 전개: "점유 42%[보정 38%·n12↔동벤치 31%](+7pp)" / "페이스 뒤짐 -8pp(기대 50%)" / "토요일×1.46(주말)" / "압력 +18→good(인상)" / "밴드 62분위 배치(p25₩92k~p75₩194k)" / "완판신호 RAISE(주말긴장 80%)" / "2박 LOS −15%" / "학습 클리어링가 블렌드(7건)". 하단 "가격변동 로그" 피드(시각·range·₩from→₩to·±%·source). · 본문 하단 풀폭 버튼: "📈 트레이딩 터미널 — 채널 호가·캘린더·가격변동로그 전체". [화면 3 — 가격 송출 콘솔 /admin/pricing/ratepush] (세로 3패널 스택) · 패널A: 헤더 "가격 송출 (Rate Push)" + 캡션 "각 OTA에 따로 안 칩니다. ARI 1개를 채널매니저에 던지면 전 채널 동시 변동". 본문 가로 노드 다이어그램: [MOSO 엔진(강조) '45-21-10 권장가'] →화살표→ [채널매니저 ONDA/Beds24] →화살표 분기→ 6개 채널 노드(에어비앤비·부킹·아고다·야놀자·여기어때·네이버) 가로 나열. · 패널B: 헤더 "채널별 송출 경로·상태" + 우측 상태태그(대기/송출중…/완료). 본문 6채널 행 각각 상태칩(회색'대기'→노랑'송출중'→초록'✓반영됨'). 하단 액션바: [지금 가격 송출(시뮬/라이브 토글)] 버튼 + 우측 작은 글씨 "라이브 송출은 채널매니저 키 필요" + 드라이런 체크박스. · 패널C: 헤더 "실제 송출 페이로드" + 태그 "Beds24 PUT /inventory/rooms/calendar". 본문 다크 코드블록(JSON 신택스): roomId·calendar[{from,to,price1,minStay,numAvail}] 배열. 채널매니저 포맷 토글(ONDA ARI ↔ Beds24). · 최하단 note 박스(연한 배경): "정직. 코드·페이로드까지 완성(WIRED), 라이브 송출만 키 대기. 에어비앤비·야놀자·여기어때는 직접 API 없어 반드시 채널매니저 경유 — 온다 켜는 순간 6채널 한 번에." [화면 4 — 승인 큐 /admin/pricing/approvals] (좌 필터바 + 우 카드 리스트) · 상단 필터바: 모드칩(전체/semi-auto/manual) + 동 드롭다운 + 변동률 임계 슬라이더 + "일괄 승인/반려" 버튼. · 본문 카드 리스트(세로): 각 카드 = 좌측 매물명·동, 중앙 [현재가 ₩XXX → 권장가 ₩YYY] 큰 화살표 + 변동률 배지(+N%/-N% 색상) + 신호배지, 우측 "예상 매출영향 +₩Z/월" + 근거 1줄 요약. 카드 우측 끝 [승인 ✓][반려 ✗] 버튼. 하단 audit 타임라인(누가 언제 무엇을 승인). [화면 5 — 학습·실험 대시 /admin/pricing/learning] (2×2 그리드) · 좌상: "버킷 클리어링가" 바차트 — X축 D-band(D90+..D3-0 6구간), 막대=EWMA 클리어링가, 막대 위 n수. 우상: "정확도·MAE 추이" 라인차트(시간축, accuracy% 상승·MAE 하락). 좌하: "504셀 학습 히트맵" — region×Dband 격자, 셀 농도=seen, 테두리=conf, 클릭시 셀 상세(clearPrice·beta a/b·bookProb). 우하: "A/B 실험·드리프트" — 변형 A/B 매출 비교 막대 + 드리프트 알람 리스트(정확도 하락·셀 분포 이상 경고). [화면 6 — 가드레일 /admin/pricing/guardrails] (세로 폼 + 상태등) · 상단 큰 상태등: 초록 "정상 가동" 또는 빨강 "송출 동결(서킷브레이커)". 우측 kill-switch 토글(전체 송출 즉시 동결/해제). · 본문 슬라이더 폼: 전역 단일사이클 ±% 클램프(기본 ±40%) · 일일 최대 누적변동% · 송출 throttle(시간당 최대 송출수) · Price Floor 마진 하한. 그 아래 동(洞)별/매물별 오버라이드 테이블(개별 ± 한도). 최하단 이상감지 5종 토글(경쟁 언더컷·수요급증·컴프이탈·페이스급락·더블부킹)과 각각의 액션(자동대응/에스컬레이션) 선택.

서버 · 보안

· 2-tier: ①Cloudflare Worker(scheduled cron */5~매시 + fetch 엔드포인트) = 항상 켜진 자율 엔진·SSOT 서빙. ②Supabase(Postgres+Realtime+Auth+RLS+Edge Functions) = 영속·동시성·구독·무거운 학습연산. Worker는 핫패스(decideV2 계산·KV 캐시), Supabase는 콜드패스(영속·집계·백테스트).

· 데이터 흐름: 노트북 헤드리스 추적기(playwright 병렬 P=4)→POST /ingest(점유·sold-event diff)→KV realocc/ledger→cron engineTick: realocc→decideV2(매물별)→±40% 가드→recommendations KV(SSOT)→송출 오케스트레이터→온다/Beds24 ARI→6채널→N시간 후 pickup 재조회→sold_events 환류→learnFromEvents→learning_cells 영속→다음 사이클 정밀화.

[인증·권한 — RLS]

· Supabase Auth: 역할 4종 — owner(대표 송현우/명훈, 전권+가드설정+kill-switch), operator(운영자, 승인/오버라이드/송출), viewer(읽기), service(Worker 서비스롤, cron 쓰기).

· RLS 정책: listings_pricing·price_decisions·sold_events는 service_role 풀액세스, operator/viewer는 SELECT만. approval_queue 승인은 operator+owner만 UPDATE. guardrail_config·circuit_breaker_state는 owner만 UPDATE(가격발작 방지 — 운영자도 가드는 못 푼다). rate_push_log는 service INSERT, 나머지 SELECT.

· 멀티테넌시 대비: org_id 컬럼 + RLS로 무해 외 다른 클라 확장시 격리(소유권 이전 후 클라가 자기 데이터만).

[보안 처리]

· 키 관리: BEDS24_REFRESH_TOKEN·ONDA_API_KEY·HOSTAWAY_API_KEY·INGEST_TOKEN 전부 Worker Secrets/Supabase Vault만(코드·배포 평문 절대 금지, beds24.js 주석에 명시된 원칙 준수). 토큰은 서버측에서만 access token 교환, 프론트 노출 0.

· /ingest는 INGEST_TOKEN 가드(403), 송출/승인/서킷 엔드포인트는 Supabase JWT 검증. CORS는 관리자 도메인 화이트리스트(현재 '*'는 읽기전용 SSOT만, 쓰기는 토큰필수).

· 멱등성: rate_push_log.idempotency_key UNIQUE로 중복송출 차단(네트워크 재시도시 이중가격 방지). sold_events UNIQUE(source,external_id)로 학습 이중집계 방지.

· 가격 무결성 불변식(코드강제): ①Price Floor — 어떤 경로로도 (청소비/최소박+가변비)/(1-수수료) 미만 송출 불가. ②단일사이클 ±40% 클램프. ③일일 누적변동 상한. ④서킷브레이커 — 가격발작(다수 매물 동시 급변·송출실패율 급등) 감지시 전체 동결, owner만 해제.

· 감사성: 모든 결정(price_decisions.trace)·송출(rate_push_log)·승인(approval audit)·가드변경 로깅. 비결정성 0(decideV2 순수함수·결정론) → 사후 재현·분쟁대응 가능.

· 법적: 통신판매중개 면책 고지(가격은 자동산출 권장가, 최종 판매는 호스트/플랫폼 책임), 가격 산정 로직 영업비밀 보호.

동작 프로세스

수집(Ingest): 노트북 헤드리스 추적기가 1,116매물 × 5날짜대(D14·D30·D45·D60·D90)를 병렬 P=4로 StaysPdpSections 견적 가로채 가격커브·캘린더 수집(매물당 ~10초, 1대 15분당 ~90매물). 직전 스냅샷과 diff → 가격변동 이벤트 + 가용→마감 뒤집힌 날짜 = sold-event 프록시. POST /ingest로 KV realocc/ledger 누적.

[2] 점유 해석(Occupancy): refineSnapshotCalendar가 unavailable 연속런으로 CLOSED(≥21박 캘린더닫힘)·AMBIG(8~20 오너블록)·STAY(1~7 실예약)·OPEN 라벨링 → 캘린더닫힘/블록 분모제외 보정점유 occ_corr = STAY/(STAY+OPEN). 단일캘린더 노이즈는 동벤치 prior로 shrinkage(K=14): occPct=(n·occ_corr+14·bench)/(n+14).

[3] 신호 융합(Signal): paceTarget(D)=실측앵커 선형보간(D0:58%~D90:13%, 데드존 D18). 압력 P = 0.50·occZ + 0.35·paceZ + 0.15·dowZ (+demandSurge 0.30), clamp[-1,+1]. P≤-0.33=risk·≥+0.33=good. 주말(금·토)이면 sellSignal(weekendTightness≥0.80→RAISE) 강제오버라이드.

[4] 가격 산출(Decide): phaseFor(D)로 단계·기본 최소박·채널(P1 5박 에어비앤비만 → P4 1박 6채널). risk면 다음단계 박수/채널 조기개방, good+P1이면 5박고정, orphanGap이면 1박강제+booking개방. targetPercentile(점유압·guestFav+12·superhost-8·momentum·페이스갭)→interpBand(동밴드 p25~p75)→ ×seasonFactor×dowFactor×(1+0.18·P) → LOS −15%·라스트미닛 −25% 레이어 → 경쟁밴드 클램프(ratio>1.15만 p75상단) → 언더컷 매칭(순이익 하한 사수).

[5] 학습 블렌드(Learn-blend): predictClearing(region·dday·los)이 504셀 EWMA를 부모 prior로 shrink(est=(n·cell+8·prior)/(n+8))한 클리어링가·bookProb 반환. seen>0이면 price=(1-conf)·price+conf·clearPrice (conf=min(1,seen/20)).

[6] 가드(Guard): Price Floor 적용(미만이면 올림) → 천원 라운딩 → 단일사이클 ±40% 클램프(자사기준가) → 일일 누적변동 체크 → 서킷브레이커 정상확인. reason 문자열·trace attribution 생성. price_decisions 영속.

[7] 송출(Push): pricing_mode 분기 — full-auto면 바로 큐, semi-auto면 임계초과만 approval_queue, manual이면 전건 대기. 승인된 결정 → 송출 오케스트레이터가 매물×날짜대 평탄화·동시성 풀로 온다/Beds24 ARI 빌드 → setPrices(roomId, calendar[{from,to,price1,minStay,numAvail}]) 1건 푸시로 6채널 동시반영 → rate_push_log(멱등키·status). 부분실패 격리·지수백오프 재시도.

[8] 검증·환류(Verify-loop): N시간 후 POST /push/verify가 잔여 재조회 → 실제 pickup(예약 들어왔나) 확인 → success/fail을 sold_events로 환류 → learnFromEvents가 셀 clearPrice EWMA·bookProb 베타-베르누이 갱신 → learning_cells 영속(version 낙관적락) → KV 캐시 무효화 → 다음 cron 사이클이 더 정밀한 클리어링가로 결정. = 완전 폐루프.

[9] 자율·감시(Autonomy): Worker cron */5가 사람·브라우저 없이 [2]~[7] 전 사이클 무한반복, recommendations SSOT 갱신. 트레이딩 터미널·승인큐·학습대시는 Supabase Realtime 구독으로 실시간 반영. 드리프트(정확도 하락)·서킷브레이커 발동시 슬랙/이메일 알림 → owner 개입. 주간 RevPAR·점유·완판률 리포트 자동집계.

하드웨어 연동 — 통합 IoT 컨트롤 레이어 (CCTV · 솔리티 도어락 · 무인 키오스크)

현장의 쇠붙이(카메라·도어락·키오스크)를 MOSO 두뇌에 물려, 호스트는 손 안 대고 온이가 영상·출입·결제까지 자율 운영하는 단일 하드웨어 컨트롤 플레인.

₩12,000,000

소프트웨어 SaaS는 '현장'을 못 본다는 한계를 정면으로 깬다. 본 모듈은 MOSO 콘솔·호스트앱·온이(AI)를 현장 하드웨어 3종 — (1) CCTV/IP카메라, (2) 솔리티 스마트 도어락, (3) 무인 체크인 키오스크 — 에 직접 물리는 통합 IoT 컨트롤 레이어다. 핵심 설계 사상은 '현장 엣지 에이전트(MOSO Edge Bridge) + 클라우드 컨트롤 플레인(Supabase + Cloudflare Worker) + 표현 레이어(콘솔/호스트앱/키오스크) 3단 분리'. 각 숙소에 라즈베리파이급 엣지 박스(또는 호스트 PC 상주 데몬)를 두어 로컬 RTSP/ONVIF 카메라, 솔리티 WiFi 게이트웨이(BLE 브리지), 키오스크 단말을 LAN에서 수렴하고, 아웃바운드 보안 터널(WireGuard/Cloudflare Tunnel)로만 클라우드와 통신한다(인바운드 포트 개방 0 — 보안 핵심).

(A) CCTV 전체 통합 대시보드 — 콘솔과 호스트앱에서 동시에. 숙소별·전체 그리드(1·4·9·16분할) 라이브 뷰. 카메라는 RTSP/ONVIF로 수집하고 엣지의 go2rtc가 WebRTC(서브초 지연, 모니터링용)와 HLS(2~4초, 다중 동시접속·녹화 재생용)로 동시 변환. 모션 이벤트 타임라인, 24/7 순환녹화(R2 오브젝트 스토리지 + 로컬 SD 이중화), 스냅샷 캡처, PTZ 제어(지원 카메라), 다운 카메라 알림. 온이가 영상 이벤트(예: 체크아웃 시간 후 인원 감지, 비정상 출입)를 트리거로 호스트앱 푸시.

(B) 솔리티 도어락 — 비번 호스트 자동변경 + 온이 고객 자동발송. 예약 확정 → MOSO가 체크인 전용 4~8자리 임시 비밀번호를 자동 생성 → 솔리티 WiFi 게이트웨이 경유로 해당 도어락에 시간제한(체크인~체크아웃) 임시키 발급 → 온이가 6개국어로 고객 메신저(카톡/문자/플랫폼 메시지)에 '도어락 비번 + 사용법 영상'을 자동 발송 → 체크아웃 시각에 자동 폐기/회전. 호스트 수동 개입 0. 도어 개폐 로그(누가·언제) 수집해 콘솔 타임라인에 기록, 무단 연장·이상 출입 탐지.

(C) 무인 키오스크 — 호텔용 UI + 결제 서버 API. 로비 무인 키오스크(호텔주 모바일에서도 동일 플로우)에서 예약조회→신원확인(QR/예약번호/전화)→잔금·보증금·현장결제(PG/VAN 카드리더)→도어락 비번 발급→영수증. 무인텔(시간제/숙박 셀프) 모드 분기. 결제는 KICC/NICE/KIS VAN 또는 PortOne 추상화로 카드(EMV/IC·MSR)·간편결제 처리, 서버 단 승인·매입·취소·부분취소 API 연동. 키오스크는 PWA 풀스크린(키오스크 모드) + 결제단말(카드리더) 시리얼/SDK 연동.

전 모듈 공통 기반(Supabase Realtime·Auth·RLS, 다국어 6개, PWA, 보안, 소스/Supabase 소유권 클라 이전, 통신판매중개 면책 고지) 위에 얹는다. 본 모듈은 '하드웨어 어댑터'를 표준 인터페이스로 추상화(Driver Pattern)하여, 추후 다른 도어락(코맥스·게이트맨)·다른 PG·다른 카메라 벤더로 무손상 확장 가능하게 설계.

품목 · 세부단가수량합계
하드웨어 추상화 아키텍처 설계 (HAL)3종 장치 공통 Device Abstraction Layer 설계 — Driver/Adapter 패턴, device_registry·device_command·device_event 스키마, 엣지↔클라우드 프로토콜 규약(MQTT-over-WSS/JSON-RPC) 정의, 장치 상태머신(online/offline/degraded) 설계서₩1,400,0001 LOT₩1,400,000
MOSO Edge Bridge 엣지 에이전트 개발숙소 현장 상주 데몬(Node/Go) — 로컬 장치 디스커버리(ONVIF WS-Discovery·BLE 스캔), 아웃바운드 보안 터널(WireGuard/Cloudflare Tunnel) 자동 연결, 헬스비콘·자동재접속·OTA 업데이트, 오프라인 큐잉. 인바운드 포트 0₩1,900,0001 LOT₩1,900,000
CCTV 스트리밍 게이트웨이 (go2rtc 통합)RTSP/ONVIF 입력 → WebRTC(서브초)·HLS(녹화/다접속) 동시 출력 파이프라인, 멀티카메라 트랜스코딩, 자동 재연결, 다운감지. 엣지 내장 + 클라우드 시그널링(STUN/TURN) 구성₩1,500,0001 LOT₩1,500,000
CCTV 통합 대시보드 UI (콘솔+호스트앱)숙소별·전체 그리드(1/4/9/16분할), 라이브 뷰어, 스냅샷, PTZ 제어 패드, 카메라 상태 보드, 모션 이벤트 타임라인. 콘솔(데스크톱)·호스트앱(모바일) 양쪽 반응형 컴포넌트₩1,300,0001 LOT₩1,300,000
녹화·이벤트 파이프라인 (R2 + 모션 + AI훅)24/7 순환녹화 R2 업로드+로컬 SD 이중화, 보관기간 정책(30/60일), 모션 디텍션 이벤트 → recording_clip 인덱싱, 온이 영상이벤트 훅(체크아웃 후 인원감지·이상출입) → 호스트 푸시₩1,100,0001 LOT₩1,100,000
솔리티 도어락 연동 드라이버 + 게이트웨이 통신솔리티 WiFi 스마트 브리지/BLE 게이트웨이 통신 어댑터, 임시 비밀번호 발급·회전·폐기, 시간제한 게스트키(체크인~체크아웃), 도어 개폐 로그 수집. 벤더 비공개 API 대응 리버스/브리지 핸드셰이크 포함₩1,700,0001 LOT₩1,700,000
비번 자동 라이프사이클 + 온이 6개국어 자동발송예약확정→비번 자동생성→도어락 발급→온이가 카톡/문자/플랫폼 메시지로 비번+사용영상 6개국어 발송→체크아웃 자동폐기/회전. 발송 실패 재시도·도어락 오프라인 폴백(백업 비번) 로직₩900,0001 LOT₩900,000
무인 키오스크 셀프체크인 UI (호텔/무인텔/모바일)PWA 풀스크린 키오스크 모드 — 예약조회→신원확인(QR·예약번호·전화)→약관·면책동의→객실배정→도어락 비번 발급→영수증. 호텔/무인텔(시간제) 모드 분기, 호텔주 모바일 동일 플로우, 6개국어, 터치 최적화·접근성₩1,300,0001 LOT₩1,300,000
키오스크 결제 서버 API 연동 (PG/VAN)KICC/NICE/KIS VAN 또는 PortOne 추상화 — 카드리더(EMV/IC·MSR) SDK·시리얼 연동, 서버단 승인·매입·취소·부분취소·보증금 예치/해제, 현장결제·잔금정산, 결제 멱등성·웹훅 대사, 영수증(현금영수증 포함) 발행₩1,100,0001 LOT₩1,100,000
소계₩12,000,000

백엔드 구조

• device_registry — 장치 마스터. id, property_id(FK 숙소), kind('cctv'|'doorlock'|'kiosk'), vendor('solity'|'onvif'|...), model, serial, edge_id(FK), capabilities(jsonb: ptz/audio/temp_key 등), status('online'|'offline'|'degraded'), last_seen_at, firmware, install_meta(jsonb)

• edge_node — 현장 엣지 박스. id, property_id, tunnel_id, public_key(WireGuard), agent_version, health(jsonb: cpu/mem/disk/uplink), last_beacon_at, ota_channel

• camera_stream — 카메라 스트림 구성. device_id, rtsp_url(암호화), webrtc_session, hls_path, resolution, fps, ptz_supported, record_policy('24x7'|'motion'), retention_days

• recording_clip — 녹화 인덱스. id, device_id, r2_key, started_at, ended_at, duration, trigger('schedule'|'motion'|'ai'), thumbnail_key, expires_at

• motion_event — 모션/AI 이벤트. id, device_id, ts, zone, kind('motion'|'person'|'abnormal_entry'|'post_checkout_occupancy'), confidence, clip_id(FK), acknowledged_by

• doorlock_credential — 도어락 임시키. id, device_id, reservation_id(FK), pin(암호화), valid_from, valid_until, state('pending'|'active'|'revoked'|'expired'), issued_by, fallback_pin

• doorlock_event — 개폐 로그. id, device_id, ts, action('unlock'|'lock'|'denied'|'tamper'), credential_id(FK), source('pin'|'card'|'remote'|'manual')

• kiosk_session — 키오스크 세션. id, kiosk_device_id, reservation_id, step('lookup'|'verify'|'agree'|'assign'|'pay'|'issue'|'done'), guest_verify_method, locale, started_at, completed_at

• payment_txn — 결제 트랜잭션. id, kiosk_session_id, reservation_id, pg('kicc'|'nice'|'kis'|'portone'), method('card_ic'|'card_msr'|'easy'), amount, kind('balance'|'deposit'|'onsite'), pg_tid, status('approved'|'captured'|'cancelled'|'partial_cancel'), idempotency_key, receipt_url, cash_receipt_no

• device_command — 명령 큐. id, device_id, type('ptz'|'snapshot'|'issue_pin'|'revoke_pin'|'reboot'|'payment_approve'|'payment_cancel'), payload(jsonb), status('queued'|'sent'|'acked'|'failed'), issued_by, acked_at

• device_audit_log — 전 장치 감사로그(불변). actor, device_id, action, before/after(jsonb), ip, ts

[Cloudflare Worker — 서버측 컨트롤 플레인]

• /hw/ingest — 엣지 비콘·이벤트·로그 수신(WSS), 멱등 처리, Supabase Realtime 브로드캐스트

• /hw/command — 콘솔/온이 명령 → device_command 큐잉 → 엣지로 푸시(WSS), ack 대기·타임아웃 재시도

• /hw/stream/signal — WebRTC 시그널링(SDP/ICE), STUN/TURN 발급, 단기 토큰서명

• /doorlock/issue · /doorlock/revoke — 예약 라이프사이클 훅(체크인 전 발급·체크아웃 폐기), 온이 메시지 디스패치 트리거

• /kiosk/lookup · /kiosk/verify · /kiosk/issue — 키오스크 단계별 검증

• /pay/approve · /pay/capture · /pay/cancel · /pay/webhook — PG 승인/매입/취소·웹훅 대사(서명검증), 멱등키 보장

• /ai/vision-hook — 모션·AI 이벤트 → 온이 의사결정 엔진(decideV2 계열)으로 라우팅 → 호스트 푸시

[서비스 레이어]

• HAL Driver 인터페이스(IDeviceDriver) — SolityDriver / OnvifCameraDriver / KioskPayDriver 구현체(확장형)

• ReservationLifecycle 오케스트레이터 — 예약상태(confirmed→checkin→checkout)와 도어락·키오스크·결제 동기화

• MediaGateway — go2rtc 제어, HLS 세그먼트 R2 라우팅, TURN 관리

• PaymentService — PG 추상화, 멱등·대사·정산

• OniHardwareAgent — 온이가 장치 이벤트를 읽고 행동(비번발송·이상알림·심야문의 응대) 하는 어댑터

프론트엔드 구조

• 페이지: HardwareOverview(전 숙소 장치 상태 히트맵 — 온라인/오프라인/저하), CCTVWall, DoorlockBoard, KioskMonitor, DeviceLogs

• 컴포넌트:

– CameraGrid (1/4/9/16 분할 토글), LiveTile(WebRTC 우선·HLS 폴백, 지연표시 배지), PtzPad(상하좌우·줌·프리셋), SnapshotButton, CameraHealthChip

– EventTimeline(모션·출입·결제 통합 타임라인, 필터·재생점프), ClipPlayer(HLS 녹화 스크러버)

– DoorlockCard(숙소별 현재 비번·유효시간·개폐로그), PinLifecycleStepper(생성→발급→발송→폐기 시각화), ForceRevokeButton

– KioskStatusCard(단말 온라인·현재 세션 단계·오늘 셀프체크인 수), PaymentLedgerTable(승인·취소·정산)

– EdgeNodePanel(엣지 박스 헬스: CPU/디스크/업링크, OTA 버튼)

[호스트앱 — 모바일(네이티브 맥앱/PWA) 하드웨어 탭]

• 페이지: 내 숙소 CCTV(스와이프 카메라 전환·풀스크린 핀치줌), 도어락(현재 비번·'재발송'·'임시 1회용 비번' 버튼), 출입로그, 키오스크 알림

• 컴포넌트: MobileCameraViewer, DoorlockQuickCard, PushAlertSheet(이상출입·카메라다운·결제실패), OneTapResend

[무인 키오스크 — 풀스크린 PWA (키오스크 모드, 별도 테마: 대형 터치·고대비)]

• 화면 플로우 컴포넌트: KioskAttract(대기 슬라이드), ReservationLookup, GuestVerify(QR스캐너·텍스트패드), AgreementScreen(약관·통신판매중개 면책), RoomAssign, PaymentScreen(카드 삽입 안내·진행링), PinIssueScreen(대형 비번+QR), ReceiptScreen(인쇄·이메일·완료)

• 공통: LocaleSwitcher(6개국어), IdleTimeout(세션 자동복귀), AccessibilityControls(글자크기·음성안내), AttendantCallButton(직원호출)

와이어프레임 설계

좌측 220px 다크 네이비 nav(기존 모소 사이드바, '하드웨어' 활성). 상단 바: 좌측 숙소 드롭다운('전체/숙소별')·분할 토글(1·4·9·16 아이콘 버튼)·'라이브/녹화' 세그먼트·우측 녹화상태 점. 본문: 카메라 타일 그리드(예 9분할 3×3). 각 타일 — 16:9 영상, 좌상단 카메라명 칩, 우상단 지연배지(WebRTC 0.4s 녹색/HLS 3s 노랑), 하단 호버 시 컨트롤바(스냅샷·PTZ·풀스크린). 우측 320px 사이드 패널: 위 '모션 이벤트 타임라인'(시간 역순 카드: 썸네일+'사람 감지 04:12'+숙소), 아래 '카메라 상태 보드'(온라인 12 / 오프라인 1 빨강). [화면2 · 콘솔 도어락 보드] 상단 KPI 4칸(활성 비번·오늘 체크인·이상출입·도어락 오프라인). 좌측 2/3: 숙소 리스트 테이블(숙소·현재비번 ****·유효 14:00~익11:00·마지막개폐·상태 칩). 행 클릭 시 우측 1/3 드로어: 'PIN 라이프사이클 스테퍼'(생성●─발급●─온이발송●─폐기○ 가로 진행, 각 단계 타임스탬프), 그 아래 '개폐 로그' 리스트(unlock 14:03 pin / denied 02:11 빨강), 하단 위험버튼 '강제 폐기·재발급'. [화면3 · 호스트앱 모바일 도어락] 상단 숙소명+오늘날짜. 큰 카드: '현재 게스트 비번' 대형 숫자 ●●●●●● (탭하면 표시), 유효시간 바, 그 아래 가로 2버튼 '고객에게 재발송'(파랑)·'1회용 임시비번'(아웃라인). 하단 '최근 출입' 3줄. 카메라 다운/이상출입 시 상단에 빨간 알림 시트 슬라이드업. [화면4 · 키오스크 셀프체크인 — 결제 단계] 풀스크린, 상단 진행 스텝바(조회─확인─동의─배정─●결제─발급). 중앙: 좌측 큰 일러스트(카드 삽입 그래픽 + 화살표 애니메이션 자리), 우측 결제요약 박스(객실·박수·잔금·보증금·합계 큰 숫자). 하단 진행 스피너 '카드를 꽂아주세요…'. 우상단 6개국어 토글, 우하단 '직원 호출' 버튼. 고대비·버튼 최소 64px. [화면5 · 키오스크 비번 발급 완료] 중앙 초대형 비밀번호 6자리(자간 넓게) + 우측 QR(도어락 위치·길안내 링크). 상단 '○○호 체크인 완료 ✓'. 하단 3버튼: '영수증 인쇄'·'이메일 전송'·'완료'. 10초 후 자동으로 대기화면 복귀 카운트다운. [화면6 · 콘솔 통합 이벤트 타임라인(전 장치)] 한 화면에 카메라 모션·도어 개폐·키오스크 결제 이벤트를 시간축 한 줄로 병합. 좌측 필터(장치종류·숙소·심각도), 중앙 타임라인(아이콘별 색: 영상 powder·도어 navy·결제 green, 이상은 red), 우측 선택 이벤트 상세(관련 클립 재생/결제 영수증/온이 대응 내역).

서버 · 보안

현장 인바운드 포트 개방 0. 엣지는 WireGuard 또는 Cloudflare Tunnel로 아웃바운드만 수립 → 클라우드가 역방향으로 명령 푸시. RTSP 자격증명·도어락 시드는 평문 미저장(Supabase Vault/KMS 암호화, at-rest AES-256).

[인증/인가] Supabase Auth(호스트·운영자·직원 역할). RLS로 property_id 기반 행수준 격리 — 호스트는 본인 숙소 장치만, 직원은 배정 숙소만 조회. 키오스크 단말은 디바이스 전용 단기 토큰(만료·회전), 사람 세션과 분리.

[명령 무결성] 모든 device_command는 서명(HMAC)·멱등키·만료. 비번 발급/폐기·결제 승인/취소 등 고위험 명령은 audit_log 불변 기록(actor·ip·before/after) + 이중확인(콘솔 강제폐기 시 확인 모달).

[영상 프라이버시] 스트림은 단기 서명 URL(TURN 토큰 60초), 직접 RTSP 노출 0. 녹화 R2는 비공개 버킷+서명 URL, 보관기간 자동만료. 객실 내부 카메라 금지 정책 명문화(공용부만), 화면에 녹화중 고지.

[결제 보안] 카드 PAN 비저장(PG 토큰화·VAN 단말 처리), PCI 범위 최소화. 결제 승인/취소는 서버 단독 호출+웹훅 서명검증+멱등키로 이중과금 차단. 보증금 예치/해제 별도 추적.

[도어락 안전장치] 도어락 오프라인 시 백업 비번 폴백, 비번 회전 실패 알림, tamper 이벤트 즉시 호스트 푸시. 체크아웃 후 비번 자동폐기 보장(스케줄러 + 재확인).

[법적] 영상정보처리기기 운영·관리방침 및 안내판 고지, 개인영상정보 보관·파기 절차, 통신판매중개자 면책 고지(키오스크 약관화면 포함), 데이터·소스·Supabase 소유권 클라 이전.

[가용성] 엣지 헬스비콘 미수신 시 콘솔 경보, OTA 롤백, 오프라인 명령 큐잉 후 복구 시 재생.

동작 프로세스

카메라(RTSP/ONVIF) → 엣지 go2rtc 수렴 → 24/7 녹화는 로컬SD+R2 업로드(recording_clip 인덱싱), 라이브는 콘솔/호스트앱 요청 시 Worker 시그널링으로 WebRTC P2P(서브초) 연결, 다접속·재생은 HLS. 모션 감지 → motion_event 생성 → 온이 vision-hook 판정(예: 체크아웃 후 인원) → 이상 시 호스트앱 푸시 + 타임라인 기록.

[흐름B · 도어락 비번 자동] 예약 confirmed → ReservationLifecycle가 체크인 전 임시 PIN 생성 → /doorlock/issue → 엣지 → 솔리티 게이트웨이 → 도어락에 시간제한 게스트키 등록(valid_from~until) → 온이가 6개국어로 '비번+사용영상' 고객 발송(실패 시 재시도) → 투숙 중 개폐 이벤트 수집 → 체크아웃 시각 도달 → 자동 폐기/회전(스케줄러). 도어락 오프라인이면 백업 비번 폴백+호스트 알림.

[흐름C · 무인 키오스크 셀프체크인] 게스트가 키오스크(또는 호텔주 모바일)에서 예약조회 → 신원확인(QR/예약번호/전화) → 약관·면책 동의 → 객실 배정 → 결제(잔금·보증금: 카드리더 IC/MSR → PaymentService → PG 승인 → payment_txn approved) → 결제 성공 시 도어락 비번 자동 발급(흐름B 연결) → 비번+QR 화면 표시 → 영수증(인쇄/이메일) → 세션 종료·대기화면 복귀. 무인텔(시간제) 모드는 객실선택·시간단위 결제로 분기.

[흐름D · 온이 자율 운영 루프] 온이가 device_event(영상·출입·결제)를 실시간 구독 → 규칙·LLM 판단 → 행동(비번 재발송·이상출입 호스트 알림·심야 고객문의 응대·결제실패 안내) → 모든 행동 audit_log 기록 → 호스트는 콘솔/앱에서 사후 확인만. 현장 무인·호스트 무개입 자율 운영 완성.

마케팅 자동화 엔진 + 업체숙소 웹사이트 스킨 15 (Content & Microsite Automation)

호스트는 사진만 던집니다. 캐러셀·소재·블로그·숙소 웹사이트까지 AI가 찍어내고 6개 채널에 알아서 발행하는 '콘텐츠 공장' 자체를 통째로 짓습니다.

₩8,920,000

MOSO에 입점한 1실 호스트의 '마케팅'을, 사람이 디자인·카피·발행에 손대지 않아도 굴러가는 자율 콘텐츠 공장으로 대체합니다. 호스트가 객실 사진 6~10장과 한국어 한 줄만 던지면, ① 인스타 캐러셀(4:5 2160×2700 retina) ② AI 생성·보정 이미지 ③ 네이버 블로그·티스토리 포스트 ④ 그 숙소 전용 웹사이트(마이크로사이트) 가 자동으로 만들어지고, ⑤ 인스타·스레드·페북·X·네이버·티스토리 6개 채널에 큐를 타고 발행됩니다.

[① SNS 캐러셀 자동생성 엔진] 이미 보유한 '어피어즈 카드뉴스 룰북(104개 표현법 → 3대 범주로 정리)'을 MOSO 숙소 도메인으로 포팅합니다. 7단계 골격(표지 검정+사진 → 흰배경 디테일 → 체크리스트/숫자 → 다크 임팩트 → 호출형 CTA)을 그대로 쓰되, 카피 풀을 숙소 운영(다국어 응대·중복예약 방지·청소 인증·다이내믹 프라이싱)으로 교체. '매 게시물 다르게' 변주 보장 장치(표현법 로테이션·표지 후킹 5유형 교체·강조 위치 변주)를 코드로 강제해, 30덱을 돌려도 똑같은 카드가 안 나오게 합니다. HTML 덱 → Playwright(chromium)로 슬라이드별 1080×1350 @2x PNG 출력 + manifest.json 생성까지, 지금 작동하는 render_appears.js 파이프라인을 프로덕션화합니다.

[② AI 이미지 생성·보정 파이프라인] 텍스트→이미지 생성(프롬프트 템플릿화), 객실 사진 누끼(rembg)·로고 제거(LaMa)·업스케일·톤락(브랜드 컬러 #1d3557 계열 LUT)을 한 줄 잡(job)으로 묶습니다. 결제 없는 무료 스택(Pollinations 생성 + rembg + LaMa)을 1차 엔진, 유료 API(gpt-image-1/Gemini)를 폴백으로 이중화. 생성 로그(generation_log.json)·재현 가능한 시드 관리 포함.

[③ 블로그·티스토리 반자동] 네이버는 JS 차단 → CSS-only 스킨(타이틀·프로필·메뉴·위젯·본문 5개 영역)으로 브랜딩하고, 본문 초안은 brand-blog 시스템이 생성, 발행은 Claude-in-Chrome(CIC)이 에디터에 입력→임시저장(발행 버튼만 사람). 티스토리는 API/스킨 양쪽. 자동화 가능도 80%(가입·최종 발행만 사람)로 설계.

[④ 업체숙소 웹사이트 스킨 15종] '아이디 하나만 주세요'로 입점한 숙소가 각자 가질 수 있는 마이크로사이트 테마 15종. 한옥/오션뷰/시티/감성스테이/패밀리/펫동반 등 카테고리별 룩앤필. 단일 HTML+CSS 반응형(PC/모바일), 예약 CTA→OTA 딥링크, 갤러리·다국어(6개)·OG/SEO·통신판매중개 면책 고지 슬롯 내장.

[⑤ 사진→웹사이트 자동제작 내부시스템(Auto-Microsite)] 이 모듈의 심장. 호스트가 업로드한 사진 묶음 → AI가 (a)대표컷/객실/주변 자동 분류 (b)색감 분석→15스킨 중 매칭·톤 자동조정 (c)캡션·소개문·하이라이트 자동 작문(6개국어) → 완성된 마이크로사이트를 1클릭 퍼블리시(서브도메인 발급). 운영자(어피어즈/무해온)만 쓰는 내부 콘솔.

[⑥ 브랜딩 키트 + 인스타 비즈 세팅(런치팩)] 신규 숙소 1곳 온보딩 시: 로고/워드마크 락 → 컬러·하이라이트 커버 9종 → 인스타 비즈 계정 프로필·바이오·링크인바이오 세팅 → 첫 12피스 그리드 시딩. 슬롯별 쌓기·연계성 0 금지(브랜드 시스템 퀄리티 기준 준수).

품목 · 세부단가수량합계
업체숙소 웹사이트 스킨 15종 (마이크로사이트 테마)한옥·오션뷰·시티·감성스테이·패밀리·펫동반 등 카테고리별 단일 HTML+CSS 반응형(PC/모바일) 테마. 각 테마: Hero/갤러리/객실/주변/리뷰/예약CTA(OTA 딥링크)/다국어 6개/OG·SEO/면책고지 슬롯 내장. 디자인 토큰화(컬러·타이포·간격 변수)로 톤 교체 가능₩180,00015 LOT₩2,700,000
사진→웹사이트 자동제작 내부시스템 (Auto-Microsite Builder)사진 묶음 업로드→AI 자동분류(대표/객실/주변)→색감분석으로 15스킨 매칭·톤 자동조정→캡션·소개문·하이라이트 6개국어 자동작문→서브도메인 1클릭 퍼블리시. 운영자 전용 내부 콘솔(인테이크 큐·미리보기·재생성·승인 게이트)₩1,500,0001 LOT₩1,500,000
SNS 캐러셀 자동생성 엔진 (DNA 104 + Playwright 렌더)카드뉴스 룰북 104표현법을 숙소도메인으로 포팅, 7단계 골격·변주보장 장치 코드화. HTML 덱→Playwright(chromium) 슬라이드별 1080×1350 @2x(2160×2700) PNG + manifest.json 자동출력. 폰트(Pretendard) 정확 렌더, 30덱 무중복 보장₩1,400,0001 LOT₩1,400,000
멀티채널 발행 오케스트레이터 (큐·워커·6채널)studio_server 큐(JSON/Realtime)+publish_worker 프로덕션화. 인스타(Graph API 캐러셀)·스레드·페북·X=API, 네이버블로그·티스토리=CIC 브릿지. 예약발행·재시도·실패격리·발행임박 푸시알림·채널별 상태보드₩950,0001 LOT₩950,000
AI 이미지 생성·보정 파이프라인텍스트→이미지(프롬프트 템플릿)·누끼(rembg)·로고제거(LaMa)·업스케일·브랜드 톤락 LUT를 단일 잡으로 묶음. 무료스택(Pollinations+rembg+LaMa) 1차 / 유료API(gpt-image-1·Gemini) 폴백 이중화. 시드·생성로그 재현관리₩780,0001 LOT₩780,000
블로그·티스토리 반자동 (스킨+초안생성+CIC 발행 브릿지)네이버 CSS-only 스킨 5영역(타이틀·프로필·메뉴·위젯·본문)+티스토리 스킨. 본문 초안 brand-blog 자동생성→CIC가 에디터 입력·임시저장(발행 버튼만 사람). 키워드·내부링크·이미지 자동삽입. 자동화 80%₩600,0001 LOT₩600,000
숙소 브랜딩 키트 + 인스타 비즈 세팅 (런치팩)신규 숙소 온보딩 1곳 기준: 로고/워드마크 락→컬러·스토리 하이라이트 커버 9종→인스타 비즈 프로필·바이오·링크인바이오 세팅→첫 12피스 그리드 시딩. 슬롯 쌓기·연계성0 금지(브랜드 시스템 퀄리티 기준)₩470,0001 LOT₩470,000
콘텐츠 캘린더·스케줄러·성과 분석 루프숙소별 발행 캘린더(주간 슬롯), 시즌·요일 최적 타이밍 큐잉, IG Insights/네이버 데이터랩 메트릭 수집→누적 대시보드→다음 콘텐츠 추천(6단계 중 ⑥분석·최적화 루프)₩320,0001 LOT₩320,000
해시태그·발행 타이밍·카피 변주 엔진숙소 카테고리·지역별 해시태그 풀 자동조합, 표지 후킹 5유형 로테이션, 클리셰 결론 차단 룰. 채널별 글자수·포맷 자동 트랜스폼(인스타/스레드/X 길이 변환)₩200,0001 LOT₩200,000
소계₩8,920,000

백엔드 구조

· properties(숙소 마스터: id, host_id, name_i18n jsonb, category, brand_tokens jsonb[컬러·로고url·폰트], subdomain, status)

· photo_intakes(사진 인테이크 묶음: id, property_id, files jsonb[], exif jsonb, palette jsonb[추출 색], classify jsonb[대표/객실/주변 라벨], status[uploaded→classified→approved])

· microsites(마이크로사이트: id, property_id, skin_id(1~15), tokens jsonb, copy_i18n jsonb, html_snapshot, published_url, version, published_at)

· skins(스킨 카탈로그: id, name, category, schema jsonb[슬롯 정의], thumbnail, css_vars jsonb)

· content_decks(캐러셀 덱: id, property_id, method_id(104표현법), spine jsonb[7단계 슬라이드], variation_seed, lang)

· slide_renders(렌더 산출: id, deck_id, slide_no, png_url(2160×2700), retina, manifest jsonb)

· media_assets(이미지: id, property_id, kind[generated/cutout/upscaled], src_prompt, seed, lut, url, derived_from)

· blog_posts(블로그/티스토리: id, property_id, channel[naver/tistory], title, body_md, keywords[], cover_url, status[draft→staged→published], cic_run_id)

· publish_queue(발행 큐: id, channel, payload jsonb, scheduled_at, attempts, state[queued→processing→done/failed], error)

· channels(채널 연결: id, property_id, type, handle, token_ref(Vault), status, auto bool)

· content_calendar(캘린더: id, property_id, channel, slot_at, deck_id/post_id, status)

· metrics(성과: id, property_id, channel, post_ref, impressions, reach, saves, ctr, captured_at)

· brand_kits(런치팩: id, property_id, logo_locks jsonb, highlight_covers jsonb[9], bio_i18n, link_in_bio jsonb)

· asset_jobs(잡 큐: id, type[generate/cutout/upscale/render/microsite_build], input jsonb, output jsonb, state, worker, logs)

[API 엔드포인트 — Cloudflare Worker + Supabase Edge Functions]

· POST /intake/upload (presigned R2/Storage 업로드) · POST /intake/{id}/classify(AI 분류) · POST /intake/{id}/palette

· POST /microsite/build(사진→스킨매칭→카피생성) · GET /microsite/{id}/preview · POST /microsite/{id}/publish(서브도메인 발급)

· GET /skins · GET /skins/{id}/schema

· POST /deck/generate(method_id·variation_seed) · POST /deck/{id}/render(Playwright 트리거) · GET /deck/{id}/manifest

· POST /image/generate · POST /image/cutout · POST /image/upscale · POST /image/tonelock

· POST /blog/draft(brand-blog 생성) · POST /blog/{id}/stage(CIC) · GET /blog/{id}/status

· POST /publish(채널·payload·schedule) · GET /publish/queue · POST /publish/{id}/retry · DELETE /publish/{id}

· GET /calendar/{property} · POST /calendar/slot · GET /metrics/{property}?channel= · GET /notify/check(발행임박)

· POST /brandkit/{property}/build · GET/POST /bio/{property}

[서비스/워커 레이어]

· render-worker(Node+Playwright/chromium, 헤드리스 PNG 2160×2700, 폰트 ready 대기, 슬라이드 screenshot, manifest 작성)

· image-worker(Pollinations 생성 → rembg 누끼 → LaMa 로고제거 → upscale → LUT 톤락, 무료 1차/유료 폴백)

· microsite-worker(EXIF·색감 분석 → 15스킨 매칭 점수 → 토큰 자동조정 → i18n 카피 작문 → HTML 스냅샷 빌드 → R2 퍼블리시)

· publish-worker(채널별 어댑터: IG Graph API 캐러셀 컨테이너→publish, 스레드/페북/X API, 네이버·티스토리 CIC 어댑터)

· cic-bridge(Claude-in-Chrome: 사람 로그인 세션 위에서 에디터 입력→임시저장, 발행 버튼은 휴먼 게이트)

· scheduler(cron: 캘린더 슬롯→큐 적재, 발행임박 푸시), metrics-collector(IG Insights·네이버 데이터랩 폴링→누적)

프론트엔드 구조

페이지:

· /studio/intake — 사진 인테이크 큐(드래그업로드·진행률·분류결과 칩)

· /studio/microsite/{property} — Auto-Microsite 빌더(좌:사진 그리드/분류, 중앙:스킨 매칭 미리보기 라이브, 우:토큰·카피 6개국어 탭+재생성/승인)

· /studio/skins — 15스킨 갤러리(썸네일 그리드·카테고리 필터·미리보기 모달)

· /studio/decks — 캐러셀 생성기(표현법 104 선택 드롭다운·variation seed·7단계 슬라이드 미리보기·Render 버튼→PNG 결과)

· /studio/images — 이미지 잡 보드(생성/누끼/업스케일/톤락 탭, 무료·유료 토글, 시드·로그)

· /studio/blog — 블로그·티스토리 초안 에디터(좌:초안 md, 우:스킨 미리보기, CIC '임시저장까지' 버튼)

· /studio/queue — 멀티채널 발행 큐 보드(채널별 칼럼 칸반, 예약시각·재시도·실패격리)

· /studio/calendar — 주간 콘텐츠 캘린더(슬롯 드래그 배치, 채널 색상)

· /studio/metrics — 성과 대시보드(노출·도달·저장·CTR 카드+채널별 추이 차트)

· /studio/brandkit/{property} — 런치팩(로고락·하이라이트 9커버·바이오·12피스 시딩 프리뷰)

핵심 컴포넌트:

· <PhotoIntakeGrid> 분류 라벨 오버레이 · <SkinMatchPreview> 라이브 iframe 렌더 · <TokenEditor> 컬러/폰트/간격 변수 · <I18nCopyTabs> 6개국어 탭 · <DeckSpineEditor> 7단계 슬라이드 카드 · <CarouselPreview> 4:5 스와이프 · <RenderStatus> Playwright 진행 · <ChannelKanban> 큐 칸반 · <MetricCard>·<TrendChart> · <CICRunButton> 휴먼게이트 표시

[퍼블릭 — 숙소 마이크로사이트(생성물)]

· 단일 HTML/CSS 반응형(PC/모바일), Hero·갤러리(라이트박스)·객실·주변·리뷰·예약CTA(OTA 딥링크)·언어 스위처(6개)·OG/JSON-LD·푸터 통신판매중개 면책고지. PWA·SEO 최적화.

와이어프레임 설계

(W1) Auto-Microsite 빌더 — 3분할 작업대 · 상단 바(높이 56): 좌측 'MOSO 스튜디오 / 마이크로사이트' 브레드크럼, 중앙 숙소명 드롭다운, 우측 [미리보기][승인·퍼블리시] 버튼(네이비 #1d3557). · 좌측 패널(폭 300): 'STEP 1 사진' 라벨 → 3열 썸네일 그리드, 각 썸네일 좌상단 분류 칩(대표=파랑/객실=청록/주변=회색), 하단 '+ 업로드' 점선 박스. · 중앙 패널(가변, 가장 넓음): 'STEP 2 스킨 매칭' 라벨 → 디바이스 토글(PC/모바일 세그먼트) → 그 아래 큰 iframe 라이브 프리뷰(모바일이면 폰 목업 프레임). 프리뷰 하단 스킨 캐러셀: 15개 미니 카드 가로 스크롤, 매칭점수 높은 3개에 'AI 추천' 뱃지. · 우측 패널(폭 320): 'STEP 3 브랜드·카피' → 탭(컬러/폰트/간격) 토큰 스와치 행 + 6개국어 탭(KO·EN·JA·ZH·ES·...) 아래 소개문·하이라이트 텍스트영역, 각 필드 옆 [재생성] 아이콘. 맨 아래 '승인 게이트' 체크 + 발행 URL 미리보기(sub.moso.io/{slug}). (W2) 캐러셀 생성기 — 좌설정·우프리뷰 · 좌측(폭 360): '표현법' 큰 드롭다운(예: 역순부검·디데이카운트다운·진료차트… 104개), 그 아래 'Variation Seed' 숫자+주사위 버튼, 'P1~P8 골격' 세로 리스트(각 행: 배경 검정/흰 토글·역할 라벨·카피 인풋). 하단 [Render PNG 2160×2700] 큰 버튼. · 우측(가변): 폰 목업 안에 4:5 캐러셀, 하단 점 인디케이터·좌우 화살표로 슬라이드 넘김. 우상단 'n/8' 카운터. Render 후 하단에 PNG 썸네일 8장 스트립 + manifest 다운로드. (W3) 멀티채널 발행 큐 — 칸반 · 상단: 채널 필터 토글 칩(IG·Threads·FB·X·네이버·티스토리), 우측 '예약 발행' 토글. · 본문: 6개 세로 칼럼(채널별), 칼럼 헤더에 채널 아이콘·연결상태 점(초록=connected). 각 카드: 썸네일+캡션 1줄+예약시각 뱃지+상태(queued/processing/done/failed). failed 카드는 빨강 좌측 보더+[재시도]. 칼럼 하단 '대기 n건'. (W4) 스킨 갤러리(15종) · 상단: 카테고리 필터(전체·한옥·오션뷰·시티·감성·패밀리·펫). · 본문: 3열 카드 그리드 ×5행=15장. 각 카드: 16:10 썸네일(데스크탑 목업)+우하단 모바일 미니 목업 겹침, 하단 스킨명·카테고리 태그·[미리보기]. 호버 시 '이 스킨으로 만들기' 오버레이. (W5) 성과 대시보드 · 상단: 숙소 선택 드롭다운 + 기간 세그먼트(7일/30일/전체). · KPI 행: 4개 카드(노출·도달·저장·CTR) 각 큰 숫자+증감 화살표. · 본문: 좌측 채널별 추이 라인차트(범례=채널색), 우측 '상위 게시물' 리스트(썸네일·저장수·CTR 바). 하단 '다음 콘텐츠 추천' 카드(추천 표현법·발행 타이밍). (W6) 블로그 반자동 에디터 · 좌측(50%): 마크다운 초안 에디터(제목·본문·키워드 칩·삽입 이미지). · 우측(50%): 네이버/티스토리 스킨 미리보기 iframe(탭 전환). · 하단 바: 'CIC가 임시저장까지 진행합니다(발행 버튼은 직접)' 안내 + [임시저장 실행] 버튼 + 진행 로그 토스트.

서버 · 보안

· Auth: Supabase Auth(이메일+OTP, 운영자/호스트 역할 분리). 운영자(어피어즈·무해온)만 /studio/* 접근.

· RLS: 모든 테이블 row-level. 호스트는 자기 property_id 행만 SELECT(자기 숙소 사이트·성과만). 운영자 role은 전체. publish_queue·asset_jobs·channels는 운영자/서비스롤 전용(호스트 차단). microsites.published 스냅샷만 익명 공개 읽기.

· 토큰 보안: 인스타 Graph/페북/X/네이버·티스토리 자격증명은 평문 금지 → Supabase Vault(또는 CF Secrets)에 token_ref만 보관, 워커가 런타임 주입. 키 로테이션·만료 추적.

· CIC 안전: Claude-in-Chrome은 본인(클라) 로그인 세션 위에서만 동작, ToS 회색지대 회피 위해 '임시저장까지'만 자동·최종 발행은 휴먼 게이트. 봇 행동 레이트리밋·휴먼라이크 딜레이.

· 동시성: publish_queue·asset_jobs는 SELECT … FOR UPDATE SKIP LOCKED 패턴으로 워커 중복처리 방지. 멱등키(idempotency key)로 같은 덱 이중발행 차단.

· 스토리지: 원본 사진/PNG/이미지는 R2(또는 Supabase Storage) presigned URL 업·다운로드, 퍼블릭 버킷엔 퍼블리시 산출물만.

· 저작권·면책: 마이크로사이트·블로그 푸터에 '통신판매중개자 면책' 법적고지 자동 삽입. AI 생성 이미지 시드·프롬프트 로그 보존(분쟁 대비). 외부 이미지 무단 사용 차단(누끼·생성은 자체/무료스택 우선).

· 콘텐츠 가드레일: 발행 전 운영자 승인 게이트(캐러셀·블로그·마이크로사이트 모두 approve 상태 필요). 자동발행은 화이트리스트 채널·검수 통과분만.

· 보안 일반: CORS 화이트리스트, 업로드 MIME·용량 검증, 레이트리밋, 감사로그(asset_jobs.logs·cic_run_id).

· 소유권: 본 모듈 소스코드·Supabase 프로젝트·스킨 15종·렌더 파이프라인 전체 IP를 클라(무해)에게 이전(계약상 명시).

동작 프로세스

(A) 사진→웹사이트 자동제작

1) 호스트가 객실 사진 6~10장 + 한국어 한 줄(또는 OTA URL) 업로드 → photo_intakes 생성(uploaded).

2) microsite-worker: EXIF·색감 추출 → AI가 대표/객실/주변 자동 분류 → 색감 기반 15스킨 매칭 점수 산출 → 상위 추천.

3) 매칭 스킨에 브랜드 토큰 자동조정 + 소개문·객실설명·하이라이트를 6개국어로 작문 → HTML 스냅샷 빌드 → microsites(draft).

4) 운영자 콘솔에서 라이브 프리뷰 확인 → 토큰/카피 미세조정·재생성 → 승인 게이트 체크 → POST /microsite/publish → 서브도메인 발급·R2 퍼블리시(published).

(B) 캐러셀 자동생성·발행

1) 운영자가 숙소 선택 → 표현법(104 중 1) + variation seed 지정 → POST /deck/generate → 7단계 골격에 숙소 카피 매핑(중복 방지 룰 적용) → content_decks.

2) [Render] → render-worker(Playwright)가 HTML 덱을 슬라이드별 1080×1350 @2x(2160×2700) PNG로 캡처 + manifest.json → slide_renders.

3) 캡션·해시태그·발행 타이밍 변주 엔진이 채널별 페이로드 생성 → publish_queue 적재(예약 슬롯).

4) publish-worker가 채널 어댑터로 발행: IG는 Graph API 캐러셀 컨테이너 생성→publish, 스레드/페북/X는 API, 네이버/티스토리는 cic-bridge로 임시저장(발행 버튼만 사람). 실패는 격리·재시도.

(C) 이미지 파이프라인(보조)

1) /image/generate(프롬프트) → image-worker: Pollinations 생성(무료 1차, 실패 시 유료 폴백) → rembg 누끼 → LaMa 로고제거 → upscale → 브랜드 LUT 톤락 → media_assets(시드·로그 보존).

(D) 블로그 반자동

1) /blog/draft → brand-blog가 초안(제목·본문·키워드·내부링크·이미지) 생성 → blog_posts(draft).

2) 운영자 검수 → /blog/stage → cic-bridge가 네이버·티스토리 에디터에 입력·임시저장(staged) → 사람이 최종 발행.

(E) 성과 루프(상시)

1) scheduler cron이 캘린더 슬롯→큐 적재 + 발행임박 푸시알림.

2) metrics-collector가 IG Insights·네이버 데이터랩 폴링 → metrics 누적 → 대시보드 갱신 → '다음 콘텐츠 추천'(표현법·타이밍) 피드백 → (B)1로 회귀.

[클로징] 우리는 콘텐츠를 만들지 않습니다. 호스트가 사진만 던지면 알아서 굴러가는, 맡기면, 알아서 채워집니다.

비서 어시스턴트 + MOSO 전자서명 시스템 (Assistant & Legal e-Signature)

정다운 대표의 손안에서 도는 영업·운영 두뇌(모바일 플래너 + 능동 푸시알림 + 운영 파트너 현장 보드)와, 모두싸인 없이 MOSO가 직접 소유하는 변호사 검수·법적효력형 전자서명 엔진 — 사람의 기억과 도장을 코드로 대체한다.

₩6,000,000

이 모듈은 두 개의 독립 시스템을 하나의 공통 백엔드(Supabase + Cloudflare Worker/Pages Functions) 위에 얹는다.

[A] 비서 어시스턴트 — '정다운 대표 전용 운영 두뇌' MOSO 영업·운영을 총괄하는 정다운 대표가 휴대폰만 보면 "오늘 무엇을 해야 하는가"가 끝나도록 만드는 모바일 우선 PWA. 마스터 콘솔(모듈 ③)의 11단계 영업 퍼널·전체 숙소·정산 데이터를 읽어 (1) 아침 브리핑(오늘 미팅·마감 임박 계약·신규 리드·이상 알림 요약), (2) 통합 플래너(일정 캘린더 + 할 일 + 매물/계약 파이프라인 카드를 한 화면에서 드래그로 관리), (3) 능동 영업 푸시알림(리드가 특정 단계에 머무르면, 계약 만료 D-3, 신규 호스트 가입, 정산 이상, 청소 지연 등 22종 이벤트를 실시간 웹푸시로 손목에 꽂음), (4) 음성/텍스트 빠른 기록(이동 중 메모→자동으로 해당 리드 카드에 첨부). 여기에 '정다운 대표 전체 업무 플래너'를 별도 역할 뷰로 붙인다 — 현장 운영 업무을 보드(예정·진행·검수·완료)로 관리하고, 작업자가 휴대폰으로 현장 사진을 올리면 정다운 대표·호스트가 실시간으로 보고, 일정이 자동으로 대표 캘린더에 합쳐진다.

[B] MOSO 전자서명 시스템 — '자체 소유 법적 서명 인프라' 무해/MOSO는 호스트와 '위탁운영 계약'을, 운영 파트너와 '공사 계약'을, 게스트/입주자와 각종 동의서를 끊임없이 체결한다. 모두싸인·도큐사인 같은 외부 SaaS에 월 비용·종속·데이터 주권을 내주지 않고, 어피어즈가 이미 자체 개발해 운영 중인 서명 엔진(캔버스 손서명+도장 업로드+KV 저장+감사 메타: 이미 리비더스·홍콩발레 계약에 실사용·e2e 검증 완료)을 'MOSO 프로덕트 등급'으로 승격한다. 핵심 확장: (1) 다자·순차 서명(갑=MOSO, 을=호스트, 병=연대보증/배우자까지 N명이 순서대로 서명, 모두 끝나야 문서 완결), (2) 법적 효력 레이어(전자문서 및 전자거래 기본법 근거 동의문구·문서 해시 봉인(SHA-256)·타임스탬프·서명자 신원확인(휴대폰 본인인증/사업자 진위확인)·감사추적 로그), (3) 변호사 검토·승인 워크플로우(법무가 템플릿을 검수→승인된 버전만 발송 가능, 버전·개정 이력 관리), (4) 템플릿 라이브러리(위탁운영계약·KYC동의·통신판매중개 면책고지·위탁계약 등 MOSO 표준 계약서를 변수치환형으로 보관), (5) 서명 관리 콘솔(누가 어디까지 서명했나·리마인드 자동발송·만료·재발송·완결 PDF 다운로드·검색). 발송은 카카오 알림톡 1순위 + 이메일/SMS 폴백.

두 시스템은 한 점에서 만난다: 비서 어시스턴트의 영업 퍼널에서 리드가 '계약' 단계로 가면 → 전자서명 시스템이 해당 호스트 정보로 위탁계약 템플릿을 자동 채워 서명 링크를 발급하고 → 알림톡으로 발송 → 서명 완결되면 → 푸시알림이 정다운 대표에게 "○○ 호스트 계약 체결 완료"를 꽂고 리드 카드가 '운영 시작' 단계로 자동 전진한다. 즉 영업→계약→온보딩이 사람 손을 거의 안 거치고 흐른다.

품목 · 세부단가수량합계
비서 어시스턴트 모바일 PWA(정다운 대표 통합 플래너)아침 브리핑 + 일정 캘린더 + 할 일 + 매물/계약 파이프라인 카드를 한 화면에서 드래그 관리. 마스터 콘솔 11단계 영업퍼널·정산 데이터 연동, 오프라인 캐시(IndexedDB), 홈화면 설치, 음성/텍스트 빠른 기록→리드 카드 자동 첨부₩1,150,0001 LOT₩1,150,000
영업 푸시알림 엔진(이벤트 트리거 22종)VAPID+AES-128-GCM 웹푸시(RFC 8030/8291). 리드 단계 정체·계약 D-3 만료·신규 호스트·정산 이상·청소 지연 등 22종 룰 트리거, 세그먼트·우선순위·조용시간(야간 묶음), 알림 클릭→해당 리드/문서 딥링크, 발송·도달·열람 로그₩780,0001 LOT₩780,000
프로젝트·현장 일정 보드현장 작업 칸반 보드(예정·진행·검수·완료) + 작업자 휴대폰 현장 사진 업로드(리사이즈 1280px·EXIF 위치) + 체크리스트 + 일정이 정다운 대표·호스트 캘린더에 자동 병합, 역할별 권한 뷰(작업자/대표/호스트)₩620,0001 LOT₩620,000
전자서명 엔진 코어(다자·순차 서명)기존 캔버스 손서명(그린 영역 crop·투명배경)+도장 업로드 엔진을 N인 순차 서명으로 확장. 갑·을·병(연대보증) 순서 강제, 서명자별 필드 매핑(사업자번호·주소·대표자), 문서 상태머신(초안→발송→일부서명→완결→만료/철회)₩880,0001 LOT₩880,000
법적 효력·감사추적 레이어전자문서 및 전자거래 기본법 근거 동의 문구, 문서 SHA-256 해시 봉인(서명 후 변조 탐지), 서버 타임스탬프, 서명자 IP·기기·UA 캡처, 휴대폰 본인인증/사업자 진위확인 훅, 전체 감사로그 + CSV/PDF 증적 내보내기(분쟁 대비)₩560,0001 LOT₩560,000
변호사 검토·승인 워크플로우 + 표준 템플릿 라이브러리법무 검수 라운드(검토중→수정요청→승인), 승인된 버전만 발송 가능 락, 개정 이력·버전 관리. 위탁운영계약·KYC동의·통신판매중개 면책고지·위탁계약 등 MOSO 표준 계약서를 변수치환({{호스트명}}·{{수수료율}}) 템플릿으로 보관₩540,0001 LOT₩540,000
서명 관리 콘솔(문서함·진행·리마인드)전체 문서 목록·서명 진행률 게이지·미서명자 자동 리마인드(D+2·D+5) + 만료/재발송·완결 PDF 다운로드·서명자별 상세 모달(이미지·메타)·검색·권한(대표/법무 분리). 마스터 콘솔에 탭으로 임베드₩470,0001 LOT₩470,000
Supabase 백엔드(스키마·RLS·Realtime·Edge Function)assistant·signature 공통 데이터 레이어. 9개 핵심 테이블 + Row Level Security(대표/법무/작업자/서명자 역할 격리), Realtime 구독(보드·서명 상태 실시간 반영), Edge Function(해시 봉인·발송 오케스트레이션·만료 cron)₩430,0001 LOT₩430,000
QA·6개국어 서명 UI·접근성·기기 테스트·배포서명 UI 6개국어(한·영·일·중·프·스) i18n, iOS Safari/안드로이드 크롬 터치 서명 실기기 테스트, 접근성(스크린리더·대비), 스테이징→프로덕션 배포 파이프라인, 운영 핸드오프 문서₩290,0001 LOT₩290,000
발송 채널 통합(알림톡·이메일·SMS 폴백)서명 요청·리마인드·완결 통지를 카카오 알림톡 1순위 발송, 미수신 시 이메일/SMS 자동 폴백. 발송 상태 로그, 템플릿 사전심사 대응, 재시도 큐₩280,0001 LOT₩280,000
소계₩6,000,000

백엔드 구조

Supabase(Postgres + Auth + Realtime + RLS) 위에, 발송·해시·cron 등 서버 측 보안 로직은 Cloudflare Pages Functions / Worker로 처리(기존 SION_KV·VAPID 인프라 재사용).

■ DB 테이블 (Supabase Postgres, 모두 RLS 적용)

1. assistant_tasks — 정다운 대표 할 일/일정. (id, owner_id, title, type[task|meeting|followup], due_at, status[todo|doing|done], linked_lead_id, linked_doc_id, notes, voice_memo_url, created_at)

2. assistant_briefings — 매일 06:30 생성되는 아침 브리핑 스냅샷. (id, date, meetings_json, hot_leads_json, expiring_contracts_json, anomalies_json, generated_at)

3. push_subscriptions — 웹푸시 구독. (id, user_id, endpoint, p256dh, auth, device_label, quiet_hours_json, created_at) ※기존 SION_KV subidx 패턴을 테이블화

4. push_events — 발송 이력·룰 로그. (id, rule_code, user_id, title, body, deeplink_url, status[sent|delivered|read|failed], trigger_payload_json, sent_at)

5. notify_rules — 22종 트리거 룰 정의·on/off. (id, code, label, condition_json, channel[push|alimtalk|email], priority, enabled)

6. build_projects — 현장 프로젝트. (id, listing_id, partner_company, title, status[planned|doing|review|done], start_at, end_at, manager_id)

7. build_tasks — 현장 작업 카드. (id, build_project_id, title, column[planned|doing|review|done], assignee_id, checklist_json, position, due_at)

8. build_photos — 현장 사진. (id, build_task_id, storage_path, exif_geo, uploaded_by, caption, created_at)

9. doc_templates — 전자서명 표준 템플릿. (id, name, category[consignment|kyc|disclaimer|construction], body_html, variables_json, version, status[draft|review|approved], approved_by_lawyer_id, updated_at)

10. documents — 발송된 서명 문서 인스턴스. (id, template_id, title, party_data_json, status[draft|sent|partial|completed|expired|voided], content_hash(sha256), expires_at, completed_pdf_path, created_by, created_at)

11. signers — 문서별 서명자(다자/순차). (id, document_id, role[gap|eul|byeong|witness], name, biz_no, addr, ceo, order_index, status[pending|signed|declined], sign_token, verified_via[phone|biz_check|none], created_at)

12. signatures — 실제 서명 데이터. (id, signer_id, sign_img(dataURL/storage), stamp_img, agreed_at, ip, ua, geo, hash_at_sign, created_at)

13. audit_logs — 불변 감사추적. (id, entity_type, entity_id, action, actor, ip, ua, meta_json, created_at) ※append-only, 수정/삭제 트리거 차단

■ API 엔드포인트 (Pages Functions /api/* — 기존 /api/sign·/api/push-send 확장)

· 비서: GET /api/assistant/briefing(오늘 브리핑), GET/POST/PATCH /api/assistant/tasks, POST /api/assistant/voice(음성→텍스트→태스크), GET /api/assistant/pipeline(영업 퍼널 카드)

· 푸시: POST /api/push-subscribe(기존), POST /api/push-send(기존 VAPID 엔진 재사용), POST /api/notify/dispatch(룰 평가 후 발송), GET/PATCH /api/notify/rules

· 현장: GET/POST/PATCH /api/build/projects, /api/build/tasks(보드 이동), POST /api/build/photos(업로드·리사이즈)

· 서명: POST /api/sign(기존 단일서명 — 하위호환 유지), POST /api/docs/create(템플릿+당사자→문서 생성·해시·토큰 발급), GET /api/docs/:id(서명자 토큰별 뷰), POST /api/docs/:id/sign(서명 제출·다음 서명자 활성화), POST /api/docs/:id/remind, POST /api/docs/:id/void, GET /api/docs/:id/pdf(완결본), GET /api/docs(콘솔 목록·검색)

· 템플릿/법무: GET/POST /api/templates, POST /api/templates/:id/review(법무 검토 전이), POST /api/templates/:id/approve

· 발송: POST /api/notify/alimtalk(알림톡), POST /api/notify/email, POST /api/notify/sms — 폴백 체인

■ 서버 서비스 (Worker / Edge Function / Cron)

· briefing-cron: 매일 06:30 KST — 퍼널·계약·정산을 집계해 assistant_briefings 생성 + 대표에게 요약 푸시

· rule-engine: notify_rules 조건을 5분 간격 평가(리드 단계 정체·계약 D-3 등) → push_events 발행 → /api/push-send

· hash-sealer: 서명 완결 시 문서 콘텐츠를 SHA-256 봉인, 이후 모든 조회에서 무결성 검증

· reminder-cron: 미서명 문서 D+2/D+5 자동 리마인드, expires_at 도달 시 status=expired

· dispatch-service: 알림톡→이메일→SMS 폴백 오케스트레이션, 실패 재시도 큐

프론트엔드 구조

모바일 우선 PWA(정다운 대표·현장 작업자용) + 마스터 콘솔 임베드 탭(서명 관리·법무).

■ 페이지

1. /assistant (홈 — 아침 브리핑 대시보드): 오늘 날짜·인사, 4개 요약 카드(오늘 미팅 N·핫 리드 N·만료 임박 계약 N·이상 알림 N), 아래로 '다음 할 일' 타임라인.

2. /assistant/planner (통합 플래너): 상단 주간 캘린더 스트립 + 본문은 탭 전환(일정 | 할 일 | 파이프라인). 파이프라인 탭은 11단계 영업퍼널을 가로 스크롤 칸반으로.

3. /assistant/lead/:id (리드 상세): 호스트 정보·타임라인·메모·"위탁계약 발송" 버튼(→전자서명 시스템 연결).

4. /assistant/quick (빠른 기록): 큰 마이크 버튼(음성)·텍스트 입력, 저장 시 리드 자동 매칭.

5. /build (현장 보드): 프로젝트 선택 → 4열 칸반(예정·진행·검수·완료), 카드 드래그 이동, 카드 탭→사진·체크리스트.

6. /build/task/:id (현장 작업 상세): 사진 그리드(+카메라 업로드 버튼)·체크리스트·담당·기한.

7. /sign/:token (서명자 화면, 공개): 외부 호스트/파트너가 받는 모바일 서명 페이지(로그인 불필요, 토큰 인증).

8. 콘솔 탭 /admin#documents (서명 관리): 문서 테이블·진행률·필터.

9. 콘솔 탭 /admin#templates (법무 템플릿): 템플릿 목록·에디터·검토/승인.

■ 컴포넌트

· BriefingCard(요약 타일, 숫자+추세), TimelineList(시간순 할 일), CalendarStrip(주간 가로), KanbanBoard(드래그&드롭, 비서 파이프라인·현장 보드 공용), LeadCard / BuildCard, QuickCaptureSheet(음성 녹음 비주얼라이저), PhotoUploader(리사이즈·미리보기), ChecklistEditor.

· SignaturePad(기존 캔버스 엔진 — DPR 스케일·crop·도장 업로드 재사용), SignerFieldForm(사업자번호/주소/대표자 입력·인라인 검증), SignProgressBar(갑→을→병 순차 표시), DocViewer(읽기전용 계약 본문·해시 배지), ConsentBanner(전자문서법 동의), CompletionSheet(완결 후 PDF저장·공유 — 기존 done() 흐름).

· DocTable(상태 색칩·진행률), RemindButton, TemplateEditor(변수 하이라이트 {{호스트명}}), ReviewFlow(법무 검토 전이 버튼), AuditLogViewer.

· PushPermissionPrompt(알림 권한 요청·구독 등록), RuleToggleList(22종 룰 on/off·우선순위).

■ UX 원칙: 정다운 대표 화면은 '엄지 한 손'으로 출퇴근 지하철에서 끝나야 함 — 큰 타깃·하단 고정 액션바·스와이프 단계 이동. 서명 화면은 외부인이 설명 없이 1분 내 완료(기존 '여기에 서명해 주세요' 태그·하단 고정 제출바 패턴 유지).

와이어프레임 설계

SVG로 그릴 수 있게 6개 화면을 정밀 기술. 기본 캔버스는 모바일 375×812(서명/플래너/보드), 콘솔 화면은 1280×800. [W1] 비서 아침 브리핑 홈 (375×812) · 상단 상태바(높이 44) 아래 헤더(높이 72): 좌측 "6월 19일 목요일 · 좋은 아침이에요, 다운 대표님" 2줄, 우측 종 아이콘(빨간 점 배지 3). · 헤더 밑 2×2 요약 카드 그리드(각 162×96, 16 거터): ①오늘 미팅 "3건" + 작은 시계, ②핫 리드 "5" + 상승 화살표 빨강, ③만료 임박 계약 "2" 주황 테두리, ④이상 알림 "1" 빨강. 각 카드 우상단 미니 스파크라인. · 그 아래 섹션 제목 "다음 할 일" + 우측 "전체 보기". · 타임라인 리스트(세로): 좌측 시간(09:30)·세로 점선·우측 카드(제목 "강남 호스트 박○○ 미팅"·부제 "위탁계약 설명"·우측 작은 칩 '미팅'). 카드 3~4개 쌓임, 카드별 좌측 색 바(미팅=파랑/할일=회색/팔로업=주황). · 하단 고정 탭바(높이 64, 5칸): 홈(채워짐)·플래너·기록(가운데 큰 + 원형 버튼, 떠 있음)·현장·설정. [W2] 통합 플래너 — 파이프라인 칸반 (375×812) · 헤더(56): "플래너" 타이틀 + 우측 필터 아이콘. · 그 아래 세그먼트 토글(높이 40, 3칸): [일정] [할 일] [파이프라인(선택, 검정 알약)]. · 그 아래 주간 캘린더 스트립(높이 56): 월~일 7개 원형 날짜, 오늘(19) 채워진 원, 점=일정 있는 날. · 본문: 가로 스크롤 칸반. 보이는 컬럼 1.3개(다음 컬럼 살짝 보임). 컬럼 헤더 "신규 리드 (5)" + 점 색. 컬럼 안 카드(폭 300): 호스트명 굵게·매물 타입 "독채 펜션 · 가평"·하단 라인(체류 일수 "3일째" 회색 + 우측 아바타). 카드 2~3개. 한 카드는 드래그 중처럼 살짝 기울이고 그림자. · 하단 동일 탭바(플래너 활성). [W3] 현장 운영 작업 상세 (375×812) · 헤더(56): 뒤로 화살표 + "○○하우스 셋업" + 우측 점3 메뉴. · 상단 메타 줄: 상태 칩 '진행중'(파랑)·담당 아바타+이름·기한 "D-2". · 섹션 "현장 사진" + 우측 "12장": 사진 3열 그리드(정사각 썸네일 6개 + 마지막 칸은 점선 테두리 카메라 아이콘 '추가'). 한 썸네일에 위치핀 작은 배지. · 섹션 "체크리스트": 체크박스 리스트 5줄(체크된 3개 취소선·회색, 미체크 2개), 하단 진행바 "3/5". · 하단 고정 바: 좌 "사진 추가" 보조버튼 + 우 "검수 요청" 강조버튼(파랑 꽉찬). [W4] 외부 서명자 화면 (375×812) — 기존 ?sign 모드의 프로덕트판 · 최상단 안내 배너(연한 박스): "✍ 전자서명 · MOSO" 굵게 + "아래 계약서를 확인하신 뒤 발주자 칸에 서명해 주세요" 작게. · 진행 표시(순차): ●갑 MOSO(완료 체크) — ━ — ◉을 호스트(현재, 강조) — ○병 보증인(대기). 3노드 가로. · 계약 본문 카드(읽기전용, 연회색): 상단 우측 작은 자물쇠+해시 배지 "문서 잠금 · #a1b2…". 본문 몇 줄 + "…전문 보기" 접힘. · '발주자(을) 정보' 박스: 입력 필드 3개(사업자등록번호 [000-00-00000]·사업장 주소·대표자 성명), 각 우측 인증 체크 아이콘. · '여기에 서명해 주세요' 태그 + 서명 슬롯(큰 점선 박스 "여기를 눌러 서명 또는 도장 추가") + 그 아래 버튼 2개([✍ 손으로 서명][🖋 도장 업로드]). · 동의 체크: "□ 전자문서 및 전자거래 기본법에 따라 본 전자서명이 서면 서명과 동일한 효력을 가짐에 동의합니다." · 하단 고정 바(파랑): "서명 완료하고 제출". [W5] 서명 관리 콘솔 탭 (1280×800, 마스터 콘솔 내부) · 좌측 기존 콘솔 사이드바(좁게 표현) + 본문. · 본문 상단 바: 제목 "전자서명 · 문서함" + 우측 검색창 + [+ 새 계약 발송] 버튼. · 상태 필터 칩 줄: 전체 / 발송됨 / 일부서명 / 완결 / 만료. · 문서 테이블(열): 문서명 · 상대(호스트) · 카테고리 칩 · 진행률(미니 게이지 "을 서명 대기 2/3") · 발송일 · 만료 D-day · 액션(리마인드·PDF·…). 행 6~8개, 상태별 좌측 색 바. · 우측에 슬라이드오버 상세(한 행 클릭 시): 서명자 3명 카드(이름·역할·서명 이미지 썸네일·시각·IP)·감사로그 타임라인·완결 PDF 다운로드. [W6] 법무 템플릿 검토 (1280×800) · 2분할: 좌측 템플릿 목록(위탁운영계약 v3 '승인'·KYC동의 v2 '검토중'·위탁계약 v1 '초안'), 우측 에디터. · 우측 에디터: 상단 상태 배지 + [수정요청][승인] 버튼 + 버전 드롭다운(v3·v2…). 본문에 변수 하이라이트({{호스트명}}·{{수수료율}}·{{개시일}} 노란 칩). 우측 사이드에 '변수 목록'·'개정 이력' 패널. · 하단 작은 주의 띠: "승인된 버전만 발송 가능합니다."

서버 · 보안

내부 사용자(정다운 대표·법무·현장 매니저·작업자)는 Supabase Auth(이메일 매직링크 또는 OTP). 외부 서명자는 로그인 없이 일회용 서명 토큰(sign_token, 문서별·서명자별 고유, 만료 내장)으로만 /sign/:token 접근 — 토큰은 추측 불가 난수(crypto.randomUUID 기반 + 서명자 바인딩).

[권한·RLS] 모든 Supabase 테이블에 Row Level Security. 역할 4종:

· owner(정다운 대표): assistant_*·build_*·documents 전체 R/W, audit 읽기.

· lawyer(법무): doc_templates 검토/승인·documents 읽기·audit 읽기, 비서 개인 데이터(tasks)는 차단.

· field(현장 작업자): 본인 배정 build_tasks·build_photos만 R/W, 영업·서명 데이터 전면 차단.

· signer(외부): 자기 토큰의 단일 문서 뷰 + 자기 서명 제출만. 다른 서명자 PII·다른 문서 접근 불가.

RLS는 DB 레벨에서 강제되므로 클라이언트 우회 불가. push_subscriptions·signatures의 개인 식별 정보는 owner/lawyer 외 노출 금지.

[법적 효력 — 핵심] 전자문서 및 전자거래 기본법 제4조(전자문서의 효력)·전자서명법에 근거:

· 동의 문구를 서명 직전 체크박스로 명시 수집(기록 보존).

· 서명 완결 시 문서 콘텐츠 전체를 SHA-256으로 해시 봉인(content_hash) → 이후 1바이트라도 바뀌면 무결성 검증 실패로 즉시 탐지(위·변조 방지).

· 각 서명에 서버 타임스탬프·서명자 IP·기기·User-Agent·(가능 시)위치를 캡처해 signatures/audit_logs에 기록 → "언제·누가·어떤 기기로 서명했는가" 증명.

· 신원확인 강화 훅: 휴대폰 본인인증(PASS/통신사) 또는 사업자등록번호 진위확인(국세청 API) 연동 지점 마련(verified_via 기록). 1차 릴리스는 입력+동의+감사메타, 본인인증 게이트는 키 연결 시 활성.

· audit_logs는 append-only(수정·삭제 트리거 차단) — 분쟁 시 법적 증적으로 CSV/PDF 내보내기.

[전송·저장 보안] 전 구간 HTTPS/TLS. 서명 이미지·현장 사진은 Supabase Storage(서명형 URL, 만료) 또는 KV에 저장하되 직접 URL 추측 불가. 서명 dataURL 크기 상한(3MB)·이미지 5MB 상한(기존 검증 로직 유지). 발송 API(/api/push-send·/api/notify/*)는 PUSH_SECRET류 서버 시크릿으로 보호(외부 무단 발송 차단). VAPID 개인키·알림톡 키·국세청 키 등은 전부 환경변수(코드 미저장, 기존 패턴).

[법적 고지·면책] 모든 위탁계약 템플릿에 '통신판매중개자 책임 제한' 면책 고지를 표준 삽입(MOSO는 거래당사자가 아니라 중개·운영대행임을 명시) — 공통 기반의 법적고지 정책과 일치.

[데이터 주권] documents·signatures·audit_logs 전체가 클라이언트(무해) 소유 Supabase/계정에 적재 → 모듈 종료 시 소스코드와 함께 100% 이전(외부 서명 SaaS 종속 0).

동작 프로세스

06:30 briefing-cron이 영업퍼널·계약 만료·정산 이상을 집계해 assistant_briefings 생성 → 대표 폰에 "오늘 미팅 3건·만료 임박 계약 2건" 푸시 → 탭하면 /assistant 홈이 열려 요약 카드·타임라인 표시 → 대표가 핫 리드 카드를 눌러 메모를 음성으로 남기면 /api/assistant/voice가 텍스트화해 해당 리드에 첨부.

[흐름 2 — 능동 영업 알림] rule-engine이 5분마다 notify_rules 평가 → '리드가 제안 단계에서 3일 정체' 조건 충족 → push_events 발행 → /api/push-send(VAPID)로 "박○○ 호스트 3일째 무응답 — 팔로업?" 발송(조용시간이면 다음 아침에 묶음) → 대표가 알림 클릭 → 리드 상세 딥링크 → "위탁계약 발송" 버튼.

[흐름 3 — 영업→계약 자동 연결] 대표가 리드 상세에서 '위탁계약 발송' → /api/docs/create가 승인된 위탁운영계약 템플릿에 호스트 데이터({{호스트명}}·{{수수료율}}) 치환·문서 생성·서명 토큰 발급·초기 해시 기록 → dispatch-service가 카카오 알림톡으로 서명 링크 발송(미수신 시 이메일/SMS 폴백) → 리드 카드 자동으로 '계약 발송' 단계로 전진.

[흐름 4 — 다자·순차 서명] 호스트가 /sign/:token 열기 → 계약 본문(읽기전용·해시 잠금 배지) 확인 → 사업자번호·주소·대표자 입력(진위확인 훅) → 손서명 또는 도장 업로드 → 전자문서법 동의 체크 → 제출(/api/docs/:id/sign) → signatures 저장·IP/기기/시각 기록·audit_logs 적재 → 상태 partial → 다음 서명자(보증인 '병')에게 자동으로 다음 토큰 발송 → 마지막 서명자까지 끝나면 status=completed → hash-sealer가 최종 콘텐츠 SHA-256 봉인 → 완결 PDF 생성.

[흐름 5 — 완결 후 폐루프] 완결 시 푸시가 대표에게 "○○ 호스트 위탁계약 체결 완료" 꽂음 + 리드 카드가 '운영 시작' 단계로 자동 전진 + 호스트 온보딩(모듈 ④) 트리거 → 영업·계약·온보딩이 한 줄로 흐름.

[흐름 6 — 미서명 리마인드·만료] reminder-cron이 D+2·D+5에 미서명자에게 알림톡 자동 리마인드 → expires_at 도달 시 status=expired·대표에게 통지 → 대표가 콘솔 문서함에서 '재발송' 또는 '철회(void)'.

[흐름 7 — 법무 검토] 법무가 콘솔에서 새 템플릿 작성 → review 전이(검토중) → 수정요청/승인 → 승인된 버전만 발송 가능 락 → 이후 모든 발송은 승인본 기준, 개정 시 버전 증가·이력 보존.

[흐름 8 — 현장 운영] 현장 매니저가 /build에서 프로젝트·작업 카드 생성 → 작업자가 현장에서 /build/task/:id로 사진 업로드(자동 리사이즈·위치 기록)·체크리스트 체크 → 보드 상태 Realtime으로 대표·호스트 화면에 즉시 반영 → '검수 요청'→'완료' 전이 시 일정이 대표 캘린더에 병합·완료 푸시.

https://appears.kr/contractMOSO · 모듈
APPEARS · MOSO와이어프레임 · 구축 화면 (1/3)

와이어프레임 — 구축 화면 설계

아래는 어피어즈가 직접 디자인·구현하는 핵심 화면(모바일/PWA)입니다 — 본 견적 범위에 포함된 산출물.
④ 호스트 SaaS · 호스트 앱 + CCTV정산·예약·점유 + CCTV 현장 + 다국어 메신저
MOSO운영중이번 달 정산 예정₩3,676,500커미션 차감 후예약율76%청소2건채널별 점유1대시보드정산·예약·점유 한눈에예약 현황7/12–14에어비앤비확정7/15야놀자확정7/18–20여기어때확정7/22네이버확정2예약 현황전 OTA 통합 캘린더정산 내역채널 매출+₩4,169,000수수료−₩625,350청소비−₩98,000MOSO 3%−₩125,070실수령₩3,320,5803정산 내역매출−수수료−청소=실수령CCTV · 현장LIVE현관거실복도루프탑청소·체크인 현장 실시간4CCTV · 현장청소·체크인 현장 실시간 확인메시지체크인 몇시예요?KO오후 3시입니다 :)MOパスワードは?JA온이 6개국어 자동응대5메신저운영자↔호스트·게스트 다국어
⑤ 청소관리자 · 쏘카형 무로그인 PWA카톡 링크 입장 → AI 사진검수 → 1시간 자동정산
MOSO 청소청소 파트너오늘 배정된 청소를 카톡 링크 하나로. 로그인 없이 시작.오늘 3곳 · 예상 4시간오늘 청소 시작1링크 입장무로그인 — 카톡 링크 1회오늘 청소 · 3곳성수 루프탑13:00 · #4471진행연남 다락방15:00 · #4472홍대 원룸17:00 · #44732출근지 안내동선·도어락 자동 배정성수 루프탑도어락 #4471원룸 14평 · 루프탑청소 체크리스트침구 화이트 3세트수건 6장 비치루프탑 화분 물분리수거 좌측온이에게 전화 문의3공간·청소 설명+ 온이 전화 문의(청소 모드)청소 사진8/8AI 검수중…욕실·침구 누락 자동확인4사진·AI 검수8컷→AI 누락·품질 검수검수 · 정산검수 상태AI 통과검수자 1인 최종 확인검수 완료 시₩42,0001시간 뒤 자동정산콘솔·호스트 양쪽 보딩5검수→정산AI+사람 더블체크→1h 자동입금
https://appears.kr/contractMOSO · 와이어 1
APPEARS · MOSO와이어프레임 · 구축 화면 (2/3)
⑥ 온이 AI · 통화·다국어·통합 인박스게스트 전화 음성 자동응대 + 전 OTA 메시지 통합 + 6개국어 딥러닝
수신 통화Kenji T.日本語 자동 감지온이온이가 자동 응대 중…1수신 통화게스트 전화→온이 음성 자동응대(언어 감지)다국어 응대What time is check-in?ENCheck-in is 3 PM :)MO可以带宠物吗?ZH애매하면 호스트로 에스컬레이션2다국어 응대6개국어 자동·애매하면 호스트통합 인박스에어비앤비Kenji · JA자동응대야놀자김** · KO자동응대부킹Anna · EN자동응대여기어때이** · KO자동응대3통합 인박스전 OTA 메시지 한 곳에자동응대 설정체크인·주차·와이파이반려동물 문의가격·할인 문의컴플레인→호스트호스트마다 페르소나·말투 커스텀4자동응대 설정호스트별 페르소나·범위 토글딥러닝 · 6개국어한국어 94%English 90%日本語 89%中文 86%Français 83%Español 81%5딥러닝대화 쌓일수록 자동응대율↑
④ 모텔호스트 트랙 · 객실관리·무인 키오스크객실 단위 현황 + 무인 체크인·키오스크 + 층별 CCTV (별도 트랙)
객실 현황 · 12실101공실102투숙103청소104공실105투숙106청소107공실108투숙109청소1객실 현황12실 공실·투숙·청소 실시간무인 체크인 설정체크인 가능 시간15:00도어락솔리티 연동예약번호로 비번 자동 발급키오스크 적용2무인 체크인 설정도어락·예약번호 자동 발급키오스크 실시간LIVE205호체크인 완료308호진행중112호결제 대기401호체크아웃3키오스크 실시간체크인·결제 현황 모니터객실 매출·정산이번 달 매출₩28,400,000객실 평균 가동률 72%무인 운영 비용 절감 ↓4객실 매출·정산가동률·무인 운영 절감CCTV · 층별LIVE로비2층3층주차5CCTV · 층별로비·층별·주차 실시간
https://appears.kr/contractMOSO · 와이어 2
APPEARS · MOSO와이어프레임 · 구축 화면 (3/3)
⑧ 하드웨어 연동 · CCTV·도어락·키오스크도어락 비번 변경→온이 자동발송 + 무인 키오스크 체크인·결제
CCTV 통합12 LIVE성수연남홍대제주강원여수1CCTV 통합 대시보드전 숙소 카메라 한 화면(콘솔·호스트)솔리티 도어락성수 루프탑 #4471현재 비번 · 1234**변경새 비밀번호비번 변경·발급변경 즉시 온이가 게스트에 발송2솔리티 도어락호스트가 비번 직접 변경온이 자동발송체크인 도어락 비번은 5582입니다. 현관에서 입력해주세요 :)MO✓ 발송 완료게스트 언어 자동(EN/JA/ZH)3온이 자동발송변경 비번 게스트에 자동(다국어)무인 체크인예약번호를입력해주세요예약번호MOSO-7K2P확인키오스크 UI · 호텔/모텔4무인 키오스크 체크인예약번호 입력→도어락 발급결제1박 · 성수 루프탑₩189,000카드 결제간편결제 (카카오·네이버)결제 서버 API 연동5키오스크 결제카드·간편결제 서버 연동
⑨ 마케팅 자동화 · SNS·이미지·블로그·15스킨카드뉴스·AI 이미지·블로그 반자동 + 사진→업체 웹사이트 자동제작
카드뉴스 자동생성HOOK본문임팩트CTA캐러셀 6장 생성1카드뉴스 자동생성HOOK·본문·임팩트·CTA 캐러셀 6AI 이미지 생성🖼 생성된 비주얼프롬프트제주 오션뷰 감성 숙소…생성2AI 이미지 생성프롬프트→비주얼 자동블로그·티스토리제주 한 달 살기 추천 숙소 5곳제주에서 한 달 살기 — 위치·가성비 핵심 정리…초안 완료발행 검토SEO 자동·반자동 발행3블로그·티스토리SEO 초안 반자동 발행웹사이트 스킨 15종4웹사이트 스킨 15종업종별 스킨 갤러리사진→웹 자동제작사진 12장 업로드완료↓ 자동 생성업체숙소 웹사이트 완성5사진→웹 자동제작사진 업로드→사이트 완성
https://appears.kr/contractMOSO · 와이어 3
APPEARS · MOSO금액 종합 · 결제

개발비 종합

10개 모듈 바텀업 합산 (공급가 기준 · VAT 별도)
① MOSO 브랜딩 · BI 시스템₩6,000,000
② 전환형 퍼널 + 정식 웹사이트 (Conversion Funnel + Official Website)₩12,000,000
③ 마스터콘솔 CRM · 11단계 영업 퍼널 엔진 · 모바일 영업본부 · 10차 메일 자동화₩15,000,000
④ 호스트 SaaS — 가입·세팅 자동화·커미션·정산 대시보드·운영자 메신저₩14,000,000
⑤ 청소관리자 앱 — 쏘카형 무로그인 PWA · 사진검수 · 1시간 지연 자동정산₩7,000,000
⑥ 온이 AI — 다국어 음성통화 · 전(全)플랫폼 메시지 자동응대 · 호스트별 자동응대 설정₩11,000,000
⑦ 다이내믹 프라이싱 엔진 (decideV2 + 온다/Beds24 ARI 송출 · 전 플랫폼 자율 수율관리)₩8,440,000
⑧ 하드웨어 연동 — 통합 IoT 컨트롤 레이어 (CCTV · 솔리티 도어락 · 무인 키오스크)₩12,000,000
⑨ 마케팅 자동화 엔진 + 업체숙소 웹사이트 스킨 15 (Content & Microsite Automation)₩8,920,000
⑩ 비서 어시스턴트 + MOSO 전자서명 시스템 (Assistant & Legal e-Signature)₩6,000,000
소계 (공급가액)₩100,360,000
부가세 (10%)₩10,036,000
₩110,396,000 (KRW · 개발비)
바텀업 시장가 기준 산정. 최종 계약 시 라운드다운·조정 가능. 본 개발비는 1회성 구축비이며, 아래 상시 운영 리테이너는 별도.

상시 운영 · 교육 · 동행 (별도 리테이너)

구축 후 상시 운영 — 개발비와 별도 청구
월 운영·유지보수 리테이너PM·자동화 운영·서버·모니터링·장애대응·소규모 개선. 마스터콘솔/엔진/온이/송출 상시 가동 관리₩3,000,000 /월
6개월 가이드라인 교육AI·마스터콘솔·각 시스템 운영 교육(무해 내부팀 대상), 매뉴얼·세션₩1,000,000 /6개월
정례 회의 (월 2회)진행·지표 리뷰·우선순위 조정. 리테이너 포함월2 · 리테이너 포함
핵심 PMS·미팅 동행온다/Beds24 연동·주요 호스트 온보딩 등 핵심 미팅 5회 동행5회 · 리테이너 포함
월 운영 리테이너 ₩3,000,000/월 + 6개월 교육 ₩6,000,000(분할). 정례회의·미팅 동행은 리테이너에 포함. 운영 범위·SLA는 계약 시 확정.
https://appears.kr/contractMOSO · 금액
APPEARS · MOSO진행 단계 · 결제 · 범위

진행 단계 (4 페이즈)

총 개발 기간 약 22~26주(약 5.5~6.5개월). 페이즈는 직렬 마일스톤이되 BI(M1)·웹(M2)은 P1과 병행 착수한다.

■ Phase 1 — 두뇌 코어 (약 8~10주): 마스터 콘솔(M3) · 호스트 SaaS(M4) · 온이 AI(M6) · 다이내믹 프라이싱 엔진(M7). + 병행: 브랜딩 BI(M1)·퍼널/웹사이트(M2). 산출: 호스트가 가입→대시보드→AI 응대→자동 가격까지 한 줄로 도는 작동 제품. 마일스톤=콘솔·엔진·온이 라이브 데모.

■ Phase 2 — 운영 폐루프 (약 5~6주): 청소관리자 앱(M5·쏘카형 PWA·사진검수) + 정산 자동화(전 채널 매출·수수료·청소비·정산금·정산일). 산출: 예약→청소 배차→검수→정산까지 자동화, 실거래 학습 데이터 축적 시작.

■ Phase 3 — 하드웨어 무인화 (약 4~5주): CCTV·솔리티 도어락·무인 키오스크 연동(M8). 산출: 무인 체크인·현장 운영, 호스트 물리 개입 최소화.

■ Phase 4 — 성장·완결 (약 4~5주): 마케팅 자동화 + 웹사이트 스킨 15종(M9) + 비서 어시스턴트 + 전자서명 시스템(M10). + 전구간 통합·QA·배포·핸드오프(M11)는 각 페이즈 종료마다 점진 인수인계, 마지막에 최종 검수·문서·교육으로 마감. 산출: 호스트 유입 퍼널 가동 + 계약·서명 자동화 + 운영 OS 인계 완료.

결제 일정

기준 = 개발비 총액 ₩110,396,000 (VAT 포함). 입금: 우리은행 1005-504-899758 (주)어피어즈.

■ 계약금 50% — ₩55,198,000 : 계약 체결 시. 착수·브랜딩 BI·콘솔/엔진/온이 코어 개발 개시(Phase 1 시작). ■ 중도금 30% — ₩33,118,800 : Phase 2 완료(청소·정산 자동화 검수) 시점. ■ 잔금 20% — ₩22,079,200 : 최종 산출물 인수·배포·핸드오프 완료 시점.

■ 월 운영 리테이너 — 정식 오픈(베타 종료) 월부터 매월 선결제, 별도 청구. 외부 사용 원가·PG 수수료는 실비 정산.

※ 세금계산서는 각 회차 입금 시 발행. 전자서명 계약 링크(?sign)로 즉시 서명·집행 가능.

포함 · 제외 범위

포함: 10개 모듈 설계·개발·배포·문서·교육 일체(브랜드 BI 원본 + 콘솔·호스트앱·청소앱·온이·프라이싱 엔진·하드웨어 연동·웹 스킨 15·전자서명·비서). 제외(별도): 외부 SaaS/API 사용 원가(온다·Beds24·LLM·Twilio·시장데이터·PG·인프라), 하드웨어 실물 구매, OTA·숙박업 자격·법무·세무, 범위 외 신규 기능, 오픈 후 유지보수(월 리테이너로 커버).

기술 자신감: 본 프로젝트에 어피어즈가 구현 불가한 프로그래밍은 없습니다. 맥미니(M4) 실서버에서 API 연동 · 다이내믹 프라이싱 · 자동화가 전부 가동되며, 외부 키 · 계약 · 하드웨어만 충족되면 즉시 라이브됩니다. 제외 항목은 어피어즈의 개발 범위가 아닌 클라이언트 책임 · 외부 의존분이며, 본 견적은 실 상용 SaaS 전 기능 개발(MVP 아님) 기준입니다. 앱은 PWA로 제공하며 네이티브 앱스토어 정식 출시는 별도 계약(+₩1억)입니다.
https://appears.kr/contractMOSO · 진행
APPEARS · MOSO연동 아키텍처 · 책임 분계

연동 아키텍처 · 책임 분계

두뇌(MOSO 엔진 · 콘솔 · 온이 · 자동화)는 어피어즈가 직접 개발 · 레일/하드웨어/텔레포니는 검증된 레이어를 오케스트레이션
글로벌 OTAHostaway / Beds24 채널매니저 API (셀프서브)에어비앤비·부킹·익스피디아·VRBO 가격·재고·예약·메시지 자동 동기화. 구독만으로 연동(파트너 심사 불요) — 다이내믹 프라이싱 엔진을 직접 송출.
국내 OTA채널매니저 경유 (온다 또는 호텔스토리·윙스 등)야놀자·여기어때·네이버는 제3자에게 직접 API를 개방하지 않아 채널매니저를 통해 연동한다. 채널매니저 파트너 계약·수수료는 발주자가 부담하며, 온다 외 대안 경로(호텔스토리·윙스·핸드SOS)도 확보돼 있다.
도어락 · 키오스크연동기/벤더 레이어 (브릿지 · 키오스크 HW)스마트 도어락은 브랜드 직접 API가 없어 연동기/브릿지로 임시 비번을 발급하고, 무인 키오스크는 키오스크 HW·연동 벤더와 결합한다. 연동기·키오스크 하드웨어 구매·설치는 별도(발주자).
온이 AI 음성글로벌 음성엔진 + 국내 070/SIP 텔레포니인바운드 통화 자동응대를 구축한다. 한·일·중 음성 정확도는 운영 데이터가 쌓이며 향상되는 초기 튜닝 구간을 포함하며, 애매한 문의는 호스트로 자동 에스컬레이션한다.
결제 PG토스페이먼츠 · 나이스페이 등 결제 API카드·간편결제 연동. PG 가맹 심사·간편결제(카카오·네이버페이) 승인은 발주자가 진행한다.
위 외부 레이어(채널매니저 · 연동기 · 텔레포니 · PG)의 사용료 · 파트너 계약 · 하드웨어 · 가맹 심사는 발주자 부담이며, 해당 제3자 서비스의 장애 · 정책 변경은 계약 제7조(외부 서비스 면책)에 따라 어피어즈 책임에서 제외됩니다. 어피어즈는 각 레이어의 연동 · 오케스트레이션을 책임지고 구현합니다.
https://appears.kr/contractMOSO · 연동
APPEARS · MOSO계약 조건 · 유효기간 · 서명

계약 조건

본 견적서에 명시된 조건은 본 계약의 일부를 구성합니다 — 어피어즈 ↔ 무해 양측을 공정하게 보호합니다.
제1조계약의 목적본 계약은 MOSO(멀티-OTA AI 위탁운영 SaaS)의 설계·개발·배포·교육 일체를 대상으로 한다. 어피어즈는 실 상용 수준(MVP 아님)으로 전 기능을 개발하여 인도한다.
제2조대금 및 지급개발비 ₩110,396,000(VAT 포함). 계약금 50% · 중도금 30%(핵심 1차 완료 시) · 잔금 20%(최종 인도·검수 시). 상시 운영 리테이너(₩3,000,000/월)는 개발비와 별도로 청구한다.
제3조환불 불가 · 중도해지착수금은 착수 즉시 환불되지 않으며, 페이즈별 완료·인수된 산출물의 대금은 환불 대상이 아니다(기 투입 개발 공수 보전). 발주자 사유로 중도 해지 시 그 시점까지의 진행분을 정산하고 종료한다.
제4조소유권 이전전 소스코드·Supabase 프로젝트·디자인 원본·브랜드 자산의 소유권은 잔금 완료 시 발주자에게 이전한다. 대금 완납 전까지 소유권은 어피어즈에 유보된다.
제5조범위 변경 · 서면 합의계약 범위(본 견적서 명시 기능) 외의 추가·변경 요청은 서면 합의 및 별도 단가로 처리한다. 모든 범위·금액·일정 변경은 서면(전자서명 포함)으로만 효력이 발생한다.
제6조출시 범위 한정본 계약의 앱 제공 범위는 PWA(웹앱)까지이다. iOS App Store · Google Play 네이티브 정식 출시는 별도 계약(예상 +₩1억)으로 진행하며, 아키텍처는 추후 네이티브 전환이 가능하도록 설계한다.
제7조외부 서비스 · API 면책OTA·채널매니저(온다·Beds24·Hostaway)·LLM·결제·문자/알림 등 제3자 서비스의 장애·점검·요금/정책 변경·연동 중단·응답 지연으로 인한 가동 중단 및 손해는 어피어즈 책임에서 제외한다.
제8조무단 수정 · 오조작 면책발주자 또는 제3자가 어피어즈의 사전 서면 동의 없이 소스코드·서버·DB·환경설정·인프라를 변경하여 발생한 장애·보안사고·데이터 손실은 어피어즈 책임에서 제외하며, 해당 부분의 하자보증은 소멸한다.
제9조운영 · 보안 책임 분계어피어즈는 인도 시점의 보안 설계·구현(키 격리·RLS·HTTPS·토큰 만료·감사 로그)까지 책임진다. 인도 이후 운영 단계의 계정·API 키·접근 권한·단말기(휴대폰·키오스크)·망 보안은 발주자 책임이다.
제10조데이터 · 백업어피어즈는 백업·복구 체계를 구축하여 인도한다. 운영 중 데이터의 주기적 백업·보존 및 개인정보 처리(동의·파기) 의무는 발주자에게 있다.
제11조손해배상 한도어떠한 경우에도 어피어즈의 누적 배상책임은 해당 사유와 직접 관련하여 기지급된 대금을 한도로 하며, 일실이익·기회손실 등 간접·특별·결과적 손해는 배상하지 않는다.
제12조하자보수 (무상 워런티)최종 인도·검수 후 3개월간 어피어즈의 구현 결함에 한해 무상 하자보수한다. 외부요인·무단수정·신규 요구사항·데이터/콘텐츠 오류는 제외하며 별도 유지보수로 처리한다.
제13조비밀유지양 당사자는 계약 과정에서 취득한 상대방의 영업·기술·고객 정보를 목적 외로 사용·누설하지 않는다. 어피어즈의 포트폴리오·실적 활용은 사전 협의한다.
제14조준거법 · 분쟁 해결본 계약은 대한민국 법에 따르며, 분쟁은 상호 협의를 우선하되 미해결 시 서울중앙지방법원을 제1심 전속 관할로 한다.
견적 유효기간
발행일로부터 30일 (~2026.07.19)
개발비 총액 (VAT 포함)
₩110,396,000
공급자 (을)
주식회사 어피어즈 · 대표 송현우
서명 / 날인
2026. 06. 19
발주자 (갑)
무해 · 대표 명훈
서명 / 날인
202 . .
https://appears.kr/contractMOSO · 계약
APPEARS · MOSO산출물 · 소유권 · 약속

최종 산출물 · 소유권

■ 포함: 10개 모듈 설계·개발·배포 전부 / MOSO 브랜드 BI 원본(로고·시그니처·가이드) / 웹·콘솔·호스트앱·청소앱 소스코드 / 프라이싱 엔진·온이 KB·자동화 스크립트 / 하드웨어 연동 펌웨어 연결·세팅 / 웹사이트 스킨 15종 / 전자서명·비서 어시스턴트 / 운영 매뉴얼·핸드오프 문서 / AI 업무 시스템 내부 교육 1회.

■ 제외(별도): 외부 SaaS·API 구독료·사용 원가 — 온다/Beds24/Hostaway 채널매니저 계약·수수료, LLM(OpenAI 등) 토큰, Twilio 통화료, 시장데이터 라이선스(AirROI/AirDNA), 결제 PG 수수료, 도메인·클라우드 인프라 비용 / 하드웨어 실물 구매비(CCTV·도어락·키오스크 단말) / OTA·사업자 자격 취득(채널매니저 B2B 계약, 숙박업 신고·법무·세무 검토) / 본 범위 외 신규 기능 추가(별도 견적) / 운영 단계 지속 유지보수(월 리테이너로 커버).

■ 최종 산출물: 작동하는 통합 운영 OS(콘솔+엔진+온이+호스트앱+청소앱+키오스크 연동) + 전체 소스코드 + 브랜드 원본 + 문서·교육.

■ 소유권: 잔금 완납 시 MOSO 전용으로 제작된 소스코드·브랜드 자산·산출물 일체의 사용·소유권은 발주처에 귀속한다. 단, 어피어즈가 보유한 범용 프레임워크·재사용 모듈·자동화 노하우의 지적재산권은 어피어즈에 유보되며, 발주처에 사용권을 부여한다. 제3자 오픈소스·외부 SaaS는 각 라이선스를 따른다. 어피어즈는 본 프로젝트를 포트폴리오로 게시할 권리를 가진다(기밀 정보 제외).

소유권 이전: 잔금 완료 시 전 소스코드·Supabase 프로젝트·디자인 원본(Figma)·브랜드 자산의 소유권을 무해(클라이언트)에게 이전합니다.
본 견적서 및 계약서에 명시된 범위로 어피어즈는 MOSO를 실 상용 SaaS로 구축하고, 6개월간 운영·교육으로 동행합니다. 검토 후 서명(전자서명 가능)으로 착수합니다.
APPEARS DESIGN · 주식회사 어피어즈
Prepared by Song Hyun-Woo · CEO Director
john316@appears.kr · 010-3974-8785 · 서울 마포구 토정로2길 18, 202호
https://appears.kr/contractMOSO · 끝