gradient blur

Creating, testing and releasing your first iOS subscription product and app to the App Store

From App Store Connect, to TestFlight and everything in-between, follow this all-in-one guide to get your next idea into production

From idea to app

Jordan Morgan

Developer Advocate

Published

Launching an app and making that first dollar from it is an unforgettable experience. Getting there? It can feel intimidating. This guide is here to help you get started from step one to shipping. Here, we'll cover in the most simple terms how to:

  • Create a new Apple developer account.

  • Create a new app in App Store Connect.

  • Create subscriptions products in App Store Connect.

  • Display them in your app with Superwall.

  • Test them out before launching via TestFlight.

  • How to get them ready to submit to App Store review.

  • And, how to get them live in the App Store.

Before we dive in, here's what I expect you are comfortable with:

  • You know what Xcode is. You know how to build and run an app in the iOS simulator.

  • You have an app you've been working on.

  • Finally, this is not a programming guide. This post is to get your app you've been working on in a testable state with real products. Then, if you so choose, it details how to get it live on the App Store.

If you haven't done this process before, you can open up this post on one side of your screen — and then use a new window to perform the tasks, side-by-side, on the other side. Let's get started.

Create a developer account with Apple

If you don't have an active developer account, you need to create one. To do that, go sign up and then come back to this post.

Sign into Xcode

First, make sure you're signed in with your developer account inside of Xcode. Also, keep in mind that if you've done any of these steps (i.e., you already signed into Xcode with your developer account), you can skip to the next part and continue on.

  1. Open Xcode Preferences: Go to Xcode > Preferences.

  2. Navigate to Accounts: Click the "Accounts" button.

  3. If you aren't signed in, click Add Account and follow the prompts.

Once signed in, make sure your app is open in Xcode. In its Signing & Capabilities section, you should have your developer team selected there. Here's what mine looks like in Xcode...

gradient blur
dashboard-header

My team associated to my developer account is selected and ready for use in Xcode.

Creating an app in App Store Connect

Now that you're signed up with Apple and signed in on Xcode, you'll head to App Store Connect and create a new app:

  • Click on Apps

  • Click on the blue plus button at the top left:

gradient blur
dashboard-header

Creating a new app in App Store Connect

  • Then, fill in all of the metadata in the resulting modal. Make sure you check iOS under Platforms:

gradient blur
dashboard-header

Filling out new app information

I want to call out the Bundle ID section. You'll need to create a new bundle ID in the Certificates, Identifiers & Profiles section. This bundle ID is what connects your app from App Store Connect to Xcode. Recall the last screen shot. In App Store Connect, the bundle ID for my app, Scores for NCAA, is com.daywellspent.scoresforncaa — and it's also the same here in Xcode for my project. For a refresher:

gradient blur
dashboard-header

The bundle ID for this app is the same in App Store Connect and in Xcode.

...which matches what's in App Store Connect:

gradient blur
dashboard-header

The same bundle ID in App Store Connect.

When you visit the Certificates, Identifiers & Profiles, Apple will walk you through the steps of creating all of the things you need for a new app — and then you'll go right back to this modal and the bundle ID will be selectable.

Creating subscriptions in App Store Connect

Now, it's time to make some products users can purchase and subscribe to.

Create a subscription group

Your first stop is to create the subscriptions within App Store Connect. To do that, we'll need a subscription group — which are used to organize your app’s subscriptions. Typically, each group (you can use just one, or as many as you need) contains different levels of subscription options. For example, a monthly plan, a yearly plan, or a premium plan might be in one group.

Here's some important bits to remember about them:

  1. Users can only subscribe to one product in a group at a time.

  2. They can upgrade, downgrade, or switch between subscriptions within the same group.

  3. If you want totally separate subscriptions, you would put them in different groups.

  4. This last part is important! Users can subscribe to more than one subscription group, but only one subscription within a group.

Subscription groups are like a restaurant menu. Someone picks one item off of it, but they can swap it later if they want.

Select your app and create a subscription group, where you'll add one or more subscriptions in the next step:

  • Open your app in App Store Connect.

  • In the left sidebar under App Store --> Monetization, click on Subscriptions.

  • Under Subscription Groups, click the create button.

gradient blur
dashboard-header

Creating a subscription group

  • Name your subscription group and create it.

gradient blur
dashboard-header

Naming and saving the subscription group

Create a subscription

Next, create one or more subscriptions within the group. This is what your users will see on your paywalls:

  • Click on Create under Subscriptions.

    gradient blur
    dashboard-header

    Create a subscription

  • Add a Reference Name and Product ID.

  • For Reference Name, use something that you can easily understand when seeing it in a UI. You'll see this in App Store Connect reporting — it won't show on the App Store.

  • For Product ID, I find it helps to name it in a way that conveys what the plan, price and trials duration offer. This value isn't user facing.

