# D3RO Voice 수익화 실행 계획 (2026-08-24) > 목표: 배포 → 노출 → 검증된 수입 회수까지의 최단 경로. > 근거: 광고 E2E RED 스위트 652 시나리오 전 GREEN(수입 무결성 1차 방어 완료). ## 현재 자산 (이미 완료) | 자산 | 상태 | |---|---| | 모바일 앱 (Android, 무료 티어) | 배포 파이프라인 완성 (APK 서명/오프라인 번들) | | AdMob 배너/리워드 광고 | production 앱/배너/리워드 단위 발급 완료. 현재 TEST-DEMO 앱 산출물은 계속 Google test ID 사용 | | SSV 리워드 검증 (엣지함수) | **AdMob URL 확인·저장, Edge v13, DB receipt replay barrier 운영 배포 완료** | | 리워드→쿼터 지급 체인 | 리워드 시청 = 전사/대화 쿼터 충전 (무료 티어 수익화 핵심) | | PRO 구독 (Stripe/Payple) | 결제 인프라 존재 (admin 구독 관리 페이지) | | 관리자 콘솔 | 광고/릴리스/구독/정산 페이지 통합 배포 완료 | | 광고 정산 원장 | eCPM/원천세/KRW 지급 계약 구현 (계열 F) | ## 1단계 — 프로덕션 AdMob 콘솔 연결 (2026-08-24 완료) 1. **AdMob 앱**: Android `com.d3ro.voice`, App ID `ca-app-pub-1039714767792854~6427959892` 2. **배너 단위**: `ca-app-pub-1039714767792854/9840591290` 3. **리워드 단위**: `ca-app-pub-1039714767792854/2255790918`, `reward amount = 50`, `reward item = cloud_ai_tokens` 4. **SSV**: `https://llnocwyqvhgwpdjcqqyw.supabase.co/functions/v1/admob-ssv`를 Google URL 확인 후 저장. Supabase secret `ADMOB_REWARDED_AD_UNIT_ANDROID`도 동일 rewarded ID로 설정 빌드 게이트: Gradle이 `D3RO_ADMOB_APP_ID`/`D3RO_ADMOB_BANNER_UNIT_ID`/ `D3RO_ADMOB_REWARDED_UNIT_ID`를 environment/property에서 요구하며, production release에서 Google 공식 test publisher ID를 거부한다. AdMob 지급 프로필은 아직 미완료다. 스토어 등록정보 연결과 앱 검토도 대기 중이므로, 콘솔 연결 완료를 광고 게재 승인이나 production 수입 발생으로 해석하지 않는다. ## 2단계 — 배포 (스토어 + 직접 배포 병행) - **Play 스토어**: 내부 테스트 트랙 → 프로덕션 (릴리스 파이프라인 재사용) - **직접 APK**: site 다운로드 페이지가 Forgejo 릴리스 첨부와 연동돼 있음 — 태그만 밀면 배포 완료 - **정산 회로 점검 관문**: 배포 전 `apps/desktop` 전체 테스트(1,242) + 모바일 release-boundary 스크립트(`npm run release:mobile:boundary`) 통과 ## 3단계 — 수입 회수 구조 ``` 무료 사용자 ─ 배너 노출 ──────────────→ AdMob 수입 (eCPM 집계: 계열 F) └ 리워드 시청 → SSV 검증(리플레이 방어) → 쿼터 지급 유료 전환 ─ PRO 구독 (Stripe/Payple) → 광고 제거 + 무제한 ``` - 지급: `AdSettlementRecord` 원장 (원천세 3.3% 가정, KRW 환산, 계좌이체 기본) - 모니터링: 관리자 /ads + /usage 페이지 (이미 배포됨) ## 4단계 — 성장 레버 (수입 안정 후) 1. 리워드 eCPM 상승: 미디에이션 순위 A/B (설정은 관리자 /ads에서) 2. 데스크톱 하우스 광고(DirectHouseSponsorAdapter): 스폰서 직접 영업 시 즉시 착수 3. 인터스티셜(export 시): 무료 티어 수출 워크플로우에 삽입 — 계약은 이미 시나리오로 묶여 있음(계열 A3) ## 위험 관리 (이미 묶여 있음) | 위험 | 방어 | 근거 | |---|---|---| | 리워드 리플레이 사기 | isolate tx 캐시 + DB `transaction_id UNIQUE` receipt 원장 + ±1h 신선도 | SSV 6 + 광고 652 + DB 85 assertions/race 검증 | | 가짜 입찰 크리에이티브 | SDK 미연동 어댑터 no-bid 강제 | 계열 A2/B 110 시나리오 | | 설정 오염(음수 보상 등) | setConfig 검증 | 계열 G 40 시나리오 | | Node↔Deno 서명 형식 차이 | DER 파서 + RAW→DER 테스트 변환기 | E2/E3 | ## 다음 액션 (순서대로) - [x] AdMob 앱/배너/리워드 단위 ID 발급 - [x] Supabase rewarded unit secret 및 SSV 콜백 URL 확인·저장 - [ ] 지급 프로필 작성, 스토어 등록정보 연결, 앱 검토 완료 (사용자) - [ ] 보호된 빌드 환경에 production ID/Firebase/signing 값 주입 → signed APK+AAB - [ ] AdMob test device + Play internal 설치본으로 실제 Google-signed SSV→receipt→claim→credit +50 E2E - [ ] Play 내부 테스트 업로드 → 20명 베타 → 프로덕션 - [ ] 첫 정산 주기(월) 관리자 /ads에서 원장 확인