How do I use RevenueDot with Capacitor and Ionic?

Call await Purchases.setProxyURL({ url: "https://revenuedot.example.com" }) before Purchases.configure, and pass entitlementVerificationMode: ENTITLEMENT_VERIFICATION_MODE.DISABLED. The Capacitor plugin passes no default of its own, so without it the native iOS and Android default (informational) applies and logs every RevenueDot response as a failed signature check.

Use the RevenueCat SDK you already ship (proxy mode)#

TypeScript
import { Capacitor } from "@capacitor/core";
import { ENTITLEMENT_VERIFICATION_MODE, Purchases } from "@revenuecat/purchases-capacitor";

// Point the SDK at your RevenueDot server; nothing else in the app changes.
await Purchases.setProxyURL({ url: "https://revenuedot.example.com" });
await Purchases.configure({
  apiKey: Capacitor.getPlatform() === "ios" ? "appl_..." : "goog_...",
  // Capacitor passes no default, so the native default (informational signature checks) would apply.
  entitlementVerificationMode: ENTITLEMENT_VERIFICATION_MODE.DISABLED,
});
  • setProxyURL takes an object { url }, not a string. Await it before configure.
  • Use each app's public key from RevenueDot, or your old RevenueCat keys if the importer kept them. See Which key goes where.

After you migrate from RevenueCat, sync once on the first launch of the update, so current subscribers keep access:

TypeScript
// Once, after this update: send purchases made while the app talked to RevenueCat.
await Purchases.syncPurchases();

Use the RevenueDot fork#

The fork is github.com/revenuedot/purchases-capacitor. It depends on RevenueDot's hybrid common builds, which trust RevenueDot's signing key.

It is not published yet (2026-09-30). Install it only through the alias below. Capacitor derives the native pod and Swift package names from the npm package name, so the alias keeps them as RevenuecatPurchasesCapacitor. A direct install of @revenuedot/purchases-capacitor would change those names and is not supported.

JSON
{
  "dependencies": {
    "@revenuecat/purchases-capacitor": "npm:@revenuedot/purchases-capacitor@<version>",
    "@revenuecat/purchases-capacitor-ui": "npm:@revenuedot/purchases-capacitor-ui@<version>"
  }
}

Then run npx cap sync. The patch branch revenuedot/main-patches is at version 13.6.1. It cannot be installed from git yet, because its native dependencies (RevenueDotPurchasesHybridCommon 19.4.1 and app.revenuedot.purchases:purchases-hybrid-common:19.4.1) are not published. Use proxy mode until then.

Trusted Entitlements#

  • Stock plugin: pass DISABLED. The native default, INFORMATIONAL, logs every RevenueDot response as a failed check but still grants access. ENFORCED would fail every request.
  • Fork: it trusts RevenueDot Cloud's key. A self-hosted server signs with its own key, so keep DISABLED, or build the forks with your own public key.

See Trusted Entitlements.

Check an entitlement and make a purchase#

TypeScript
const { customerInfo } = await Purchases.getCustomerInfo();
const isPro = customerInfo.entitlements.active["pro"] !== undefined;

const offerings = await Purchases.getOfferings();
const aPackage = offerings.current?.availablePackages[0];
if (aPackage) {
  const result = await Purchases.purchasePackage({ aPackage });
  const nowPro = result.customerInfo.entitlements.active["pro"] !== undefined;
}

getCustomerInfo resolves to { customerInfo }, and purchasePackage takes { aPackage }.

Test Store#

Create a test_store app in RevenueDot and use its test_... key on a debug build. The Test Store dialog replaces the store sheet.

  • Native builds accept test_ keys only in debug builds. Ship with the appl_ and goog_ keys.
  • iOS: servers older than the 2026-09-30 fix could not serve Test Store products to the native iOS SDK. See iOS.
  • Test Store prices come from each product's Test Store price. Set it in the dashboard (Product catalog, Edit product) or with test_store_price on POST /v2/projects/{project_id}/products; a product without one shows 0.

More: Test Store.

Migrate from RevenueCat#

Diff
-import { Purchases } from "@revenuecat/purchases-capacitor";
+import { ENTITLEMENT_VERIFICATION_MODE, Purchases } from "@revenuecat/purchases-capacitor";

+// Point the SDK at your RevenueDot server; nothing else in the app changes. Await it before configure.
+await Purchases.setProxyURL({ url: "https://revenuedot.example.com" });
 await Purchases.configure({
   apiKey: isIOS ? "appl_..." : "goog_...",
+  // Capacitor passes no default, so the native default (informational signature checks) would apply.
+  entitlementVerificationMode: ENTITLEMENT_VERIFICATION_MODE.DISABLED,
 });
+// Once, after this update: send purchases made while the app talked to RevenueCat.
+await Purchases.syncPurchases();

The full order of steps is in Migrate from RevenueCat.

Examples#

There is no Capacitor example yet. The React Native Expo example shows the same calls in a JavaScript app.

Edit this page on GitHub ↗ View as Markdown Last updated