gradient blur
dashboard-header

Reference and product identifiers

Here is an example from one of my apps:

gradient blur
dashboard-header

Subscription from Elite Hoops

Fill in subscription details

Next up, you'll set the price, duration, and fill in similar metadata for the subscription on this page:

gradient blur
dashboard-header

Subscription metadata

  • Set a subscription duration. Pick an option from the toggle found in the top right of the page.

  • Click on Setup Availability and either choose Done from the modal to make it available in all territories, or select the individual ones where it should be available.

  • Now, click on Add Subscription Price and choose a price for your subscription (optionally, customize the price per region). Click Confirm at the end. You will be able to set a free trial or paid introductory offer in a minute.

  • Finally, click on Add Localization and fill in the display name and description.

  • gradient blur
    dashboard-header

    Localizations for your subscription

  • At the top right, click on Save.

Adding a free trial or introductory offer

If you want to add a free trial, or introductory offer (i.e. $10 for the first year, renews at $15):

  • Click on the + button next to "Subscription Prices" and choose "Create Introductory Offer":

  • gradient blur
    dashboard-header

    Creating a trial

  • Click Next to select the applicable territories.

  • Choose a start and end date. For free trials, most likely you'll just choose the start date as today, and don't choose an end date. Then, click Next.

  • Now, you'll choose the type of introductory offer you want to use. You have three options:

    1. Pay as you go: Let subscribers pay periodically (e.g., monthly or yearly) at a discounted rate during the introductory period, while renewing at your standard rate.

    2. Pay up front: Similar to pay as you go, except subscribers pay the total discounted price for the entire introductory period in advance. Then, they'll renew at the standard rate.

    3. Free: This create a free trial (X days free, then $Y per (month, year, etc).

  • Choose the territories, and click Confirm.

Repeat these steps for any of the subscriptions you want to offer. Before you go any further, now is the time to create your free Superwall account if you haven't yet, and add your new iOS app to it.

Adding subscriptions in Superwall

At this point, you could add your products into your iOS app in several different ways (such as StoreKit). Here, I'll show how quick and easy it is using Superwall — which is the fastest route to launching and monetizing.

Here are two super short videos I've put together to show you all that you need to know:

  1. Adding Products in Superwall

  2. Putting Products on a Paywall

At this point:

  1. You have created subscriptions.

  2. You’ve added your products into Superwall. Behind the scenes, Superwall also created a default entitlement for you. An entitlement is simply a way of saying, “this person can access this part of my app.” You can create multiple entitlements if you need them, but in most cases — like in our example — one is enough. (For example, if someone has an active subscription, they can access all the features of your app with one active entitlement.)

  3. And, you've setup an entire stack to present paywalls, and offer products to purchase.

If you aren't one for watching videos, I've written to-the-point documentation here on how to add products to Superwall. Please follow those steps and return back here when you're done.

Configure the Superwall SDK

When you created your app in Superwall, you might've already done this step. But, just in case you haven't, go ahead and get Superwall installed and configured:

  1. Installing the SDK on iOS

  2. Configuring the SDK

If you need Superwall to interface with another third party service, such as RevenueCat, you can certainly do that! You'll use something we call a PurchaseController, which is just a fancy way of saying "Hey Superwall, use this code for buying subscriptions instead of your own. Also, I want to manually set whether or not they are a paid user based off another service." Instructions for that can be found right here.

Testing a purchase in the simulator or device

Next, we're going to add a StoreKit Configuration file. I've got all that steps outlined right here. Come back once you've done that. In short, a StoreKit Configuration file allows you to test purchases quickly before they are live in the App Store.

StoreKit Configuration files are an indispensable tool. They make it quick to test things when you're not yet launched or you're creating new products to test out which haven't been approved by App Store review. Here, you've added (or automatically synced) the same products you added in App Store Connect. And, you've put those same ones on a Superwall paywall, so you're all set now.

Here comes the fun part — showing a paywall! Assuming you didn't edit the default Superwall campaign, you can add this code anywhere in your app (like in a button press) to show a paywall:

Superwall.shared.register(placement: "campaign_trigger") {
    print("Unlock feature.")
}

swift

ungroup Copy

At this point, a paywall will appear with your products. Go ahead and purchase one, and just like that — you just made your first purchase!

Testing a purchase in TestFlight beta builds

Now, let's test your app on TestFlight. Here's a critical reminder — none of your subscriptions should be in the "Missing Metadata" phase here. Here's an example:

gradient blur
dashboard-header

Missing metadata on a product

If they are in this state, they won't work in TestFlight or during app review. This is the most common problem new (and existing!) developers face. Your products must be in "Ready to Submit" or "Approved" state. If this is a brand new app that's launching, then the state we need is "Ready to Submit", and the blue banner at the top of the subscription hints at that. It's basically telling you that, for the app's first launch, you'll submit all your new subscriptions for review alongside your app.

So, again, to test in TestFlight, subscriptions must be in the "Ready to Submit" phase. To get them there before launch:

  • Make sure all localization fields are filled out.

  • All developer agreement forms are active and filled out.

  • Tax and banking info has been submitted and completed.

As part of this, you need a screenshot of the subscription. Remember how we tested out our subscriptions locally before? Simply run the simulator again, and press ⌘+S on your keyboard to save a screenshot of the subscription showing on a paywall. Then, upload that and you'll be set here:

  • Open the subscription that's in the "Missing Metadata" state.

  • Under Review Information, upload the screenshot:

gradient blur
dashboard-header

Adding a screenshot of your subscription

Once you're products are in the "Ready to Submit" phase, you're ready to continue. Let's package up the app and send it to TestFlight.

Archiving a build

Archiving and uploading your build allows it to be available for testing via TestFlight, which is Apple's service for beta testing.

  • In Xcode, go to Product --> Archive:

gradient blur
dashboard-header

Archiving a product in Xcode.

  • Once it's archived, Xcode's Organizer will open up. Select the archive, and click on Distribute App:

gradient blur
dashboard-header

Distributing an app via the Organizer

  • Choose App Store Connect on the next screen, and then click Distribute:

gradient blur
dashboard-header

Distributing an app to App Store Connect

Once it's done finished, you should get a modal letting you know it's uploaded to App Store Connect successfully:

gradient blur
dashboard-header

You should see this once the archive is uploaded.

Making a public test build via TestFlight

Now, back in App Store Connect, open up your app and go to the TestFlight tab. You should see your archive you just uploaded. Note that it may be in a "Processing" phase, and that's normal — usually it only takes around 5-10 minutes to complete. Once it's in "Ready to Submit", we can test it:

gradient blur
dashboard-header

Build that is ready for TestFlight.

  • On the left-hand side, click on the plus button next to EXTERNAL TESTING. If you've already made a public testing group, you can skip this step. Otherwise, name the group and save it. You can also enable a public testing link on the resulting page if you want. Here, I've already made a group called "Public Testers":

gradient blur
dashboard-header

Create a public testing group.

  • On the left-hand side, under Builds, click on iOS.

  • Then, for your build that you uploaded, click the plus button and choose the public testing group you just made under GROUPS:

gradient blur
dashboard-header

Assigning a testing group to TestFlight.

  • Fill out the release notes, and submit it for review:

gradient blur
dashboard-header

Adding test notes.

At this point, your build will be in "Waiting for Review" status. If it passes review, congratulations! You can publicly test your app and perform purchases.

Launching your first app and products

If everything goes well in testing, you're ready to ship. At the top of App Store Connect, choose Distribution:

gradient blur
dashboard-header

Getting ready to ship under the Distribution tab.

Filling out release data

Here, you'll need to fill in all of the metadata about the release. Things like:

  • App Store screenshots.

  • Keywords.

  • Product details, etc.

Take your time figuring out which keywords make sense, what to name your app, picking out a great subtitle, and more. All of that plays heavily into "ASO", which stands for "App Store Optimization" — or put simply, how well your app performs in the search rankings. You can also change most of this between releases, too. Try not to overthink things too hard here, there's no better motivation than shipping — and you can always improve things like screenshots later if you need to.

Sending a build and subscriptions to review

After all of the metadata is taken care of, under Build, choose the build you've been testing with (or perhaps another one, if you've made some fixes or changes and have uploaded another archived build). The build shows up as a result of uploading an archived build to App Store Connect, which we did earlier. This is what will go to App Review, and ultimately, release:

gradient blur
dashboard-header

Choosing a build to release.

In the example above, I've already shipped an initial version of this app — so that's why we are seeing "Version 1.0.1", yours will read "Version 1.0". Once you have that all finished, you get to press the Add for Review button:

gradient blur
dashboard-header

Submitting a build to Apple for review.

Follow the prompts, and you're all set! Your subscription products should also show here to add for review, but if they don't — you can open them up individually and submit them to app review. When Apple has your build and products, they'll start the review process. It'll either go live once approved, or according to whatever you've chosen under App Store Version Release on that same page:

gradient blur
dashboard-header

Release date options.

Don't be discouraged if your first submission is rejected. That's fairly normal, and most fixes and tweaks are quite easy to make. In fact, I don't think I've ever had an app approved on the first try, so don't get discouraged.

And, you're live!

At this point, you're app will be shipped and off to the App Store! Getting the first one out the door is, by far, the hardest this process will ever be. Once you've done it a few times, you'll get the hang of it. So stick with it, and ask questions if you get stuck somewhere along the way.

If you've followed along here, you've got an app with Superwall in production. Now, you can take things to the next level and start running paywall experiments, price tests, and more. I hope this guide has useful, and if you ever need any help — we're always one ping away on X or email.

gradient blur

Get a demo

We'd love to show you Superwall

