Object argument
setProxyURL takes { url }, not a plain string.
SDK
To add subscriptions to a Capacitor or Ionic app on RevenueDot, keep @revenuecat/purchases-capacitor, await Purchases.setProxyURL({ url: "https://api.revenuedot.app" }) before Purchases.configure, and pass entitlementVerificationMode DISABLED. The plugin sets no default of its own, so the native informational mode would otherwise log every response as failed.
Free up to $10,000 a month in tracked revenue. Works with the RevenueCat SDK you already ship.
setProxyURL takes { url }, not a plain string.
Capacitor has no default, so the native informational mode applies unless you pass DISABLED.
Install the planned fork through an npm alias so the native pod and package names stay the same.
One TypeScript call path covers both native platforms.
Steps
Start free on Cloud and add an App Store app and a Google Play app, or a Test Store app for a first run.
Add credentials (App Store, Google Play), then products, a pro entitlement and a current offering.
Install @revenuecat/purchases-capacitor and run npx cap sync, as you would for any RevenueCat project.
Call await Purchases.setProxyURL({ url }), then Purchases.configure with entitlementVerificationMode: ENTITLEMENT_VERIFICATION_MODE.DISABLED.
Call Purchases.purchasePackage({ aPackage }) and read customerInfo.entitlements.active["pro"].
TypeScript
import { Capacitor } from "@capacitor/core";
import { ENTITLEMENT_VERIFICATION_MODE, Purchases } from "@revenuecat/purchases-capacitor";
await Purchases.setProxyURL({ url: "https://api.revenuedot.app" });
await Purchases.configure({
apiKey: Capacitor.getPlatform() === "ios" ? "appl_..." : "goog_...",
entitlementVerificationMode: ENTITLEMENT_VERIFICATION_MODE.DISABLED,
}); TypeScript
getCustomerInfo resolves to { customerInfo }, and purchasePackage takes { aPackage }.
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;
} Fork
The fork lives at github.com/revenuedot/purchases-capacitor. Install it only through the alias below: Capacitor derives native pod and Swift package names from the npm name, and the alias keeps them unchanged. It is not published yet (checked October 2026), so use proxy mode today.
// package.json
"@revenuecat/purchases-capacitor": "npm:@revenuedot/purchases-capacitor@<version>" Notes
await Purchases.syncPurchases() once on the first launch of the update.appl_ and goog_ keys.ENFORCED: every request would fail, because RevenueDot cannot sign with RevenueCat's key.FAQ
Install @revenuecat/purchases-capacitor, configure it with your store key, fetch offerings and call purchasePackage. A backend checks the receipts. With RevenueDot you await Purchases.setProxyURL({ url }) before configure and pass verification DISABLED.
The plugin passes no verification default, so the native informational mode checks signatures against RevenueCat's key. Pass entitlementVerificationMode DISABLED to stop it. Access is granted either way in informational mode.
No. It takes an object, so you write Purchases.setProxyURL({ url: "https://api.revenuedot.app" }), and you await it before configure.
Only through the npm alias. A direct install of @revenuedot/purchases-capacitor would change the generated native names and is not supported. The fork is not published yet.
Get started
Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue, or move an existing RevenueCat app with one line of code.
Already have an account? Sign in · Prefer your own servers? Self-host free