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
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.
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
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
const cashRunway = currentCash / monthlyBurnRate;
// $200,000 / $15,000 burn = 13.3 months of runway13+ 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
// 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