stubkit docs

Migrate from RevenueCat

This guide covers the practical steps to move an app off RevenueCat onto stubkit without breaking existing subscribers.

What stubkit does differently

  • Offering model. RC has Offering → Package → Product; stubkit has Offering → Product (with an entitlement field on each product).
  • Cross-platform user. RC uses appUserID; stubkit uses user_id forwarded via appAccountToken, obfuscatedAccountId, or Stripe metadata.
  • Entitlement check. RC: Purchases.shared.customerInfo(). stubkit: GET /v1/entitlement/{app_id}/{user_id} or the local cache.

Migration phases

Phase 1 — parallel run (2 weeks)

  1. Register the app in stubkit dashboard.
  2. Upload the same Apple .p8 + Google service account JSON that RC has.
  3. Generate a publishable key.
  4. On new purchases only, call POST /v1/purchases with the StoreKit JWS or purchaseToken alongside RC's syncPurchases.

Phase 2 — backfill

Two options:

  • Let renewals flow in. Any future renewal webhook goes through stubkit's full pipeline. Most subs renew within 30 days.
  • Explicit backfill. Export RC customers and either seed entitlements via POST /v1/admin/grants, or replay transactions through POST /v1/purchases.

Phase 3 — cut over

  1. Point StoreKit/Play webhook URLs at stubkit: https://api.stubkit.com/webhooks/apple, /webhooks/google, /webhooks/stripe.
  2. Remove Purchases.configure from the app.
  3. Switch entitlement reads to StubkitPurchases / the REST API.
  4. Replace RC Offerings / Paywalls views with stubkit paywall components.

Phase 4 — decommission

Ship an app update without RC, wait for >95% rollout, remove RC's webhook URL, cancel the RC subscription.

Gotchas

  • UUID requirement on iOS. appAccountToken must be a UUID. If your user id isn't a UUID, hash it first.
  • Historical charts reset. MRR/LTV history starts fresh with stubkit. If you need continuity, import a historical dataset via admin endpoints.
  • Sandbox separation. Use pk_test_ / sk_test_ keys so sandbox purchases don't pollute production MRR.