Build · rw-projects

RevenueCat Migration

Overview
Current Owner
@tristan
Stage
Build
Time in Stage
136d
Slack Channel
Stage Timeline
Backlog
2025-11-01 · @tristan
Shape
2025-11-01 · @tristan
Build
2025-12-01 · @tristan
Expedite
Ship
Learn
Done
Stage Documents
motivation.md Motivation

RevenueCat Migration -- Motivation

Readwise's billing logic is extremely complex: 7 subscription states x 3 billing platforms (iOS/Android/web) x 3 current platforms x 2 products (Readwise/Reader) = potentially 252 billing state transitions. Android already uses RevenueCat, but iOS still uses native Apple StoreKit, creating inconsistency and bugs. Migrating iOS to RevenueCat unifies all mobile billing under one system, dramatically simplifies entitlement logic, and unblocks two critical projects: the Readwise 2.0 mobile app (which needs a working upgrade/subscribe flow) and the Bifurcation plan (which requires new Readwise-only and Reader-only subscription plans).

shape.md Shape Deliverable

RevenueCat Migration -- Shape

Entered Shape: 2025-11-01 · Owner: @tristan · Initiative: rw-projects

Key decisions

  • Migrate iOS in-app purchases to RevenueCat (Android already on RC)
  • Server-side migration first: import existing Apple receipts into RevenueCat, validate purchase history
  • Use profile.id as RevenueCat app_user_id (same auth system across all apps)
  • Switch App Store Connect S2S URL to RevenueCat with forwarding to existing Apple webhook
  • One RevenueCat project for Readwise + Reader + future apps
  • Don't use RevenueCat on web (Stripe stays -- RC web would cost ~$50K/year)
  • Part of broader Billing Bifurcation Refactor with multiple milestones

Scope

  • Milestone 1: Audit existing billing state transitions
  • Milestone 2: Billing state unification (subscription_state field)
  • Milestone 3: Migrate iOS to RevenueCat
  • Future: Create new subscription plans on Stripe + RevenueCat

Appetite

  • Medium -- primarily Tristan with Arek on Android/mobile side, Rasul on billing audits
build.md Build Deliverable

RevenueCat Migration -- Build (WIP)

This document is underway while the project is in Build. It will be finalized when the stage completes.

Entered Build: 2025-12-01 · Owner: @tristan · Initiative: rw-projects

Goal

Migrate all mobile billing to RevenueCat and unify billing state logic, unblocking RW 2.0 and subscription bifurcation.

What's been done

  • Reader Android RevenueCat integration shipped (Arek, Dec 2025)
  • Backend RevenueCat integration merged (Tristan, Dec 2025)
  • RevenueCat webhook improvements and billing failure state tracking (Tristan, Jan 2026)
  • login() called before purchase fix (Tristan, Jan 2026)
  • Migration meeting with RevenueCat engineering team (Jan 27, 2026)
  • Webhook gateway refactor (Tristan, Feb 2026)
  • Billing flows audit (Rasul, Feb 2026)
  • Reader iOS RevenueCat migration merged (Tristan, Feb 25, 2026)
  • Webhook routing guards + race condition fix for Reader iOS (Tristan, Feb 2026)
  • Google Play subscription management for RC subscribers (Tristan, Mar 2026)
  • Arek: singleTop launch mode fix, Android notification fixes for RC

What's in progress

  • PR #7662: Transition RevenueCat subscribers properly through subscription states (open since Dec 27)
  • PR #8030: Audit RevenueCat dry run vs Apple webhook (open since Feb 4)
  • Readwise iOS migration (Reader iOS done, Readwise iOS still needed)
  • RW 2.0 mobile upgrade/subscribe flow depends on this (Ibai PR #8715 merged)

What's not done yet

  • Readwise iOS app migration to RevenueCat
  • New subscription plans (Readwise-only, Reader-only) on Stripe + RevenueCat
  • Full billing state transition audit completion
  • Final QA across all billing state transitions

Open Questions (for next stage)

  • Timeline for Readwise iOS migration vs Reader iOS (which is done)?
  • How to handle edge cases in subscriber state transitions during migration?
  • When to create the new bifurcated subscription plans?
Daily Digests 6
2026-03-10 Daily Digest

RevenueCat Migration -- 2026-03-10

Stage: Build | Owner: @tristan

Activity

  • Tristan merged Google Play subscription management for RevenueCat subscribers (PR #8469).
  • Ensures Android users can manage subscriptions properly through the new RC integration.
2026-02-25 Daily Digest

RevenueCat Migration -- 2026-02-25

Stage: Build | Owner: @tristan

Activity

  • Major milestone: Reader iOS RevenueCat migration merged (PR #8295).
  • Webhook routing guards for Reader iOS migration merged (PR #8296).
  • A4 guard race condition fix in Apple webhook routing merged (PR #8302).
  • Reader iOS is now fully on RevenueCat.
2026-02-03 Daily Digest

RevenueCat Migration -- 2026-02-03

Stage: Build | Owner: @tristan

Activity

  • Tristan merged RevenueCat webhook gateway refactor (PR #8000).
  • Tristan opened audit PR for RevenueCat dry run vs Apple webhook (PR #8030, still open).
  • Rasul opened billing flows auditing PR (PR #8035, merged Feb 4).
2026-01-27 Daily Digest

RevenueCat Migration -- 2026-01-27

Stage: Build | Owner: @tristan

Activity

  • Tristan met with RevenueCat engineering team to plan iOS migration strategy.
  • Agreed on server-side migration first approach: import Apple receipts into RC, validate purchase history.
  • RevenueCat team created shared Slack channel (#temp-readwise-revenuecat) for coordination.
  • Key guidance: use profile.id as app_user_id, don't call logOut(), switch App Store S2S URL to RC with forwarding.

Key decisions

  • Server-side migration first, then SDK integration.
  • One RevenueCat project for all apps (Readwise + Reader + future).
  • Start with small batch of receipts to validate, then full import.
2026-01-10 Daily Digest

RevenueCat Migration -- 2026-01-10

Stage: Build | Owner: @tristan

Activity

  • Tristan merged RevenueCat webhook improvements and billing failure state tracking (PR #7771).
  • Tristan merged fix to always call RevenueCat login() before purchase (PR #7772).
2025-12-01 Daily Digest

RevenueCat Migration -- 2025-12-01

Stage: Build | Owner: @tristan

Activity

  • Arek opened PR for Reader Android RevenueCat mobile integration (merged Dec 1).
  • Tristan merged backend-only parts of RevenueCat integration (PR #7438, Dec 2).
  • First engineering work on the migration begins.
DateSummary
2026-03-10 Google Play subscription management for RC subscribers shipped.
2026-02-25 Major milestone: Reader iOS fully migrated to RevenueCat. Webhook routing guards shipped.
2026-02-03 Webhook gateway refactor. Rasul auditing billing flows.
2026-01-27 Migration planning meeting with RevenueCat engineering team. Server-side-first approach agreed.
2026-01-10 Tristan ships webhook improvements and login() before purchase fix.
2025-12-01 First engineering work: Arek ships Reader Android RC, Tristan merges backend integration.
Linked Documents & Assets