Languages 

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
  • Subscription tracking enabled with the minimum Adjust SDK version (see below).
Tip:
Check your developer has set the call [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.

Tip:
If the SDK is already integrated into your app, please ensure you are using Adjust Android SDK v4.22.0 or higher / Adjust iOS SDK v4.22.1 or higher. If you are not, upgrade the SDK now.

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.

1/3

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.

1/2

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.

1/2

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/

1/2

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.

1/2

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.

PlaceholderDescriptionContent + example value
{subscription_event_type} 
Which of the 7 event types an action isactivation

first_conversion

renewal
{subscription_event_subtype}See the table below for more detailsinitial_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 chain230000687036600
{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 appcom.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 locationus
{subscription_store}
Which store the subscription purchased was triggered fromappleappstore

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 typeSubscription event subtype valuesDescription 
activationinitial_subscriptionUser triggers first (paid) subscription in app
initial_trialUser triggers the first free trial in app
initial_offerUser triggers first (paid) offer in app with a discounted price
first_conversionconverted_trialUser did not cancel the subscription when the free trial ended, converting them into a subscribed user
converted_offerUser did not cancel the subscription when the first paid offer ended, converting them to a full-paying subscribed user
entered_billing_retrytrial_in_retryTrial 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_retryOffer 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_retrySubscription 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
renewalrenewed_subscriptionSuccessful subscription renewal
cancellationfailed_trialTrial not renewed at the end of the trial period
failed_offerThe first paid offer was not renewed at the end of the offer period. 
failed_subscriptionSubscription not renewed at the end of its time period
failed_trial_from_retryTrial is not converted after the billing retry fails
failed_offer_from_retryOffer is not converted after the billing retry fails
failed_subscription_from_retrySubscription not renewed after the billing retry fails
renewal_from_billing_retryconverted_trial_from_retryWhen the billing retry on a trial is successful and the trial is converted 
converted_offer_from_retryWhen the billing retry on an offer is successful and the offer is converted 
renewed_subscription_from_retryWhen the billing retry on subscription is successful and the subscription is renewed  
reactivationreactivated_subscriptionA 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}&currency={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}&currency={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}&currency={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.

Note:
If you already have Amazon S3 or Google Cloud Storage set up in the Dashboard, when subscription tracking is enabled you automatically receive CSV uploads for your subscription events. However, you still need to add subscription-related placeholders to your CSV definition to see these specific data points.

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.

Warning:
If you set up internal S2S subscription events and select these as events to export for CSV upload, while also adding subscription placeholders to your CSV definition, this will result in duplicate data. In this case, follow our duplicate data instructions to filter your data using the activity kind.

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

Warning:
If you set up internal S2S subscription events, do not also enable these internal S2S subscription events CSV uploads or callbacks from the dashboard. Doing so will lead to duplicate subscription events being sent.

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.

  1. Find your app and select your app options caret (^)
  2. Select Partner Setup > Facebook > Event Linking
  3. Find the event you want to link and update the field with a Facebook event name or your own custom name
  4. Select OK
  5. 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.