How to Calculate Customer Churn Rate Step by Step

How to Create Dynamic Charts in Excel

If you work in any business that has recurring customers — subscriptions, SaaS, retail, banking, telecom one metric matters more than almost any other:

Customer churn rate.

Churn tells you how fast you are losing customers. A high churn rate means your business is leaking revenue faster than it can grow. A low churn rate means customers are staying — compounding your growth over time.

Understanding how to calculate churn rate accurately and what to do with that number is one of the most valuable analytical skills in business and data science.

In this guide, we will walk through everything step by step — the basic formula, variations, cohort analysis, Python implementation, and practical interpretation.

What Is Customer Churn?

Customer churn (also called customer attrition) is when a customer stops doing business with you during a given time period.

What counts as “churned” depends on your business model:

  • SaaS/Subscription — Customer cancels their subscription
  • Telecom — Customer switches to a competitor or closes their account
  • E-commerce — Customer has not made a purchase in X days
  • Banking — Customer closes their account or stops using services
  • Mobile app — User stops opening the app for X days

Defining churn clearly for your specific context is the first and most important step before any calculation happens.

The Basic Churn Rate Formula

Churn Rate = (Customers Lost During Period / Customers at Start of Period) × 100

Step-by-Step Walkthrough

Step 1: Choose your time period

Churn is always measured over a specific time window — monthly, quarterly, or annually. Monthly is the most common for SaaS and subscription businesses.

Step 2: Count customers at the start of the period

How many customers did you have on the first day of the period?

Step 3: Count customers lost during the period

How many customers cancelled, churned, or became inactive during that period?

Step 4: Apply the formula

Churn Rate = (Customers Lost / Customers at Start) × 100

Simple Example

A SaaS company has these numbers for January 2024:

  • Customers at start of January: 1,000
  • New customers acquired in January: 120
  • Customers at end of January: 1,050
  • Customers lost in January: 1,000 + 120 – 1,050 = 70
Monthly Churn Rate = (70 / 1,000) × 100 = 7%

The company lost 7% of its starting customer base in January.

Important: Notice that new customers acquired during the period are NOT included in the denominator. You are measuring loss from your existing base — not your ending or average base.

Churn Rate Variations

The basic formula works well for simple cases. But different businesses use different variations depending on their context.

Variation 1: Average Customers in Period

Some analysts use the average of start and end customers as the denominator — smoothing out the effect of large acquisition or loss events mid-period.

Churn Rate = Customers Lost / ((Customers at Start + Customers at End) / 2) × 100

Example:

  • Start: 1,000
  • End: 1,050
  • Lost: 70
  • Average: (1,000 + 1,050) / 2 = 1,025
Churn Rate = (70 / 1,025) × 100 = 6.83%

Use this variation when your customer base fluctuates significantly within a period.

Variation 2: Annual Churn Rate From Monthly

If you know your monthly churn rate, you can calculate the equivalent annual churn rate but do not simply multiply by 12.

The correct formula accounts for compounding:

Annual Churn Rate = 1 - (1 - Monthly Churn Rate)^12

Example:

  • Monthly churn rate: 3%
Annual Churn Rate = 1 - (1 - 0.03)^12
                 = 1 - (0.97)^12
                 = 1 - 0.694
                 = 30.6%

A 3% monthly churn rate means you lose about 30.6% of customers per year not 36% as simple multiplication would suggest.

Variation 3: Revenue Churn Rate

Instead of counting customers, count the revenue lost.

Revenue Churn Rate = Revenue Lost from Churned Customers / Total Revenue at Start × 100

Example:

  • Revenue at start of month: $500,000
  • Revenue lost from cancellations: $35,000
Revenue Churn Rate = (35,000 / 500,000) × 100 = 7%

Revenue churn is often more important than customer churn for subscription businesses — losing one enterprise customer worth $50,000 per month matters more than losing ten customers worth $50 each.

Variation 4: Net Revenue Churn

Net revenue churn accounts for expansion revenue (upsells and upgrades) from existing customers.

Net Revenue Churn = (Revenue Lost - Expansion Revenue) / Revenue at Start × 100

Example:

  • Revenue at start: $500,000
  • Revenue lost from cancellations: $35,000
  • Expansion revenue from upsells: $25,000
