rc-configuring-the-sdk — Claude Code skill for RevenueCat Android SDK
A skill that walks the agent through wiring RevenueCat into an Android app: the Gradle dependency, Purchases.configure, app user id strategy and log level.
npx skills add RevenueCat/ai-toolkit --skill rc-configuring-the-sdk -a claude-codeWhat rc-configuring-the-sdk does
The skill runs in three phases. First the agent searches the project for an existing Purchases.configure call and for billing code built on BillingClient. Then it picks where configure belongs — Application.onCreate or the first Activity.onCreate — and which app user id to pass. The last phase is code: the com.revenuecat.purchases:purchases dependency in build.gradle.kts, a PurchasesConfiguration.Builder call, and a minimal offerings fetch to confirm the wiring.
One configure call covers what you would otherwise write by hand: creating and closing a BillingClient, startConnection, reconnection on SERVICE_DISCONNECTED, and querying unfinished transactions at launch. Configure runs once per process, so if the call is already there the skill tells the agent to stop and check with you before touching it.
Keep the public Android SDK key out of source — the skill suggests injecting it through BuildConfig or a secret manager. Gate the log level on BuildConfig.DEBUG, otherwise LogLevel.DEBUG ships to production. When offerings come back null, the usual culprit is a package name mismatch between Play Console and the dashboard, not your code.
What it helps with
- add RevenueCat to an Android app without missing the Gradle sync
- choose between an anonymous and a known app user id at startup
- drop hand-written
BillingClientconnection and reconnection logic - split log levels between debug and release builds
- track down why offerings come back empty
Example prompts for the agent
- wire the RevenueCat Android SDK into this project
- set up
Purchases.configureinApplication.onCreatewith an anonymous app user id - debug why
offerings.currentis null
How to install rc-configuring-the-sdk
1Skills CLI (Vercel)
npx skills add RevenueCat/ai-toolkit --skill rc-configuring-the-sdk -a claude-code2Manually: put the files in place
~/.claude/skills/rc-configuring-the-sdk/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/rc-configuring-the-sdk/
1Skills CLI (Vercel)
npx skills add RevenueCat/ai-toolkit --skill rc-configuring-the-sdk -a codex2Manually: put the files in place
.agents/skills/rc-configuring-the-sdk/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add RevenueCat/ai-toolkit --skill rc-configuring-the-sdk -a cursor2Manually: put the files in place
.cursor/skills/rc-configuring-the-sdk/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install RevenueCat/ai-toolkit rc-configuring-the-sdk2Manually: put the files in place
.github/skills/rc-configuring-the-sdk/SKILL.md1Skills CLI (Vercel)
npx skills add RevenueCat/ai-toolkit --skill rc-configuring-the-sdk -a gemini-cli2Platform CLI
gemini skills install https://github.com/RevenueCat/ai-toolkit --path revenuecat-play-billing/skills/rc-configuring-the-sdkManually: put the files in place
.devin/skills/rc-configuring-the-sdk/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add RevenueCat/ai-toolkit --skill rc-configuring-the-sdk -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about rc-configuring-the-sdk
How do I install rc-configuring-the-sdk in Claude?
Run npx skills add RevenueCat/ai-toolkit --skill rc-configuring-the-sdk -a claude-code. The skill lands at ~/.claude/skills/rc-configuring-the-sdk/SKILL.md.
What does rc-configuring-the-sdk do?
It guides the agent through adding the RevenueCat Android SDK: finding any existing configure call and old billing code, adding the Gradle dependency, writing Purchases.configure, and verifying with an offerings fetch.
Does the skill need an API key?
Yes, PurchasesConfiguration.Builder takes the public Android SDK key. The skill advises keeping it out of source and injecting it through BuildConfig or a secret manager.
Source text
SKILL.md · MIT
---
name: rc-configuring-the-sdk
description: Use this skill when adding and configuring the RevenueCat Android SDK (purchases-kt/purchases) in an app. Covers the Gradle dependency, Purchases.configure with PurchasesConfiguration, initial app user id strategy, and log level.
license: Apache-2.0; see LICENSE
metadata:
author: RevenueCat
source: revenuecat-handbook chapter 5
keywords:
- android
- revenuecat
- configure
- purchases-configuration
- app-user-id
- sdk
---
# Configuring the RevenueCat Android SDK
Use this skill to add and configure RevenueCat (`purchases-kt`) in an Android app. A single `Purchases.configure` call replaces `BillingClient` setup, connection lifecycle management, reconnection handling, and launch-time purchase queries.
Work through the phases in order. The [full chapter on revenuecat.com](https://www.revenuecat.com/guides/revenuecat-android-sdk/configuring-the-sdk) has the complete reference text.
## Phase 1: Discovery
Find out whether RevenueCat is already wired up and where billing code currently lives.
1. Search for an existing configure call and prior SDK version.
```bash
rg -n "Purchases\.configure|PurchasesConfiguration" --type kotlin --type java
rg -n "com\.revenuecat\.purchases" -g '*.gradle*' -g '*.toml'
```
2. Search for the existing billing surface you may be replacing.
```bash
rg -n "BillingClient|PurchasesUpdatedListener|startConnection" --type kotlin --type java
```
3. Record answers before moving on.
| Question | Where to look |
| --- | --- |
| Is `Purchases.configure` already called? | App startup, `Application.onCreate`, main `Activity.onCreate` |
| Which module owns billing today? | `app/build.gradle(.kts)`, any `:billing` module |
| Is there an auth system with a stable user id? | Login flow, session store |
| Debug vs release build detection available? | `BuildConfig.DEBUG` |
If `Purchases.configure` already runs, stop and confirm with the user before changing it. Configuration runs once per process.
## Phase 2: Plan
Decide three things before writing code.
### 2.1 Where to call configure
| Location | When to choose |
| --- | --- |
| `Application.onCreate` | Default. Ensures the SDK is ready before any `Activity` or background work touches purchases. |
| First `Activity.onCreate` | Only if the app has no custom `Application` class and you are not willing to add one. |
Call `configure` exactly once per process. Calling it from an `Activity` risks re-running it on configuration changes if you are not careful; the `Application` path avoids that.
### 2.2 App user id strategy
| Strategy | Pass to `appUserID` | Use when |
| --- | --- | --- |
| Anonymous | `null` | Users can purchase before signing in, or you have no auth. Later call `Purchases.sharedInstance.logIn(id)` to merge history. |
| Known user | Your stable backend id (for example `"user_12345"`) | Users are always authenticated before purchase. |
Do not pass device ids, email addresses, or values that can change. If you do not have the id at startup, configure anonymously and call `logIn` after authentication.
### 2.3 Log level
| Build | Log level |
| --- | --- |
| Debug | `LogLevel.DEBUG` or `VERBOSE` while integrating |
| Release | `LogLevel.INFO` (default) or `WARN` |
Switch on `BuildConfig.DEBUG` so production builds stay quiet.
## Phase 3: Execute
### 3.1 Add the Gradle dependency
In the app module `build.gradle.kts`:
```kotlin
dependencies {
implementation("com.revenuecat.purchases:purchases:<latest>")
}
```
Replace `<latest>` with the current published version. If the project uses a Groovy `build.gradle`, use `implementation 'com.revenuecat.purchases:purchases:<latest>'`. Sync Gradle after the change.
### 3.2 Call configure at startup
In your `Application` subclass:
```kotlin
class App : Application() {
override fun onCreate() {
super.onCreate()
Purchases.logLevel =
if (BuildConfig.DEBUG) LogLevel.DEBUG else LogLevel.INFO
Purchases.configure(
PurchasesConfiguration.Builder(this, BuildConfig.RC_API_KEY)
.appUserID(null) // or your stable user id
.build()
)
}
}
```
Register the class in `AndroidManifest.xml` with `android:name=".App"` on `<application>`. Keep the public Android SDK key out of source; inject it through `BuildConfig` or a secret manager.
### 3.3 Confirm the wiring with a minimal offerings fetch
From any coroutine scope after `configure` has run:
```kotlin
lifecycleScope.launch {
val offerings = Purchases.sharedInstance.awaitOfferings()
Log.d("RC", "current=${offerings.current?.identifier}")
}
```
A non-null `offerings.current` identifier means the API key, package name, and network path are working. If you see `null`, check the dashboard offering setup and the package name match before touching code.
## What the SDK handles for you
Once configured, you do not need to:
- Create or close a `BillingClient`
- Call `startConnection` or `endConnection`
- Check `isReady` or write reconnection logic for `SERVICE_DISCONNECTED`
- Call `queryPurchasesAsync` at launch; the SDK posts unfinished transactions automatically
## Common pitfalls
| Symptom | Likely cause |
| --- | --- |
| `IllegalStateException: There is no singleton instance` | Code touched `Purchases.sharedInstance` before `configure` ran. Move `configure` to `Application.onCreate`. |
| Offerings always `null` | Package name mismatch between Play Console and dashboard, or offering not marked current. |
| Duplicate anonymous users | `configure` called more than once per process, or an unstable id passed as `appUserID`. |
| Verbose logs in production | Log level not gated on `BuildConfig.DEBUG`. |
## References
- [Full chapter](https://www.revenuecat.com/guides/revenuecat-android-sdk/configuring-the-sdk)
© RevenueCat · MIT · RevenueCat/ai-toolkit