docs(subscription): correct stale Android RevenueCat status

The Platform Support section claimed Android was "not yet implemented".
Android has full native SDK support: getApiKey() selects the Android key,
com.android.vending.BILLING is declared in app.json, the paywall has no
platform gating, and the webhook passes event.store through unchanged so
PLAY_STORE events need no separate handling.

Also flag the entitlement ID mismatch between the "pro" fallback in
revenuecat.ts and the "Sauci Pro" value set in eas.json. A build profile
missing that variable yields isProUser: false with no error, which
presents as churn rather than as misconfiguration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
jjbruntonandClaude Opus 5 committed 2026-08-28 19:26:53 +01:00
1 parent 1be54175e4
commit aacb4f8731
1 file changed
+12 -2
+12 -2
View File
@@ -28,7 +28,10 @@ The `RevenueCatService` class wraps the `react-native-purchases` SDK.
**Platform Support:** **Platform Support:**
- iOS: Full support with native SDK - iOS: Full support with native SDK
- Android: Not yet implemented - Android: Full support with native SDK. `getApiKey()` selects the Android key,
`com.android.vending.BILLING` is declared in `app.json`, and the paywall has no
platform gating. The backend is store-agnostic: the webhook passes `event.store`
through unchanged, so `PLAY_STORE` events need no separate handling.
- Web/Expo Go: Gracefully disabled (returns defaults) - Web/Expo Go: Gracefully disabled (returns defaults)
**Key Methods:** **Key Methods:**
@@ -201,11 +204,18 @@ The `get_recommended_questions()` function also filters premium packs:
|----------|----------|---------| |----------|----------|---------|
| `EXPO_PUBLIC_REVENUECAT_IOS_API_KEY` | Mobile app | RevenueCat iOS public SDK key | | `EXPO_PUBLIC_REVENUECAT_IOS_API_KEY` | Mobile app | RevenueCat iOS public SDK key |
| `EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEY` | Mobile app | RevenueCat Android public SDK key | | `EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEY` | Mobile app | RevenueCat Android public SDK key |
| `EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID` | Mobile app | Entitlement identifier (default: "pro") | | `EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID` | Mobile app | Entitlement identifier (code default: `"pro"`; builds set `"Sauci Pro"` — see warning below) |
| `REVENUECAT_API_KEY` | Edge functions | RevenueCat secret API key | | `REVENUECAT_API_KEY` | Edge functions | RevenueCat secret API key |
| `REVENUECAT_ENTITLEMENT_ID` | Edge functions | Server-side entitlement check | | `REVENUECAT_ENTITLEMENT_ID` | Edge functions | Server-side entitlement check |
| `REVENUECAT_WEBHOOK_SECRET` | Edge functions | Webhook auth verification | | `REVENUECAT_WEBHOOK_SECRET` | Edge functions | Webhook auth verification |
> **Entitlement ID mismatch risk.** The fallback in `src/lib/revenuecat.ts` is
> `"pro"`, but `eas.json` sets `EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID` to
> `"Sauci Pro"`. If that variable is missing from a build profile, the SDK looks up
> an entitlement that does not exist, `parseCustomerInfo()` returns
> `isProUser: false`, and paying users silently appear unsubscribed with no error.
> Confirm the variable is set on every iOS and Android build profile.
## Subscription Flow Diagrams ## Subscription Flow Diagrams
### Purchase Flow ### Purchase Flow