Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions docs/launch-checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# 출시 준비 체크리스트 (0028 — 스토어 URL · 유니버설 링크 · 루트 리다이렉트)

> 스토어 심사 통과로 실제 스토어 URL 이 나오는 시점에 실행하는 것들.
> 사전 준비(코드·인프라)는 전부 완료 상태이며, 각 항목은 값 채우기 수준이다.

## 1. 스토어 URL 시크릿 (share-view CTA 실동작 전환)

`share-view` 는 `?go=store` 에서 `STORE_URL_IOS`/`STORE_URL_ANDROID` 시크릿이
비어 있으면 "앱 출시 준비 중" 안내를 보여준다(index.ts). 시크릿을 채우는 즉시
모든 공유 링크·QR 의 설치 버튼이 스토어 302 로 전환된다 — 재배포 불필요.

- [ ] App Store 등록 완료 → URL 확보 (`https://apps.apple.com/kr/app/…`)
- [ ] Play 스토어 등록 완료 → URL 확보 (`https://play.google.com/store/apps/details?id=com.seizeh.pawmate`)
- [ ] Supabase 시크릿 설정:
```
supabase secrets set STORE_URL_IOS=… STORE_URL_ANDROID=… --project-ref vyatppuxmpulqtxevfpk
```
(대시보드 Edge Functions → Secrets 로도 가능. 설정 후 `?go=store` 스모크 테스트.)

## 2. pawmate.kr 루트 — 임시 랜딩 → 스토어 리다이렉트

`workers/share-proxy/src/index.js` 의 `LANDING` 이 임시 안내를 서빙 중.

- [ ] 루트 처리 교체: UA 분기로 iOS→App Store / Android→Play / 데스크톱→간단 소개
(share-view 의 UA 정규식 `iphone|ipad|ipod|macintosh` 재사용).
- [ ] `workers/share-proxy` 에서 `npx wrangler deploy`.

## 3. 유니버설 링크 (iOS) — 설치자가 공유 링크를 앱으로 열기

서버 쪽은 **완료**: Worker 가 `go.pawmate.kr/.well-known/apple-app-site-association`
을 서빙 중(appID `5GVP46ZJ2H.com.seizeh.pawmate`, path `/s`). 남은 것은 앱 쪽:

- [ ] Xcode → Runner 타깃 → Signing & Capabilities → **Associated Domains** 추가:
`applinks:go.pawmate.kr` (Runner.entitlements 에
`com.apple.developer.associated-domains` 로 기록됨. 유료 팀 5GVP46ZJ2H 이므로
capability 활성화 가능)
- [ ] 앱 링크 수신 배선: `app_links` 패키지를 직접 의존성으로 승격 →
수신한 `/s?t=…` 를 라우팅. v1 라우팅 제안: 로그인 상태면
`claim_care_reports()` 호출 후 받은 케어 기록 화면(연결된 기록이 도착해 있는
흐름), 비로그인이면 웰컴 화면. 토큰별 정밀 라우팅(kind 해석 RPC)은 후속.
- [ ] 실기기 검증: 링크를 메모장에 붙여 길게 눌러 "PawMate 로 열기" 확인.

## 4. 앱 링크 (Android)

- [ ] 릴리스 서명키 확정 후 SHA-256 지문 추출:
`keytool -list -printcert -keystore <release.jks>` (Play App Signing 사용 시
Play Console → 앱 무결성에서 지문 확인)
- [ ] `workers/share-proxy/src/index.js` 의 `ANDROID_CERT_SHA256` 에 지문 추가 →
deploy (빈 배열이면 `/.well-known/assetlinks.json` 은 404 로 안전하게 꺼져 있음)
- [ ] `AndroidManifest.xml` MainActivity 에 `autoVerify` intent-filter 추가:
`https` + `go.pawmate.kr` + pathPrefix `/s`
- [ ] `adb shell pm get-app-links com.seizeh.pawmate` 로 verified 확인.