Net Revenue Churn = (35,000 - 25,000) / 500,000 × 100 = 2%

If expansion revenue exceeds lost revenue, net revenue churn becomes negative meaning your existing customer base is actually growing revenue even as some customers leave. This is called negative churn and is the holy grail of SaaS businesses.

Churn Rate vs Retention Rate

Churn and retention are two sides of the same coin.

Retention Rate = 1 - Churn Rate

Or:

Retention Rate = (Customers at End - New Customers Acquired) / Customers at Start × 100

Example using our January numbers:

  • Start: 1,000
  • End: 1,050
  • New acquired: 120
  • Retained: 1,050 – 120 = 930
Retention Rate = (930 / 1,000) × 100 = 93%
Churn Rate = 100% - 93% = 7%  #Matches our earlier calculation

Always calculate both — different stakeholders prefer different framings. Executives often find “we retained 93% of customers” easier to digest than “we churned 7%.”

Calculating Churn Rate in Python

Basic Monthly Churn Calculation

python

import pandas as pd
import numpy as np

# Monthly customer data
data = {
    'month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
    'customers_start': [1000, 1050, 1098, 1143, 1185, 1224],
    'new_customers':   [120,  115,  108,  105,  100,  95],
    'customers_end':   [1050, 1098, 1143, 1185, 1224, 1260]
}

df = pd.DataFrame(data)

# Calculate customers lost
df['customers_lost'] = (
    df['customers_start'] +
    df['new_customers'] -
    df['customers_end']
)

# Calculate monthly churn rate
df['churn_rate'] = (
    df['customers_lost'] / df['customers_start'] * 100
).round(2)

# Calculate retention rate
df['retention_rate'] = (100 - df['churn_rate']).round(2)

print(df[['month', 'customers_start', 'customers_lost',
          'churn_rate', 'retention_rate']])

Output:

monthcustomers_startcustomers_lostchurn_rateretention_rate
Jan1000707.0093.00
Feb1050676.3893.62
Mar1098635.7494.26
Apr1143635.5194.49
May1185615.1594.85
Jun1224594.8295.18

Churn is improving each month — a positive trend worth highlighting to stakeholders.

Visualizing Churn Trend

python

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots(figsize=(10, 6))

color = 'tab:red'
ax1.set_xlabel('Month')
ax1.set_ylabel('Churn Rate (%)', color=color)
ax1.plot(df['month'], df['churn_rate'],
         color=color, marker='o', linewidth=2, label='Churn Rate')
ax1.tick_params(axis='y', labelcolor=color)
ax1.set_ylim(0, 15)

ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('Customers', color=color)
ax2.bar(df['month'], df['customers_start'],
        alpha=0.3, color=color, label='Customers at Start')
ax2.tick_params(axis='y', labelcolor=color)

plt.title('Monthly Churn Rate and Customer Base')
fig.tight_layout()
plt.show()

Calculating Churn From Individual Customer Records

In real data engineering work, you calculate churn from raw customer records — not pre-aggregated summaries.

python

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# Customer subscription data
np.random.seed(42)
n = 500

customers = pd.DataFrame({
    'customer_id': range(1, n + 1),
    'signup_date': pd.date_range('2023-01-01', periods=n, freq='D')[:n],
    'cancel_date': [
        pd.Timestamp('2023-01-01') + timedelta(days=np.random.randint(30, 365))
        if np.random.random() < 0.35 else pd.NaT
        for _ in range(n)
    ],
    'plan': np.random.choice(['Basic', 'Pro', 'Enterprise'], n,
                              p=[0.5, 0.35, 0.15]),
    'mrr': np.random.choice([29, 99, 299], n, p=[0.5, 0.35, 0.15])
})

# Define analysis period
period_start = pd.Timestamp('2023-06-01')
period_end = pd.Timestamp('2023-06-30')

# Customers active at start of period
active_start = customers[
    (customers['signup_date'] <= period_start) &
    (customers['cancel_date'].isna() |
     (customers['cancel_date'] > period_start))
]

# Customers who churned during the period
churned = active_start[
    active_start['cancel_date'].between(period_start, period_end)
]

# Calculate churn rate
churn_rate = len(churned) / len(active_start) * 100

