Advanced iOS Summer Bundle

3 brand-new books on SwiftUI, Combine and Catalyst — $99.99 for a limited time!

Introductory Pricing for iOS: Getting Started

In this tutorial, you’ll learn how to add an introductory pricing option to an app that already offers an auto-renewable subscription.

Version

  • Swift 4.2, iOS 12, Xcode 10

So, you have a great app that offers awesome, subscription-based content. Users love your app and can’t understand how they lived without it. The problem is, even with rave reviews from paying users, it’s hard to get new users to take that leap of faith and subscribe.

What can you do about it? I’m glad you asked!

Apple now offers Introductory Pricing to attract new subscribers.

  • It’s available to users of iOS 11.2 or newer.
  • It’s easy to add to apps that already offer auto-renewable subscriptions.

Using introductory pricing, you’ll be able to offer a discounted price or a free trial for a limited time at the beginning of a subscription. Sounds like this may be the solution to all of your problems, right?

In this tutorial, you’ll learn how to add an introductory pricing option to an app that already offers an auto-renewable subscription.

Getting Started

To try out this cool new feature, you can either use your own app that already offers auto-renewable subscriptions or use my awesome “Words of Wisdom by Winnie the Pooh” app. Beware, Winnie the Pooh quotes are highly addictive, so use this app with caution. :]

If you decide to use your own app, skip ahead to Introductory Pricing Types. If you’re going to use the PoohWisdom app, continue onto Setting up the Project.

The PoohWisdom app is simple: It has one screen with Winnie the Pooh’s image, a label for displaying the quotes after a successful purchase or a message to encourage the user to make a purchase, and two buttons: Purchase and Restore.

The app offers a single, auto-renewable subscription In-App Purchase, or IAP. Next, you’ll learn how to add introductory pricing to this IAP.

This tutorial assumes you’re already familiar with auto-renewable subscriptions and IAPs. If you’re new to these, you should work through these tutorials first:

Setting up the Project

Download the app using the Download Materials button at the top or bottom of this tutorial. Open it using Xcode, then build and run the project. In order to use the app, you’ll also need to set up the auto-renewable subscription. Do the following:

Note: If you’re not sure how to do these steps, work through the tutorials recommended above first.
  1. Create an App ID in the Apple Developer Portal.
  2. Create an App in App Store Connect using said App ID.
  3. Create an IAP auto-renewable subscription product: Make sure you complete all sections, including the Review Information. Use this image for the review screenshot. The status should show as Ready to Submit once you’re done.
  4. Copy your App ID and Product ID somewhere easy to access: You’ll need these next.
  5. Create a sandbox user for testing purposes. Remember to use a real email address, and verify the account by clicking the link in the email from Apple.
    1. Note: When you create an auto-renewable subscription, App Store Connect will ask you to define a Subscription Group. Apple introduced subscription groups in 2016 as a way to resolve major issues with subscriptions. Subscription groups allow users to modify their subscriptions without having to cancel them first, and they prevent accidental simultaneous subscriptions.

      Subscription groups are essentially a collection of subscription products that are grouped together on the subscription management menu. Only one product in a subscription group can be active at a given time. An introductory price can only be used once per subscription group.

      OK, back to the project! Do the following:

      1. Set the Bundle Identifier to the one you created.
      2. Switch the Team on the General tab to your developer team.
      3. Search for com.razeware.poohWisdom.monthlySub and replace it with the Product ID you created.

      Build and run the project. This is what you should see in the project console:

      Not purchased: $MyIAPID
      Loaded list of products...
      Found product: $MyIAPID $GroupID $Pricing
      

      If you see this, you’re ready for the next step! If not, make sure you didn’t miss anything:

  • Is everything set up properly on App Store Connect?
  • Does your IAP product show as Ready to Submit?
  • Did you set your Team and Bundle Identifier on the General tab?
  • Did you replace com.razeware.poohWisdom.monthlySub with your own product ID?

If everything else looks correct and you’re still not receiving products, make sure you don’t need to accept any agreements in App Store Connect. Confusingly, Apple may return an empty response for IAP products, instead of a failure, if you have outstanding agreements.

Don’t tap Purchase just yet!

If you already completed the purchase, that’s okay. We’re all human, after all. :] However, you’ll unfortunately need to create another sandbox user in App Store Connect.

Introductory Pricing Types

