---
description: Practical tips for setting up in-app purchases and subscriptions in your Capacitor app for iOS and Android using the Purchases plugin.
title: Tips for Setting Up In-App Purchases with Capacitor - Capawesome
image: https://capawesome.io/docs/assets/images/social/blog/tips-for-setting-up-in-app-purchases-with-capacitor.png
---

<!doctype html> 

[Skip to content ](#tips-for-setting-up-in-app-purchases-with-capacitor) 

[🖥️ Introducing the **Capacitor Electron Platform** — build desktop apps for macOS, Windows, and Linux. Free & open source. ](/blog/announcing-the-capacitor-electron-platform/) 

* [ SDKs ](/docs/sdks/)
* [ Formbricks ](/docs/sdks/capacitor/formbricks/)
* [ Geocoder ](/docs/sdks/capacitor/geocoder/)
* [ Google Sign-In ](/docs/sdks/capacitor/google-sign-in/)
* [ Grafana Faro ](/docs/sdks/capacitor/grafana-faro/)
* [ Gyroscope ](/docs/sdks/capacitor/gyroscope/)
* [ Haptics ](/docs/sdks/capacitor/haptics/)
* [ Home Indicator ](/docs/sdks/capacitor/home-indicator/)
* [ In-App Browser ](/docs/sdks/capacitor/in-app-browser/)
* [ Install Referrer ](/docs/sdks/capacitor/install-referrer/)
* [ Intercom ](/docs/sdks/capacitor/intercom/)
* [ Intune ](/docs/sdks/capacitor/intune/)
* [ Keep Awake ](/docs/sdks/capacitor/keep-awake/)
* [ libSQL ](/docs/sdks/capacitor/libsql/)
* [ Light Sensor ](/docs/sdks/capacitor/light-sensor/)
* [ Live Update ](/docs/sdks/capacitor/live-update/)
* [ Localization ](/docs/sdks/capacitor/localization/)
* [ Mail Composer ](/docs/sdks/capacitor/mail-composer/)
* [ Managed Configurations ](/docs/sdks/capacitor/managed-configurations/)
* [ Maps Launcher ](/docs/sdks/capacitor/maps-launcher/)
* [ Media Session ](/docs/sdks/capacitor/media-session/)
* [ ML Kit ](/docs/sdks/capacitor/mlkit/)
* [ Navigation Bar ](/docs/sdks/capacitor/navigation-bar/)
* [ Network ](/docs/sdks/capacitor/network/)
* [ NFC ](/docs/sdks/capacitor/nfc/)
* [ Node.js ](/docs/sdks/capacitor/nodejs/)
* [ OAuth ](/docs/sdks/capacitor/oauth/)
* [ Passkeys ](/docs/sdks/capacitor/passkeys/)
* [ Password Autofill ](/docs/sdks/capacitor/password-autofill/)
* [ PDF Generator ](/docs/sdks/capacitor/pdf-generator/)
* [ PDF Viewer ](/docs/sdks/capacitor/pdf-viewer/)
* [ Pedometer ](/docs/sdks/capacitor/pedometer/)
* [ Permissions ](/docs/sdks/capacitor/permissions/)
* [ Phone Dialer ](/docs/sdks/capacitor/phone-dialer/)
* [ Photo Editor ](/docs/sdks/capacitor/photo-editor/)
* [ Photo Manipulator ](/docs/sdks/capacitor/photo-manipulator/)
* [ PixLive ](/docs/sdks/capacitor/pixlive/)
* [ PostHog ](/docs/sdks/capacitor/posthog/)
* [ Printer ](/docs/sdks/capacitor/printer/)
* [ Privacy Screen ](/docs/sdks/capacitor/privacy-screen/)
* [ Proximity Sensor ](/docs/sdks/capacitor/proximity-sensor/)
* [ Purchases ](/docs/sdks/capacitor/purchases/)
* [ RealtimeKit ](/docs/sdks/capacitor/realtimekit/)
* [ Root Detection ](/docs/sdks/capacitor/root-detection/)
* [ Screen Brightness ](/docs/sdks/capacitor/screen-brightness/)
* [ Screen Orientation ](/docs/sdks/capacitor/screen-orientation/)
* [ Screen Reader ](/docs/sdks/capacitor/screen-reader/)
* [ Screenshot ](/docs/sdks/capacitor/screenshot/)
* [ Secure Preferences ](/docs/sdks/capacitor/secure-preferences/)
* [ Settings Launcher ](/docs/sdks/capacitor/settings-launcher/)
* [ Shake ](/docs/sdks/capacitor/shake/)
* [ Silent Mode ](/docs/sdks/capacitor/silent-mode/)
* [ SIM ](/docs/sdks/capacitor/sim/)
* [ SMS Composer ](/docs/sdks/capacitor/sms-composer/)
* [ Speech Recognition ](/docs/sdks/capacitor/speech-recognition/)
* [ Speech Synthesis ](/docs/sdks/capacitor/speech-synthesis/)
* [ Share Target ](/docs/sdks/capacitor/share-target/)
* [ Square Mobile Payments ](/docs/sdks/capacitor/square-mobile-payments/)
* [ SQLite ](/docs/sdks/capacitor/sqlite/)
* [ Superwall ](/docs/sdks/capacitor/superwall/)
* [ System WebView ](/docs/sdks/capacitor/system-webview/)
* [ Tauri ](/docs/sdks/capacitor/tauri/)
* [ Text Interaction ](/docs/sdks/capacitor/text-interaction/)
* [ Text Zoom ](/docs/sdks/capacitor/text-zoom/)
* [ Thermal State ](/docs/sdks/capacitor/thermal-state/)
* [ Toast ](/docs/sdks/capacitor/toast/)
* [ Torch ](/docs/sdks/capacitor/torch/)
* [ Vault ](/docs/sdks/capacitor/vault/)
* [ Volume ](/docs/sdks/capacitor/volume/)
* [ Wallet ](/docs/sdks/capacitor/wallet/)
* [ Wifi ](/docs/sdks/capacitor/wifi/)
* [ YouTube Player ](/docs/sdks/capacitor/youtube-player/)
* [ Zip ](/docs/sdks/capacitor/zip/)
* [ Cordova ](/docs/sdks/cordova/)
* [ Cloud ](/docs/cloud/)
* [ Integrations ](/docs/cloud/live-updates/integrations/)
* Concepts
* Reference
* [ Troubleshooting ](/docs/cloud/live-updates/troubleshooting/)
* [ FAQ ](/docs/cloud/live-updates/faq/)
* [ Native Builds ](/docs/cloud/native-builds/)
* [ Set Up Environments ](/docs/cloud/native-builds/environments/)
* [ Overwrite Native Configurations ](/docs/cloud/native-builds/native-configurations/)
* [ Auto-Increment Build Numbers ](/docs/cloud/native-builds/auto-incrementing-build-numbers/)
* [ Configure the Web Build Script ](/docs/cloud/native-builds/web-build-script/)
* [ Build from a Monorepo ](/docs/cloud/native-builds/monorepo/)
* [ Use pnpm, Yarn, or bun ](/docs/cloud/native-builds/package-managers/)
* [ Install Private npm Packages ](/docs/cloud/native-builds/npm-private-registry/)
* [ Override the Java Version ](/docs/cloud/native-builds/override-java-version/)
* [ Custom iOS Provisioning Profiles ](/docs/cloud/native-builds/custom-ios-provisioning-profiles/)
* [ Build without Git ](/docs/cloud/native-builds/build-without-git/)
* [ Access Git Behind a Firewall ](/docs/cloud/native-builds/firewall-access/)
* [ Integrations ](/docs/cloud/native-builds/integrations/)
* Reference
* [ Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [ FAQ ](/docs/cloud/native-builds/faq/)
* [ App Store Publishing ](/docs/cloud/app-store-publishing/)
* [ Submit a Build ](/docs/cloud/app-store-publishing/submit-a-build/)
* [ Submit Automatically After a Build ](/docs/cloud/app-store-publishing/submit-automatically/)
* [ Troubleshooting ](/docs/cloud/app-store-publishing/troubleshooting/)
* [ FAQ ](/docs/cloud/app-store-publishing/faq/)
* [ Automations ](/docs/cloud/automations/)
* [ Reference ](/docs/cloud/automations/reference/)
* [ Troubleshooting ](/docs/cloud/automations/troubleshooting/)
* [ FAQ ](/docs/cloud/automations/faq/)
* [ Assist ](/docs/cloud/assist/)
* [ CLI ](/docs/cloud/cli/)
* APIs and SDKs
* [ Webhooks ](/docs/cloud/webhooks/)
* [ Integrations ](/docs/cloud/integrations/)
* Account
* [ Organization ](/docs/cloud/organizations/)
* [ Two-Factor Enforcement ](/docs/cloud/organizations/two-factor-authentication/)
* [ Audit Logs ](/docs/cloud/organizations/audit-logs/)
* [ Billing ](/docs/cloud/organizations/billing/)
* [ License Keys ](/docs/cloud/license-keys/)
* [ AI ](/docs/ai/)
* [ Insiders ](/docs/insiders/)
* [ Billing & Plans ](/docs/insiders/billing-and-plans/)
* [ FAQ ](/docs/insiders/faq/)
* [ License ](https://capawesome.io/legal/eula/)
* [ Support ](/docs/support/)
* [ Contributing ](/docs/contributing/)
* Contributing code
* [ Code of Conduct ](/docs/contributing/code-of-conduct/)
* [ Questions ](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#creating-a-discussion)
* [ Blog ](/blog/)
* Categories

* [ Setting Up In-App Purchases on iOS ](#setting-up-in-app-purchases-on-ios)
* [ Setting Up In-App Purchases on Android ](#setting-up-in-app-purchases-on-android)
* [ Testing ](#testing)
* [ FAQ ](#faq)
* [ Related Posts ](#related-posts)
* [ Stay Updated ](#stay-updated)
* [ Conclusion ](#conclusion)

* Related links

# Tips for Setting Up In-App Purchases with Capacitor[¶](#tips-for-setting-up-in-app-purchases-with-capacitor "Permanent link")

Setting up in-app purchases in a mobile app involves more than just writing code. Between Apple's agreements, Google's compliance checks, and platform-specific gotchas, there's a lot of ground to cover before you can charge your first customer. Here are some practical tips to help you get started with in-app purchases on both iOS and Android using the [Capacitor Purchases plugin](/docs/sdks/capacitor/purchases/).

[ ![Build and deploy your Capacitor app with Capawesome Cloud](https://capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.png?t=1) ](/) 

## Prerequisites[¶](#prerequisites "Permanent link")

Before you begin, make sure you have the following:

* A **Capacitor app** with the [Capacitor Purchases plugin](/docs/sdks/capacitor/purchases/) installed. To install the plugin, please refer to the [Installation](/docs/sdks/capacitor/purchases/#installation) section in the plugin documentation.
* An **Apple Developer account** with access to [App Store Connect](https://appstoreconnect.apple.com/) (for iOS).
* A **Google Play Developer account** with access to the [Google Play Console](https://play.google.com/console/) (for Android).

## General Recommendations[¶](#general-recommendations "Permanent link")

Before diving into platform-specific setup, here are a few best practices that apply to both iOS and Android.

### Handling Unfinished Transactions[¶](#handling-unfinished-transactions "Permanent link")

On every app launch, call [getUnfinishedTransactions()](/docs/sdks/capacitor/purchases/#getunfinishedtransactions) to check for any purchases that weren't properly confirmed. This can happen if the app was closed or crashed before a transaction was completed. If there are unfinished transactions, deliver the purchased content or enable the service and then call [finishTransaction(...)](/docs/sdks/capacitor/purchases/#finishtransaction) for each one.

### Adding a Restore Purchases Button[¶](#adding-a-restore-purchases-button "Permanent link")

Your app should include a restore purchases button so users can recover their purchases on a new device or after reinstalling. Use [syncTransactions()](/docs/sdks/capacitor/purchases/#synctransactions) for this. If there are any transactions, deliver the purchased content or enable the service. Unlike the unfinished transactions flow, there is no need to call [finishTransaction(...)](/docs/sdks/capacitor/purchases/#finishtransaction) since transactions returned by [syncTransactions()](/docs/sdks/capacitor/purchases/#synctransactions) have already been finished.

### Choosing Product IDs[¶](#choosing-product-ids "Permanent link")

To simplify your backend logic, use the same product ID for equivalent products on both Apple and Google. Be careful when choosing your product IDs — they often cannot be changed or reused on either platform once created.

## Setting Up In-App Purchases on iOS[¶](#setting-up-in-app-purchases-on-ios "Permanent link")

Apple's setup process involves multiple steps across your Developer account and App Store Connect. Pay close attention to the details here, as missing a single step can prevent purchases from working.

### Accepting Developer Agreements[¶](#accepting-developer-agreements "Permanent link")

Under the **Agreements** section of your [Apple Developer account](https://developer.apple.com/account), make sure the following are accepted:

1. Apple Developer Agreement
2. Apple Developer Program License Agreement

These agreements are updated regularly and need to be accepted each time they change.

### Configuring App Store Connect Business[¶](#configuring-app-store-connect-business "Permanent link")

Under the **Business** section of [App Store Connect](https://appstoreconnect.apple.com/business/), verify the following:

1. Free Apps Agreement has status **Active**.
2. Paid Apps Agreement has status **Active**.
3. A bank account has been added with status **Active**.
4. All tax forms are completed with status **Active** (the exact list depends on your region).

### Creating Products and Subscriptions[¶](#creating-products-and-subscriptions "Permanent link")

Under the **Monetization** section of your app in App Store Connect:

1. Create your in-app purchases or subscriptions.
2. Fill out **all** fields on screen, including localization and optional fields.
3. The product or subscription must have the status **Ready to Submit** or **Waiting for Review**, which indicates that no information is missing.

Note

There may be a delay of up to a few hours between a product being properly created and the API returning a response. You may see "Product not found." until then.

### Small Business Program[¶](#small-business-program "Permanent link")

If you qualify as a small business, you can apply to Apple's [Small Business Program](https://developer.apple.com/app-store/small-business-program/) for a significant reduction in commission fees.

### Handling App Store Server Notifications[¶](#handling-app-store-server-notifications "Permanent link")

If you offer renewable subscriptions, your backend must handle the different [notification types](https://developer.apple.com/documentation/appstoreservernotifications/notificationtype) of App Store Server Notifications. This is how you get notified about events that happen outside your app, such as a subscription renewal, cancellation, or expiration. Make sure to remove a user's access when their subscription has expired.

## Setting Up In-App Purchases on Android[¶](#setting-up-in-app-purchases-on-android "Permanent link")

Google's setup is generally more straightforward, but there are still a few prerequisites to take care of before creating products.

### Completing Compliance and Metadata[¶](#completing-compliance-and-metadata "Permanent link")

Under your app's section in the Google Play Console:

1. Make sure all compliance steps are completed.
2. Make sure all metadata steps are completed.

### Creating Products and Subscriptions[¶](#creating-products-and-subscriptions%5F1 "Permanent link")

Under the **Monetize with Play** section of the Google Play Console:

1. Under **Products**, create your one-time products or subscriptions.
2. Fill out **all** fields on screen, including price, availability, and tax and policy settings.
3. The product or subscription must have the status **Active**.

Note

You can configure your subscription settings and Real-time Developer Notifications under **Monetization setup**.

### Reduced Fee Program[¶](#reduced-fee-program "Permanent link")

If you qualify as a small business, you can apply to Google's [reduced fee program](https://support.google.com/googleplay/android-developer/answer/10632485) for lower commission fees.

### Handling Real-Time Developer Notifications[¶](#handling-real-time-developer-notifications "Permanent link")

If you offer renewable subscriptions, your backend must handle the different [notification types](https://developer.android.com/google/play/billing/rtdn-reference#sub) of Real-time Developer Notifications. Similar to Apple, this is how you get notified about out-of-app events like renewals, cancellations, and expirations.

## Testing[¶](#testing "Permanent link")

Before going live, you should thoroughly test your in-app purchases on both platforms.

On **iOS**, Apple provides two approaches: Sandbox testing with test accounts created in App Store Connect, and StoreKit testing in Xcode using a local configuration file (iOS 14+). Sandbox testing requires a physical device with a sandbox account signed in under **Settings** \> **Developer** \> **Sandbox Apple Account** — you do not need to log out of your main Apple account. StoreKit testing works entirely locally without server connectivity.

On **Android**, you need to upload your app to the Google Play Console (the internal testing track is sufficient), add test accounts under **Settings** \> **License Testing**, and install the app from Google Play rather than via direct APK installation.

For full details, see the [Testing](/docs/sdks/capacitor/purchases/#testing) section in the plugin documentation.

## FAQ[¶](#faq "Permanent link")

### Do I have to build and maintain my own paywall?[¶](#do-i-have-to-build-and-maintain-my-own-paywall "Permanent link")

Not necessarily. The [Capacitor Purchases plugin](/docs/sdks/capacitor/purchases/) gives you full control to build a custom paywall in your own UI, which is the right choice when you want the checkout screen to match your app exactly. If you would rather manage paywalls and pricing experiments remotely — and ship changes without an app update — the [Capacitor Superwall plugin](/docs/sdks/capacitor/superwall/) lets you design and A/B test paywalls from a dashboard while still going through the native App Store and Google Play billing systems.

### Can I use in-app purchases to sell physical goods?[¶](#can-i-use-in-app-purchases-to-sell-physical-goods "Permanent link")

No. Apple and Google require in-app purchases only for **digital** content and subscriptions consumed inside the app, and both explicitly forbid using them for physical goods or services delivered outside the app. For real-world sales — physical products, in-person checkout, or services — you need a payment processor instead. The [Capacitor Square Mobile Payments plugin](/docs/sdks/capacitor/square-mobile-payments/), for example, lets you accept card and contactless payments directly in your Android and iOS app.

## Related Posts[¶](#related-posts "Permanent link")

* [11 Steps to Get Your Web App on the App Store](/blog/11-steps-to-get-your-web-app-on-the-app-store/)
* [How to Create Your Apple and Google Developer Accounts](/blog/how-to-create-apple-developer-and-google-play-accounts/)
* [How to Distribute iOS and Android Apps to Testers](/blog/how-to-distribute-ios-and-android-apps-to-testers/)
* [How to Prepare Your App Store Listing](/blog/how-to-prepare-your-app-store-listing/)

## Stay Updated[¶](#stay-updated "Permanent link")

Want to stay up to date with the latest features and guides? Subscribe to the Capawesome newsletter.

[Subscribe to the Capawesome Newsletter](/newsletter/)

## Conclusion[¶](#conclusion "Permanent link")

Setting up in-app purchases requires careful attention to platform-specific requirements, from Apple's agreements and App Store Connect configuration to Google Play's compliance steps and product setup. By following this guide and handling edge cases like unfinished transactions and server notifications, you'll be well prepared to monetize your Capacitor app on both platforms.

For the full API reference and additional details, check out the [Purchases plugin documentation](/docs/sdks/capacitor/purchases/). Have suggestions or questions? Join the [Capawesome Discord server](https://discord.gg/VCXxSVjefW) to connect with the community. And subscribe to the [Capawesome newsletter](/newsletter/) to stay updated on the latest news.

July 15, 2026 

Back to top

```json
{
      "@context": "https://schema.org",
      "@type": "BlogPosting",
      "headline": "Tips for Setting Up In-App Purchases with Capacitor",
      "description": "Practical tips for setting up in-app purchases and subscriptions in your Capacitor app for iOS and Android using the Purchases plugin.",
      "image": "https://capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.png",
      "datePublished": "2026-02-24T00:00:00+00:00",
      "dateModified": "2026-07-14T00:00:00+00:00",
      "author": [
        {
          "@type": "Person",
          "name": "Robin Genz",
          "url": "https://github.com/robingenz"
        }
      ],
      "publisher": {
        "@type": "Organization",
        "name": "Capawesome",
        "url": "https://capawesome.io",
        "logo": {
          "@type": "ImageObject",
          "url": "https://capawesome.io/assets/images/logo.svg"
        }
      },
      "articleSection": "Capacitor",
      "keywords": ["Capacitor", "Guides", "SDKs"],
      "isPartOf": {
        "@type": "Blog",
        "@id": "https://capawesome.io/blog/#blog"
      },
      "mainEntityOfPage": "https://capawesome.io/blog/tips-for-setting-up-in-app-purchases-with-capacitor/",
      "url": "https://capawesome.io/blog/tips-for-setting-up-in-app-purchases-with-capacitor/"
    }
{
      "@context": "https://schema.org",
      "@type": "BreadcrumbList",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Home",
          "item": "https://capawesome.io/"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "Blog",
          "item": "https://capawesome.io/blog/"
        },
        {
          "@type": "ListItem",
          "position": 3,
          "name": "Tips for Setting Up In-App Purchases with Capacitor",
          "item": "https://capawesome.io/blog/tips-for-setting-up-in-app-purchases-with-capacitor/"
        }
      ]
    }
{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Do I have to build and maintain my own paywall?", "acceptedAnswer": {"@type": "Answer", "text": "Not necessarily. The Capacitor Purchases plugin gives you full control to build a custom paywall in your own UI, which is the right choice when you want the checkout screen to match your app exactly. If you would rather manage paywalls and pricing experiments remotely — and ship changes without an app update — the Capacitor Superwall plugin lets you design and A/B test paywalls from a dashboard while still going through the native App Store and Google Play billing systems."}}, {"@type": "Question", "name": "Can I use in-app purchases to sell physical goods?", "acceptedAnswer": {"@type": "Answer", "text": "No. Apple and Google require in-app purchases only for digital content and subscriptions consumed inside the app, and both explicitly forbid using them for physical goods or services delivered outside the app. For real-world sales — physical products, in-person checkout, or services — you need a payment processor instead. The Capacitor Square Mobile Payments plugin, for example, lets you accept card and contactless payments directly in your Android and iOS app."}}], "url": "https://capawesome.io/blog/tips-for-setting-up-in-app-purchases-with-capacitor/"}
```
