# Create the products of your plans in App Store Connect and Google Play Console

The step `purchases.store_products`, for [`revenuecat`](https://doc.saymyframe.com/modules/revenuecat.md).

The plans of the app are products in the stores. Every plan gives the same premium access, so create one product for each plan that you sell, in both stores, such as:

| Plan | App Store | Google Play | Product ID |
| --- | --- | --- | --- |
| Monthly, with a free week | An auto-renewable subscription of 1 month, with an introductory offer | A subscription with a monthly base plan and a free trial offer | `premium_monthly` |
| Yearly | An auto-renewable subscription of 1 year | A subscription with a yearly base plan | `premium_yearly` |
| Lifetime | A non-consumable in-app purchase | A one-time product | `premium_lifetime` |

The same Product ID in both stores keeps the next steps simple. A Product ID can never be used again, in either store, even after you delete its product. On Google Play it starts with a lowercase letter or a digit, has at most 40 characters, and may have underscores and periods.

The paywall names these periods: every week, every 1, 2, 3 or 6 months, and every year. It names a free trial or a lower price at first of 3 days, 1 or 2 weeks, 1, 2, 3 or 6 months, or 1 year. These are the periods and trials of the App Store. Google Play offers more, such as every 4 weeks, and the paywall shows the title of such a product instead of the name of its period.

Do [the step about payments](https://doc.saymyframe.com/setup/purchases-store-agreements.md) first: App Store Connect lets you create no in-app purchase until the Paid Apps Agreement is signed.

:::tip
The screenshots use the app `My App`. The orange frames mark what to click, in the order of their numbers.
:::

## App Store Connect

**1. Create a subscription group.** In [App Store Connect](https://appstoreconnect.apple.com/), open **Apps** and your app. In the sidebar, under **Monetization**, click **Subscriptions** (1). In **Subscription Groups**, click **Create** (2), or **+** next to the heading once the app has a group.

![The page Subscriptions of an app in App Store Connect, with Subscriptions in the sidebar marked 1 and Create under Subscription Groups marked 2](https://doc.saymyframe.com/assets/images/subscriptions-create-d3c03159949a784090a787ce26be1fa2.png)

Enter a reference name (1), such as `Premium`, and click **Create** (2).

![The dialog Create Subscription Group, with the reference name Premium marked 1 and Create marked 2](https://doc.saymyframe.com/assets/images/subscription-group-a2317b75ee7f090613bf7a58dfd77325.png)

A user can take one introductory offer in a group, and moves between the plans of a group rather than having two at once, so put the subscriptions of the premium access into this one group. Under **Display Name and Description** of the group, click **Add** and enter the name that the App Store shows for it.

**2. Create a subscription.** On the page of the group, click **Create** (1), or **+** next to **Subscriptions** once the group has one.

![The page of the subscription group Premium in App Store Connect, with Create under Subscriptions marked 1](https://doc.saymyframe.com/assets/images/subscription-group-page-7306d07ad864366cc506aaee3178b1e3.png)

Enter a **Reference Name** (1), such as `Premium Monthly`, the **Product ID** (2), such as `premium_monthly`, and the **Subscription Duration** (3), such as 1 month, and click **Create** (4). Apple offers 1 week, 1, 2, 3 and 6 months, and 1 year. You cannot change the duration once the subscription is submitted.

![The dialog Create Subscription, with the reference name Premium Monthly marked 1, the Product ID premium_monthly marked 2, the duration 1 month marked 3 and Create marked 4](https://doc.saymyframe.com/assets/images/create-subscription-3dee0103cc8507a8e8c8268289961379.png)

On the page of the subscription, under **Availability**, click **Set Up Availability** (1) and choose the countries or regions where you sell. Under **Subscription Prices**, click **Add Subscription Price** (2).

![The sections Availability and Subscription Prices of a subscription, with Set Up Availability marked 1 and Add Subscription Price marked 2](https://doc.saymyframe.com/assets/images/subscription-prices-38f712a8e163d2553583297d36a4affb.png)

Choose a country or region and its price (1), such as United States and $4.99, and click **Next** (2). App Store Connect computes the prices of the other countries and regions from it. Change any of them on the next page, click **Next**, then **Confirm**.

![The dialog Subscription Pricing, with the country United States and the price $4.99 marked 1 and Next marked 2](https://doc.saymyframe.com/assets/images/subscription-pricing-ec40fe178defe362bc20718fabcdef43.png)

Then fill in:

- **Display Name and Description**: click **Add** and enter what the App Store shows.
- **Review Information**: a screenshot of the paywall and notes for App Review.

Click **Save**. Repeat for the yearly plan.

**3. Add a free trial.** On the page of the monthly subscription, click **+** next to **Subscription Prices** (1), then **Create Introductory Offer** (2). App Store Connect shows the **+** once the subscription has a price.

![The section Subscription Prices of a subscription, with + next to the heading marked 1 and Create Introductory Offer in its menu marked 2](https://doc.saymyframe.com/assets/images/intro-offer-menu-4b5b26fdb3e73c1fedf8057c4ee6076b.png)

Choose the countries or regions and click **Next**. Choose the start date, choose **No End Date** under **End Date**, and click **Next**. Choose the type **Free** (1) and its duration under **Free for** (2), such as 1 week. Click **Next**, then **Confirm**. **Pay as you go** and **Pay up front** give a lower price at first instead. An introductory offer cannot be edited later, only deleted and created again.

![The step Type of Introductory Offer, with the types Pay as you go, Pay up front and Free marked 1, where Free is chosen, and the duration Free for 1 week marked 2](https://doc.saymyframe.com/assets/images/intro-offer-type-b7856ec4223c62e7051b691d82df6163.png)

**4. Create the lifetime purchase.** In the sidebar, under **Monetization**, click **In-App Purchases**, then **+** next to the heading. Choose the type **Non-Consumable** (1), enter a reference name (2) and the Product ID (3), such as `premium_lifetime`, and click **Create** (4).

![The dialog Create an In-App Purchase, with the type Non-Consumable marked 1, the reference name Premium Lifetime marked 2, the Product ID premium_lifetime marked 3 and Create marked 4](https://doc.saymyframe.com/assets/images/iap-non-consumable-2cded5646993f64d6151578495b3b215.png)

On the page of the purchase, set a price in the section **Price Schedule**. In the section **Display Name and Description**, add a display name and a description. Add a screenshot under **Review Information**, and click **Save**.

**5. Send them with the app.** The first subscription and the first in-app purchase of an app go to App Review with a new version of the app. On the page of each product, click **Add for Review**, and submit them with the version.

## Google Play Console

**6. Upload a build.** Play Console lets you create products only once a version of the app with the Google Play Billing Library is on a track. The app has the library through RevenueCat, and the library declares the permission `com.android.vending.BILLING` itself, so the manifest needs no change. Build an app bundle, signed with your upload key, since Google Play takes no bundle that is signed with the debug key; see [Sign the app](https://docs.flutter.dev/deployment/android#sign-the-app) in the documentation of Flutter:

```bash
flutter build appbundle --dart-define-from-file=.env
```

In [Google Play Console](https://play.google.com/console), open the app, then **Test and release > Testing > Internal testing**. Click **Create new release** (1) and upload `build/app/outputs/bundle/release/app-release.aab` to it.

![The page Internal testing of an app in Play Console, with Create new release marked 1](https://doc.saymyframe.com/assets/images/internal-testing-de7f5ec56dc026d15d239cad560f8901.png)

**7. Create a subscription.** Open **Monetize with Play > Products > Subscriptions** and click **Create subscription** (1).

![The page Subscriptions of an app in Play Console, with Create subscription marked 1](https://doc.saymyframe.com/assets/images/subscriptions-56e6ff1ae590d0a6e655ff2e7aebf523.png)

Enter the **Product ID** (1), such as `premium_monthly`, and a **Name** (2), and click **Create** (3).

![The dialog Create subscription, with the Product ID premium_monthly marked 1, the name Premium Monthly marked 2 and Create marked 3](https://doc.saymyframe.com/assets/images/create-subscription-680bd4ec46336be29f8d98b963665d9e.png)

On the page of the subscription, under **Base plans and offers**, click **Add base plan**. Enter a **Base plan ID** (1), such as `monthly`, with lowercase letters, digits and hyphens. Choose the type **Auto-renewing** (2) and the **Billing period** (3), such as **Monthly**.

![The page Add base plan in Play Console, with the base plan ID monthly marked 1, the type Auto-renewing marked 2 and the billing period Monthly marked 3](https://doc.saymyframe.com/assets/images/base-plan-569925ed92d16407f107a6387e8539af.png)

Under **Price and availability**, click **Set prices**, check the countries and regions where you sell (the box in the header of the table checks all of them), and click **Set price**. Enter the price and its currency, such as 4.99 USD, and click **Update**. Click **Save**, then **Activate**.

Repeat for the yearly plan: a subscription `premium_yearly` with a base plan `yearly` whose billing period is **Yearly**.

**8. Add a free trial.** In the monthly subscription, under **Base plans and offers**, click **Add offer**, choose the base plan and click **Add offer**. Enter an **Offer ID**, such as `free-week`, and under **Eligibility criteria** choose **New customer acquisition**. Under **Phases**, click **Add phase**, choose the type **Free trial** and its duration (1), such as 1 week, and click **Apply**. Click **Save**, then **Activate**.

![The dialog Add phase of an offer in Play Console, with the type Free trial and the duration 1 week marked 1](https://doc.saymyframe.com/assets/images/offer-phase-91118f919fb8341992cc73b775310842.png)

**9. Create the lifetime product.** Open **Monetize with Play > Products > One-time products** and click **Create one-time product**. On **Product details**, enter the **Product ID** (1), such as `premium_lifetime`, a **Name** and a **Description**, and click **Next**.

![The first page of Create one-time product, Product details, with the Product ID premium_lifetime marked 1](https://doc.saymyframe.com/assets/images/one-time-product-efbb0bb40eff9e67dcdb46ab3ef3fc2d.png)

On **Availability and pricing**, add a purchase option with an ID and the purchase type **Buy**, set its prices, and click **Activate**. A one-time product that is bought once and kept for good is a non-consumable, and [the step in RevenueCat](https://doc.saymyframe.com/setup/revenuecat-entitlement-and-offering.md) marks it so.

**Check.** App Store Connect lists the subscriptions in their group and the non-consumable purchase, each with a price. Play Console lists the subscriptions with active base plans, the offer of the free week, and the one-time product as active.

To buy them on a device before a release, add testers: in App Store Connect under **Users and Access > Sandbox**, and in Play Console under **Manage account > Play apps settings > License testing**.

![The page Manage account of Play Console, with Manage account in the bar on the left marked 1 and License testing under Play apps settings marked 2](https://doc.saymyframe.com/assets/images/license-testing-d892326be6714d9d01add01a8b6aab19.png)

A license tester installs the app from the internal testing track and pays with a test card. In a debug build, leave `REVENUECAT_TEST_KEY` empty, so that the app sells through the store rather than the Test Store of RevenueCat.
