> ## Documentation Index
> Fetch the complete documentation index at: https://www.minitap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# In-app purchases

> Let Mini buy products and subscriptions in your app without charging anyone, on iOS simulators and on physical iPhones and Android phones.

> [!NOTE]
>
> **Beta.** In-app purchase testing is in beta. Purchases on physical phones need a phone set up for purchases, which you request from the **In-app purchases** page.

Mini can go through a purchase, a subscription or a restore of purchases in your app, with sandbox buyers so nobody is charged. This page shows where Mini can buy, what to set up once per app for each kind of device, and how to mark the scenarios that buy.

## Where Mini can buy

| Device | Ready to buy | What you set up |
| - | - | - |
| **iOS cloud simulators** | Right away | Nothing |
| **Physical iPhones** | Once per app | A TestFlight or Ad Hoc build, and a Sandbox Apple Account on each iPhone |
| **Physical Android phones** | Once per app | Google Play license testers, an internal testing link and your usual APK |
| **Android cloud emulators** | Not available yet | They run without Google Play, so scenarios that buy run on your physical Android phones |

Set it up in your app under **Builds & test data → In-app purchases**. The page shows each device type with its status, and each setup step says who does it (**You**, **Minitap** or **Automatic**) and whether it's **Done**, **To do** or **Waiting on Minitap**. Only workspace owners and admins can set up in-app purchases.

