Business Models & Revenue

Building Revenue Projections

Build credible revenue projections grounded in defensible assumptions — not top-down wishful thinking.

Revenue Projections Are Educated Guesses

No projection is accurate. Markets behave unpredictably. Customers don't arrive on schedule. But projections are not meant to be accurate — they're meant to reveal whether your assumptions produce a viable business, and to surface the key drivers you need to focus on.

The biggest mistake: building projections that justify a predetermined conclusion. The right approach: build honest projections from realistic assumptions, then stress-test them.

Bottom-Up vs Top-Down

Top-down (weak): "The market is $10B. We'll capture 1% in year 3. That's $100M ARR."

Every investor has heard this. It's meaningless because it says nothing about how.

Bottom-up (strong): "We can acquire 20 new customers in month 1. Our sales cycle takes 14 days. We expect 15% month-over-month growth as we improve acquisition. At $49 ARPU with 3% monthly churn, here's what MRR looks like month by month."

Bottom-up projections are built from mechanics: acquisition, retention, expansion, pricing. They're falsifiable and actionable.

Building a 12-Month Projection

typescript
interface ProjectionParams {
  startingCustomers: number;
  startingMRR: number;
  monthlyNewCustomers: number;   // Starting acquisition
  acquisitionGrowthRate: number; // Monthly growth in acquisition
  monthlyChurnRate: number;
  arpu: number;
  expansionRate: number;         // Monthly MRR growth from upgrades
}

function buildMonthlyProjection(params: ProjectionParams, months: number) {
  const projection = [];
  let customers = params.startingCustomers;
  let mrr = params.startingMRR;
  let monthlyAcquisition = params.monthlyNewCustomers;

  for (let month = 1; month <= months; month++) {
    const newCustomerRevenue = monthlyAcquisition * params.arpu;
    const churnedRevenue = mrr * params.monthlyChurnRate;
    const expansionRevenue = mrr * params.expansionRate;

    customers = customers + monthlyAcquisition - Math.round(customers * params.monthlyChurnRate);
    mrr = mrr + newCustomerRevenue + expansionRevenue - churnedRevenue;
    monthlyAcquisition = Math.round(monthlyAcquisition * (1 + params.acquisitionGrowthRate));

    projection.push({ month, customers, mrr: Math.round(mrr) });
  }

  return projection;
}

Assumption Documentation

Every projection must explicitly state its assumptions. Undocumented assumptions are the most dangerous part of a financial model.

typescript
const projectionAssumptions = {
  acquisition: {
    startingCustomers: 20,
    note: 'Based on existing waitlist and direct outreach to developer communities',
  },
  growth: {
    monthlyAcquisitionGrowth: '15%',
    note: 'Conservative; assumes content marketing starts producing traffic by month 3',
  },
  churn: {
    monthlyChurnRate: '3.5%',
    note: 'Industry median for dev tools SaaS; will improve with better onboarding',
  },
  pricing: {
    arpu: 49,
    note: 'Blended ARPU assuming 70% Free→Pro conversion rate and 20% Pro→Team',
  },
};

Three-Scenario Planning

Always build three scenarios:

Conservative — Half the growth you expect. Acquisition takes longer. Churn is higher. This answers: "Can we survive if things go poorly?"

Base — Your best realistic estimate. Not the best case; not the worst case.

Optimistic — Everything goes right. Viral growth, strong retention, fast enterprise deals. This answers: "What's the upside?"

The gap between conservative and optimistic reveals execution risk.

Break-Even Analysis

typescript
function calculateBreakEven(
  monthlyRevenue: number[],
  monthlyExpenses: number[]
): number {
  for (let month = 0; month < monthlyRevenue.length; month++) {
    if (monthlyRevenue[month] >= monthlyExpenses[month]) {
      return month + 1; // Break-even month
    }
  }
  return -1; // Never breaks even in the projection window
}

Cash Runway

typescript
const cashRunway = currentCash / monthlyBurnRate;
// $200,000 / $15,000 burn = 13.3 months of runway

13+ months is comfortable. Under 6 months requires immediate action (fundraising or reducing burn).

Key Takeaways

  • Bottom-up projections from acquisition/retention/pricing mechanics are more credible than top-down market share calculations
  • Always document every assumption — undocumented assumptions make projections unfalsifiable and misleading
  • Build three scenarios (conservative, base, optimistic) to understand the range of outcomes
  • Cash runway = current cash ÷ monthly burn — keep this above 12 months at all times
  • The value of projections is not accuracy — it's identifying which assumptions drive the outcome and focusing on them

Example

typescript
// 12-month bottom-up projection
const projection = buildMonthlyProjection({
  startingCustomers: 0,
  startingMRR: 0,
  monthlyNewCustomers: 20,
  acquisitionGrowthRate: 0.15, // 15% monthly growth in new customers
  monthlyChurnRate: 0.035,
  arpu: 49,
  expansionRate: 0.02,
}, 12);

// Month 1:  20 customers, $980 MRR
// Month 3:  58 customers, $2,842 MRR
// Month 6: 119 customers, $5,831 MRR
// Month 12: 302 customers, $14,798 MRR

// Key milestone: break-even at month 8 (expenses $10,000/month)
console.log('12-month ARR:', projection[11].mrr * 12);
// $177,576 ARR at month 12
Try it yourself — TYPESCRIPT