Subscription tracking
With Adjust, you can track users’ subscriptions and measure signup behavior. Use your data to calculate users’ lifetime value (LTV) and create effective retargeting campaigns. Here, you’ll learn how to set up subscription tracking in Adjust and find answers to frequently asked questions.
Before you begin
Here’s what you need to know before getting started.
Availability
- Subscription tracking package
- For more information, speak with your dedicated Sales representative or Technical Account Manager
Requirements
- Your own BI or cloud storage system to receive raw subscription data
- Aggregated data is available on the Dashboard using S2S internal subscription events
- Subscription tracking enabled with the minimum Adjust SDK version (see below).
[Adjust trackSubscription:subscription];
for iOS and Adjust.trackPlayStoreSubscription(subscription);
for Android when a subscription purchase is made.
- Native Adjust Android SDK v4.22.0+ / Adjust iOS SDK v4.22.1+
- Non-native SDKs Unity v4.22.1, React Native v4.22.0, Flutter v4.22.0, Xamarin v.4.22.0, Cordova v.4.22.0, Titanium v.4.23.0
- In compliance with GDPR, make sure to encrypt all of your parameter data. Additionally, do not include any personal data (including, but not limited to, email address, age, name etc.) within the parameter data.
Getting started
To get started with subscription tracking, please alert your dedicated Technical Account Manager or contact support@adjust.com. They will initiate setup within Adjust’s internal interface. Once that is done, follow these steps.
Set up your subscription app
Setting up your app for subscription tracking involves a few important stages. These must be completed before you can begin tracking.
1. Add your App to the Adjust dashboard
First, add your subscription app to the Adjust dashboard. Be sure to select the correct platform (iOS or Android) and provide its app_token to complete setup.
Use our Add a New App article to guide you through these initial steps.
2. Integrate the Adjust SDK
We use our open-source SDK to implement our subscription tracking solution.
If you do not yet have the Adjust SDK integrated into your app, use our Github developer documentation to do so. Be sure to add the latest version. You can watch this video for more information. After, use our Testing Console to verify the implementation.
3. Share credentials with Adjust
In order to finalize the setup in Adjust, we require certain pieces of app-specific information. Please share the following details with your Technical Account Manager or the Support representative who has been assisting you.
For Android
1. Link to your Google Developer Project
Go to the Google Play Console, select API access > Link. This connects your Play account to a Google Developer Project.
2. Create a Service Account
Within the Google API Console select Create Service Account. Add Service Account key credentials. Now, name the account and assign it to the role of Project Owner.
When you select Create, a JSON file will start to download. This contains the credentials required for communication between Adjust and Google.
3. Grant Financial Access
Return to the Play Console. Select Grant Access on the new Adjust service account and set the following:
- Role - Finance
- Add - Manage Orders Permissions
Now, select Save.
If these options are not available, you likely do not have adequate account permissions. Contact your Account Owner or Admin.
4. Send information to Adjust
To complete the process, share the following information with the Adjust representative helping you through setup.
- Your Adjust app token(s)
- Your JSON credential file, as downloaded from Google (see step 2)
That’s it! You’re all set.
For iOS
1. Set up the Apple Subscription Trigger URL
Log in to your iTunes Connect account and select the My Apps tab.
Select App Information from the sidebar, and navigate to the field in the bottom right-hand corner called Subscription Status URL.
Enter: https://subscription.adjust.com/v2/appstore/
2. Find your App-Specific Shared Secret
From your iTunes Connect account, go to My Apps and select your subscription app. Then, select Features > In-App Purchases > App-Specific Shared Secret. From the pop-up, you can now copy your secret.
3. Send information to Adjust
To complete the process, now share the following information with the Adjust representative helping you through setup.
- Your Adjust app token(s)
- Your Shared Secret (see step 2)
That’s it! You’re all set.
Set up subscription event callbacks
Using callbacks, you can send user-level data directly to your servers—seconds after Adjust tracks the event. Set up global callbacks to receive the same data points for every tracked event or callbacks for individual events. Watch this video for more information about Adjust callbacks.
Requirements
- Your own BI system to receive GET requests. (Confirm that your server can receive all of your parameters and store all incoming data—the number of users in your app affects how fast your servers need to be.)
Helpful information
- To make sure you only receive data from Adjust, whitelist our server IPs
- We can forward callbacks up to 1MB
- Since subscription events are considered activities, you can filter
{activity_kind}
for ‘subscription’ to find them quickly.
Subscription events and placeholders
Adjust automatically tracks the following subscription events.
- Subscription activation
- Subscription first conversion
- Subscription entered billing retry
- Subscription renewal
- Subscription cancellation
- Subscription renewal from billing retry
- Subscription reactivation
For a more granular look at your users’ behavior, we offer the following placeholders you can add to your callbacks.
Placeholder | Description | Content + example value |
{subscription_event_type} | Which of the 7 event types an action is | activation first_conversion renewal |
{subscription_event_subtype} | See the table below for more details | initial_subscription failed_trial renewed_subscription |
{subscription_purchased_at}
| Unix timestamp of any valid purchase | 1571608922 |
{subscription_expiration_time}
| Unix timestamp of the expiration of a valid subscription. The data can be in the past or future. | 1571608922 |
{subscription_cancelled_at}
| Unix timestamp from when the subscription stops being valid. Cannot be later than the expiration_time. If the subscription transaction fails and cannot be resolved, the value returned will be the expiration_time of the failed transaction. No value shows in the expiration_time placeholder | 1571608922 |
{subscription_transaction_id}
| The value of a valid transaction. Failed transactions return no value. If there is a billing problem, the current transaction ID is returned. | 230000687036600 |
{subscription_original_transaction_id}
| The first transaction ID of the product subscription chain | 230000687036600 |
{subscription_expired_transaction_id}
| The previous valid transaction ID - if it's the first transaction, this returns an empty value. If it’s a failed transaction, this returns the previous valid transaction ID. | 230000687036600 |
{subscription_environment}
| Which environment the subscription purchase happened in | sandbox production |
{subscription_product_id}
| The subscription product type within the app | com.product.id |
{subscription_sales_region}
| The region code of the Apple store account's registered location; Google’s region code is based on the device's physical location | us |
{subscription_store}
| Which store the subscription purchased was triggered from | appleappstore googleplaystore |
Subscription event subtypes
For each subscription event type, there are additional subtypes. These offer greater insight into your user data. From the table below, you can see which subtype values can be returned when you include the {subscription_event_subtype} placeholder in your callbacks.

