Three Methods to Calculate Customer Lifetime Value (CLV) - Intuition, Churn Rate, and Survival Rate

For SaaS (Software-as-a-Service) and other subscription businesses, understanding CLV (Customer Lifetime Value) is crucial.

Unlike one-time sale businesses, in subscription businesses, the cumulative revenue from the same customer increases over time.

For example, let’s consider a service like Netflix that charges $20 per month.

In the first month, you can only earn $20 in revenue from a customer, but if this customer doesn’t cancel the service for the next 12 months, you can earn a total of $240 in revenue from this customer.

This is called Customer Lifetime Value or CLV.

Understanding how much revenue can be expected from one customer is important because it helps determine how much can be spent on acquiring new customers and retaining existing ones.

CLV can be calculated using the following three methods, which we will introduce in this note:

  1. Estimating CLV by intuition
  2. Estimating CLV from churn rate
  3. Estimating CLV from survival rate

Estimating CLV by Intuition

Let’s start with the simplest method.

For example, if we assume that the average customer duration is about 12 months, and the monthly revenue per customer is $100, the CLV would be $1200.

12 * 100 = 1200

However, this calculation might be a bit too simplistic. This is because there’s no basis for this 12-month figure, and it assumes that no one churns when estimating CLV.

Unfortunately, customers churn in any business, so such an estimate is not realistic.

Estimating CLV from Churn Rate

The average customer duration is greatly influenced by the churn rate. For example, if the customer churn rate is high, the average duration will be short, and if the churn rate is low, the average duration will be long.

The average customer duration can be calculated as follows:

Average retention period = 1 / Churn rate

For example, if the monthly churn rate is 10%, the average duration can be calculated as follows:

1 / 0.1 = 10

As shown above, the average duration is 10 months.

Once you’ve calculated the average duration, you can calculate CLV by multiplying it by the monthly revenue per customer.

If the monthly revenue per customer is $100, the CLV would be $1,000.

10 * 100 = 1,000

However, there’s a problem with this calculation.

The churn rate varies by month, so you can’t expect the same monthly revenue every month.

For example, the churn rate might be 40% in the first month, 30% in the second month, and then flatten out at 25% thereafter.

Therefore, if you want to calculate CLV in a more realistic way, it’s better to calculate the retention rate (survival rate) for each period in the customer’s lifetime and multiply these values by the monthly revenue.

Estimating CLV from Survival Rate

The most appropriate way to estimate the survival rate (or retention rate) from the time of customer conversion is to use the Kaplan-Meier method, a well-known statistical algorithm.

The advantage of the Kaplan-Meier method is that it can account for users who have just converted and started using the service recently, as well as users whose churn status is unknown.

In Exploratory, you can calculate and visualize the survival rate from the time of customer conversion using the Kaplan-Meier method in the “Survival Curve” of the Analytics View.

For example, suppose you have data where each row represents one customer and includes the following information in columns:

  • User ID
  • Start Date - The date the customer started using the service
  • End Date - The date the customer stopped using the service
  • OS - Information about the operating system being used
  • Cancel - Whether the service was cancelled or not

For more details on how to create survival curve data, please refer to this explanation.

Using Survival Curve to Calculate Survival Rate

Move to the Analytics View and select “Survival Curve” as the type.

Then select the following columns for each item and execute:

  • Start Date -> Start Time
  • End Date -> End Time
  • Survival Status (Event) -> Cancel

We were able to draw the survival curve.

This “Survival Curve” chart shows the survival rate for each period. Currently, the period is set to “week”.

So let’s change the unit of the period to “month” to visualize the survival rate for each elapsed “month”.

Now we can visualize the survival rate by month.

For example, we can see that the survival rate for the first month is 67.47%.

So, how can we use this survival curve to calculate CLV (Customer Lifetime Value)?

As a reminder, CLV is the expected revenue from when a customer converts until they churn.

Therefore, the expected revenue for each period can be calculated as follows:

Expected revenue for a given period = Survival rate up to that period * Average MRR (ARPU) per customer

In terms of the survival curve, the period where the X-axis is 0 means the time of conversion, so it starts at 100%.

