Skip to content

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-planesendManualApprovalSms 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/* (see modules/trial-access-handlers.ts).
  • Stripe: src/checkout.ts (POST /v1/checkout), src/webhooks-stripe.ts (POST /webhooks/stripe), secrets STRIPE_* 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 인증 (아카이브): 수동 승인 플로우의 휴대폰 OTPTwilio 대신 Bird로 발송한다는 전제. API 키는 Bird 계정에서 확보한 상태를 가정한다.
  • 결제: Stripe는 prego-control-plane에 이미 구현되어 있으므로, 시크릿·웹훅·가격 ID 배치와 운영 검증에 초점을 둔다.

2. 과거 구현 (Bird 교체 대상이었던 시점 — 아카이브)

영역당시 문서 기준 (현재 제품과 다름)
SMS 발송Bird REST (sendManualApprovalSms), BIRD_* 시크릿 — 수동 승인 SMS 경로는 제거됨
OTP6자리, OTP_PEPPER와 함께 해시 저장, phone-otp.ts 레이트리밋 — trial 전화 발송은 없음
라우트CP .../phone/send-otp, verify-otp삭제됨
Stripe 웹훅STRIPE_WEBHOOK_SECRET 설정 시 서명 검증 (stripe-webhook-signature.ts) — 여전히 유효

3. 구현 요약 (Twilio → Bird)

  1. 발송: sendManualApprovalSms — Bird POST .../workspaces/{id}/channels/{channelId}/messages 또는 .../navigators/{navigatorId}/messages.
  2. 시크릿: BIRD_ACCESS_KEY, BIRD_WORKSPACE_ID, BIRD_SMS_CHANNEL_ID 또는 BIRD_NAVIGATOR_ID, OTP_PEPPERprego-control-plane Worker.
  3. 동작 보존: OTP·해시·레이트리밋 동일.
  4. WhatsApp: 범위 밖(후속).

4. Stripe (변경 없음 — 기획 정리만)

항목내용
Secret keyWorker 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. 배포·검증 (운영)

  1. Bird 콘솔에서 Access Key·Workspace·SMS Channel 또는 Navigator 확인.
  2. Worker에 wrangler secret put (README 표).
  3. 스테이징에서 send-otp / verify-otp E2E.
  4. Stripe Dashboard에 웹훅 URL 등록 후 이벤트 수신 확인.

6. 리스크·완화

리스크완화
Bird API 오류 형식이 Twilio와 다름사용자에게는 동일한 일반 오류 문구 유지; 로그에 provider 코드 저장
국가·지역 SMS 규제Bird 발신 프로필·허용 국가 목록 사전 확인
이중 과금구형 Twilio 시크릿은 제거하고 Bird만 유지

요약: Twilio SMS를 Bird로 일대일 교체하는 것이 범위이며, 공개 API(Zuplo 경로·CP 라우트)는 유지하는 것이 목표다. Stripe는 키·웹훅·Price ID로 연동을 마무리하면 된다.

Help