## 5. 출시 시점 운영

- [ ] 위치기반서비스사업 신고 수리 확인(캠페인 전제 — 0028 원칙 7)
- [ ] pmlegal 문서의 앱 내 링크·시행일 최종 확인
- [ ] 파일럿 QR 인쇄물은 그대로 유효(주소가 `go.pawmate.kr` 라 백엔드 교체 무관)
- [ ] iOS `aps-environment` 가 릴리스 빌드에서 production 인지 확인(푸시)
67 changes: 67 additions & 0 deletions docs/pilot-onboarding-checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# 미용 파일럿 — 업체 온보딩 체크리스트 (0028 P1 실행)

> 대상: 1개 동네 미용업체 5~10곳(밀도 우선, 0028 원칙 5). 이 문서는 업체 1곳을
> 섭외부터 도구 사용까지 올리는 운영 절차다. 서버·앱은 전부 구현 완료 상태
> (P0~P3)이며, 남은 것은 사람이 하는 일이다.

## 시작 전 전제 (전체 파일럿 공통, 1회)

- [ ] **위치기반서비스사업 신고(방통위) 수리** — 수리 전 오프라인 캠페인 금지
(0028 원칙 7). 준비 상태는 pmlegal `05신고준비체크리스트.md`.
- [ ] pmlegal 개정 시행일 경과 확인 — 대가성 후기·업종 인증·케어 리포트 조항
(공고 2026-07-24 / **시행 2026-07-31**). 시행 전 도구 실사용 금지.
- [ ] `go.pawmate.kr` 뷰어 정상 동작 스모크 테스트(QR 스캔 → 열람 → 스토어 버튼).
- [ ] 관리자 계정으로 QR 화면 접근 가능 확인.

## 업체별 온보딩 (업체마다 반복)

### 1. 섭외·약정
- [ ] 도구 데모 보여주기 — 핵심 화법: "미용 끝나고 전후 사진, 이 앱으로 보내면
손님 카톡에 예쁘게 도착해요. 무료예요."
- [ ] 제휴 약정 체결. 필수 조항:
- 분양 관련 홍보 문구 게재 금지(0028 §0 — 위반 시 노출 중단)
- 대가성 후기 표시를 숨기도록 유도 금지(약관 제9조의3 ④)
- 고객 전화번호 입력 시 고객 고지·동의는 업체 책임(약관 제10조의3 ④)

### 2. 계정·인증
- [ ] 사장님 폰에 앱 설치 → 가입(업체 유형) → 업체 등록 폼 제출
(사업자등록증 + **미용업 등록증 동시 제출** — 신청 두 번 안 하게).
- [ ] 관리자: 업체 인증 승인 → 업종(grooming) 라이선스 승인.
- [ ] 사장님 폰에서 케어 리포트 발행 진입점 보이는지 확인.

### 3. QR 발급·인쇄
- [ ] 관리자 QR 화면에서 매장 미리보기 링크 발급(`admin_create_facility_share_link`
— 재호출해도 같은 토큰 재사용이라 재인쇄 안전).
- [ ] 인쇄물 제작 — 주소는 반드시 `go.pawmate.kr/s?t=…`. **supabase.co 주소
절대 금지**(게이트웨이 HTML 차단 + 도메인 영속성).
- [ ] 매장 비치(카운터·대기석) + 스캔 테스트.

### 4. 도구 교육 (5분)
- [ ] 발행 흐름: 업체 모드 → 케어 리포트 → 사진(전/후) → 아이 이름 →
전화번호(**선택** — "번호를 넣으면 손님 가입 시 자동 연결") → 발행 →
공유 시트로 손님 카톡·문자 전송(업체 폰에서).
- [ ] 전화번호 입력 전 고객에게 한마디 안내 습관화: "사진 보내드릴게요,
번호 입력할게요~" (약관상 고지 의무).
- [ ] 대가성 후기 정책: 할인·사은품 주고 후기 부탁할 땐 손님이 체크박스
선택하도록 안내(배지가 붙을 뿐 후기 노출엔 불이익 없음).
- [ ] 습관 목표: **미용 완료마다 1회 발행**. 첫 주에 발행 0이면 재방문 코칭.

