We’re migrating customers to a new pricing system where the cost per channel decreases as the number of channels increases. This is a strategic move to make our pricing more flexible and aligned with customer value, but it comes with a significant one-time cost. I estimate that we’ll take a one-time hit of around $65,000 in MRR.
In this the analysis I’ll try to estimate the amount of time it will take us to recover $65K in MRR to get back to our current leve.
This analysis uses our historical daily MRR data to forecast future growth and estimate the break-even timeline. I’ll also model a couple of scenarios where we increase new customer acquisition by 5% or 10% to see how much faster we could recover.
Key Takeaways
Based on current MRR values and channel distribution, I estimate that migrating all users to tiered pricing would result in an immediate loss of around $65,000 in MRR.
Based on our current growth trajectory, these are the estimated recovery timelines:
No changes to customer acquisition: With no changes to customer acquisition, we’d recover the $65K MRR loss in around 70 days (early February 2026).
If we boosted acquisition by 5% and nothing else changed: Increasing new customer acquisition by 5% would mean we’d recover the lost MRR in around 60 days.
If we boosted acquisition by 10% and nothing else changed: Increasing new customer acquisition by 10% would mean we’d recover the lost MRR in around 52 days.
If ASP decreased by 5%: If the new pricing resulted in a 5% decrease in average sales price for new customers, we’d recover the lost MRR in around 84 days, adding about 14 days to our baseline recovery timeline.
If we staggered the migration over 3 months: Instead of taking the full $65K hit immediately, we could lose $21.7K per month on January 1, February 1, and March 1. After the final loss on March 1, it would take 70 days to recover to where we would have been without the migration (early May 2026). While this extends the total timeline to 166 days from today, we’d maintain higher MRR throughout the migration period.
Realistic ASP impact from pricing changes: Based on our customer distribution, around 3.8% of new customers have 10+ channels and would receive a 12.5% discount under the new pricing. This results in a 0.475% overall ASP reduction, slowing our recovery by only 1 day compared to baseline (71 days total).
Loading Data
The data used comes from ChartMogul and contains the past 365 days of MRR data.
First we’ll forecast MRR for the next year using the prophet package. We know there were significant change-points on July 31 and August 26, 2025, when we proactively canceled plans of inactive Legacy customers, so we’ll include those in the model.
Code
# prepare data for Prophetprophet_data <- mrr_data %>%select(ds = date, y = mrr)# create Prophet model with weekly seasonalitym <-prophet(weekly.seasonality =TRUE,daily.seasonality =FALSE,changepoint.prior.scale =0.05)# fit the modelm <-prophet( prophet_data,weekly.seasonality =TRUE,daily.seasonality =FALSE,changepoints =c("2025-07-31", "2025-08-26"),changepoint.prior.scale =0.05)# make future dataframe for 365 daysfuture <-make_future_dataframe(m, periods =365)# generate forecastforecast <-predict(m, future)# extract forecast from today forwardfuture_forecast <- forecast %>%filter(ds > current_date) %>%select(ds, yhat, yhat_lower, yhat_upper)head(future_forecast)
The forecast model predicts we’ll grow MRR by about $934 per day on average over the next year. This accounts for weekly seasonality (i.e. slower growth on weekends).
Scenario 1: One-Time 65K MRR Loss
If we lose $65,000 in MRR today, the number of days it will take for us to recover will roughly be 65,000 divided by our average daily growth ($934/day). This simple calculation gives us an initial estimate of around 70 days to recover the initial MRR loss.
Code
# Calculate MRR after 65K lossmrr_after_loss <- current_mrr -65000# Calculate days to recovermrr_gap <- current_mrr - mrr_after_lossdays_to_recover <-ceiling(mrr_gap / avg_daily_growth)cat("MRR after 65K loss:", dollar(mrr_after_loss), "\n")
MRR after 65K loss: $1,869,793
Code
cat("Days to recover:", days_to_recover, "days\n")
If the migration happened today, this would mean that we’d break even by February 3, 2026. Let’s plot this scenario out.
Scenario 2: 65K Loss + 5% More New Customers
What if this pricing changed helped us increase new customer acquisition by 5%? Currently we acquire around 161.8 new customers per day at $19.57 in MRR per customer on average. A 5% uptick in new customer acquisition would add an additional $158 (161.8 daily customers * 0.05 * $19.57 ASP) in daily MRR growth, bringing our total growth rate to around $1,093 per day.
The simple calculation of 65,000 divided by 1,093 equates to around 60 days to recover the lost MRR.
Code
# calculate average new customers per dayavg_new_customers <-mean(mrr_data$new_biz_customer_count, na.rm =TRUE)# calculate average MRR per new customeravg_mrr_per_customer <-mean( mrr_data$new_biz_mrr / mrr_data$new_biz_customer_count,na.rm =TRUE)# 5% increase in new customersadditional_customers_5pct <- avg_new_customers *0.05additional_daily_mrr_5pct <- additional_customers_5pct * avg_mrr_per_customer# new growth rateboosted_growth_5pct <- avg_daily_growth + additional_daily_mrr_5pct# days to recover with 5% boostdays_to_recover_5pct <-ceiling(mrr_gap / boosted_growth_5pct)cat("Days to recover:", days_to_recover_5pct, "days\n")
What if this pricing change helped us increase new customer acquisition by 10%? Doubling that acquisition boost to 10% would add an additional $317 in daily MRR growth (161.8 daily customers * 0.10 * $19.57 ASP), pushing our total growth rate to around $1,251 per day.
65,000 divided by 1,251 equates to around 52 days to recover the lost MRR.
Code
# 10% increase in new customersadditional_customers_10pct <- avg_new_customers *0.10additional_daily_mrr_10pct <- additional_customers_10pct * avg_mrr_per_customer# new growth rateboosted_growth_10pct <- avg_daily_growth + additional_daily_mrr_10pct# days to recover with 10% boostdays_to_recover_10pct <-ceiling(mrr_gap / boosted_growth_10pct)cat("Days to recover:", days_to_recover_10pct, "days\n")
What if the new pricing structure resulted in a 5% decrease in average sales price for new customers going forward? This would slow down our MRR growth since each new customer would contribute less revenue. With ASP dropping from $19.57 to $18.59 ($19.57 * 0.95), our daily MRR growth would decrease by around $81 to about $853 per day.
65,000 divided by 853 equates to around 76 days to recover the lost MRR.
Code
# 5% decrease in ASPreduced_asp <- avg_mrr_per_customer *0.95# Calculate reduction in daily MRR growthasp_impact <- avg_new_customers * (avg_mrr_per_customer - reduced_asp)# New growth rate with reduced ASPreduced_growth_asp <- avg_daily_growth - asp_impact# Days to recover with reduced ASPdays_to_recover_asp <-ceiling(mrr_gap / reduced_growth_asp)cat("Original ASP:", dollar(avg_mrr_per_customer), "\n")
cat("Days to recover:", days_to_recover_asp, "days\n")
Days to recover: 84 days
Code
cat("Additional days vs baseline:", days_to_recover_asp - days_to_recover, "days\n")
Additional days vs baseline: 14 days
Here’s the plot for this scenario.
Scenario 5: Staggered Loss (21.7K over 3 Months)
What if instead of taking the full $65K MRR hit all at once, we staggered the migration over three months? In this scenario we’d lose $21.7K on January 1, another $21.7K on February 1, and the final $21.7K on March 1.
This approach means we’re always operating at a higher MRR level compared to taking the full loss immediately. The trade-off is that it takes longer before all customers are migrated. Let’s model how long it takes from the final loss (March 1) to recover back to where we would have been without any losses.
Code
# Staggered lossesloss_per_month <-65000/3loss_dates <-as.Date(c("2026-01-01", "2026-02-01", "2026-03-01"))# Create a dataframe to track MRR over time with staggered losses# Compare to immediate loss scenariostaggered_scenario <-data.frame(ds =seq(current_date +1, current_date +365, by ="day")) %>%left_join( future_forecast %>%select(ds, baseline_yhat = yhat),by ="ds" ) %>%mutate(# Calculate cumulative loss based on datecumulative_loss =case_when( ds < loss_dates[1] ~0, ds >= loss_dates[1] & ds < loss_dates[2] ~ loss_per_month, ds >= loss_dates[2] & ds < loss_dates[3] ~ loss_per_month *2, ds >= loss_dates[3] ~ loss_per_month *3,TRUE~0 ),yhat_staggered = baseline_yhat - cumulative_loss,# Immediate loss scenario for comparisonyhat_immediate = baseline_yhat -65000 )# On March 1 (final loss date), what's the MRR gap?march_1_data <- staggered_scenario %>%filter(ds == loss_dates[3])march_1_baseline <- march_1_data$baseline_yhat # What MRR would be without migrationmarch_1_actual <- march_1_data$yhat_staggered # What MRR will be after final lossmarch_1_gap <- march_1_baseline - march_1_actual# How long to recover that gap at our daily growth rate?days_from_final_loss_to_recovery <-ceiling(march_1_gap / avg_daily_growth)# Find actual recovery daterecovery_row <- staggered_scenario %>%filter(ds >= loss_dates[3]) %>%filter(yhat_staggered >= march_1_baseline) %>%slice(1)# Total days from todaydays_to_final_loss <-as.numeric(difftime(loss_dates[3], current_date, units ="days"))days_to_recover_staggered <- days_to_final_loss + days_from_final_loss_to_recoverycat("Loss per month:", dollar(loss_per_month), "\n")
cat(" Days to final loss:", days_to_final_loss, "days\n")
Days to final loss: 96 days
Code
cat(" Days from final loss to recovery:", days_from_final_loss_to_recovery, "days\n")
Days from final loss to recovery: 70 days
Code
cat(" Total days:", days_to_recover_staggered, "days\n")
Total days: 166 days
If we took this staggered approach, it would take us almost 6 months from today to fully recover the $65K of MRR that will be lost. From the day of the final loss, March 1, 2026, it would still take around 70 days to recover to what MRR would have been had there been no migration.
Let’s visualize how this staggered approach compares to the immediate loss scenario.
Scenario 6: Realistic ASP Impact from Pricing Changes
Let’s model a more realistic ASP scenario based on our customer distribution. Around 3.8% of new customers have more than 10 channels, and our pricing changes will give these customers a 12.5% MRR discount compared to what they would have previously paid.
This means the overall ASP impact is: 3.8% of customers × 12.5% discount = 0.475% overall ASP reduction.
Code
# Realistic ASP calculationpct_customers_affected <-0.038# 3.8% of new customers have 10+ channelsdiscount_for_affected <-0.125# 12.5% discount for those customersoverall_asp_reduction <- pct_customers_affected * discount_for_affected# New ASPrealistic_reduced_asp <- avg_mrr_per_customer * (1- overall_asp_reduction)# Calculate reduction in daily MRR growthrealistic_asp_impact <- avg_new_customers * (avg_mrr_per_customer - realistic_reduced_asp)# New growth rate with realistic ASP reductionrealistic_reduced_growth <- avg_daily_growth - realistic_asp_impact# Days to recover with realistic ASP reductiondays_to_recover_realistic_asp <-ceiling(mrr_gap / realistic_reduced_growth)cat("Customers affected:", percent(pct_customers_affected), "\n")
Customers affected: 4%
Code
cat("Discount for affected customers:", percent(discount_for_affected), "\n")
Discount for affected customers: 12%
Code
cat("Overall ASP reduction:", percent(overall_asp_reduction), "\n")
cat("Days to recover:", days_to_recover_realistic_asp, "days\n")
Days to recover: 71 days
Code
cat("Additional days vs baseline:", days_to_recover_realistic_asp - days_to_recover, "days\n")
Additional days vs baseline: 1 days
Here’s what this scenario looks like.
Summary
The table below summarizes all six scenarios we’ve covered.
The customer acquisition requirements are calculated by multiplying the average number of customers acquired per day (161.8) by the number of days to break even in each scenario.