Moving from RevenueCat
Import your catalog and customers, keep RevenueCat-format endpoints and webhooks working, and switch SDKs.
1. Connect your stores
Create an app for each store (npx -y @salesdogg/cli apps create ..., see Connect payment providers) and point their server notifications at SalesDogg. For the App Store, add an In-App Purchase key (issuer_id, key_id, private_key) so purchases can be looked up at Apple.
2. Import
npx -y @salesdogg/cli import revenuecat --revenuecat-key "$REVENUECAT_API_KEY" --revenuecat-project <project_id>
This imports products, entitlements and offerings, then every customer: app user ids and aliases, attributes, last-seen details and promotional entitlements. It is safe to run again, and --starting-after resumes. The RevenueCat key (a v2 secret key) is used for the request only and never stored. The same import is in the dashboard under Settings, and as two endpoints: POST /v1/imports/revenuecat/catalog and POST /v1/imports/revenuecat/customers.
3. Purchases
Purchases are not copied from RevenueCat: their ids are not the ones store notifications use. Each is looked up at its store and recorded exactly as a store notification would be (Stripe through its API, Google Play through the Orders API, the App Store with the key above). Anything that cannot be looked up is linked by the SDK the next time the app opens, because it syncs the device's purchases at launch. Nothing imported sends webhooks.
4. Backend code
These endpoints answer in RevenueCat's REST v1 format; change the base URL and key:
GET /v1/subscribers/{app_user_id}DELETE /v1/subscribers/{app_user_id}POST /v1/subscribers/{app_user_id}/attributesPOST /v1/subscribers/{app_user_id}/entitlements/{entitlement}/promotionalPOST /v1/subscribers/{app_user_id}/entitlements/{entitlement}/revoke_promotionals
Webhook endpoints created with --format revenuecat (and optionally --authorization-header) receive RevenueCat's webhook body.
5. Apps
Replace the RevenueCat SDK with SalesDogg's. Pass RevenueCat's current app user id to configure the first time, so anonymous users' purchases stay attached.
Not covered
Amazon, Roku, Paddle and RevenueCat Web Billing purchases; RevenueCat's own prices (SalesDogg learns prices from store notifications, so MRR for imported subscriptions fills in as they renew); experiments and paywalls. grace_period_expires_date is always null in the RevenueCat format.