Some checks failed
ci / 정본·보안·린트·타입·테스트 (push) Failing after 1m13s
ci / 워크스페이스 빌드 검증 (push) Has been skipped
ci / 모바일 린트·타입·Jest (push) Failing after 1m4s
ci / Supabase Edge Functions + Cloudflare Worker (push) Successful in 37s
ci / .NET API 서버 테스트 (push) Successful in 27s
deploy-site / deploy (push) Failing after 20s
Stripe is not used. Keeping its checkout, portal and webhook paths meant a
second payment provider, a second return-URL format and dead UI.
- Delete the stripe-checkout, stripe-portal and stripe-webhook functions and
their config; billing-catalog serves Payple prices only, and the web parser
rejects a catalog that still mixes in Stripe prices.
- Web: drop the Stripe checkout/portal buttons, provider toggle and return
notices; billing shows Payple only. Past rows with provider='stripe' are
still displayed ("Stripe (종료)") with a support contact instead of a portal.
- Desktop: delete the Stripe checkout modal, payment IPC channels, preload
namespace and their types; "Remove ads with Pro" opens the web billing page
via license.openBilling. Support/refund copy names Payple.
- billingUrl() loses the Stripe-only success/canceled result option; the
Deno contract is regenerated.
- Migrations and the DB's accepted provider values are untouched (history).
- Docs and the backlog record the removal (MON-04, EXT-STRIPE-01, GAP-BILL-03).
Verified: typecheck (desktop/web/admin/api-client/mobile), contract:check,
deno check all functions, deno test 80/80, desktop 1478/1480 on the Electron
runtime (2 known environment failures), web and admin builds, release
metadata and mobile boundary self-tests, eslint on changed files.
4.4 KiB
4.4 KiB
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 구독 (웹 Payple · 모바일 Google Play) | 결제 인프라 존재 (admin 구독 관리 페이지) |
| 관리자 콘솔 | 광고/릴리스/구독/정산 페이지 통합 배포 완료 |
| 광고 정산 원장 | eCPM/원천세/KRW 지급 계약 구현 (계열 F) |
1단계 — 프로덕션 AdMob 콘솔 연결 (2026-08-24 완료)
- AdMob 앱: Android
com.d3ro.voice, App IDca-app-pub-1039714767792854~6427959892 - 배너 단위:
ca-app-pub-1039714767792854/9840591290 - 리워드 단위:
ca-app-pub-1039714767792854/2255790918,reward amount = 50,reward item = cloud_ai_tokens - SSV:
https://llnocwyqvhgwpdjcqqyw.supabase.co/functions/v1/admob-ssv를 Google URL 확인 후 저장. Supabase secretADMOB_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 구독 (웹 Payple / 모바일 Google Play) → 광고 제거 + 무제한
- 지급:
AdSettlementRecord원장 (원천세 3.3% 가정, KRW 환산, 계좌이체 기본) - 모니터링: 관리자 /ads + /usage 페이지 (이미 배포됨)
4단계 — 성장 레버 (수입 안정 후)
- 리워드 eCPM 상승: 미디에이션 순위 A/B (설정은 관리자 /ads에서)
- 데스크톱 하우스 광고(DirectHouseSponsorAdapter): 스폰서 직접 영업 시 즉시 착수
- 인터스티셜(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 |
다음 액션 (순서대로)
- AdMob 앱/배너/리워드 단위 ID 발급
- 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에서 원장 확인