From 1145fd6671d15bcffedf6bf11d1543bc04bb9445 Mon Sep 17 00:00:00 2001 From: Tanya Aulachynskaya Date: Fri, 25 Sep 2026 15:56:22 +0200 Subject: [PATCH 1/4] feat(integrate-revenuecat): settle how the paywall is built before coding it Given "hook up RevenueCat", agents split: one hand-coded a paywall wired to offerings, another asked whether to use the paywall builder. The skills listed both paths as equal follow-ups with no recommendation. integrate-revenuecat now has an explicit paywall choice step: RevenueCat Paywall is the default for apps with no paywall screen, an existing screen is kept and wired to offerings, agents ask when they can and otherwise take the default and say so. purchase-flow and paywall point back at that choice. Co-Authored-By: Claude Opus 5.5 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- CHANGELOG.md | 9 +++++++ package.json | 2 +- revenuecat/.claude-plugin/plugin.json | 2 +- revenuecat/.codex-plugin/plugin.json | 2 +- revenuecat/.cursor-plugin/plugin.json | 2 +- revenuecat/gemini-extension.json | 2 +- revenuecat/plugin.json | 2 +- .../skills/integrate-revenuecat/SKILL.md | 26 ++++++++++++++++--- revenuecat/skills/revenuecat-paywall/SKILL.md | 4 +-- .../skills/revenuecat-purchase-flow/SKILL.md | 4 ++- 12 files changed, 45 insertions(+), 14 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 00537e0..0471b75 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -13,7 +13,7 @@ "displayName": "RevenueCat", "source": "./revenuecat", "description": "Set up RevenueCat, integrate it, and access data.", - "version": "2.3.0", + "version": "2.3.1", "category": "developer-tools", "author": { "name": "RevenueCat" }, "homepage": "https://www.revenuecat.com", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 913600e..f98308d 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -3,7 +3,7 @@ "name": "revenuecat", "displayName": "RevenueCat", "description": "Set up RevenueCat, integrate it, and access data.", - "version": "2.3.0", + "version": "2.3.1", "license": "MIT", "keywords": ["revenuecat", "in-app-purchases", "subscriptions", "monetization", "iap", "mcp"], "author": { diff --git a/CHANGELOG.md b/CHANGELOG.md index bfaafd9..c38049c 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ All notable changes to the RevenueCat AI Toolkit will be documented in this file The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.3.1] – 2026-09-25 + +### Changed + +- **integrate-revenuecat** now settles how the paywall is built before any paywall code is written: RevenueCat Paywall (recommended default, created via `create-paywall-ai` / `rc paywalls generate`) or a custom paywall wired to offerings. It keeps an existing paywall screen, asks when it can, and falls back to the recommendation with a note when it cannot ask. The description also triggers on "hook up RevenueCat" and adding subscriptions or in-app purchases. +- **revenuecat-purchase-flow** is scoped to custom (hand-coded) paywalls and points back at that choice; **revenuecat-paywall** drops a stale "(when available)" and points at the same choice. + +--- + ## [2.3.0] – 2026-09-18 ### Added diff --git a/package.json b/package.json index fa23731..a70834c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ai-toolkit", - "version": "2.3.0", + "version": "2.3.1", "description": "RevenueCat plugin marketplace for AI coding assistants", "type": "module", "scripts": { diff --git a/revenuecat/.claude-plugin/plugin.json b/revenuecat/.claude-plugin/plugin.json index 2adb878..6190c6e 100644 --- a/revenuecat/.claude-plugin/plugin.json +++ b/revenuecat/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "revenuecat", "displayName": "RevenueCat", "description": "Set up RevenueCat, integrate it, and access data.", - "version": "2.3.0", + "version": "2.3.1", "license": "MIT", "keywords": ["revenuecat", "in-app-purchases", "subscriptions", "monetization", "iap", "mcp"], "author": { diff --git a/revenuecat/.codex-plugin/plugin.json b/revenuecat/.codex-plugin/plugin.json index 83b9df3..573f30f 100644 --- a/revenuecat/.codex-plugin/plugin.json +++ b/revenuecat/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "revenuecat", - "version": "2.3.0", + "version": "2.3.1", "description": "Configure your RevenueCat integration and access data from your RevenueCat projects.", "homepage": "https://www.revenuecat.com/docs/tools/mcp/overview", "repository": "https://github.com/RevenueCat/ai-toolkit", diff --git a/revenuecat/.cursor-plugin/plugin.json b/revenuecat/.cursor-plugin/plugin.json index 7bf3838..c4afdb9 100644 --- a/revenuecat/.cursor-plugin/plugin.json +++ b/revenuecat/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "revenuecat", "description": "Configure your RevenueCat integration and access data from your RevenueCat projects.", - "version": "2.3.0", + "version": "2.3.1", "license": "MIT", "keywords": ["revenuecat", "in-app-purchases", "subscriptions", "monetization", "iap", "mcp"], "author": { diff --git a/revenuecat/gemini-extension.json b/revenuecat/gemini-extension.json index d7e4f93..eb73ff4 100644 --- a/revenuecat/gemini-extension.json +++ b/revenuecat/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "revenuecat", - "version": "2.3.0", + "version": "2.3.1", "description": "Configure RevenueCat projects, products, entitlements, and offerings from Gemini CLI.", "mcpServers": { "revenuecat": { diff --git a/revenuecat/plugin.json b/revenuecat/plugin.json index 085e9a9..ba02eba 100644 --- a/revenuecat/plugin.json +++ b/revenuecat/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "revenuecat", - "version": "2.3.0", + "version": "2.3.1", "description": "Set up RevenueCat, integrate it, and access data.", "author": { "name": "RevenueCat", diff --git a/revenuecat/skills/integrate-revenuecat/SKILL.md b/revenuecat/skills/integrate-revenuecat/SKILL.md index dc36b4b..adc2c11 100644 --- a/revenuecat/skills/integrate-revenuecat/SKILL.md +++ b/revenuecat/skills/integrate-revenuecat/SKILL.md @@ -1,6 +1,6 @@ --- name: integrate-revenuecat -description: End-to-end RevenueCat integration — sets up the dashboard side via the RevenueCat MCP or the `rc` CLI (project, app, public API key) and installs/configures the Purchases SDK in the app. Use when the user asks to add RevenueCat, integrate Purchases, install the RevenueCat SDK, set up a RevenueCat API key, configure Purchases on launch, or set up a brand new RevenueCat integration on iOS, Android, Kotlin Multiplatform, Flutter, or React Native. +description: End-to-end RevenueCat integration — sets up the dashboard side via the RevenueCat MCP or the `rc` CLI (project, app, public API key) and installs/configures the Purchases SDK in the app. Use when the user asks to add RevenueCat, hook up RevenueCat, add subscriptions or in-app purchases to an app, integrate Purchases, install the RevenueCat SDK, set up a RevenueCat API key, configure Purchases on launch, or set up a brand new RevenueCat integration on iOS, Android, Kotlin Multiplatform, Flutter, or React Native. --- # integrate-revenuecat: end-to-end RevenueCat integration @@ -10,6 +10,8 @@ Use this skill when the user wants to add RevenueCat to a project for the first 1. **Dashboard side** — set up the project, register the app, and obtain the public API key, through the RevenueCat MCP server or the `rc` CLI. 2. **App side** — install the Purchases SDK, call `Purchases.configure(…)` at app entry, and verify the configuration banner in the logs. +Once the SDK is configured, settle **how the paywall is built** (Section 5c) before writing any paywall code. + Walk them in order. Most integrations need both halves, even when the user asks "just install the SDK" — the SDK needs an API key from the dashboard. > If a project + app already exist and the user only wants to wire the SDK into code, jump to **Section 3** below. @@ -119,12 +121,30 @@ Check whether products, entitlements, and offerings are already set up in the pr 2. **Real-time Developer Notifications (RTDN)** — Set up a Cloud Pub/Sub topic. Configure in Play Console → Monetization setup. 3. If the user provides this information, register it via `create-app` / `update-app`. -### 5c. Subsequent skills +### 5c. Choose how the paywall is built + +The app still needs a paywall, and there are two ways to build one. This is a product decision, not an implementation detail, so settle it before writing any paywall code. + +- **RevenueCat Paywall (recommended default).** Designed in the dashboard and rendered by RevenueCatUI. Design, copy, and packages change without an app release, and paywall variants can be A/B tested with RevenueCat Experiments. Create it with `create-paywall-ai` (MCP) or `rc paywalls generate` (CLI), attached to the current offering (see `revenuecat-paywall-design`), then present it with `revenuecat-paywall`. +- **Custom paywall in code.** The app's own UI, with packages and prices from `getOfferings()` and the purchase handled by `revenuecat-purchase-flow`. Full visual control, but every design change ships in an app release and the paywall design cannot be A/B tested. Price and offering tests still work, because packages come from the offering. + +Pick the path: + +1. **The user already said which one.** Use it. +2. **The app has no paywall screen yet.** Recommend a RevenueCat Paywall. +3. **The app already has a paywall or subscription screen** (a screen listing plans or prices, a subscribe or upgrade button, hardcoded prices or product IDs). The user most likely wants that screen wired to offerings. Recommend keeping it, and mention that a RevenueCat Paywall could replace it. + +If you can ask the user, ask one question with both options, the recommended one first, each with a one-line trade-off. If you cannot ask (for example, you are running non-interactively), do not stop: take the recommendation above, and in your summary say which path you took and how to switch to the other. + +Do not hand-code a paywall screen by default just because it keeps the work in code. A new RevenueCat Paywall is an unpublished draft: tell the user to review it in the paywall builder, and publish it only when they ask, because the app renders the default fallback layout until a paywall is published and attached to the offering. + +### 5d. Subsequent skills Common follow-ups after `integrate-revenuecat`: +- `revenuecat-paywall-design` — create or edit the dashboard paywall. - `revenuecat-paywall` — display a dashboard-configured paywall. -- `revenuecat-purchase-flow` — implement purchase + restore manually. +- `revenuecat-purchase-flow` — implement purchase + restore for a custom paywall. - `revenuecat-entitlements-gate` — gate features behind active entitlements. - `revenuecat-identify-user` — wire `logIn` / `logOut` to the app's auth system. - `revenuecat-testing-setup` — set up a sandbox testing channel. diff --git a/revenuecat/skills/revenuecat-paywall/SKILL.md b/revenuecat/skills/revenuecat-paywall/SKILL.md index e8dc44e..02f407a 100644 --- a/revenuecat/skills/revenuecat-paywall/SKILL.md +++ b/revenuecat/skills/revenuecat-paywall/SKILL.md @@ -5,7 +5,7 @@ description: Display a RevenueCat paywall inside an app using the RevenueCatUI S # revenuecat-paywall: display a RevenueCat paywall -Use this skill when the user wants to show a paywall that is built and configured in the RevenueCat dashboard, using the native RevenueCatUI components. This skill does not cover building a custom paywall from scratch. For that, use `revenuecat-purchase-flow` (when available) and `Purchases.getOfferings(…)` directly. To create, edit, evaluate, or audit the dashboard paywall, use `revenuecat-paywall-design`. +Use this skill when the user wants to show a paywall that is built and configured in the RevenueCat dashboard, using the native RevenueCatUI components. This skill does not cover building a custom paywall from scratch. For that, use `revenuecat-purchase-flow` and `Purchases.getOfferings(…)` directly. If the user has not chosen between the two, see `integrate-revenuecat`, Section 5c. To create, edit, evaluate, or audit the dashboard paywall, use `revenuecat-paywall-design`. Prerequisite: `integrate-revenuecat` has already run. `Purchases.configure(…)` must succeed before a paywall can load. @@ -31,7 +31,7 @@ If several match (e.g. an `ios/` folder inside a Flutter project), pick the **ou - (c) Conditional present on a CTA tap, such as an "Upgrade" button in settings. - **RevenueCatUI owns the purchase flow.** Do not call `Purchases.purchase(…)` manually alongside a RevenueCatUI paywall. The paywall calls it internally. Listen for the dismiss or purchase completed callback to react in app code. - **Close button is opt in on most platforms.** Pass `displayCloseButton = true` (iOS / Flutter / RN) or `setShouldDisplayDismissButton(true)` (Android / KMP) when the paywall is presented modally and the user needs a way out. Skip it when presenting behind a sheet with its own grabber, or when wrapping the paywall in a navigation controller. -- **If the app needs a fully custom UI**, do not use this skill. Call `Purchases.getOfferings()` and render your own components. RevenueCatUI is only for dashboard templated paywalls. +- **If the user has chosen a fully custom UI**, do not use this skill. Call `Purchases.getOfferings()` and render your own components. RevenueCatUI is only for dashboard templated paywalls. ## 3. Implementation diff --git a/revenuecat/skills/revenuecat-purchase-flow/SKILL.md b/revenuecat/skills/revenuecat-purchase-flow/SKILL.md index 5fdf95b..05097d9 100644 --- a/revenuecat/skills/revenuecat-purchase-flow/SKILL.md +++ b/revenuecat/skills/revenuecat-purchase-flow/SKILL.md @@ -1,12 +1,14 @@ --- name: revenuecat-purchase-flow -description: Implement the RevenueCat purchase and restore flow. Use when the user asks to buy a package, purchase a subscription, fetch offerings, build paywall purchase logic, handle purchase errors, detect user cancelled, or restore previous purchases on iOS, Android, Kotlin Multiplatform, Flutter, or React Native. +description: Implement the RevenueCat purchase and restore flow. Use when the user asks to buy a package, purchase a subscription, fetch offerings, build the purchase logic behind a custom (hand-coded) paywall, handle purchase errors, detect user cancelled, or restore previous purchases on iOS, Android, Kotlin Multiplatform, Flutter, or React Native. --- # revenuecat-purchase-flow: buy a package and restore purchases Use this skill when the user wants to complete the purchase side of RevenueCat: fetch offerings, call `purchase`, deal with cancellation and errors, and expose a "Restore" action. It does not cover rendering a paywall UI (that lives in `revenuecat-paywall`) or gating features (that lives in `revenuecat-entitlements-gate`). +If the app has no paywall yet and the user has not asked for a custom one, settle how the paywall is built first (`integrate-revenuecat`, Section 5c). The default is a RevenueCat Paywall, which handles the purchase itself. + ## 1. Detect the platform Inspect the working directory and pick the **first** match, from top to bottom: From aa6f5bea6a6151273e2014877f538a82fcb0bcbb Mon Sep 17 00:00:00 2001 From: Tanya Aulachynskaya Date: Fri, 25 Sep 2026 16:29:18 +0200 Subject: [PATCH 2/4] docs(integrate-revenuecat): make clear the agent creates the RevenueCat Paywall Co-Authored-By: Claude Opus 5.5 --- revenuecat/skills/integrate-revenuecat/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/revenuecat/skills/integrate-revenuecat/SKILL.md b/revenuecat/skills/integrate-revenuecat/SKILL.md index adc2c11..a4a99d4 100644 --- a/revenuecat/skills/integrate-revenuecat/SKILL.md +++ b/revenuecat/skills/integrate-revenuecat/SKILL.md @@ -125,7 +125,7 @@ Check whether products, entitlements, and offerings are already set up in the pr The app still needs a paywall, and there are two ways to build one. This is a product decision, not an implementation detail, so settle it before writing any paywall code. -- **RevenueCat Paywall (recommended default).** Designed in the dashboard and rendered by RevenueCatUI. Design, copy, and packages change without an app release, and paywall variants can be A/B tested with RevenueCat Experiments. Create it with `create-paywall-ai` (MCP) or `rc paywalls generate` (CLI), attached to the current offering (see `revenuecat-paywall-design`), then present it with `revenuecat-paywall`. +- **RevenueCat Paywall (recommended default).** Hosted by RevenueCat and rendered by RevenueCatUI. You create it yourself with `create-paywall-ai` (MCP) or `rc paywalls generate` (CLI), attached to the current offering and informed by the app's codebase (see `revenuecat-paywall-design`), then present it with `revenuecat-paywall`. The user does not have to design anything in the dashboard; they can refine it later in the paywall builder. Design, copy, and packages change without an app release, and paywall variants can be A/B tested with RevenueCat Experiments. - **Custom paywall in code.** The app's own UI, with packages and prices from `getOfferings()` and the purchase handled by `revenuecat-purchase-flow`. Full visual control, but every design change ships in an app release and the paywall design cannot be A/B tested. Price and offering tests still work, because packages come from the offering. Pick the path: From 39591e61509b1f1e5de1af7351c9c42f4afd1709 Mon Sep 17 00:00:00 2001 From: Tanya Aulachynskaya Date: Fri, 25 Sep 2026 16:44:26 +0200 Subject: [PATCH 3/4] chore: leave the version bump to the release PR Co-Authored-By: Claude Opus 5.5 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- CHANGELOG.md | 9 --------- package.json | 2 +- revenuecat/.claude-plugin/plugin.json | 2 +- revenuecat/.codex-plugin/plugin.json | 2 +- revenuecat/.cursor-plugin/plugin.json | 2 +- revenuecat/gemini-extension.json | 2 +- revenuecat/plugin.json | 2 +- 9 files changed, 8 insertions(+), 17 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 0471b75..00537e0 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -13,7 +13,7 @@ "displayName": "RevenueCat", "source": "./revenuecat", "description": "Set up RevenueCat, integrate it, and access data.", - "version": "2.3.1", + "version": "2.3.0", "category": "developer-tools", "author": { "name": "RevenueCat" }, "homepage": "https://www.revenuecat.com", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index f98308d..913600e 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -3,7 +3,7 @@ "name": "revenuecat", "displayName": "RevenueCat", "description": "Set up RevenueCat, integrate it, and access data.", - "version": "2.3.1", + "version": "2.3.0", "license": "MIT", "keywords": ["revenuecat", "in-app-purchases", "subscriptions", "monetization", "iap", "mcp"], "author": { diff --git a/CHANGELOG.md b/CHANGELOG.md index c38049c..bfaafd9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,15 +5,6 @@ All notable changes to the RevenueCat AI Toolkit will be documented in this file The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [2.3.1] – 2026-09-25 - -### Changed - -- **integrate-revenuecat** now settles how the paywall is built before any paywall code is written: RevenueCat Paywall (recommended default, created via `create-paywall-ai` / `rc paywalls generate`) or a custom paywall wired to offerings. It keeps an existing paywall screen, asks when it can, and falls back to the recommendation with a note when it cannot ask. The description also triggers on "hook up RevenueCat" and adding subscriptions or in-app purchases. -- **revenuecat-purchase-flow** is scoped to custom (hand-coded) paywalls and points back at that choice; **revenuecat-paywall** drops a stale "(when available)" and points at the same choice. - ---- - ## [2.3.0] – 2026-09-18 ### Added diff --git a/package.json b/package.json index a70834c..fa23731 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ai-toolkit", - "version": "2.3.1", + "version": "2.3.0", "description": "RevenueCat plugin marketplace for AI coding assistants", "type": "module", "scripts": { diff --git a/revenuecat/.claude-plugin/plugin.json b/revenuecat/.claude-plugin/plugin.json index 6190c6e..2adb878 100644 --- a/revenuecat/.claude-plugin/plugin.json +++ b/revenuecat/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "revenuecat", "displayName": "RevenueCat", "description": "Set up RevenueCat, integrate it, and access data.", - "version": "2.3.1", + "version": "2.3.0", "license": "MIT", "keywords": ["revenuecat", "in-app-purchases", "subscriptions", "monetization", "iap", "mcp"], "author": { diff --git a/revenuecat/.codex-plugin/plugin.json b/revenuecat/.codex-plugin/plugin.json index 573f30f..83b9df3 100644 --- a/revenuecat/.codex-plugin/plugin.json +++ b/revenuecat/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "revenuecat", - "version": "2.3.1", + "version": "2.3.0", "description": "Configure your RevenueCat integration and access data from your RevenueCat projects.", "homepage": "https://www.revenuecat.com/docs/tools/mcp/overview", "repository": "https://github.com/RevenueCat/ai-toolkit", diff --git a/revenuecat/.cursor-plugin/plugin.json b/revenuecat/.cursor-plugin/plugin.json index c4afdb9..7bf3838 100644 --- a/revenuecat/.cursor-plugin/plugin.json +++ b/revenuecat/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "revenuecat", "description": "Configure your RevenueCat integration and access data from your RevenueCat projects.", - "version": "2.3.1", + "version": "2.3.0", "license": "MIT", "keywords": ["revenuecat", "in-app-purchases", "subscriptions", "monetization", "iap", "mcp"], "author": { diff --git a/revenuecat/gemini-extension.json b/revenuecat/gemini-extension.json index eb73ff4..d7e4f93 100644 --- a/revenuecat/gemini-extension.json +++ b/revenuecat/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "revenuecat", - "version": "2.3.1", + "version": "2.3.0", "description": "Configure RevenueCat projects, products, entitlements, and offerings from Gemini CLI.", "mcpServers": { "revenuecat": { diff --git a/revenuecat/plugin.json b/revenuecat/plugin.json index ba02eba..085e9a9 100644 --- a/revenuecat/plugin.json +++ b/revenuecat/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "revenuecat", - "version": "2.3.1", + "version": "2.3.0", "description": "Set up RevenueCat, integrate it, and access data.", "author": { "name": "RevenueCat", From 968b7194e1263337d6903448b18ec934239c1bc4 Mon Sep 17 00:00:00 2001 From: Tanya Aulachynskaya Date: Fri, 25 Sep 2026 17:01:43 +0200 Subject: [PATCH 4/4] fix(integrate-revenuecat): hand paywall creation to revenuecat-paywall-design Co-Authored-By: Claude Opus 5.5 --- revenuecat/skills/integrate-revenuecat/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/revenuecat/skills/integrate-revenuecat/SKILL.md b/revenuecat/skills/integrate-revenuecat/SKILL.md index a4a99d4..ace48ee 100644 --- a/revenuecat/skills/integrate-revenuecat/SKILL.md +++ b/revenuecat/skills/integrate-revenuecat/SKILL.md @@ -125,7 +125,7 @@ Check whether products, entitlements, and offerings are already set up in the pr The app still needs a paywall, and there are two ways to build one. This is a product decision, not an implementation detail, so settle it before writing any paywall code. -- **RevenueCat Paywall (recommended default).** Hosted by RevenueCat and rendered by RevenueCatUI. You create it yourself with `create-paywall-ai` (MCP) or `rc paywalls generate` (CLI), attached to the current offering and informed by the app's codebase (see `revenuecat-paywall-design`), then present it with `revenuecat-paywall`. The user does not have to design anything in the dashboard; they can refine it later in the paywall builder. Design, copy, and packages change without an app release, and paywall variants can be A/B tested with RevenueCat Experiments. +- **RevenueCat Paywall (recommended default).** Hosted by RevenueCat and rendered by RevenueCatUI. You create it yourself: load the `revenuecat-paywall-design` skill and follow its creating workflow (`create-paywall-ai` via MCP or `rc paywalls generate` via CLI, attached to the current offering and informed by the app's codebase), then present it with `revenuecat-paywall`. The user does not have to design anything in the dashboard; they can refine it later in the paywall builder. Design, copy, and packages change without an app release, and paywall variants can be A/B tested with RevenueCat Experiments. - **Custom paywall in code.** The app's own UI, with packages and prices from `getOfferings()` and the purchase handled by `revenuecat-purchase-flow`. Full visual control, but every design change ships in an app release and the paywall design cannot be A/B tested. Price and offering tests still work, because packages come from the offering. Pick the path: