Today, developers from all over the world generate billions of dollars in subscription revenue. In 2021, for example, iOS app revenue exceeded $85 billion. However, revenue tracking and collecting the app’s revenue data may be complicated for smaller developers. If you have or are working on an iOS app with auto-renewable subscriptions, this article is for you. Here, we describe what difficulties you will face while calculating the revenue of your subscription-based app.
You will need to track revenue to be able to send this data to your mobile product analytics or marketing platforms, such as Amplitude, Mixpanel, AppsFlyer, Branch, or Adjust. They don’t all support subscription revenue tracking. So you will need your own server to track subscription events, such as trial conversions, renewals, cancellations, etc. Then, you will need to send data to your analytics using a server-to-server API. Unfortunately, not all analytics platforms have such a feature. For example, Firebase and Flurry don’t have an API for receiving server events, and they don’t support subscriptions.
In this article, I will explain all the difficulties that you will meet if you decide to make your own solution. And I will try to convince you in favor of our ready-to-use solution, Apphud, to check your app revenue.
Well, I wouldn’t call it analytics at all. App Store Connect has just overview data: conversions, events, and retention charts. But it is not the best app revenue checker for several reasons:
The main problem is that you can’t send subscription events when the app is not running. You could probably send events when a user has launched the app, but this may happen in a week, in a month, or, perhaps, never. And your data won’t be up to date, and some events will be lost.
You may think that two events – trial conversion and renewal – are enough. But that’s not true. There are plenty of subscription events, and all of them occur frequently. It’s up to you how many events you identify. It could be 5 events or 20.
Here is a list of a possible set of events.
Renewal: regular renewal, trial activation, paid introductory offer renewal, trial promotional offer renewal, paid promotional offer renewal
Conversion: trial conversion, paid introductory offer conversion, trial promotional offer conversion, paid promotional offer conversion
Expiration: regular subscription expiration, trial expiration, paid introductory offer expiration, trial promotional offer expiration, paid promotional offer expiration
Refund: regular subscription refund, paid introductory offer refund, paid promotional offer refund
Other events: autorenew enabled, autorenew disabled, billing grace period started, subscription upgraded.
Custom events: paywall shown, paywall payment cancelled, etc.
Quite a lot of events, right? In Apphud, we have our own set of more than 30 events. You can set custom event names, so you can send all paid renewals under one event if needed.
The main difficulty is that you can’t know how much Apple charged the user in each transaction. Maybe someday, Apple will add a “charge amount” field in the receipt, but until that day, we have to solve the problems listed below by ourselves.
When a developer increases the price, they can choose whether to apply the new price to existing subscribers or not. If they choose to apply the new price, everything is simple. If the user agrees to the new price, then you set a higher price for new transactions; otherwise, their subscription will expire. If the developer decides to keep the current prices, it requires a bit more work. Unfortunately, StoreKit doesn’t allow us to get the original price of the subscription that the user purchased. So, you should save the original prices for all subscribers.
Users can manage their subscriptions in the App Store app to choose a different duration and price.
When fetching new transactions, you should also check for product identifiers in the receipts and get the corresponding price. Subscription changes can be of three types: upgrade, downgrade, and cross-grade. We will write a separate article about this; for now, you can get more info about subscription levels here:
When a user upgrades to a higher level of subscription, they upgrade immediately and get a refund of the prorated amount of the previous subscription.
As you know, App Store Connect has 155 territories, and you can create different prices for them. So, you have to keep prices for each territory and use the corresponding price.
Not all product analytics support automatic currency conversion. You have to manually convert prices into a basic currency — for example, USD. In Apphud, we regularly refresh currency rates using Open Exchange Rates.
Apple’s commission is 30%. However, after a year of paid uninterrupted service, it decreases to 15%. If a subscription was interrupted for more than 60 days in total, then the paid service date resets.
It means that an introductory offer can be applied not only at the beginning of the original subscription but also after reactivating a subscription if the introductory offer hasn’t yet been used.
You have to keep all introductory types and prices for each country. An introductory offer can be of the following types: trial, pay up front, or pay as you go. You can read more about introductory offers here:
Subscription offers, AKA promotional offers, can be applied as many times as the developer wants and can change each other. So, you have to keep prices for all subscription offers as well. You can read more about promotional offers here:
You have to track refunds as well and send the negative amount to your analytics.
A user can launch your app from another device. And you don’t want them to appear as two paid users in your analytics; you want all renewals to be sent only from the first user. That’s not an easy job. In some cases, you will need to merge users in your server.
That’s a fundamental task. You have to store receipt data, shared secrets, and validated receipts at their expiration dates.
Apphud offers integrations that let you send subscription events, such as trial conversions, renewals, and cancellations, to your mobile analytics from our server.
To enable integration with Amplitude or Mixpanel, you just need to add the API key to the corresponding integration page in Apphud.
After you add the integration, you will begin to receive subscription events in real-time. You will know subscription key metrics, such as ARPU, MRR, trial conversion, churn rate, etc. And you can tie these metrics to your custom events in your app. Besides that, you will see the total amount spent, a transaction count, and other important properties for each user.
If you have ad campaigns or are planning to start advertising your app, you should add integration with AppsFlyer or Branch. You will be able to track campaign effectiveness and compare your traffic sources by real revenue, trial conversions, or other metrics.
You can also receive real-time information about new trials or renewals in Slack or Telegram. The integration process will take you less than a minute.
Tracking and sending subscription revenue by yourself is not easy. Besides having your own server, you will need to calculate the correct charge amounts. It will take plenty of time and resources for implementation, which is better spent on improving your product. So, a good app revenue tracker may make your life much easier. Apphud will help you correctly track subscription revenue and send it to your analytics.
Besides integrations, we are working on other features, such as winning back lapsed subscribers. More features are coming, so join Apphud using this link.