Periscope Data
The world’s fastest visualization platform for data analysts.

Thinking Critically About Mobile Game Retention

July 16, 2015

Many of our customers produce mobile games and use Periscope to track their growth metrics. Since a mobile game that doesn’t retain its players will never recoup the costs of getting those players, it’s not surprising that retention is one of their top metrics.

We’ve talked about calculating retention and cohort retention before. In this post, we’ll go a bit more in-depth about some of the important considerations around defining retention for mobile games.

Defining and Calculating Retention

The two most common ways to define retention are hard retention and rolling retention.

Hard retention is the most conservative definition and covers users who have returned exactly 1, 3, 7, etc. days after installing your app. In a fast paced industry such as mobile gaming, most companies like to look at hard retention as both an internal metric, and one for comparing to industry averages.

Rolling retention involves looking at the number of users who returned on or after day 7. This is more useful if your game is one where you do not necessarily expect players to play every day, but might play every weekend.

Calculating Hard Retention

First we select activity rows that occurred on the user’s join date. We left join to the same activity table, but conditioning on the future activity date being exactly one day from the join date. This will give us a table of users who have joined on each given day, and whether or not they returned the following day.

select 
  users.date as date,
  count(distinct activity.user_id) as new_users, 
  count(distinct future_activity.user_id) as retained_users,
  count(distinct future_activity.user_id) / 
    count(distinct activity.user_id)::float as retention
from activity
-- Limits activity to activity from new users
join users on
  activity.user_id = users.id 
  and users.date = activity.date
left join activity as future_activity on
  activity.user_id = future_activity.user_id
  and activity.date = future_activity.date - interval '1 day'
group by 1

Finally we count the users who have joined on each date, and how many have returned the following day. Dividing these numbers gives us day 1 hard retention over time.

Calculating Rolling Retention

It’s only a small change to switch from hard to day 1 rolling retention. In the second to last line, instead of conditioning the join to be future activity being exactly one day from their join date, we relax it and allow for future activity that is one or more days after the join date.

select 
  users.date as date,
  count(distinct activity.user_id) as new_users, 
  count(distinct future_activity.user_id) as retained_users,
  count(distinct future_activity.user_id) / 
    count(distinct activity.user_id)::float as retention
from activity
-- Limits activity to activity from new users
join users on
  activity.user_id = users.id 
  and users.date = activity.date
left join activity as future_activity on
  activity.user_id = future_activity.user_id
  and activity.date <= future_activity.date - interval '1 day'
group by 1

Finally, we can look at hard retention for each day since install, using a cohort grid. You can find the SQL for creating a cohort grid here.

An alternative option to using a cohort grid for visualization is a line chart. Many people will only look at day 1, 3, and 7 for early retention. While these are good approximations, they do not give you the granularity that a day by day line does. With a retention line, you can clearly see where the drop-offs are for your game.

We hope this post gave you a good framework for finding the definition of retention that fits your game best. Now go forth with your new knowledge and see how long you keep your players coming back!

Haven't tried Periscope Data yet?
Start a trial and we’ll send you one of our famous coffee mugs.
Read More
Haven’t tried Periscope Data yet?