The first ever step-by-step playbook to building & scaling subscription-based apps 👉 Get your copy

Maximizing app trial conversions

Better identifying and understanding trial and subscription behaviors enables you to best build the monetization flows that help convert trials, retain potential churn, and recover lost users… if done correctly.
Marco Pifferi
December 7, 2022
glassfy blog hero image

Background

In this article we will help you understand the flow of events that we send to webhooks and other integrations related to Trials such as:

  1. When a subscriber starts a subscription with a trial period
  2. When trial converts to pay subscription
  3. When a user churns from their trial period

First, why do we care? This is a core principle of recurring revenue and subscriptions. Better identifying and understanding trial and subscription behaviors enables you to best build the monetization flows that help convert trials, retain potential churn, and recover lost users… if done correctly.

The concept of a trial period at the beginning of a subscription is becoming table stakes in monetization and what a user genuinely expects from their experience. This is a sure fire way to introduce low friction to increasing top of funnel with a low risk of churn if managed correctly. As a quick reminder for those who need a refresher, here is what that can look like in your app…

paywall

Most companies who implement a free trial flow can increase revenue up to 10%. Amplitude Guide To Flywheels

Trial to Subscription events in Glassfy

For the purpose of todays example we are going to show how which events you can use for a user who is purchasing a monthly subscription with a 1 week trial person. There are two main paths the user can follow: ultimately move into the subscription or cancel their trial before the subscription starts.

Converted from Trial period to Subscription

The user starts the subscription and at the end of the trial period they converted to the paid subscription.

glassfy blog image

We are generating the following sequence

  1. SubscriptionInitialBuy with is_trial_period == true when the subscriber purchase the subscription.
  2. When the trial will end (in the above example is 1 week trial) we send SubscriptionRenewed with trial_status==1 (the trial status will describe how the trail converted see events descriptions in our webhook documentation here https://docs.glassfy.io/docs/webhooks
  3. Then a normal sequence of events will be generated for further renewal or cancellation of the subscription

Did not convert from Trial period to Subscription

The user starts the subscription and before the end of the trial period they are canceling the subscription.

not-converting.png

We are generating the following sequence

  1. SubscriptionInitialBuy with is_trial_period == true when the subscriber purchase the subscription.
  2. Before the end of the trial period the user goes to the app store settings page and cancel the subscription: we send SubscriptionDidChangeRenewalStatus with auto_renew_status == false at the exact date when the user cancel.
  3. When the trial will end (in the above example is 1 week trial) we send SubscriptionExpired with trial_status==2
  4. No more events will be sent for the same subscription

All of these events are sent to our webhooks and also to Connectors such as Segment, MixPanel or Slack.

Using the Glassfy SDK you can query if a subscription is currently in trial mode with the following code

Glassfy.permissions { [weak self] permissions, err in
    if let permissions=permissions {
        if let p=permissions["permission"], p.isValid,!p.accountableSkus.isEmpty {
            let activeSkus = p.accountableSkus
            activeSkus.forEach { sku in
                // sku.isInTrialPeriod
            }
        }
    }
}

or you can use our REST API to query the subscriber permission including trial status.

curl --request GET \
     --url https://openapi.glassfy.io/v1/subscriber?subscriberid=your_subscriber_id \
     --header 'Authorization: Bearer f07e36eaeccc436d88212c12dbb6dc06' \
     --header 'accept: application/json'

Read More