Common code
One proxyURL assignment covers the Android and iOS targets.
SDK
To add in-app subscriptions to a Kotlin Multiplatform app on RevenueDot, keep purchases-kmp and set Purchases.proxyURL = "https://api.revenuedot.app" in common code before Purchases.configure. In purchases-kmp the proxy URL is a String, not a URL. The default verification mode is already DISABLED, so nothing else changes on Android or iOS.
Free up to $10,000 a month in tracked revenue. Works with the RevenueCat SDK you already ship.
One proxyURL assignment covers the Android and iOS targets.
Unlike the native Android SDK, the KMP proxy URL is a String.
EntitlementVerificationMode.DISABLED is the default.
The stock Android SDK underneath still sends diagnostics and events to RevenueCat.
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.
Assign Purchases.proxyURL before Purchases.configure, in code shared by both targets.
Pass the appl_ key on iOS and the goog_ key on Android to PurchasesConfiguration.
Call awaitPurchase(pkg) and read customerInfo.entitlements.active. It throws PurchasesTransactionException on failure or cancel.
Kotlin
Purchases.proxyURL = "https://api.revenuedot.app"
fun initPurchases(apiKey: String) {
Purchases.configure(PurchasesConfiguration(apiKey) {
// DISABLED is the KMP default; keep it.
verificationMode = EntitlementVerificationMode.DISABLED
})
} Kotlin
val customerInfo = Purchases.sharedInstance.awaitCustomerInfo()
val isPro = customerInfo.entitlements.active.containsKey("pro")
val offerings = Purchases.sharedInstance.awaitOfferings()
val pkg = offerings.current?.availablePackages?.firstOrNull() ?: return
val result = Purchases.sharedInstance.awaitPurchase(pkg)
val nowPro = result.customerInfo.entitlements.active.containsKey("pro") Fork
The fork lives at github.com/revenuedot/purchases-kmp. Packages stay com.revenuecat.purchases.kmp.*. It builds on RevenueDot's iOS and Android forks, so both trust RevenueDot's signing key and send events to your proxy URL. It is not on Maven Central yet (checked October 2026), so proxy mode is the practical choice today.
implementation("app.revenuedot.purchases:purchases-kmp-core:<version>") Notes
Purchases.sharedInstance.awaitSyncPurchases() once from a coroutine on the first launch of the update.FAQ
Use purchases-kmp in common code, configure it with a store key per platform, fetch offerings and call awaitPurchase. A backend checks the receipts. With RevenueDot you set Purchases.proxyURL, a String, before configure.
A String. In the native Android SDK it is a java.net.URL, but purchases-kmp takes a plain String, so you write Purchases.proxyURL = "https://api.revenuedot.app".
No. purchases-kmp already defaults to EntitlementVerificationMode.DISABLED. Never use ENFORCED, because RevenueDot cannot sign with RevenueCat's key and every request would fail.
Yes. The proxy URL applies to both targets. Pass the appl_ key on iOS and the goog_ key on Android. On Android the stock SDK underneath still sends diagnostics to RevenueCat.
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