Managed app pricing lets you define your app’s pricing plans directly in the Shopify Partner Dashboard, without needing to use the Billing API. Shopify hosts your app’s plan selection page, and automates most common billing tasks, such as recurring charges, free trials, proration, test charges, and price updates.
For most developers, managed pricing is simpler and more consistent than coding your own billing logic using the Billing API.
## Set up managed pricing
Managed pricing is the default option when you submit a new public app for approval. You can opt in to managed pricing for existing apps by editing your pricing settings. You can switch back to manual pricing at any time.
Managed pricing is available for free, monthly, and annual recurring plan types.
### Opt in to managed pricing
If you've already created plans with the Billing API that aren't compatible with managed pricing, then you'll need to remove them before you can switch.
1. From your Partner Dashboard, click **Apps > All Apps** and click the name of the app you want to update pricing for.
1. Click **Distribution**.
1. Beside **Shopify App Store listing**, click **Manage listing**.
1. Under **Published languages**, click **Edit** for the locale you want to update.
1. Under **Pricing content**, click **Manage** to open the Pricing index page.
1. Click **Settings**.
1. Select **Managed pricing**.
1. In the confirmation dialog, click **Switch**.
## Plan selection page
When using managed pricing, Shopify hosts your plan selection page. It’s visible in the Shopify admin, and allows merchants to view and select their plan.
Your app's plan selection page URL follows this pattern:
### Testing your plan selection UI
You can validate that plan selection works as expected by following the [test charge documentation](/docs/apps/launch/app-store-review/pass-app-review#test-your-app-s-billing-system).
## Public plans
Public plans are available to all merchants. Plans are visible on your app’s [plan selection page](#plan-selection-page) as well as on the Shopify App Store. You can add up to four public plans.
A plan's billing model (its cost, billing periods, free trial availability) is edited separately from its description (its display name and list of supported features). This lets you describe a single plan in multiple languages, both on the Shopify App Store and your plan selection page.
### Step 1: Add a public plan
1. From your Partner Dashboard, click **Apps > All Apps** and click the name of the app you want to update pricing for.
1. Click **Distribution**.
1. Beside **Shopify App Store listing**, click **Manage listing**.
1. Under **Published languages**, click **Edit** for the locale you want to update.
1. Under **Pricing content**, click **Manage** to open the Pricing index page.
1. Under **Public plans**, click **Add** to open the plan editor.
1. Under **Billing**, select whether the plan is free, monthly, yearly, or monthly with a yearly option.
1. (If required) Under **Monthly charge**, enter a price.
1. (If required) Under **Yearly charge**, enter a price.
1. (Optional) Under **Free trial duration**, enter the number of days you want to offer.
1. (Optional) Under **Welcome link**, add a path or URL where the merchant will be [redirected](#welcome-links) after approving the plan charge.
1. Click **Save**.
### Step 2: Add plan descriptions for each language
Public plans share the same billing model and price details across all your app listings. But plan descriptions are localized, so that you can translate the plan name and its list of top features for each locale.
1. From your Partner Dashboard, click **Apps > All Apps** and click the name of the app you want to update pricing for.
1. Click **Distribution**.
1. Beside **Shopify App Store listing**, click **Manage listing**.
1. Under **Published languages**, click **Edit** for the locale you want to update.
1. Under **Pricing content**, find your recently added or updated plan.
1. Under **Display name**, give the plan a name.
1. Under **Top features**, describe the app features available under this plan.
1. Click **Save**.
Make sure to add plan descriptions for each translated app listing. A plan will only display to merchants if it has a description for the current language.
## Private plans
Private plans are only available to a list of stores that you select. This is useful if you need to support a bespoke feature set and pricing for a complex or high-needs client. If all you need is a price incentive, then offering a [discount or trial extension](#discounts-and-trial-extensions) may be a simpler option.
Because private plans are created for a limited number of merchants, they don't support translation. Private plans show up on your [plan selection page](#plan-selection-page), but are only visible to users who are logged into an authorized store account.
You can create up to 10 private plans. You can add up to 20 authorized stores per private plan.
### Add a private plan
1. From your Partner Dashboard, click **Apps > All Apps** and click the name of the app you want to update pricing for.
1. Click **Distribution**.
1. Beside **Shopify App Store listing**, click **Manage listing**.
1. Under **Published languages**, click **Edit** for the locale you want to update.
1. Under **Pricing content**, click **Manage** to open the Pricing index page.
1. Under **Private plans**, click **Add** to open the plan editor.
1. Under **Billing**, select whether the plan is free, monthly, yearly, or monthly with a yearly option.
1. (If required) Under **Monthly charge**, enter a price.
1. (If required) Under **Yearly charge**, enter a price.
1. (Optional) Under **Free trial duration**, enter the number of days you want to offer.
1. (Optional) Under **Welcome link**, add a path or URL where the merchant will be [redirected](#welcome-links) after approving the plan charge.
1. Under **Display name**, add a name for the private plan.
1. Under **Description**, describe the plan features.
1. Under **Stores with plan access**, add up to 20 store domains (such as `example.myshopify.com`).
1. Click **Save**.
## Welcome links
A welcome link is the URL where merchants are redirected after approving your app plan charge. You can configure welcome links on a per-plan basis to customize your app onboarding experience. A welcome link can point to a [page in your embedded app](#embedded-app-welcome-links), or to an [external URL](#external-welcome-links).
We recommend that you query the Billing API for [subscription status](/docs/api/admin-graphql/current/enums/AppSubscriptionStatus) after approval for charge status changes.
### Embedded app welcome links
For embedded apps, you can specify a relative path to your app root, such as `/welcome`. A `charge_id` URL parameter with a transaction ID is appended to all redirect URLs.
### External welcome links
If you have a non-embedded app, or prefer to link to an external site, then you can redirect to a valid URL (including the `http` or `https` protocol). URL parameters for the `charge_id` and the merchant shop domain are appended to redirect URLs.
## Proration logic
### Trial proration
Managed app pricing tracks trial days over a 180-day period to prevent users from repeatedly reinstalling apps to exploit free trial periods. For example, if a merchant uses 12 out of 15 trial days on a Pro Plan, uninstalls, then reinstalls the app 90 days later, they'll still have 3 trial days left for the Pro Plan.
If you update your trial periods, then previously consumed trial days are subtracted from the new totals.
### Plan downgrading
Downgrading from a paid plan to a free plan is deferred, meaning it's effective at the end of the paid plan’s current cycle.
## Discounts and trial extensions
You can issue discounts or extend app trial periods through your Partner Dashboard. Staff members need the **[Manage credits and refunds](https://help.shopify.com/partners/dashboard/account-access#sensitive-permissions)** permission to manage discounts.
### Issue a discount
1. From your partner dashboard, search for the name of the merchant you want to offer a discount. Click the merchant name in the **Store** column of the search results.
1. Beside **Discount**, click **Create**.
1. Under **App**, search for your app by name and select it.
1. Select the type, value, and duration of the discount.
1. Click **Create**.
1. In the confirmation dialog, click **Apply** to confirm the discount.
### Extend a trial period
1. From your partner dashboard, search for the name of the merchant whose trial you want to extend. Click the merchant name in the **Store** column of the search results.
1. Beside **Trial extension**, click **Create**.
1. Under **App**, search for your app by name and select it.
1. Under **Extra trial days**, enter the number of days to extend the merchant's trial.
1. Click **Create**.
1. In the confirmation dialog, click **Apply** to confirm the trial extension.
For both discounts and trial extensions, Shopify sends an email to the merchant on your behalf confirming the change. The merchant doesn't need to re-subscribe to the plan. The discount is applied to their subscription automatically, starting on the next billing cycle.
## Test charges
To simplify testing your app's pricing, managed pricing has implemented [free testing for dev stores](/docs/apps/launch/billing/offer-free-trials#set-up-free-testing).
When a development store subscribes to a plan, Shopify creates a test subscription for that store. Your account isn't charged for test subscriptions.
> Note
> Test subscriptions don't convert to paid when you transfer a store. After transferring, you'll need to create a new plan.
## Webhooks
To receive a webhook when a subscription is updated, register for the [`APP_SUBSCRIPTIONS_UPDATE`](https://shopify.dev/docs/api/admin-graphql/unstable/enums/WebhookSubscriptionTopic#value-appsubscriptionsupdate) topic. Note that webhooks can take several minutes to deliver. Make sure your app can handle [webhook delays](/docs/apps/build/webhooks/best-practices#manage-delays) and follow Shopify's [best practices for webhooks](/docs/apps/build/webhooks/best-practices).
## Limitations
- Managed pricing currently supports only fixed, recurring pricing models (for example, $10/month or $100/year).
- Once you opt in, you can’t create new recurring application charges using the Billing API. Charges created before opting into managed pricing continue to process as expected.
- When testing a draft app during development, its [plan selection page](#plan-selection-page) might return a 404 error if the development store and the app listing are set to different locales. This issue doesn't affect production stores or published apps.