Skip to content

Automate your full mobile subscription stack: Claude Code + RevenueCat MCP + gplay

Historically, launching a new mobile subscription tier meant a checklist across three or four dashboards: Play Console for the Android product, App Store Connect for iOS, RevenueCat for entitlements and offerings, some paywall builder for the UI. Each dashboard has its own click paths, its own idempotency semantics, its own way to be wrong.

With Claude Code, the RevenueCat MCP server, and gplay, the whole thing becomes one prompt.

Three ingredients:

  1. Claude Code — Anthropic’s terminal-native AI coding agent. Reads your project, calls tools, writes code.
  2. RevenueCat MCP — the RevenueCat team’s Model Context Protocol server. Exposes entitlements, offerings, packages, products, paywalls, customers, and revenue analytics as callable tools.
  3. gplay — the AI-agent-native Google Play Console CLI. Covers 250+ commands across 6 Google APIs, JSON-first, --dry-run on every write.

Install:

Terminal window
# gplay
brew install tamtom/tap/gplay
gplay setup --auto
# Agent Skills so Claude Code knows the real Play workflows
npx skills add tamtom/gplay-cli-skills

RevenueCat MCP setup: follow their docs. Adds a block to your Claude Code config that registers the MCP server with your RC secret key.

Every RevenueCat MCP tool + every gplay command + gh, git, your Gradle build. The intersection is powerful.

Here’s a session that stood up a real subscription tier in one prompt (transcript compressed).

Launch a new “Pro” subscription for com.example.app:

  • Monthly at $9.99 with a 7-day free trial for new users, PPP prices to all supported countries.
  • Yearly at $89.99 (25% saving vs monthly).
  • Register both as Play products, then map into RevenueCat as a “Pro” entitlement, an “default” offering with $rc_monthly and $rc_annual packages.
  • Generate an AI paywall — hero: “Unlock Pro”, features from the app’s README, testimonial style similar to our existing “starter” paywall.
  • Add a targeting rule: users on our existing “starter” entitlement get shown a “$rc_annual” upsell offering instead of “default”.
  • Show me the final paywall screenshot and a summary of what you shipped. Don’t actually flip anything live — use --dry-run for the Play writes so I can review.
  1. gplay apps list → confirmed access to com.example.app.
  2. gplay subscriptions create --product-id pro --listing en-US:... (dry-run) → showed the JSON payload.
  3. gplay baseplans create --base-plan-id monthly --billing-period P1M ... (dry-run) for both plans.
  4. gplay baseplans prices set --region US --price-micros 9990000 → then gplay baseplans prices convert --from-region US.
  5. gplay offers create --offer-id monthly-trial-7d --phases FREE_TRIAL,P7D,0.
  6. RC MCP create-product-in-store → registered pro:monthly and pro:yearly.
  7. RC MCP create-entitlement → “Pro”.
  8. RC MCP attach-products-to-entitlement → linked both products.
  9. RC MCP create-offering “default” → create-packages for $rc_monthly and $rc_annualattach-products-to-package.
  10. cat README.md → extracted feature list for the paywall copy.
  11. RC MCP list-paywalls → found existing “starter” paywall → get-paywall for style reference.
  12. RC MCP create-paywall-ai with the description → returned task ID.
  13. RC MCP poll get-paywall-ai-task → 30s later, complete.
  14. RC MCP render-paywall-screenshot → saved PNG to ./paywalls/pro-launch.png.
  15. RC MCP list-targeting-rules → confirmed “starter” entitlement exists.
  16. RC MCP create targeting rule: entitlement=starterassign-customer-offering annual-upsell.
  17. Printed a summary table of everything created + the paywall screenshot.

You read the dry-run payloads. If they look right, you say “go” and Claude Code re-runs step 2-9 for real (drops --dry-run from the gplay commands; RC MCP calls are idempotent).

The one-prompt launch is the flashy demo. The real value shows up in the ongoing operations.

Weekly business review, prompt-driven:

Pull the last 7 days of RevenueCat overview metrics. For any product with >10% trial-to-paid drop-off vs the previous week, cross-reference with gplay’s vitals — are there crashes on the paywall screen? Rank issues by revenue impact and file GitHub issues for the top three.

Chains: RC MCP get-overview-metrics → RC MCP get-chart-data for trial cohorts → gplay vitals crashes query filtered to specific screens → RC MCP get-benchmarks for industry context → gh issue create.

Price experiments, safely:

Add a targeting rule: 10% of new Indian users get the “budget” offering with a ₹299 monthly price. Everyone else stays on default. Wire it up in RC and make sure the ₹299 monthly base plan actually exists on Google Play (create it if not).

Chains: gplay baseplans list → conditional baseplans create → gplay baseplans prices set --region IN → RC MCP create-offering “budget” → create-targeting-rule.

Refund reconciliation:

Pull the last 24 hours of Google Play voided purchases. For each, revoke the RevenueCat entitlement grant for that customer.

Chains: gplay purchases voided list --start-time <24h ago> → for each: RC MCP get-customer by originalTransactionId → RC MCP revoke grant.

Both surfaces are agent-native, but they cover different territory:

  • gplay is the writer of truth. It manipulates Play Console state directly. When you need something to actually exist in Google Play, gplay does it.
  • RC MCP is the reader of state. It sees your Play products (via RC’s own webhooks + polling), aggregates the cross-store view, and lets the agent reason about entitlements/customers/revenue across iOS and Android.

Neither alone gets you to “one-prompt launch.” Together they do.

Terminal window
brew install tamtom/tap/gplay
gplay setup --auto
npx skills add tamtom/gplay-cli-skills

Add the RevenueCat MCP to your Claude Code config with your RC secret key. Then open Claude Code in your Android project and try:

Show me every subscription on Google Play for com.example.app, then show me the matching RevenueCat entitlements and offerings. Any drift?

The answer to that question was previously a 30-minute audit across two dashboards. Now it’s a prompt.