Cat Paywalls KMP is the Kotlin Multiplatform version of Cat Paywall Compose, demonstrating in-app purchases, entitlement, and server-driven paywalls on Kotlin Multiplatform for both Android and iOS using RevenueCat's purchases-kmp SDK and Compose Multiplatform. This project showcases how to share paywall and subscription logic across platforms while maintaining native performance.
The purpose of this repository is to demonstrate the following:
- In-app purchases (subscriptions) using Google Play Billing and App Store.
- Server-driven UI based paywall dialog with the RevenueCat's paywall editor.
- Checking user entitlements across platforms.
- Full UI implementation using Compose Multiplatform.
- A multi-module KMP project structure with shared business logic.
Cat Paywalls KMP is built using the RevenueCat SDK for Kotlin Multiplatform to implement in-app subscriptions and a paywall system on both Android and iOS. RevenueCat handles first-party purchases across platforms, manages customer data, supports A/B testing, and provides source-of-truth analytics.
- Turn Your App into Revenue: Building Paywalls in Android With Jetpack Compose: In-app subscriptions have become a popular way to monetize mobile applications that offer recurring value to users. In this article, you'll learn how to seamlessly implement in-app subscriptions and paywall features in Android using Jetpack Compose and the RevenueCat SDK.
- How to monetize Android apps with ad-free subscriptions using RevenueCat: Most apps monetize through ads using things like AdMob or Audience Network. To maximize your earnings with ads, you need to show as many of them as possible, which makes for a pretty lousy user experience.
- Server-driven UI SDK on Android: how RevenueCat enables remote paywalls without app updates: In this article, we'll explore the concept of server-driven UI, with a focus on how RevenueCat's Paywall Editor enables you to build and remotely update paywalls—without needing app updates—using RevenueCat's Android SDK.
- Simplify in-app purchase unit testing with RevenueCat’s Test Store: In-app purchase testing has long been a pain point in Android development. Setting up Google Play sandbox environments, managing test accounts, waiting for purchase verification, dealing with cached state… the friction is real. Luckily, RevenueCat’s Test Store is a solution to this problem — offering instant testing without the complexity of real billing systems. But the real benefit of Test Store isn’t just its simplified setup, it’s how it enables true unit testing of purchase flows, with minimal infrastructure.
💻 Codelab
-
RevenueCat Google Play Integration: In this codelab, you'll learn how to:
- Properly configure products on Google Play.
- Set up the RevenueCat dashboard and connect it to your Google Play products.
- Understanding Product, Offering, Package, and Entitlement.
- Create paywalls using the Paywall Editor.
-
RevenueCat App Store Integration
- Properly configure products on App Store Connect.
- Set up the RevenueCat dashboard and connect it to your App Store products.
- Understanding Product, Offering, Package, and Entitlement.
- Create paywalls using the Paywall Editor.
-
Kotlin Multiplatform Purchases & Paywalls Overview: In this codelab, you will:
- Integrate the Android KMP SDK into your project
- Implement in-app purchases in your Android application
- Learn how to distinguish between paying and non-paying users
- Build a paywall screen, which is based on a server-driven UI approach
You can build this project with the few steps below:
- Configure your RevenueCat dashboard following RevenueCat Google Play Integration codelab, and RevenueCat App Store Integration codelab.
- In RevenueCat dashboard, go to the "API Keys" menu on the left side, and copy the SDK API keys for Play Store and App Store.
- Put your Play Store API key to the Application class for Android, and iosApp for iOS.
- Replace the applicationId for your Google Play package name, configured on your ReveneuCat dasboard. For iOS, change the product bundle id and here with your App Bundle ID.
- Run the project.
- Android minimum SDK level 24, iOS 15+.
- 100% Compose Multiplatform based + Coroutines + Flow for asynchronous.
- RevenueCat SDK for KMP: RevenueCat allows you to implement in-app subscriptions, dynamic paywalls, actionable analytics, and plug-and-play experimentation tools across Android and iOS.
- Ktor: Kotlin-first HTTP client for networking with platform-specific engines (OkHttp for Android, Darwin for iOS).
- Metro: A compile-time dependency injection library for Kotlin Multiplatform, powered by KSP.
- Landscapist Coil3: Image loading library for Compose Multiplatform with placeholder support.
- Navigation Compose: JetBrains' Navigation library for Compose Multiplatform.
- JetBrains Lifecycle ViewModel: ViewModel support for Compose Multiplatform with lifecycle awareness.
This project follows Google's official architecture guidance with a multi-module structure adapted for Kotlin Multiplatform.
The project is organized into three main layers:
- composeApp: The main application module containing platform entry points (
androidMain,iosMain) and shared app code (commonMain). - feature modules: Individual feature screens like
home,article,paywalls,account, andsubscriptions. - core modules: Shared foundation including
model(data classes),network(Ktor client),data(repositories),designsystem(theme & components), andnavigation(routes).
Each feature module depends on core modules, and the composeApp module brings everything together with platform-specific configurations.
Anyone can contribute and improve this project following the Contributing Guideline.
All cat images used in this demo project are copyrighted and belong to Unsplash.
Support it by joining stargazers for this repository. ⭐
Also, follow the main contributor on GitHub for the next creations!
Copyright (c) 2025 RevenueCat, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.