If we assume that the monthly fee for this service is $100, we can expect $100 in revenue per customer.

The survival rate for the second month is 67.47%.

What this tells us is that the expected revenue per customer for this period is not $100, but about $67.

If this explanation doesn’t raise any questions, you can skip this explanation and move on to the next section. If you have questions about this explanation, please continue reading.

If we initially had 100 customers, a survival rate of 67% means that only 67 customers remain by the end of this period.

In other words, we can only expect revenue from these 67 people. Since the monthly fee for this service is $100, the total revenue would be $6,700.

67 people * $100 (monthly revenue per person) = $6,700

Since we originally had 100 customers, to calculate the average revenue per customer, we divide $6,700 by 100, which gives us $67. This means we’re doing the following calculation:

0.67 (67%) * $100 (monthly revenue per person) = $67

In this way, we can calculate the expected revenue for each period by multiplying the monthly revenue per person by the survival rate for that period.

The third month is similar.

The survival rate is about 63%, so the expected revenue per customer for this period is $63.

0.63 * $100 = $63

We can say that the survival rate, like the expected revenue, tends to decrease over time, and the CLV is the sum of the expected revenue for all periods until everyone churns.

Now that we understand the logic of calculating CLV using survival rates, let’s actually calculate it in Exploratory.

Calculating CLV Using Survival Rate

Click the “Export” button and select “Save Chart Data as New Data Frame”.

This creates a new data frame based on the exported data.

Now we can calculate CLV.

Select “Create Calculation (Mutate)” from the column header menu of the “Survival Rate” column.

The “Survival Rate” column is a column with percentage as the unit, so we need to divide it by 100 before multiplying it by the monthly revenue of $100.

So enter the following calculation formula and execute:

`Survival Rate`/ 100 * 100

Now that we’ve calculated the expected revenue for all periods, all we need to do is sum up these revenues.

The easiest way is to aggregate using a pivot table from the Chart View.

Select the expected revenue column for the value and select sum (SUM) for the aggregation function.

We found that the CLV is $608.74.

Calculating CLV by Segment

By the way, do you remember that in the original data, there was a column showing which PC OS each user was using?

What if we want to know if there’s a difference in CLV between customers using Windows and those using Mac, and if so, how much of a difference?

We can easily calculate these CLVs as well.

First, let’s create survival curves for each segment.

Go back to the original survival curve created in the Analytics View, assign the “OS” column to color division and execute.

Now we’ve drawn survival curves for Windows and Mac.

Export this data in the same way as before and create a new data frame again.

Now we’re ready with the data for Mac and Windows.

Let’s calculate the expected revenue in the same way as before.

Move to the Table View and create a pivot table.

Create a pivot table in the same way as before, but this time assign the “Cohort” column to the row.

Now we’ve calculated CLV for each OS.

The CLV for Mac users is $620.60, and for Windows users, it’s $599.37.

Points to Consider

Calculating CLV using survival rates is a superior method to simply multiplying the same monthly revenue for all periods, as it reflects the actual pattern of customer retention (or churn).

On the other hand, there may be cases where you should consider the following:

When There’s Not Enough Data

In survival curves, survival rates are calculated only for the periods where data is available. If only a short time (for example, 6 months) has passed since the service was launched, the calculated CLV will be the sum of the expected revenue per customer for 6 months, but in many cases, customers may use your service for more than 6 months. (We hope they do!)

In such cases, it might be better to calculate CLV using the simple method introduced earlier, understanding that the reliability of the CLV obtained may not be high (because churn rates change quickly).

Discount Rate

Another point is that the value of money can change over time. Assuming interest rates don’t go negative, if you deposit $100 in a bank, you can expect more than $100 in value after 3 years. In that sense, $100 today is not the same as $100 three years from now.

This is called the discount rate, and you can calculate CLV more strictly using the discount rate, but I’d like to explain that method in another note.

Calculating CLV (LTV/Customer Lifetime Value) Using Survival Curves (Survival Rate) with R Code

For Payment Data