Want to learn more?

  1. Fill out this tiny form →
  2. We'll prepare you a custom demo
  3. Walk you through Superwall
  4. Follow up and answer questions

Key features

  • Drag 'n Drop Paywalls
  • 200+ Custom Templates
  • Unlimited A/B tests
  • Surveys, Charts & More

Select one...

Select one...

By proceeding you consent to receiving emails and our terms.

gradient blur
shape-starshape-starshape-starshape-starshape-star

Customer Stories

Our customers refer to Superwall as their most impactful monetization tool. In their own words:

dashboard-header

Thanks to Superwall, we were able to 2x our iOS app profitability in just six months. It has greatly assisted our growth team in achieving exceptional results by facilitating high-frequency experimentation.

Mojo launch
Bernard Bontemps, Head of Growth
dashboard-header

Really excited about the progress we made recently on paywalls with Superwall. We got more than 50% increase in conversion for upsell screens. This is crazy.

Photoroom launch
Matthieu Rouif, CEO
dashboard-header

Superwall has completely changed the game for us. We’re able to run experiments 10x faster and unlock the ideal monetization model for our users.

RapChat launch
Seth Miller, CEO
dashboard-header

Superwall made testing paywalls so much faster. Instead of releasing a new version of the app each time, we were able to iterate on the winning paywalls much quicker. Thanks to that it increased our revenue per customer by 40%.

Teleprompter launch
Mate Kovacs, Indie Dev
dashboard-header

Superwall lets us move 10x faster on our monetization strategy. We can build and launch multiple paywall iterations without the need for client releases or complicated deploys. Our product iteration loop is days, rather than months because of Superwall.

Citizen launch
Jon Rhome, Head of Product
dashboard-header

Superwall enables Bickster’s marketing team to design and optimize app paywalls, freeing up engineering to concentrate on innovation. As a result, Superwall helped accelerate our install-to-subscription rates, lower engineering expenses, and cured our team’s frustration with the (once) time-consuming process of iterating on paywalls.

Bickster launch
Chris Bick, CEO
dashboard-header

Superwall has revolutionized our monetization strategy. It’s an essential tool that allows rapid paywall testing and optimization, leading to remarkable improvements in our subscription conversions and revenue generation. Can’t recommend Superwall enough for any app-based business.

Coinstats launch
Vahe Baghdasaryan, Sr. Growth
dashboard-header

Superwall has played an integral part of improving our subscription business. Compared to other providers, Superwall has proven superior in facilitating high-frequency experimentation allowing us to achieve an ideal monetization model, resulting in a significant increase in revenue.

Hornet launch
Nils Breitmar, Head of Growth
dashboard-header

Superwall is the single greatest tool we’ve used to help us increase our revenue. Our material wins from Superwall are greater than any tool we’ve worked with to date!

Pixite launch
Jordan Gaphni, Head of Growth
dashboard-header

Shout out to Superwall for helping us dial in our paywall — made a big impact on monetization, increasing revenue by more than 50% 💸

Polycam launch
Chris Heinrich, CEO
dashboard-header

Superwall increases revenue. Full stop. Being able to test paywalls on the fly and quickly analyze results has drastically increased our revenue and improved our monetization of users. Highly recommend this tool!

Hashtag Expert launch
Zach Shakked, Founder
Start for FREE

Simple win-win pricing

Interest aligned pricing. Contact us for a discount.

dashboard-header
Indie
Free
Up to 250 conversions per month
Access to every standard feature
Try it free

Standard Features

  • 250 Conversions a Month
  • Drag 'n Drop Paywall Editor
  • 200+ Paywall Templates
  • Unlimited A/B tests
  • Charts & Analytics
dashboard-header
Startup
$0.20/conversion
Pay as you go pricing that scales
Up to 5,000 conversions a month
Sign Up

Standard Features

  • 5,000 Conversions a Month
  • Drag 'n Drop Paywall Editor
  • 200+ Paywall Templates
  • Unlimited A/B tests
  • Charts & Analytics
dashboard-header
Growth
Flat-Rate
100% custom flat-rate pricing
Terms that make sense for you
Get Pricing

Premium Features

  • Unlimited Conversions
  • We Build Your Paywalls
  • 4 Weekly Growth Meetings
  • Dedicated Slack Channel
  • Custom Integrations