What are the known issues and gaps in RevenueDot?
The list below is complete as of 2026-09-30. The biggest gap: no real App Store or Google Play sandbox purchase has run end to end yet. Store support is tested against mocked Apple and Google APIs only. Each item has a workaround where one exists.
Stores and purchases#
- Real store purchases are untested end to end. The App Store and Google Play code passes tests against mocked Apple and Google APIs.
- Workaround: test with App Store sandbox and Google Play license testers, report what you find, and keep live customers on your current backend. See Test purchases.
- Only four app types accept receipts:
app_store,mac_app_store,play_storeandtest_store. Amazon, Stripe, Web Billing (rcb_), Paddle and Roku receipts answer HTTP 400, code 7662.- Workaround: none yet.
- StoreKit 1 receipts need the App Store in-app purchase key. Without it, RevenueDot answers HTTP 500, code 7234, so the SDK keeps retrying.
- Workaround: add the key. For local development only, set the
allow_unsigned_receiptscredential. See Connect the App Store.
- Workaround: add the key. For local development only, set the
- The App Store app-specific shared secret is stored but not used. RevenueDot verifies with the in-app purchase key and Apple's signed transactions instead.
- Workaround: add the in-app purchase key.
- USD values can differ slightly from RevenueCat's. RevenueDot converts at the purchase date's rate from the ECB (about 30 currencies) and the currency-api (every other currency); RevenueCat uses Open Exchange Rates. The currency-api's history starts on 2024-03-02, so older purchases in currencies the ECB does not publish use that day's rate. Servers upgraded from before 2026-09-30 counted non-USD prices as USD.
- Workaround: after upgrading, run
pnpm tsx scripts/backfill-usd.ts(a dry run), then again with--apply, to recompute those rows.
- Workaround: after upgrading, run
SDK features#
- Paywalls, Customer Center, virtual currencies, targeting and experiments are not implemented. The SDK endpoints answer empty results or 404, so the SDK hides these features instead of crashing. Paywalls built in RevenueCat do not render.
- Workaround: build the paywall in your own UI code from the offerings.
- The stock Android SDK sends some traffic to RevenueCat. Diagnostics, paywall events and ad events ignore the proxy URL.
- Workaround: the RevenueDot Android fork fixes it, but it is not published yet. You can build it from the
revenuedot/main-patchesbranch of revenuedot/purchases-android.
- Workaround: the RevenueDot Android fork fixes it, but it is not published yet. You can build it from the
- The stock web SDK sends analytics events to RevenueCat.
- Workaround: configure purchases-js with
flags: { collectAnalyticsEvents: false }.
- Workaround: configure purchases-js with
- Flutter web ignores the proxy URL with the stock SDK. Flutter on iOS and Android works.
- Workaround: the RevenueDot Flutter fork fixes it; use it as a git dependency on revenuedot/purchases-flutter.
- The stock SDK reports signature verification FAILED. RevenueDot cannot sign with RevenueCat's key.
- Workaround: turn verification off, never use ENFORCED. See signature verification.
- The SDK forks are not published to any registry. npm, CocoaPods, Maven Central and OpenUPM releases need publishing credentials that are not set up yet. The forks' default host,
https://api.revenuedot.app, is RevenueDot Cloud and is live.- Workaround: use the stock RevenueCat SDK with a proxy URL, or build a fork from its
revenuedot/main-patchesbranch.
- Workaround: use the stock RevenueCat SDK with a proxy URL, or build a fork from its
Webhooks and events#
- Six event types are never sent yet:
TEMPORARY_ENTITLEMENT_GRANT,VIRTUAL_CURRENCY_TRANSACTION,INVOICE_ISSUANCE,EXPERIMENT_ENROLLMENT,PURCHASE_REDEEMEDandSUBSCRIBER_ALIAS. You can select them in filters.- Workaround: none needed unless your backend relies on them.
- Webhook payloads leave out
renewal_number,experimentsandmetadata. Every other field matches RevenueCat's sample payloads.- Workaround: count renewals in your backend from
RENEWALevents.
- Workaround: count renewals in your backend from
Migration#
- Some RevenueCat data is not imported: paywalls, targeting, experiments and virtual currency balances. Refunded subscriptions import as expired, because RevenueCat's API does not expose the refund. RevenueCat Billing renewals stay with RevenueCat.
- Workaround: recreate paywalls in code, and keep RevenueCat running for RevenueCat Billing customers.
- Google purchase tokens are not in RevenueCat's API. Imported Google subscriptions wait with the key
needs_token_refresh:<order id>until a token arrives.- Workaround: pass
--google-tokens <csv>, or let renewal notifications and onesyncPurchases()in the app fill them in.GET /v2/projects/{project_id}/import/statuscounts what is left.
- Workaround: pass
Self-hosting#
- Run one server container per database. Expirations and webhooks are sent by a background job inside each container.
- Workaround: scale up one container rather than out. There is no high-availability setup yet.
- There is no published Docker image. Compose builds the image from source, which takes a few minutes on the first start.
- Workaround: none needed.