print(f"Active customers at start of June: {len(active_start)}")
print(f"Customers churned in June: {len(churned)}")
print(f"Monthly churn rate: {churn_rate:.2f}%")

# Revenue churn
revenue_at_start = active_start['mrr'].sum()
revenue_lost = churned['mrr'].sum()
revenue_churn_rate = revenue_lost / revenue_at_start * 100

print(f"\nMRR at start: ${revenue_at_start:,}")
print(f"MRR lost: ${revenue_lost:,}")
print(f"Revenue churn rate: {revenue_churn_rate:.2f}%")

Cohort Analysis — The Right Way to Measure Churn

The basic churn rate mixes customers from different time periods — making it hard to understand whether your product is genuinely improving or just changing in composition.

Cohort analysis tracks customers who joined in the same time period (a cohort) and measures what percentage of them remain active over time.

python

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(42)

# Generate cohort data
cohorts = []
for month_offset in range(6):
    cohort_date = pd.Timestamp('2023-01-01') + pd.DateOffset(months=month_offset)
    n_customers = np.random.randint(80, 150)

    for customer in range(n_customers):
        signup = cohort_date
        # Simulate survival — retention decreases over time
        survival_months = np.random.geometric(p=0.08)

        cohorts.append({
            'customer_id': f"C{month_offset}_{customer}",
            'cohort_month': cohort_date.strftime('%Y-%m'),
            'signup_date': signup,
            'last_active_month': min(survival_months, 6)
        })

cohort_df = pd.DataFrame(cohorts)

# Build cohort retention matrix
cohort_counts = cohort_df.groupby('cohort_month')['customer_id'].count()
retention_matrix = pd.DataFrame(index=cohort_counts.index)

for month in range(7):
    active = cohort_df[cohort_df['last_active_month'] >= month]
    active_by_cohort = active.groupby('cohort_month')['customer_id'].count()
    retention_matrix[f'Month {month}'] = active_by_cohort

# Convert to retention percentages
retention_pct = retention_matrix.div(cohort_counts, axis=0) * 100

print("Cohort Retention Matrix (%):")
print(retention_pct.round(1))

# Visualize as heatmap
plt.figure(figsize=(12, 6))
sns.heatmap(
    retention_pct,
    annot=True,
    fmt='.1f',
    cmap='RdYlGn',
    vmin=0,
    vmax=100,
    linewidths=0.5
)
plt.title('Customer Cohort Retention Heatmap (%)')
plt.xlabel('Months Since Signup')
plt.ylabel('Cohort Month')
plt.tight_layout()
plt.show()

Reading the cohort heatmap:

  • Each row is a cohort of customers who signed up in the same month
  • Each column shows what percentage of that cohort is still active after N months
  • Month 0 is always 100% (every customer is active when they sign up)
  • Darker green cells indicate higher retention
  • Comparing rows shows whether newer cohorts retain better than older ones

If Month 3 retention is improving from row to row (newer cohorts retaining better than older ones at the same age), your product improvements are working.

Churn Rate Benchmarks by Industry

Understanding whether your churn rate is good requires industry context.

IndustryGood Monthly ChurnAverage Monthly Churn
SaaS (SMB customers)< 3%3–7%
SaaS (Enterprise customers)< 1%1–2%
Consumer subscriptions< 5%5–10%
E-commerce< 5%5–8%
Telecom< 1.5%1.5–3%
Banking< 1%1–2%
Media streaming< 5%5–8%

These are rough guides — your specific market, price point, and competitive landscape all affect what is achievable and acceptable.

What Drives Churn — Common Root Causes

Calculating churn tells you how much you are losing. Understanding why helps you fix it.

Poor onboarding — Customers never experience the core value of your product before their trial or first billing period ends.

Lack of product value — The product does not solve the problem well enough or customers do not use it enough to justify the cost.

Better competitive alternatives — A competitor offers more value, better features, or lower price.

Price sensitivity — Customers feel the price is too high relative to perceived value — especially common when facing renewal.

Poor customer support — Unresolved issues and frustrating support experiences push customers to cancel.

Life events or business changes — Customers close their business, get acquired, or change direction — involuntary churn unrelated to your product.