There are three types of introductory pricing that you can offer per subscription, per territory:

  • Pay as you go (SKProductDiscount.PaymentMode.payAsYouGo): New subscribers will pay a discounted price each billing period for a specific duration. This can attract new users who are interested in your app but need that extra push to pay the normal, higher price each subscription period.

    For example, you can offer a discounted price of $1.99 per month for three months with a standard subscription price of $3.99 per month starting in the fourth month.

  • Pay up front (SKProductDiscount.PaymentMode.payUpFront): New subscribers will pay a one-time introductory price for a specific duration. This is useful when you believe the user may need longer to get hooked on the content your app provides.

    For example, if you want to offer a monthly subscription, but you think users need about six months to get used to the experience and become more likely to keep their subscription, you can offer a six-month introductory price of $9.99, followed by a standard price of $3.99 per month starting in the seventh month.

    Note that you don’t have to use the same length of time for the introductory price and the regular subscription. So, for example, you can offer an introductory price for a six-month period followed by a yearly subscription.

  • Free trial (SKProductDiscount.PaymentMode.freeTrial): New subscribers will get access to your app’s content for free for a specific duration. The subscription begins immediately, and the first billing occurs once the free trial period is over.

    This gives your users the option to cancel before the first billing takes place. If you feel confident about the content your app provides but have difficulty convincing potential subscribers it’s worth their money, this is a low-risk option that lets them decide.

No matter which type you choose to use, once the introductory period is over, the subscription will renew at the regular price.

Determining User Eligibility

Before displaying the discounted price to your users, you have to make sure that a specific, current user is eligible for the discounted price.

How will you know if the user is eligible? Great question!

Review the user’s past transactions to see if they’ve already used a discount from the same subscription group in the past. If so, the user isn’t eligible for a discounted price.

Disclaimer: This tutorial’s sample app doesn’t perform receipt validation. Instead, it saves the product’s purchased state in NSUserDefaults. In a real-life app, you should perform some sort of receipt validation to make sure that a purchase took place and that money changed hands. Apple recommends you do this on your own server, but there are ways to do it locally.

You can read more about receipt validation on Apple’s documentation. Also, check out our In-App Purchases: Receipt Validation Tutorial or the Receipts section of our great video course on In-App Purchases.

You’re not focused on receipt validation in this tutorial, but to implement the above explanation on your server, the fields you need in the JSON response from the App Store server are: latest_receipt_info, whose value is an array containing all in-app purchase transactions, and the is_trial_period and is_in_intro_offer_period fields in the receipt field for each relevant transaction.

To determine a user’s eligibility, check the values of the Subscription Trial Period and the Subscription Introductory Price Period for all IAP transactions. If the value for either of these fields is true for a given subscription, the user isn’t eligible for an introductory price for any of the products within the same subscription group.

New users are always eligible for the offered introductory price while lapsed subscribers — those who had a subscription in the past — are only eligible for the introductory price if they haven’t already used such an offer on this subscription or on other products from the same subscription group.

Offering Introductory Pricing to Eligible Users

OK, so now you’re going to add an introductory price to your IAP. Yay! :]

On App Store Connect, go to My Apps and select the app to which you want to add an introductory price. Then, go to Features ▸ In-App Purchases and select the correct auto-renewable subscription.

Set Auto-renewable Subscription for Introductory Pricing iOS

Then, press the + next to Subscription Prices and select Set Up Introductory Price.

Set Subscription Prices for Introductory Pricing iOS

Now, you’ll need to select the territories for which the new introductory price will apply. By default, all territories will be selected. For the purposes of this tutorial, and to allow you to test various success and failure states in the next section, deselect All Territories and select only United States, just like in the image below.

Set Territories for Introductory Pricing iOS

Press Next. Now you need to set the start and end dates for the new introductory price. Select today’s date as the Start Date and No End Date as the end date, and press Next.

Set Dates for Introductory Pricing iOS

Select Free trial and set the duration to 3 Days. This means that your users will get free access to your app’s content for three days before starting to pay the standard subscription price. Press Done and then press Save at the top-right.

Press Done and Save for Introductory Pricing iOS

That’s it! You’ve just set up an introductory price for your auto-renewable subscription. We’ll discuss the UX implications of introductory pricing in a minute, but technically speaking, you’re all done. Pat yourself on the back! Get ready to test this new feature.

Testing

Now that everything is set up, you should test it. Remember the sandbox user you created earlier? Now it’s time to use it! Note that while you can get the list of available IAPs on the simulator, to test actual purchases, you’ll need a physical device.

Run the app on your device, tap Purchase and you’ll see this alert:

