Date: 07/17/2026 · Status: logic locked, ready to build · One-liner: People pay to call your phone.
A marketplace for scheduled, time-boxed 1:1 video calls between fans and verified talent ("celebs"). Fans pay per call; celebs set prices and hours; the platform is the switchboard and takes a cut. Web-first for every transaction, native app as the daily surface.
| Layer | Choice | Why / notes |
|---|---|---|
| App (iOS + Android) | Expo / React Native | Same toolchain as TextingParents; one codebase both platforms. Role decided by signed-in number, not by which app. |
| Web (site + booking + call + my-bookings) | Static + a thin API | ~/personal-projects/pay-phone/site/ is the built reference. Book, pay, and take the call all work in-browser. |
| Payments | Stripe — Connect (Express) for talent payouts, PaymentIntents for booking | Apple Pay is a payment METHOD on Stripe web checkout. NO Apple IAP anywhere. Apple's cut = $0. |
| Live video | LiveKit | Same as TextingParents: rooms, egress→R2 recording, CallKit/PushKit for native call ring. |
| SMS | Twilio | Join links, T-15 reminders, drops. The SMS channel is the growth loop — not optional. |
| Recording storage | Cloudflare R2 | LiveKit egress target; MP4/AAC (iOS can't play OGG). |
| Moderation | Hive AI (or Rekognition) | Server bot participant samples frames; audio→text classifier. |
| Identity | Phone number = account, OTP via Twilio | Both sides. See §5. |
| Transactional email | Resend | E1–E6. From hello@joinpayphone.com. |
Domain: joinpayphone.com (⚠️ registration unconfirmed — verify before deploy). Entity/Apple/Stripe/LiveKit/Twilio accounts: founder, same enrollment path as TextingParents.
(service price ÷ service minutes) × extension minutes. 10-min $100 → $10/min → +5 = $50. Splits 80/5/15, settles with the base call. ┌─ cancel ≥24h ──────────────► REFUNDED (100%, auto)
│
CREATED ─pay─► PAID ─┼─ cancel <24h ─► RESCHEDULE_CREDIT (one use, 30d; →REFUNDED if no slot)
(in-hours: auto) │
(off-hours: see §2a)└─ hold ─► CONFIRMED ─remind(T-15)─► LOBBY ─both join─► IN_CALL
│
IN_CALL ─┬─ completes ──────────────► COMPLETED ──► SPLIT_PAID
├─ +extension ─────────────► COMPLETED (base+ext one settlement)
├─ celeb no-show (+5:00) ──► REFUNDED (100%, auto) + pickup-rate hit
├─ fan no-show (window end)► COMPLETED (celeb paid in full)
├─ conduct kill ───────────► FORFEITED (fan pays, celeb paid, ban)
├─ report filed ───────────► PAYOUT_HELD → T&S review → REFUNDED | SPLIT_PAID
└─ platform tech fault ────► REFUNDED (100%) + celeb paid (platform eats it)
No-show thresholds (D2): celeb no-show fires at +5:00 past start; fan no-show fires at the scheduled window end. Both printed in the cancel policy.
Fair timer (D2): protected from the OTHER party's lateness, never your own. Celeb late → timer waits until both in → fan gets full duration → later calls drift (buffers absorb). Fan late → clock runs, 60-sec grace, then they eat it; call still ends at scheduled end.
Booking outside standing hours: authorize (not capture) → fan sees PENDING → celeb accepts within min(24h from request, 24h before slot) → capture + confirm. Expire/decline → release authorization, notify fan, $0.
Number does five jobs: SMS delivery (the ring), zero-friction identity (no signup wall), celeb verification (OTP against the manager-registered number mints the ✓), ban anchor, and the web↔app bridge (book/claim on web → install app → type number → everything appears).
Real-time frame sampling (Hive) + audio→text classifier on a server bot participant. High-confidence NSFW → blur/black + kill in seconds. Report (either side) → PAYOUT_HELD → human review with recording + transcript + join log + spender history → refund/forfeit/warn/ban (reason-coded). 2-hour SLA. Conduct kill: fan forfeits, celeb paid, ban. 18+ only (ToS); App Store rating 17+ (Apple's max); 18+ attestation at checkout.
Celeb claim (all web until live): journey S1–S7d — invite text → claim → OTP verify → menu → hours+earnings hook → Stripe Connect → live + QR → App Store bridge → first open (zero re-entry).
Celeb app (4 tabs): app-proto-v2 — Today (next call + day plan) · Hours (weekly + menu + auto-accept) · Earnings (per-call payouts, dated sessions) · More (Audience export, Archive, payouts, settings, celeb recording consent).
Fan web booking: site/ — profile → per-service grid → contact → Apple Pay/card → confirmed → SMS → lobby → call → +5 extension → rate → recording.
Fan app: journey S24–S31 — two-door welcome → number → "your bookings appeared" → notifications → pick payphones → My Payphones home → Booked → You.
P1 (new): mockups/p1-screens — report/refund (R1–R3) + web my-bookings (B1–B4).
Admin: mockups/v4/admin — Today (KPIs+feed) · Lines/roster + drill-in · Trust&Safety case view.
Emails E1–E6: mockups/v4/emails — celeb live, celeb booking, fan confirm, T-15, recording ready, refund.
Design system: mockups/design-guide — tokens, type, icons (no emoji), copy law 7.1–7.4.
Verification gate (per the founder's standing rule): every number a user sees gets a test recomputing it from the source store; drive each flow end-to-end and observe behavior, not just green tests; signed-in boot smoke on iOS sim + Android emulator before any build ships.
Paid membership / paid-follow (D7 — free follow at launch), sold-out waitlist, celeb-rates-fan, account-deletion self-serve, manager bulk-onboarding tooling, celeb archive bulk export.