Product metrics
There are a lot of critical metrics for monitoring the health of a Software-as-a-Service (SaaS) startup. Let’s take Churn Rate and LTV:CAC Ratio as example and calculate them.
Loading, cleaning, and joining the data
This includes information on which marketing campaigns our users were acquired through.
Additionally, for each campaign, let’s make sure we know the acquisition cost per user.
Churn Rate
Churn Rate is the percentage of customers who cancel their subscription in a given period. You want to keep this number as low as possible, to ensure a healthy growth. They say a churn rate between 3-8% is good.
# Churn Rate (over a period of one month)
from dateutil.relativedelta import relativedelta
from datetime import datetime
df0["LastActivity"] = df0["LastActivity"].map(lambda x: datetime.strptime(x, '%Y-%m-%d').date())
df0["SignupDate"] = df0["SignupDate"].map(lambda x: datetime.strptime(x, '%Y-%m-%d').date())
end_date = df0["SignupDate"].max() - relativedelta(years=1)
start_date = end_date - relativedelta(months=1)
is_existing_user = df0["SignupDate"] <= start_date
active_at_start = is_existing_user & (df0["LastActivity"] >= start_date)
inactive_at_end = is_existing_user & (df0["LastActivity"] <= end_date)
churn_rate = (active_at_start & inactive_at_end).sum() / active_at_start.sum()
pd.DataFrame({ 'Churn Rate' : [churn_rate] })
Looks like customers are sticking around, which suggests they must like the product
LTV:CAC Ratio ⚖️️️
Lifetime Value (LTV) shows the expected profit from a customer over their lifetime.
# Lifetime Value (LTV) = Average Revenue × Average Customer Lifespan
from dateutil.relativedelta import relativedelta
from datetime import datetime
import numpy as np
df0["LastActivity"] = df0["LastActivity"].map(lambda x: datetime.strptime(x, '%Y-%m-%d').date())
df0["SignupDate"] = df0["SignupDate"].map(lambda x: datetime.strptime(x, '%Y-%m-%d').date())
monthly_revenue = df0["Fee"].astype(int)
lifespan_months = (df0["LastActivity"] - df0["SignupDate"]) / np.timedelta64(1, 'M')
LTV = monthly_revenue * lifespan_months
pd.DataFrame({ 'ID' : df0["ID"], 'LTV' : LTV })
Now let’s find out our LTV:CAC Ratio. A good one is around ~3.
# LTV:CAC Ratio
LTV_CAC = (df0["LTV"] / df0["AcquisitionCostPerUser"]).mean()
pd.DataFrame({ 'LTV:CAC' : [LTV_CAC] })
Nice. Our metrics are looking too promising!