## 주간 모니터링 (파일럿 기간)

`app.funnel_events` 집계 — 매장(token)별:

| 지표 | 이벤트 | 비고 |
| --- | --- | --- |
| 발행 수 | `report_issued` | **1순위 지표 = 업체 재사용률**(주당 발행 유지 여부) |
| 열람율 | `share_view` / 발행 | 링크 전송이 실제로 되는지 |
| 스토어 클릭율 | `store_click` / `share_view` | 출시 전엔 "준비 중" 페이지 노출 |
| claim 율 | `claim` / `report_issued` | 자동 연결(전화번호 대조) 성사 |
| 후기·D7 잔존 | 앱 지표 | 가입 후 정착 |

- [ ] 발행→claim 이탈이 크면 그때 딥링크 SDK 검토를 연다(0028 §4.3 — 그 전엔 금지).
- [ ] 업체별 폴백 승인 비율 모니터링(비정상 업체 = 오·남용 조사 대상).

## 파일럿 종료 판단 (0028 §7)

- 업체 재사용률이 유지되는가(도구가 사장님에게 실제로 쓸 이유가 됐는가) — 이 전략의
가설 그 자체. 유지되면 위탁(P2 알림장) 업체로 확장, 아니면 도구 개선 후 재시도.
26 changes: 26 additions & 0 deletions supabase/functions/share-view/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,32 @@ Deno.serve(async (req) => {
return html(page(`${petLabel}의 ${kindLabel}`, `${bizName ?? "PawMate"} · 케어 리포트`, inner));
}

// ── 분양 스타터 랜딩(P3) — 본문은 정적 콘텐츠, 업체명만 데이터(출처 표기·계측) ──
if (data.kind === "starter") {
const st = data.starter ?? {};
const bizName = st.business_name ? String(st.business_name) : null;
const inner = `
<div class="titlebar" style="margin-top:4px"><b>새 가족의 시작을 함께해요</b></div>
<div class="info-card">
${bizName ? `<div class="verified">✓ ${esc(bizName)}에서 준비했어요</div>` : ""}
<div class="irow"><span class="ic">🎁</span><span>새 보호자를 위한 <b>스타터 패키지</b>예요.
앱을 설치하고 "최근에 아이를 데려왔어요"를 선택하면 바로 시작돼요.</span></div>
</div>
<div class="titlebar"><b>패키지에 담긴 것</b></div>
<div class="info-card">
<div class="irow"><span class="ic">💉</span><span><b>접종 일정 알림</b> — 종합백신부터 광견병까지, 시기마다 잊지 않게 알려드려요</span></div>
<div class="irow"><span class="ic">✅</span><span><b>초보 보호자 체크리스트</b> — 처음 한 달, 챙길 것들을 순서대로</span></div>
<div class="irow"><span class="ic">🗺</span><span><b>동네 병원·미용 지도</b> — 우리 동네 반려 시설을 후기와 함께</span></div>
</div>
<a class="cta" href="?t=${token}&amp;go=store">PawMate 앱에서 스타터 패키지 받기</a>
<a class="cta sub" href="?t=${token}&amp;go=store">설치와 가입은 무료예요</a>`;
return html(page(
"새 보호자 스타터 패키지",
`${bizName ?? "PawMate"} · 새 가족 맞이 선물`,
inner,
));
}

if (data.kind !== "facility_preview") {
return noticePage("준비 중인 콘텐츠예요", "앱에서 곧 만나볼 수 있어요.", 200);
}
Expand Down
Loading
Loading