SDK

In-app purchases and subscriptions for Kotlin Multiplatform apps

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.

Common code

One proxyURL assignment covers the Android and iOS targets.

A String

Unlike the native Android SDK, the KMP proxy URL is a String.

Verification off

EntitlementVerificationMode.DISABLED is the default.

Android caveat

The stock Android SDK underneath still sends diagnostics and events to RevenueCat.

Steps

How to add subscriptions to a Kotlin Multiplatform app with RevenueDot

  1. 01

    Create a free Cloud project

    Start free on Cloud and add an App Store app and a Google Play app, or a Test Store app for a first run.

  2. 02

    Connect the stores and create the catalog

    Add credentials (App Store, Google Play), then products, a pro entitlement and a current offering.

  3. 03

    Set the proxy URL in common code

    Assign Purchases.proxyURL before Purchases.configure, in code shared by both targets.

  4. 04

    Pass the right key per platform

    Pass the appl_ key on iOS and the goog_ key on Android to PurchasesConfiguration.

  5. 05

    Buy and check the entitlement

    Call awaitPurchase(pkg) and read customerInfo.entitlements.active. It throws PurchasesTransactionException on failure or cancel.

Kotlin

The Kotlin Multiplatform proxy URL change

Point the SDK at RevenueDotKotlin
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

Check an entitlement and make a purchase

RevenueCat's API, unchangedKotlin
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 RevenueDot fork package for Kotlin Multiplatform

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.

Planned fork installGradle
implementation("app.revenuedot.purchases:purchases-kmp-core:<version>")

Notes

Kotlin Multiplatform details worth knowing

  • Migrating from RevenueCat? Call Purchases.sharedInstance.awaitSyncPurchases() once from a coroutine on the first launch of the update.
  • Test Store keys work in debug builds only. iOS servers older than the 2026-09-30 fix could not serve Test Store products to the native iOS SDK, so update a self-hosted server.
  • Android: see the Android SDK page for the diagnostics caveat of the stock SDK.
  • Status: there is no Kotlin Multiplatform example app yet. The calls match the Android guide.

FAQ

Kotlin Multiplatform: questions people ask

How do I add in-app purchases to a Kotlin Multiplatform app?

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.

Is the proxy URL a String or a URL in purchases-kmp?

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".

Do I need to disable entitlement verification in KMP?

No. purchases-kmp already defaults to EntitlementVerificationMode.DISABLED. Never use ENFORCED, because RevenueDot cannot sign with RevenueCat's key and every request would fail.

Does RevenueDot work on both iOS and Android targets in KMP?

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

Run subscriptions without the revenue share.

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