Triangle Forecasting: Why Traditional Impact Estimates Are Inflated (And How to Fix Them)

Dr. Owns

February 7, 2025

Accurate impact estimations can make or break your business case.

Yet, despite its importance, most teams use oversimplified calculations that can lead to inflated projections. These shot-in-the-dark numbers not only destroy credibility with stakeholders but can also result in misallocation of resources and failed initiatives. But there’s a better way to forecast effects of gradual customer acquisition, without requiring messy Excel spreadsheets and formulas that error out.

By the end of this article, you will be able to calculate accurate yearly forecasts and implement a scalable Python solution for Triangle Forecasting.

The Hidden Cost of Inaccurate Forecasts

When asked for annual impact estimations, product teams routinely overestimate impact by applying a one-size-fits-all approach to customer cohorts. Teams frequently opt for a simplistic approach: 

Multiply monthly revenue (or any other relevant metric) by twelve to estimate annual impact. 

While the calculation is easy, this formula ignores a fundamental premise that applies to most businesses:

Customer acquisition happens gradually throughout the year.

The contribution from all customers to yearly estimates is not equal since later cohorts contribute fewer months of revenue. 

Triangle Forecasting can cut projection errors by accounting for effects of customer acquisition timelines.

Let us explore this concept with a basic example. Let’s say you’re launching a new subscription service:

  • Monthly subscription fee: $100 per customer
  • Monthly customer acquisition target: 100 new customers
  • Goal: Calculate total revenue for the year

An oversimplified multiplication suggests a revenue of $1,440,000 in the first year (= 100 new customers/month * 12 months * $100 spent / month * 12 months).

The actual number is only $780,000! 

This 46% overestimation is why impact estimations frequently do not pass stakeholders’ sniff test.

Accurate forecasting is not just about mathematics — 

It is a tool that helps you build trust and gets your initiatives approved faster without the risk of over-promising and under-delivering.

Moreover, data professionals spend hours building manual forecasts in Excel, which are volatile, can result in formula errors, and are challenging to iterate upon. 

Having a standardized, explainable methodology can help simplify this process.

Introducing Triangle Forecasting

Triangle Forecasting is a systematic, mathematical approach to estimate the yearly impact when customers are acquired gradually. It accounts for the fact that incoming customers will contribute differently to the annual impact, depending on when they onboard on to your product. 

This method is particularly handy for:

  • New Product Launches: When customer acquisition happens over time
  • Subscription Revenue Forecasts: For accurate revenue projections for subscription-based products
  • Phased Rollouts: For estimating the cumulative impact of gradual rollouts
  • Acquisition Planning: For setting realistic monthly acquisition targets to hit annual goals
Image generated by author

The “triangle” in Triangle Forecasting refers to the way individual cohort contributions are visualized. A cohort refers to the month in which the customers were acquired. Each bar in the triangle represents a cohort’s contribution to the annual impact. Earlier cohorts have longer bars because they contributed for an extended period.

To calculate the impact of a new initiative, model or feature in the first year :

  1. For each month (m) of the year:
  • Calculate number of customers acquired (Am)
  • Calculate average monthly spend/impact per customer (S)
  • Calculate remaining months in year (Rm = 13-m)
  • Monthly cohort impact = Am × S × Rm

2. Total yearly impact = Sum of all monthly cohort impacts

Image generated by author

Building Your First Triangle Forecast

Let’s calculate the actual revenue for our subscription service:

  • January: 100 customers × $100 × 12 months = $120,000
  • February: 100 customers × $100 × 11 months = $110,000
  • March: 100 customers × $100 × 10 months = $100,000
  • And so on…

Calculating in Excel, we get:

Image generated by author

The total annual revenue equals $780,000— 46% lower than the oversimplified estimate!

💡 Pro Tip: Save the spreadsheet calculations as a template to reuse for different scenarios.

Need to build estimates without perfect data? Read my guide on “Building Defendable Impact Estimates When Data is Imperfect”.

Putting Theory into Practice: An Implementation Guide

While we can implement Triangle Forecasting in Excel using the above method, these spreadsheets become impossible to maintain or modify quickly. Product owners also struggle to update forecasts quickly when assumptions or timelines change.

Here’s how we can perform build the same forecast in Python in minutes:

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

def triangle_forecast(monthly_acquisition_rate, monthly_spend_per_customer):
    """
    Calculate yearly impact using triangle forecasting method.
    """
    # Create a DataFrame for calculations
    months = range(1, 13)
    df = pd.DataFrame(index=months, 
                     columns=['month', 'new_customers', 
                             'months_contributing', 'total_impact'])

    # Convert to list if single number, else use provided list
    acquisitions = [monthly_acquisitions] * 12 if type(monthly_acquisitions) in [int, float] else monthly_acquisitions
    
    # Calculate impact for each cohort
    for month in months:
        df.loc[month, 'month'] = f'Month {month}'
        df.loc[month, 'new_customers'] = acquisitions[month-1]
        df.loc[month, 'months_contributing'] = 13 - month
        df.loc[month, 'total_impact'] = (
            acquisitions[month-1] * 
            monthly_spend_per_customer * 
            (13 - month)
        )
    
    total_yearly_impact = df['total_impact'].sum()
    
    return df, total_yearly_impact

Continuing with our previous example of subscription service, the revenue from each monthly cohort can be visualized as follows:

# Example
monthly_acquisitions = 100  # 100 new customers each month
monthly_spend = 100        # $100 per customer per month

# Calculate forecast
df, total_impact = triangle_forecast(monthly_acquisitions, monthly_spend)

