What are the known issues and gaps in RevenueDot?

The list below is complete as of 2026-10-03. A real App Store sandbox purchase ran end to end on a physical iPhone on 2026-10-02, and a production app has run RevenueDot beside RevenueCat since then. The biggest remaining gap: no real Google Play purchase has run end to end yet. Each item has a workaround where one exists.

Stores and purchases#

  1. Google Play, Amazon, Paddle, Roku and Galaxy Store purchases are untested against the real stores. Their code passes tests against copies of each store's API; the App Store ran a real sandbox purchase end to end on 2026-10-02.
    • Workaround: test with Google Play license testers, report what you find, and keep the dual run forwarding to your current backend until your numbers match. See Test purchases.
  2. Nine app types accept receipts: app_store, mac_app_store, play_store, amazon, stripe, paddle, roku, galaxy and test_store. RevenueCat Billing (rcb_) receipts answer HTTP 400, code 7662. Amazon, Stripe, Paddle, Roku and the Galaxy Store are tested against copies of the stores' APIs only; no real purchase in those stores has run yet. That includes web billing: the hosted checkout, purchase links and funnels run against an in-memory copy of Stripe's API in the tests.
    • Workaround: none yet.
  3. 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_receipts credential. See Connect the App Store.
  4. 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.
  5. 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.

SDK features#

  1. Paywalls built in RevenueCat are not imported. Paywalls, Customer Center, virtual currencies, targeting and experiments work with the stock SDKs, but the importer does not copy RevenueCat paywalls, targeting rules or experiments (item 14).
  2. The stock Android SDK sends some traffic to RevenueCat. Diagnostics, paywall events and ad events ignore the proxy URL.
    • Workaround: use the RevenueDot Android SDK (app.revenuedot.purchases:purchases on Maven Central), which sends them to RevenueDot. See Android.
  3. The stock web SDK sends analytics events to RevenueCat.
    • Workaround: configure purchases-js with flags: { collectAnalyticsEvents: false }.
  4. Flutter web ignores the proxy URL with the stock SDK. Flutter on iOS and Android works.
  5. The stock SDK reports signature verification FAILED. RevenueDot cannot sign with RevenueCat's key.
  6. Resolved on 2026-10-02: the RevenueDot SDKs are published. Every platform's RevenueDot SDK is on its registry (CocoaPods, Swift Package Manager, Maven Central, npm, OpenUPM, and git tags for Flutter), and its default host, https://api.revenuedot.app, is RevenueDot Cloud.

Webhooks and events#

  1. Two event types are never sent: TEMPORARY_ENTITLEMENT_GRANT and INVOICE_ISSUANCE, because RevenueDot never has the facts behind them. You can select them in filters. SUBSCRIBER_ALIAS and the funnel types (FUNNEL_VIEWED, FUNNEL_STEP_COMPLETED, FUNNEL_PURCHASE) are sent only to webhooks whose filter names them.
    • Workaround: none needed unless your backend relies on them. See Webhooks.
  2. Webhook payloads leave out metadata, and send renewal_number only on REFUND_REVERSED. experiments is sent for customers in an offering experiment. Every other field matches RevenueCat's sample payloads.
    • Workaround: count renewals in your backend from RENEWAL events.

Migration#

  1. 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.
  2. 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 one syncPurchases() in the app fill them in. GET /v2/projects/{project_id}/import/status counts what is left.

Self-hosting#

  1. 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.
Edit this page on GitHub ↗ View as Markdown Last updated