Tap Purchase for Introductory Pricing iOS

Type in the details of a sandbox account that hasn’t already purchased this subscription, and tap Continue.

Note: Starting with iOS 12, you no longer need to sign out of your production account when signing in to a sandbox account! It’s now a separate item in the iTunes & App Store option of the Settings app. This is a huge improvement, especially when testing auto-renewable subscriptions.

You should now see this alert:

Purchase Complete for Introductory Pricing iOS

Once you tap OK, you’ll get random words of wisdom by Winnie the Pooh: “If you live to be a hundred, I want to live to be a hundred minus one day so I never have to live without you.” That’s one smart bear. :]

You should also check some flows that result in a failed transaction. For example, uninstall the app from the device, reinstall it, and try to purchase the same subscription with the same sandbox user. Because this user purchased the item in the past, you should get this alert, followed by a failure message:

Purchase Error for Introductory Pricing iOS

Now, uninstall and reinstall the app again and try restoring the IAP with the same sandbox user. In this case, you’ll get the same alert, but it’ll be followed by a successful restore.

In production apps, you should automatically attempt to restore the purchase as soon as you realize the user has purchased it in the past. At the very least, provide a good fallback display to the user so that the current status is clear. In this sample app, we kept things simple so that you can easily check for failed states.

You can see the sandbox user you’re currently signed in with in the Settings of your device by selecting iTunes & App Stores. There you’ll see your real account at the top and the current sandbox account at the bottom.

In addition, you should test for different scenarios. Consider a user who:

  • Attempts to buys a subscription in a country for which you don’t offer Introductory Pricing.
  • Has already used the introductory price and attempts to purchase the same product again.
  • Hasn’t used the introductory price for the specific product you’re testing but has used it for another product that belongs to the same subscription group.
  • Has used the introductory price for a product in a different subscription group and is still eligible for the introductory price on the subscription under test.

Introductory Pricing Best Practices

To add Introductory Pricing to an app that already has auto-renewable subscriptions, you don’t have to make any changes to the code. You can just make the relevant changes in App Store Connect and let Apple take care of the rest. However, if you really want to make the most of this great new way of enticing users into subscriptions, you might want to make some UI/UX changes to make sure potential buyers are aware of the introductory price your app offers.

Apple Human Interface Guidelines about In-App Purchase points this out specifically: “When offering an introductory price, indicate the introductory price, the duration of the offer, and the standard price the user pays after the offer ends.”

Consider these points when adding introductory prices to apps already live in the App Store:

  • Make sure your users are aware of the offering. Display the discounted price in a clear and appealing way so users know exactly what they’re purchasing. You can get all of the details you need in the new property added to SKProduct called introductoryPrice (of type SKProductDiscount). This data includes: price, priceLocale, paymentMode, subscriptionPeriod, and numberOfPeriods.
  • Don’t promise your users an introductory price that they find out they’re ineligible for after they’ve already started the purchase process. Determine eligibility as early as possible in order to match the display to the user’s specific case.
  • Introductory prices for promoted IAPs also appear on the App Store. When deciding how to use this feature, remember that potential users can see the discount before they install your app. When used properly, introductory prices can attract new users to install your app and convert existing users into new subscribers.
  • Users can now easily view and manage their subscriptions via this link apps.apple.com/account/subscriptions. There, they can see their subscriptions and switch between different options in a subscription group. It’s important to check how your IAP offerings look there and to direct your users there when relevant.
  • Finally, Apple added a new subscription retention dashboard in App Store Connect ▸ App Analytics. Once your app is live, keep an eye on the retention dashboard for trends. Notice how introductory prices improve user acquisition and use this data to make decisions about your app’s future offerings and business model.

Where to Go From Here?

I highly recommend checking out Apple’s Introductory Pricing Documentation and the Best Practices and What’s New with In-App Purchases session from WWDC 2018.

Also, be sure to go over Apple’s Receipt Validation documentation for more details on how to validate your receipts. This is necessary for determining user eligibility for introductory prices.

Introductory pricing is a great addition to your IAP toolbox and can help you attract new subscribers. After all, what’s an app without active paying users? :]

As with other types of IAPs, don’t forget about Apple’s guidelines – allow users to restore purchases, fail gracefully and provide a great user experience, even for ineligible users. As long as you keep your users in mind while you’re designing and developing your app, both you and your users will benefit from it.

Post your questions or comments about this tutorial in the discussion below!

Add a rating for this content

Contributors

Comments