Subscription event type | Subscription event subtype values | Description |
activation | initial_subscription | User triggers first (paid) subscription in app |
initial_trial | User triggers the first free trial in app | |
initial_offer | User triggers first (paid) offer in app with a discounted price | |
first_conversion | converted_trial | User did not cancel the subscription when the free trial ended, converting them into a subscribed user |
converted_offer | User did not cancel the subscription when the first paid offer ended, converting them to a full-paying subscribed user | |
entered_billing_retry | trial_in_retry | Trial expired but renewal wasn't successful due to a billing issue. For instance: the user did not cancel when the free trial period ended, however due to an issue with the payment source they could not be charged |
offer_in_retry | Offer expired but renewal wasn't successful due to a billing issue. For instance: the user did not cancel when the offer period ended, however due to an issue with the payment source they could not be charged | |
subscription_in_retry | Subscription expired but renewal wasn't successful due to a billing issue. For instance: the user did not cancel when the free subscription period ended, however due to an issue with the payment source they could not be charged | |
renewal | renewed_subscription | Successful subscription renewal |
cancellation | failed_trial | Trial not renewed at the end of the trial period |
failed_offer | The first paid offer was not renewed at the end of the offer period. | |
failed_subscription | Subscription not renewed at the end of its time period | |
failed_trial_from_retry | Trial is not converted after the billing retry fails | |
failed_offer_from_retry | Offer is not converted after the billing retry fails | |
failed_subscription_from_retry | Subscription not renewed after the billing retry fails | |
renewal_from_billing_retry | converted_trial_from_retry | When the billing retry on a trial is successful and the trial is converted |
converted_offer_from_retry | When the billing retry on an offer is successful and the offer is converted | |
renewed_subscription_from_retry | When the billing retry on subscription is successful and the subscription is renewed | |
reactivation | reactivated_subscription | A user who subscribed through a trial, offer, or subscription, then cancelled it, then reactivated it. |
Global callbacks
Global callbacks provide a full list of data points from all Adjust-tracked activities.
If you already have global callbacks set up in the dashboard, simply add our subscription event placeholders to your existing callback URL.
For a full overview of how to create global callback URLs, follow our guide here. Alternatively, edit your callback URL using our template and example below.
Example
http://callbackserver.com/adjust_global?app_id={app_id}&app_name={app_name}&app_name_dashboard={app_name_dashboard}&app_version={app_version}&app_version_raw={app_version_raw}&app_version_short={app_version_short}&store={store}&tracker={tracker}&tracker_name={tracker_name}&first_tracker={first_tracker}&last_tracker={last_tracker}&last_tracker_name={last_tracker_name}&outdated_tracker={outdated_tracker}&network_name={network_name}&campaign_name={campaign_name}&adgroup_name={adgroup_name}&creative_name={creative_name}&impression_based={impression_based}&is_organic={is_organic}&rejection_reason={rejection_reason}&click_referer={click_referer}&click_time={click_time}&click_time_hour={click_time_hour}&impression_time={impression_time}&impression_time_hour={impression_time_hour}&conversion_duration={conversion_duration}&engagement_time={engagement_time}&engagement_time_hour={engagement_time_hour}&installed_at={installed_at}&installed_at_hour={installed_at_hour}&install_finish_time={install_finish_time}&install_begin_time={install_begin_time}&referral_time={referral_time}&created_at={created_at}&created_at_milli={created_at_milli}&created_at_hour={created_at_hour}&reattributed_at={reattributed_at}&reattributed_at_hour={reattributed_at_hour}&attribution_updated_at={attribution_updated_at}&time_to_uninstall&idfa={idfa}&idfv={idfv}&gps_adid={gps_adid}&android_id={android_id}&adid={adid}&activity_kind={activity_kind}&revenue={revenue}¤cy={currency}&subscription_event={subscription_event_type}&subscription_event_subtype={subscription_event_subtype}&product_id={subscription_product_id}&sales_region={subscription_sales_region}&transaction_id={subscription_transaction_id}&expired_transaction_id={subscription_expired_transaction_id}&original_transaction_id={subscription_original_transaction_id}&subscription_store={subscription_store}&subscription_start={subscription_purchased_at}&subscription_end={subscription_expiration_time}&subscription_cancelled={subscription_cancelled_at}&environment={subscription_environment}&callback_parameter={publisher_parameters}
Single event callbacks
A single event callback is a callback for one specific subscription event (e.g., activation). This is a great option if you only need data for certain events or when you don't have the data capacity for global callbacks.
To receive single event callbacks, send the following information to your Technical Account Manager or the Support representative assisting you.
- The subscription event name(s)
- The callback URL(s) - this should include the endpoint you’ll receive the callback to & the placeholders needed
For a full overview of how to create callback URLs, follow our guide here. Alternatively, create your own callback URL using our template and example.
Example
http://callbackserver.com/adjust_subscription_activation?app_id={app_id}&app_name={app_name}&app_name_dashboard={app_name_dashboard}&app_version={app_version}&app_version_raw={app_version_raw}&app_version_short={app_version_short}&store={store}&tracker={tracker}&tracker_name={tracker_name}&first_tracker={first_tracker}&last_tracker={last_tracker}&last_tracker_name={last_tracker_name}&outdated_tracker={outdated_tracker}&network_name={network_name}&campaign_name={campaign_name}&adgroup_name={adgroup_name}&creative_name={creative_name}&impression_based={impression_based}&is_organic={is_organic}&rejection_reason={rejection_reason}&click_referer={click_referer}&click_time={click_time}&click_time_hour={click_time_hour}&impression_time={impression_time}&impression_time_hour={impression_time_hour}&conversion_duration={conversion_duration}&engagement_time={engagement_time}&engagement_time_hour={engagement_time_hour}&installed_at={installed_at}&installed_at_hour={installed_at_hour}&install_finish_time={install_finish_time}&install_begin_time={install_begin_time}&referral_time={referral_time}&created_at={created_at}&created_at_milli={created_at_milli}&created_at_hour={created_at_hour}&reattributed_at={reattributed_at}&reattributed_at_hour={reattributed_at_hour}&attribution_updated_at={attribution_updated_at}&time_to_uninstall&idfa={idfa}&idfv={idfv}&gps_adid={gps_adid}&android_id={android_id}&adid={adid}&revenue={revenue}¤cy={currency}&subscription_event={subscription_event_type}&subscription_event_subtype={subscription_event_subtype}&product_id={subscription_product_id}&sales_region={subscription_sales_region}&transaction_id={subscription_transaction_id}&original_transaction_id={subscription_original_transaction_id}&subscription_store={subscription_store}&subscription_start={subscription_purchased_at}&subscription_end={subscription_expiration_time}&environment={subscription_environment}&callback_parameter={publisher_parameters}
Single callback for all subscription events
To receive a single callback for all of your subscription events, send the following information to your Technical Account Manager or the Support representative assisting you.
- The callback URL - this should include the endpoint you’ll receive the callback to & the placeholders needed
Example
http://callbackserver.com/adjust_subscription?app_id={app_id}&app_name={app_name}&app_name_dashboard={app_name_dashboard}&app_version={app_version}&app_version_raw={app_version_raw}&app_version_short={app_version_short}&store={store}&tracker={tracker}&tracker_name={tracker_name}&first_tracker={first_tracker}&last_tracker={last_tracker}&last_tracker_name={last_tracker_name}&outdated_tracker={outdated_tracker}&network_name={network_name}&campaign_name={campaign_name}&adgroup_name={adgroup_name}&creative_name={creative_name}&impression_based={impression_based}&is_organic={is_organic}&rejection_reason={rejection_reason}&click_referer={click_referer}&click_time={click_time}&click_time_hour={click_time_hour}&impression_time={impression_time}&impression_time_hour={impression_time_hour}&conversion_duration={conversion_duration}&engagement_time={engagement_time}&engagement_time_hour={engagement_time_hour}&installed_at={installed_at}&installed_at_hour={installed_at_hour}&install_finish_time={install_finish_time}&install_begin_time={install_begin_time}&referral_time={referral_time}&created_at={created_at}&created_at_milli={created_at_milli}&created_at_hour={created_at_hour}&reattributed_at={reattributed_at}&reattributed_at_hour={reattributed_at_hour}&attribution_updated_at={attribution_updated_at}&time_to_uninstall&idfa={idfa}&idfv={idfv}&gps_adid={gps_adid}&android_id={android_id}&adid={adid}&revenue={revenue}¤cy={currency}&subscription_event={subscription_event_type}&subscription_event_subtype={subscription_event_subtype}&product_id={subscription_product_id}&sales_region={subscription_sales_region}&transaction_id={subscription_transaction_id}&original_transaction_id={subscription_original_transaction_id}&expired_transaction_id={subscription_expired_transaction_id}&subscription_store={subscription_store}&subscription_start={subscription_purchased_at}&subscription_end={subscription_expiration_time}&subscription_cancelled={subscription_cancelled_at}&environment={subscription_environment}&callback_parameter={publisher_parameters}
Set up CSV uploads
With CSV uploads, you can automatically export your subscription event raw user data to cloud storage on an hourly basis.
To get set up, add the subscription placeholders you would like to be included to your CSV definition. To do this, go to the Adjust dashboard, find your app, and select All Settings > Raw Data Exports > CSV Upload. Read more about formatting your CSV definition.
Next, provide your Technical Account Manager or Sales representative with the following details.
- Whether you will upload to Amazon S3 or Google Cloud Storage
- Your app token
Set up Adjust internal S2S subscription events
If you do not have your own BI system to process user-level data, Adjust can set up server-to-server events internally. This lets you see your aggregated data in your dashboard Deliverables and Cohorts.
Although internal subscription events are implemented by our team within Adjust, you still need to integrate the Adjust SDK and set up subscription events on the dashboard.
You can choose any of the events that Adjust automatically tracks and set up the events on the dashboard. We recommend you use the following naming convention:
- activation
- first conversion
- entered billing retry
- renewal
- cancellation
- renewal from billing retry
- reactivation
To get started, provide your Technical Account Manager with the following details.
- Your app token
- The subscription event name(s)
- The event token(s)
- S2S authentication token - only required if you have activated S2S authentication
Once subscription events are tracked, you will see the events’ KPIs in your dashboard.
Duplicate data
Similarly, setting up internal S2S subscription events and enabling global callbacks on the dashboard with the additional subscription-related placeholders will also result in duplicate data.
Filter using the activity kind
If you do receive duplicate data, you can use the {activity_kind}
placeholder to filter: internal S2S subscription events’ callbacks return activity_kind=event
, while callbacks and CSV uploads for subscription events return activity_kind=subscription
.
Use conditional callbacks
Alternatively, you can use conditional callbacks to exclude internal S2S subscription events’ callback and avoid duplication.
Example conditional callback to avoid duplication using the event token:
notcontained,{event},abc123;def456,https://myawesomeendpoint.subscriptions?app_id={app_id}&idfv={idfv}&activity_kind={activity_kind}&subscription_event={subscription_event_type}&subscription_event_subtype={subscription_event_subtype}&product_id={subscription_product_id}&sales_region={subscription_sales_region}&transaction_id={subscription_transaction_id}&original_transaction_id={subscription_original_transaction_id}&subscription_store={subscription_store}&subscription_start={subscription_purchased_at}&subscription_end={subscription_expiration_time}&environment={subscription_environment}
Set up internal S2S subscription event forwarding to partners
After internal subscription events are set up and reflected in your dashboard, you can additionally forward your event data directly to partners for more precise targeting.
For example, to link subscription events to Facebook, follow these steps.
- Find your app and select your app options caret (^)
- Select Partner Setup > Facebook > Event Linking
- Find the event you want to link and update the field with a Facebook event name or your own custom name
- Select OK
- Select SAVE
FAQs
When should I use subscription tracking?
Subscription tracking is a powerful tool for subscription-based app marketers. Use the data to better understand the value of your marketing spend and optimize future campaigns. Here are some of the key uses of subscription tracking:
- Measure signups for trial periods
- Measure conversions from trials to paying subscribers
- Use subscription data for retargeting
How does subscription tracking with Adjust work?
Our solution leverages purchase verification technology. Adjust communicates with app stores, sending receipts for confirmation, to understand the status of a user’s subscription. This lets us determine whether that purchase was a user converting from a trial to a subscription, a subscription renewal, or a cancellation.
How long is subscription data stored?
Data is stored until the user does not subscribe anymore. Adjust deletes all data 30 days after they are unsubscribed. Subscription data is stored in a separate database from attribution data.
If a user switches from an iOS to Android device, are they treated as a new user?
If a user changes their device platform, the subscription chain is terminated and a new chain activated. Subscriptions are platform-specific, and are verified and tracked accordingly.
Does Adjust verify purchases made outside of the Apps App store and Google Play Store?
No. Adjust doesn’t not verify subscription purchases made outside of the official Apple and Google stores.