# Print results
print("Monthly Breakdown:")
print(df)
print(f"nTotal Yearly Impact: ${total_impact:,.2f}")
Image generated by author

We can also leverage Python to visualize the cohort contributions as a bar chart. Note how the impact decreases linearly as we move through the months. 

Image generated by author

Using this Python code, you can now generate and iterate on annual impact estimations quickly and efficiently, without having to manually perform version control on crashing spreadsheets.

Beyond Basic Forecasts 

While the above example is straightforward, assuming monthly acquisitions and spending are constant across all months, that need not necessarily be true. Triangle forecasting can be easily adapted and scaled to account for :

  • Multiple spend tiers

For varying monthly spend based on spend tiers, create a distinct triangle forecast for each cohort and then aggregate individual cohort’s impacts to calculate the total annual impact.

  • Varying acquisition rates

Typically, businesses don’t acquire customers at a constant rate throughout the year. Acquisition might start at a slow pace and ramp up as marketing kicks in, or we might have a burst of early adopters followed by slower growth. To handle varying rates, pass a list of monthly targets instead of a single rate:

# Example: Gradual ramp-up in acquisitions
varying_acquisitions = [50, 75, 100, 150, 200, 250, 
                        300, 300, 300, 250, 200, 150]
df, total_impact = triangle_forecast(varying_acquisitions, monthly_spend)
Image generated by author
  • Seasonality adjustments

To account for seasonality, multiply each month’s impact by its corresponding seasonal factor (e.g., 1.2 for high-season months like December, 0.8 for low-season months like February, etc.) before calculating the total impact.

Here is how you can modify the Python code to account for seasonal variations:

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

def triangle_forecast(monthly_acquisitions, monthly_spend_per_customer, seasonal_factors = None):
    """
    Calculate yearly impact using triangle forecasting method.
    """    
    # Create a DataFrame for calculations
    months = range(1, 13)
    df = pd.DataFrame(index=months, 
                     columns=['month', 'new_customers', 
                             'months_contributing', 'total_impact'])

    # Convert to list if single number, else use provided list
    acquisitions = [monthly_acquisitions] * 12 if type(monthly_acquisitions) in [int, float] else monthly_acquisitions

    if seasonal_factors is None:
        seasonality = [1] * 12
    else:
        seasonality = [seasonal_factors] * 12 if type(seasonal_factors) in [int, float] else seasonal_factors        
    
    # Calculate impact for each cohort
    for month in months:
        df.loc[month, 'month'] = f'Month {month}'
        df.loc[month, 'new_customers'] = acquisitions[month-1]
        df.loc[month, 'months_contributing'] = 13 - month
        df.loc[month, 'total_impact'] = (
            acquisitions[month-1] * 
            monthly_spend_per_customer * 
            (13 - month)*
            seasonality[month-1]
        )
    
    total_yearly_impact = df['total_impact'].sum()
    
    return df, total_yearly_impact

# Seasonality-adjusted example 
monthly_acquisitions = 100  # 100 new customers each month
monthly_spend = 100        # $100 per customer per month
seasonal_factors = [1.2,  # January (New Year)
            0.8,  # February (Post-holiday)
            0.9,  # March
            1.0,  # April
            1.1,  # May
            1.2,  # June (Summer)
            1.2,  # July (Summer)
            1.0,  # August
            0.9,  # September
            1.1, # October (Halloween) 
            1.2, # November (Pre-holiday)
            1.5  # December (Holiday)
                   ]

# Calculate forecast
df, total_impact = triangle_forecast(monthly_acquisitions, 
                                     monthly_spend, 
                                     seasonal_factors)
Image generated by author

These customizations can help you model different growth scenarios including:

  • Gradual ramp-ups in early stages of launch
  • Step-function growth based on promotional campaigns
  • Seasonal variations in customer acquisition

The Bottom Line

Having dependable and intuitive forecasts can make or break the case for your initiatives. 

But that’s not all — triangle forecasting also finds applications beyond revenue forecasting, including calculating:

  • Customer Activations
  • Portfolio Loss Rates
  • Credit Card Spend

Ready to dive in? Download the Python template shared above and build your first Triangle forecast in 15 minutes! 

  1. Input your monthly acquisition targets
  2. Set your expected monthly customer impact
  3. Visualize your annual trajectory with automated visualizations

Real-world estimations often require dealing with imperfect or incomplete data. Check out my article “Building Defendable Impact Estimates When Data is Imperfect” for a framework to build defendable estimates in such scenarios.

Acknowledgement:

Thank you to my wonderful mentor, Kathryne Maurer, for developing the core concept and first iteration of the Triangle Forecasting method and allowing me to build on it through equations and code.

I’m always open to feedback and suggestions on how to make these guides more valuable for you. Happy reading!

The post Triangle Forecasting: Why Traditional Impact Estimates Are Inflated (And How to Fix Them) appeared first on Towards Data Science.

​Accurate impact estimations can make or break your business case. Yet, despite its importance, most teams use oversimplified calculations that can lead to inflated projections. These shot-in-the-dark numbers not only destroy credibility with stakeholders but can also result in misallocation of resources and failed initiatives. But there’s a better way to forecast effects of gradual
The post Triangle Forecasting: Why Traditional Impact Estimates Are Inflated (And How to Fix Them) appeared first on Towards Data Science.  Data Science, Business Forecasting, Business Impact Analysis, Cohort Analysis, Data Analysis, Python Towards Data ScienceRead More

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

FavoriteLoadingAdd to favorites

Dr. Owns

February 7, 2025

Recent Posts

0 Comments

Submit a Comment