If you want to calculate CLV (LTV/Customer Lifetime Value/Expected revenue from a single customer) using customer payment data and survival curves, please refer to the following sample R code.

R Commands to Calculate CLV Using Survival Curves (Survival Rate)

# Step 1: Perform survival analysis
# - Run survival analysis with exp_survival function
# - NULL: No explanatory variables (create overall survival curve)
# - Cancellation: Flag indicating event occurrence (e.g., cancellation)
# - Calculate survival period using contract start date and end date
# - Use maximum date when end date is missing (end_time_fill = "max")
# - Time unit set to month
exp_survival(
  NULL, 
  `Cancellation`, 
  start_time = `ContractStartDate`, 
  end_time = `ContractEndDate`, 
  end_time_fill = "max", 
  time_unit = `_tam_getTimeUnit`(
    "month", 
    `ContractStartDate`, 
    `ContractEndDate`, 
    label = TRUE
  )
) %>%
# Step 2: Format survival analysis results
# - Format model1 results using tidy_rowwise function and convert to dataframe format
tidy_rowwise(model1) %>%
# Step 3: Change column names to English
# - Change analysis result column names to English for better understanding
rename(
  `Time` = `Time`,
  `Observations` = `Observations`,
  `Events` = `Events`,
  `Censored` = `Censored`,
  `SurvivalRate` = `Survival Rate`,
  `StdError` = `Std Error`,
  `ConfLow` = `Conf Low`,
  `ConfHigh` = `Conf High`
)
# Step 4: Calculate expected revenue for each survival period
# - Add column for assumed ARPU (Average Revenue Per User)
# - Calculate expected revenue by multiplying survival rate with ARPU
mutate(ARPU = 10000) %>%
mutate(`ExpectedRevenuePerPeriod` = `SurvivalRate` * ARPU, .after = "SurvivalRate") %>%
# Step 5: Calculate CLV (LTV/Customer Lifetime Value)
# - Sum up expected revenue for each survival period to calculate CLV
summarize(
  CLV = sum(`ExpectedRevenuePerPeriod`, na.rm = TRUE)  # Sum excluding missing values
)

R Commands to Calculate CLV Using Survival Curves (Survival Rate) by Segment

# Step 1: Perform survival analysis by segment
# - Run survival analysis with exp_survival function
# - NULL: No explanatory variables (create overall survival curve)
# - Cancellation: Flag indicating event occurrence (e.g., cancellation)
# - Calculate survival period using contract start date and end date
# - Use maximum date when end date is missing (end_time_fill = "max")
# - Time unit set to month
exp_survival(
  NULL, 
  `Cancellation`, 
  start_time = `ContractStartDate`, 
  end_time = `ContractEndDate`, 
  end_time_fill = "max", 
  cohort = `Segment`,
  time_unit = `_tam_getTimeUnit`(
    "month", 
    `ContractStartDate`, 
    `ContractEndDate`, 
    label = TRUE
  )
) %>%
# Step 2: Format survival analysis results
# - Format model1 results using tidy_rowwise function and convert to dataframe format
tidy_rowwise(model1) %>%
# Step 3: Change column names to English
# - Change analysis result column names to English for better understanding
rename(
  `Cohort` = `Cohort`,
  `Time` = `Time`,
  `Observations` = `Observations`,
  `Events` = `Events`,
  `Censored` = `Censored`,
  `SurvivalRate` = `Survival Rate`,
  `StdError` = `Std Error`,
  `ConfLow` = `Conf Low`,
  `ConfHigh` = `Conf High`
)
# Step 4: Calculate expected revenue for each survival period
# - Add column for assumed ARPU (Average Revenue Per User)
# - Calculate expected revenue by multiplying survival rate with ARPU
mutate(ARPU = 10000) %>% 
mutate(`ExpectedRevenuePerPeriod` = `SurvivalRate` * ARPU, .after = "SurvivalRate") %>%  
# Step 5: Calculate CLV by segment
group_by(Segment) %>% 
summarize(CLV = sum(`ExpectedRevenuePerPeriod`, na.rm = TRUE))

For Web Service Usage Data

If you want to calculate CLV using customer service usage data and survival curves, please refer to the following sample R code.