![In-app purchases: tabs for iOS cloud simulators (ready), iOS physical iPhones, Android physical phones and Android cloud emulators, with the sandbox buyer step and Request iPhones](https://mintcdn.com/minitap-30239763/QCLbAMcddko_3eZy/minitest/images/app/in-app-purchases.png?fit=max\&auto=format\&n=QCLbAMcddko_3eZy\&q=85\&s=e8e6a0f07ed51c7acb064030258261ac)

One tab per device type, each with what is left to set up.

The workspace view lives in **Settings → In-app purchases**: the phones set aside for purchases, the buyer on each, your Sandbox Apple Accounts and which apps are ready. The setup itself happens in each app.

## iOS simulators

There is nothing to set up. Mini loads your App Store Connect products into a local StoreKit test store as the app starts, so purchases and subscriptions complete without charging anyone. Apps that use RevenueCat are covered too: purchases are recorded and entitlements are granted, as long as your RevenueCat app has its In-App Purchase key.

> [!WARNING]
>
> Purchases on simulators are signed locally by Xcode, so a backend that checks them directly with Apple may refuse them. Write purchase criteria against what the app shows.

## Physical iPhones

You need an iPhone assigned to your workspace (see [Devices](https://www.minitap.ai/docs/minitest/setup/devices.md#get-physical-phones)). Then two steps, once per app.

**1. Let the iPhones install your app**

Pick how your build reaches the iPhones. This also serves every physical iPhone run, purchases or not.

* **TestFlight** (recommended). Invite our Apple ID as a tester and paste the public link. New builds and new iPhones need nothing more from you.
* **Ad Hoc or Development .ipa**. Register our iPhones in your Apple Developer account (**Copy UDID** on each one), export the build for them and upload it. Every new build and every new iPhone means a new profile and a new upload. Minitap reads the profile and tells you which iPhones can install it.

The build has to be signed by your own team: a build signed by another team can't load your App Store Connect products. See [TestFlight and Ad Hoc](https://www.minitap.ai/docs/minitest/setup/upload-a-build.md#physical-iphones-testflight-and-ad-hoc).

**2. Give each iPhone a Sandbox Apple Account**

In App Store Connect, open **Users and Access › Sandbox › Test Accounts** and create one account per iPhone, in the team that owns your apps: a Sandbox Apple Account only buys in its own team's apps. Use addresses nobody uses as a real Apple Account.

Back in Minitap, click **Add account** and fill the **Email**, **Password**, **Store country**, the **Apps** it covers and the **Device** it goes on. Pick the same country as in App Store Connect: it sets the store, the currency and the prices Mini sees.

The password is stored encrypted and never shown again. Minitap signs the account in on the iPhone before a run, and Mini types the password on Apple's purchase sheet. One account per iPhone means two runs never share a purchase history.

A Sandbox Apple Account is separate from your app's [test accounts](https://www.minitap.ai/docs/minitest/setup/test-accounts.md): Mini still signs in to your app with your usual test account, then pays with the sandbox account on Apple's sheet. If Apple rejects a password, the account shows **Apple rejected the password**: use **Update password** in **Settings → In-app purchases**.

## Physical Android phones

On Android, the buyers are ours. Minitap puts one Google account on each purchase phone, owned by Minitap and used only by your workspace. You list them in Play Console.

**1. Make our Google testers license testers**

In Play Console, open **Settings › License testing** and create an email list named `Minitap buyers` with the addresses Minitap shows (**Copy the tester addresses**). Tick the list, save, then click **I added them**. You do this once for your developer account, and it covers every app. Google shows these testers test cards, so nobody is charged.

**2. Let them install your app from Play**

Open your app in Play Console, then **Test and release › Internal testing › Testers**, tick `Minitap buyers` and save. Copy the link under **How testers join your test** and paste it in Minitap. Mini joins once on each phone. Internal testing needs no Google review, and the track only needs one release, any build.

**3. Upload your usual APK**

Mini installs the APK you [upload to Minitap](https://www.minitap.ai/docs/minitest/setup/upload-a-build.md), debug or release signed, as long as its package name matches the app in Play Console.

> [!WARNING]
>
> Test subscriptions renew every 5 minutes and end on their own. A one-time product stays owned until your app consumes it or you refund it in Play Console. If it doesn't, a scenario that buys it only passes on the first run.

## Purchase phones

Purchase scenarios run one per phone, each phone with its own buyer, so their purchases never mix. More phones means more purchase scenarios at once.

To get more, click **Request iPhones** or **Request Android phones**, pick **How many** and add anything Minitap should know, like a model, an OS version or a deadline. Minitap reviews every request, usually within one business day, and assigns the phones to your workspace. Then:

* **iPhones**: create one more Sandbox Apple Account per iPhone and add it here, about 2 minutes each. With TestFlight, the new iPhones install your app with no change on your side. With Ad Hoc builds, register the new UDIDs and upload a build signed for them.
* **Android phones**: add each new tester's address to your `Minitap buyers` list, about 30 seconds. Your internal track already uses that list, so every app is covered.

## Mark the scenarios that buy

Open a scenario that buys, subscribes or restores purchases, go to its **Setup** tab and turn on **Tests in-app purchases** under **In-app purchases**. Only those scenarios get a buyer. The others run anywhere, as before.

From the CLI, pass `--in-app-purchases` on `scenario create` or `scenario update`, and `--no-in-app-purchases` to turn it off:

```bash theme={"theme":{"light":"github-light","dark":"vesper"}}
minitest --json --app <app_id> scenario update <scenario_id> --in-app-purchases
```

## When a purchase scenario is skipped

On physical phones, a purchase scenario runs only on a phone set up to buy in your app. When none is ready, the scenario is skipped there instead of failing:

* **Physical iPhones**: no iPhone carries a Sandbox Apple Account that covers this app, or the iPhone linked to the account is no longer assigned to your workspace. iOS simulators still run the scenario.
* **Physical Android phones**: Google Play purchases aren't set up yet, the Google Play tester isn't confirmed yet, or the phone holding the tester isn't available.

The scenario's **In-app purchases** row says when this applies, and the run dialog warns you before launch, for example **1 in-app purchase scenario will be skipped on physical iPhones**. Finish the setup above, or pick simulators for those scenarios.

## Next steps

> [card] [Devices](https://www.minitap.ai/docs/minitest/setup/devices.md)
>
> Cloud devices, phones assigned to your workspace, and when you need one.

> [card] [Upload a build](https://www.minitap.ai/docs/minitest/setup/upload-a-build.md)
>
> The right file for each device, TestFlight links and Ad Hoc builds.

> [card] [Secrets and test files](https://www.minitap.ai/docs/minitest/setup/secrets-and-files.md)
>
> Test cards and passwords Mini types without seeing them.

> [card] [Run tests](https://www.minitap.ai/docs/minitest/runs/triggering-a-run.md)
>
> Pick scenarios, builds and devices for a run.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.