onebox

Guide 13 of 30

For your agent: .md · all guides

On this page
  1. What it costs
  2. Use RevenueCat’s own Claude Code plugin
  3. Steps
  4. Where the values go
  5. Check it works
  6. The paywall
  7. Free access for reviewers and family
  8. Yearly plans
  9. Common errors

RevenueCat

Runs on: your browser (RevenueCat and App Store Connect), then your app and your server.

RevenueCat sits between your app and Apple’s in-app purchase system. The app asks RevenueCat what to show and who has paid. RevenueCat validates purchases with Apple, tracks renewals and cancellations, and can tell your server with webhooks. You do not need to parse Apple receipts. You need it only if the app sells subscriptions or other in-app purchases.

Before you start you need, in App Store Connect (app-store-connect-setup.md):

What it costs

Free up to 2,500 USD of monthly tracked revenue. Above that, 1% of tracked revenue. Checked 2026-09-28 at https://www.revenuecat.com/pricing/.

Use RevenueCat’s own Claude Code plugin

RevenueCat publishes an official plugin with an MCP server and skills for the React Native SDK, offerings and paywalls. Use it for the SDK setup, products, entitlements, offerings and paywall work:

claude plugins marketplace add RevenueCat/ai-toolkit
claude plugins install revenuecat

It signs in with OAuth in your browser, so it needs no API key. Source: https://github.com/RevenueCat/ai-toolkit. MCP docs: https://www.revenuecat.com/docs/tools/mcp

The plugin is for Claude Code. In another coding agent, you can connect the MCP server directly. See the MCP docs above.

onebox does not repeat that work. This guide covers the account and the Apple side.

Steps

  1. Make an account at https://app.revenuecat.com and create a project for your app.
  2. Create the subscription products in App Store Connect first, with the ship-ios:appstore-connect skill (subs-create) or in the web UI. Pick product IDs you will keep forever, for example com.example.myapp.pro.yearly.
  3. Make an In-App Purchase key in App Store Connect: Users and Access, Integrations, then In-App Purchase. Generate a key and download the .p8 file (once only). RevenueCat needs it to record StoreKit 2 purchases; without it, purchases can fail to record. Note its Key ID.
  4. Add the App Store app to the RevenueCat project: bundle ID, the In-App Purchase key file and its Key ID, and the Issuer ID (the same one as your App Store Connect API key). RevenueCat can also take an App Store Connect API key to import your products.
  5. Set up products, an entitlement and an offering in RevenueCat (or let the RevenueCat plugin do it). The product IDs must match App Store Connect exactly.
  6. Copy the public SDK key for the App Store app (it starts with appl_) from the project’s API keys page. It ships inside the app, so it is not a secret. Put it in eas.json env for each build profile, for example EXPO_PUBLIC_REVENUECAT_IOS_KEY.
  7. Make a sandbox tester in App Store Connect (Users and Access, Sandbox), and test a purchase, a restore and a cancellation on a real device before you submit.

Where the values go

Check it works

The paywall

The RevenueCat plugin builds the paywall screen. This part is about what goes on it and what it charges. Decide the price first, then the screens.

Set the price

Two numbers set the price: what similar apps charge, and what one user costs you.

  1. Write down what competitors charge. Find 4 to 6 apps that do the same job. Note the monthly and the yearly price of each. Put your app where its features belong in that list. An app that only logs data sits at the low end. An app with AI that does real work for the user sits higher.
  2. Measure what one user costs you per month. If the app calls an AI model, add up the cost of a light, a median and a heavy user per month. Use real token counts from a development build, not a guess. hosted-ai-limits.md records the cost of each call.
  3. Work out what you keep. Apple keeps a commission on each sale. In the App Store Small Business Program it is 15%, so you keep 85%. Compare the yearly price net, per month, with the median user’s cost.

An example. The median user costs 1.20 USD a month, the heavy user 5 USD:

priceyou keep (85%)per monthvs median user
Monthly7.99 USD6.79 USD6.79 USD5.7×
Yearly49.99 USD42.49 USD3.54 USD3.0×

The 15% rate is not automatic. You must enroll. The Account Holder accepts the Paid Apps Agreement, then enrolls on Apple’s page. The rate starts 15 days after the end of the month in which Apple approves you. It holds while your total proceeds stay at or below 1 million USD in a calendar year. Above that, the standard rate applies to later sales. Enroll before your first sale. Checked 2026-10-15 at https://developer.apple.com/app-store/small-business-program/.

Check the subscription levels in App Store Connect. Level 1 is the highest level in a subscription group. A move to a higher level happens at once, with a prorated refund. A move to a lower level waits for the next renewal. The API can give levels in the order you create the products. Then monthly may end up above yearly, and a switch from yearly to monthly refunds most of the year. Put yearly at the same level as monthly, or above it. Source: https://developer.apple.com/app-store/subscriptions/.

Design the paywall

Tests that guard the paywall

The paywall makes claims about the user’s money. Keep the copy as data (a headline per reason, the trial line, the saving), so plain unit tests can check it:

Unit tests cannot buy anything. Test a real purchase with a sandbox tester on a device (step 7).

Free access for reviewers and family

You may want to give the paid tier to people who do not pay: family, a tester, a reviewer. Do not write the gift into the paid tier. The webhook owns the paid tier: the next purchase, EXPIRATION or TRANSFER event rewrites it, and the gift is lost without a trace.

Keep the gift in its own column:

A gift needs a stable user ID. Give it after the user signs in with Apple. An anonymous account gets a new ID on reinstall, and the gift stays on the old one.

Tell the app when the access is a gift. Then it hides “Manage subscription” and “Restore purchases”, which would open an empty page.

Keep the AI cost cap on gifted accounts. The cap protects your bill, and a gifted account can loop like any other.

Yearly plans

A yearly plan sends RENEWAL once a year, not once a month. Code that refills a monthly AI allowance on INITIAL_PURCHASE and RENEWAL leaves a yearly buyer with nothing after the first month. Let the webhook set only the tier and the expiry date. Reset the allowance on your own clock. hosted-ai-limits.md, “Paid plans”, shows how.

Common errors

Wrong or out of date? Fix it on GitHub.