Payment failures — Expired credit cards, insufficient funds, or bank declines cause involuntary churn — often as much as 20–40% of total churn in subscription businesses.

How to Reduce Churn — Practical Strategies

Fix onboarding — Identify where new customers drop off before reaching their first value moment. Streamline the path from signup to first success.

Identify at-risk customers early — Use engagement signals (login frequency, feature usage, support tickets) to flag customers likely to churn before they do.

Proactive outreach — Reach out to low-engagement customers with personalized help, training offers, or check-in calls before they decide to cancel.

Reduce involuntary churn — Implement dunning — automated email sequences that retry failed payments and prompt customers to update billing details.

Offer pause instead of cancel — Give customers the option to pause their subscription temporarily instead of cancelling. Many customers who pause return.

Exit surveys — Ask every churning customer why they are leaving. Even 20% response rates provide valuable pattern data.

Win-back campaigns — Reach out to recently churned customers with targeted offers. Customers who churned 30–90 days ago are the most receptive.

Common Mistakes to Avoid

  • Including new customers in the start denominator — The denominator should be customers at the very start of the period — not end or average — unless you are specifically using the average variation
  • Mixing cohorts — Comparing churn rates across periods without cohort analysis hides whether you are genuinely improving or just acquiring different types of customers
  • Ignoring revenue churn — Customer count churn and revenue churn tell different stories. A business losing ten $10/month customers while retaining one $10,000/month customer has very different economics than customer count suggests
  • Annualizing monthly churn by multiplying by 12 — This overstates annual churn. Always use 1 - (1 - monthly_rate)^12 for accurate annualization
  • Not defining churn consistently — If different teams use different definitions of what counts as churned, no one can agree on the numbers. Document and standardize your definition
  • Measuring churn without segmenting — Aggregate churn hides important patterns. Always segment by plan type, acquisition channel, company size, or cohort to find where churn is concentrated

Customer churn rate is one of the most important metrics in any recurring revenue business. Calculating it correctly and understanding what it actually means is the foundation of any serious retention analysis.

Here is a quick recap of everything we covered:

  • Basic churn rate = customers lost / customers at start × 100
  • Annual churn from monthly uses compounding: 1 - (1 - monthly_rate)^12
  • Revenue churn measures lost revenue — often more important than customer count
  • Net revenue churn accounts for expansion and can be negative — the best outcome
  • Cohort analysis reveals retention patterns that aggregate churn rates hide
  • Common drivers of churn include poor onboarding, low engagement, and payment failures
  • Reducing churn is almost always more economical than acquiring new customers to replace lost ones

Start by calculating your basic monthly churn rate consistently. Then layer in revenue churn, cohort analysis, and segmentation. The patterns that emerge will point directly to where your retention efforts will have the greatest impact.

FAQs

What is a good customer churn rate?

It depends heavily on your industry and customer segment. For SaaS with enterprise customers, under 1% monthly is excellent. For consumer subscriptions, under 5% monthly is generally considered good. Always compare against industry benchmarks for your specific market.

What is the difference between churn rate and retention rate?

They are complements of each other. Retention Rate = 1 – Churn Rate. A 7% monthly churn rate means a 93% monthly retention rate. Both measure the same underlying dynamic — how many customers you keep — just framed differently.

What is net revenue churn?

Net revenue churn subtracts expansion revenue (upsells and upgrades from existing customers) from revenue lost to cancellations. If expansion exceeds losses, net revenue churn is negative — meaning your existing customer base grows revenue even as some customers leave.

How do I calculate annual churn from monthly churn?

Use compounding: Annual Churn Rate = 1 – (1 – Monthly Churn Rate)^12. A 3% monthly churn rate equals approximately 30.6% annual churn — not 36% as simple multiplication would suggest.

What is cohort analysis for churn?

Cohort analysis groups customers by the period they signed up and tracks what percentage remain active over time. It reveals whether retention is improving for newer customers compared to older ones — something aggregate churn rates cannot show.

What causes involuntary churn?

Involuntary churn occurs when customers are lost for reasons unrelated to dissatisfaction — primarily failed payments from expired cards or insufficient funds. It can account for 20–40% of total churn in subscription businesses and is reduced through dunning — automated payment retry and update flows.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top