R Commands to Calculate CLV Using Survival Curves (Survival Rate)

# Step 1: Perform survival analysis
# - Run survival analysis with exp_survival function
# - NULL: No explanatory variables (create overall survival curve)
# - Cancellation: Flag indicating event occurrence (e.g., cancellation)
# - Calculate survival period using usage start date and end date
# - Use maximum date when end date is missing (end_time_fill = "max")
# - Time unit set to month
exp_survival(
  NULL, 
  `Cancellation`, 
  start_time = `UsageStartDate`, 
  end_time = `UsageEndDate`, 
  end_time_fill = "max", 
  time_unit = `_tam_getTimeUnit`(
    "month", 
    `UsageStartDate`, 
    `UsageEndDate`, 
    label = TRUE
  )
) %>%
# Step 2: Format survival analysis results
# - Format model1 results using tidy_rowwise function and convert to dataframe format
tidy_rowwise(model1) %>%
# Step 3: Change column names to English
# - Change analysis result column names to English for better understanding
rename(
  `Time` = `Time`,
  `Observations` = `Observations`,
  `Events` = `Events`,
  `Censored` = `Censored`,
  `SurvivalRate` = `Survival Rate`,
  `StdError` = `Std Error`,
  `ConfLow` = `Conf Low`,
  `ConfHigh` = `Conf High`
)
# Step 4: Calculate expected revenue for each survival period
# - Add column for assumed ARPU (Average Revenue Per User)
# - Calculate expected revenue by multiplying survival rate with ARPU
mutate(ARPU = 10000) %>%
mutate(`ExpectedRevenuePerPeriod` = `SurvivalRate` * ARPU, .after = "SurvivalRate") %>%
# Step 5: Calculate CLV (LTV/Customer Lifetime Value)
# - Sum up expected revenue for each survival period to calculate CLV
summarize(
  CLV = sum(`ExpectedRevenuePerPeriod`, na.rm = TRUE)  # Sum excluding missing values
)

R Commands to Calculate CLV Using Survival Curves (Survival Rate) by Segment

# Step 1: Perform survival analysis by segment
# - Run survival analysis with exp_survival function
# - NULL: No explanatory variables (create overall survival curve)
# - Cancellation: Flag indicating event occurrence (e.g., cancellation)
# - Calculate survival period using usage start date and end date
# - Use maximum date when end date is missing (end_time_fill = "max")
# - Time unit set to month
exp_survival(
  NULL, 
  `Cancellation`, 
  start_time = `UsageStartDate`, 
  end_time = `UsageEndDate`, 
  end_time_fill = "max", 
  cohort = `Segment`,
  time_unit = `_tam_getTimeUnit`(
    "month", 
    `UsageStartDate`, 
    `UsageEndDate`, 
    label = TRUE
  )
) %>%
# Step 2: Format survival analysis results
# - Format model1 results using tidy_rowwise function and convert to dataframe format
tidy_rowwise(model1) %>%
# Step 3: Change column names to English
# - Change analysis result column names to English for better understanding
rename(
  `Cohort` = `Cohort`,
  `Time` = `Time`,
  `Observations` = `Observations`,
  `Events` = `Events`,
  `Censored` = `Censored`,
  `SurvivalRate` = `Survival Rate`,
  `StdError` = `Std Error`,
  `ConfLow` = `Conf Low`,
  `ConfHigh` = `Conf High`
)
# Step 4: Calculate expected revenue for each survival period
# - Add column for assumed ARPU (Average Revenue Per User)
# - Calculate expected revenue by multiplying survival rate with ARPU
mutate(ARPU = 10000) %>% 
mutate(`ExpectedRevenuePerPeriod` = `SurvivalRate` * ARPU, .after = "SurvivalRate") %>%  
# Step 5: Calculate CLV by segment
group_by(Segment) %>% 
summarize(CLV = sum(`ExpectedRevenuePerPeriod`, na.rm = TRUE))
Export Chart Image
Output Format
PNG SVG
Background
Set background transparent
Size
Width (Pixel)
Height (Pixel)
Pixel Ratio