2 min read

Mobile Upgrade Sources

In this analysis we’ll examine the ways in which mobile users upgrade to paid subscriptions. A mobile user is defined as one that signs up for Buffer with one of the mobile apps. We will be excluding users that started trials before subscribing to a paid plan.


Around 30% of Subscription Started events come from users that either haven’t been on a trial or started one more than 30 days prior to the conversion event.

The free-to-paid conversion rate was estimated by looking at the number of Subscription Started events that came from users without an associated trial and dividing it by the total number of users that signed up that month less the number that converted with an associated trial.

With the deprecation of Buffer Classic, which was perhaps the main source of users subscribing without a trial, the estimated proportion of users that purchase a paid subscription after having been on a Free plan for multiple weeks is around 0.85% to 1%.

# connect to bigquery
con <- dbConnect(
  project = "buffer-data"

# to make bigquery work
options(scipen = 20)

# define sql query
sql <- "
  select distinct
    u.id as user_id
    , u.account_id
    , u.created_at as signup_at
    , ps.client_name as signup_client
    , ps.signup_with_trial
    , ps.source
    , s.id as sub_start_id
    , s.original_timestamp as converted_at
    , s.plan_id
    , s.subscription_id
    , s.trial_start_date as sub_trial_start
    , s.trial_end_date as sub_trial_end
    , s.cta
    , s.cta_app
    , s.cta_view
    , s.cta_location
    , s.cta_button
    , s.utm_campaign
  from dbt_buffer.publish_users u
  inner join dbt_buffer.segment_product_signups ps
    on ps.user_id = u.account_id
    and ps.product = 'publish'
    and ps.client_name in ('publishIos', 'publishAndroid')
  left join segment_publish_server.subscription_started s
    on s.user_id = u.account_id
  left join dbt_buffer.stripe_trials t
    on u.stripe_customer_id = t.customer_id
  where u.created_at between '2020-01-01' and '2020-09-01'
  and t.id is null
# query BQ
users <- dbGetQuery(con, sql)

# save data
saveRDS(users, "mobile_free_conversions.rds")

Conversion Sources

We collect CTA data in the Subscription Started event. Let’s use these to find the most common sources of upgrades for mobile users without trials.

The most common location is the switch plans modal, followed by the queue limit notification and header.

Upgrade Rate Over Time