English {#english}
Superseded (manual trial SMS): Manual-approval phone SMS OTP (Twilio/Bird) has been removed from the product; see Remove phone SMS OTP — email-only manual approval. The remainder of this page is historical for the Bird swap design. Stripe integration on prego-control-plane (webhooks-stripe, checkout) is unchanged by that removal — use Stripe checkout plan and CP README.md for current billing setup.
Scope (historical): Operational and engineering plan for wiring Bird (bird.com) as the SMS delivery provider for manual-approval phone OTP, replacing Twilio, plus how Stripe API keys fit the already implemented Control Plane billing path.
Implementation: prego-control-plane — sendManualApprovalSms in src/trial-access/phone-otp.ts (Bird Channels or Navigator API), src/trial-access/handlers.ts, secrets BIRD_* + OTP_PEPPER on Env in src/index.ts. Routes unchanged: POST /v1/trial/manual-approval/phone/send-otp, verify-otp. Stripe: src/stripe-webhook-signature.ts + webhooks-stripe.ts (verify when STRIPE_WEBHOOK_SECRET is set).
Canonical repos
- prego-control-plane:
src/trial-access/phone-otp.ts,handlers.ts,src/webhooks-stripe.ts. - prego-zuplo: proxies to the same CP paths under
/api/trial/manual-approval/phone/*(seemodules/trial-access-handlers.ts). - Stripe:
src/checkout.ts(POST /v1/checkout),src/webhooks-stripe.ts(POST /webhooks/stripe), secretsSTRIPE_*on the Worker.
Bird replacement principle: Keep the same HTTP contract for browsers and Zuplo; only swap the backend SMS sender from Twilio to Bird (or introduce a small provider abstraction with Bird as the implementation used in production).
Related: Tenant onboarding runbook · Control Plane README (trial table, secrets) · Stripe checkout plan
한국어 {#korean}
1. 목적
- (대체됨) 수동 승인 휴대폰 SMS OTP는 제품에서 제거되었고, 동일 목적의 Bird 교체 계획은 더 이상 적용되지 않는다. Remove phone SMS OTP 참고.
- (과거 문서 본문) 아래 표·절은 Twilio → Bird 전환을 가정한 역사적 설명이다.
- SMS 인증 (아카이브): 수동 승인 플로우의 휴대폰 OTP를 Twilio 대신 Bird로 발송한다는 전제. API 키는 Bird 계정에서 확보한 상태를 가정한다.
- 결제: Stripe는 prego-control-plane에 이미 구현되어 있으므로, 시크릿·웹훅·가격 ID 배치와 운영 검증에 초점을 둔다.
2. 과거 구현 (Bird 교체 대상이었던 시점 — 아카이브)
| 영역 | 당시 문서 기준 (현재 제품과 다름) |
|---|---|
| SMS 발송 | Bird REST (sendManualApprovalSms), BIRD_* 시크릿 — 수동 승인 SMS 경로는 제거됨 |
| OTP | 6자리, OTP_PEPPER와 함께 해시 저장, phone-otp.ts 레이트리밋 — trial 전화 발송은 없음 |
| 라우트 | .../phone/send-otp, verify-otp |
| Stripe 웹훅 | STRIPE_WEBHOOK_SECRET 설정 시 서명 검증 (stripe-webhook-signature.ts) — 여전히 유효 |
3. 구현 요약 (Twilio → Bird)
- 발송:
sendManualApprovalSms— BirdPOST .../workspaces/{id}/channels/{channelId}/messages또는.../navigators/{navigatorId}/messages. - 시크릿:
BIRD_ACCESS_KEY,BIRD_WORKSPACE_ID,BIRD_SMS_CHANNEL_ID또는BIRD_NAVIGATOR_ID,OTP_PEPPER— prego-control-plane Worker. - 동작 보존: OTP·해시·레이트리밋 동일.
- WhatsApp: 범위 밖(후속).
4. Stripe (변경 없음 — 기획 정리만)
| 항목 | 내용 |
|---|---|
| Secret key | Worker STRIPE_SECRET_KEY |
| 가격 | STRIPE_PRICE_ID 또는 STRIPE_PRICE_BASIC / STRIPE_PRICE_PROFESSIONAL |
| 웹훅 | Stripe Dashboard → POST /webhooks/stripe (공개 URL은 CP 배포와 동일한 패턴) |
| 웹훅 시크릿 | STRIPE_WEBHOOK_SECRET 설정 시 HMAC 서명 검증 (stripe-webhook-signature.ts) |
5. 배포·검증 (운영)
- Bird 콘솔에서 Access Key·Workspace·SMS Channel 또는 Navigator 확인.
- Worker에
wrangler secret put(README 표). - 스테이징에서
send-otp/verify-otpE2E. - Stripe Dashboard에 웹훅 URL 등록 후 이벤트 수신 확인.
6. 리스크·완화
| 리스크 | 완화 |
|---|---|
| Bird API 오류 형식이 Twilio와 다름 | 사용자에게는 동일한 일반 오류 문구 유지; 로그에 provider 코드 저장 |
| 국가·지역 SMS 규제 | Bird 발신 프로필·허용 국가 목록 사전 확인 |
| 이중 과금 | 구형 Twilio 시크릿은 제거하고 Bird만 유지 |
요약: Twilio SMS를 Bird로 일대일 교체하는 것이 범위이며, 공개 API(Zuplo 경로·CP 라우트)는 유지하는 것이 목표다. Stripe는 키·웹훅·Price ID로 연동을 마무리하면 된다.