
Startup Metrics
- 162 installs
- 145 repo stars
- Updated April 2, 2026
- guia-matthieu/clawfu-skills
Define, track, and review core startup KPIs—activation, retention, revenue, burn, and funnel conversion—so founders can scope milestones and decide what to build next.
About
The startup-metrics skill from guia-matthieu/clawfu-skills helps early-stage founders select, define, and monitor essential KPIs—activation, retention, MRR, burn, and funnel health—so validation decisions, pricing bets, and roadmap scope stay tied to measurable traction instead of intuition alone.
- Clarifies north-star and supporting KPIs for early-stage products
- Connects funnel, retention, and revenue signals to roadmap scope
- Supports investor-ready metric framing without overbuilding dashboards
- Helps prioritize experiments by measurable impact
- Aligns pricing and unit-economics thinking with traction goals
Startup Metrics by the numbers
- 162 all-time installs (skills.sh)
- Ranked #1,133 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/guia-matthieu/clawfu-skills --skill startup-metricsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 162 |
|---|---|
| repo stars | ★ 145 |
| Last updated | April 2, 2026 |
| Repository | guia-matthieu/clawfu-skills ↗ |
What it does
Define, track, and review core startup KPIs—activation, retention, revenue, burn, and funnel conversion—so founders can scope milestones and decide what to build next.
Files
Startup Metrics
Know the metrics that matter at each stage and what investors actually look for. Master the A16Z and YC frameworks for measuring startup progress.
When to Use This Skill
- Fundraising prep to know which metrics to highlight
- Board meetings to report on the right KPIs
- Strategic planning to set goals that matter
- Product decisions to understand what to optimize
- Diagnosing problems to find what's broken
- Benchmarking to know if your metrics are good
Methodology Foundation
| Aspect | Details |
|---|---|
| Source | A16Z (Andreessen Horowitz), YC (Y Combinator), SaaS metrics best practices |
| Core Principle | "Measure what matters. Vanity metrics feel good but don't predict success. Focus on metrics that indicate real product-market fit and sustainable growth." |
| Why This Matters | Wrong metrics lead to wrong decisions. Right metrics reveal truth about your business—good or bad—before it's too late to course-correct. |
What Claude Does vs What You Decide
| Claude Does | You Decide |
|---|---|
| Structures analysis frameworks | Strategic priorities |
| Synthesizes market data | Competitive positioning |
| Identifies opportunities | Resource allocation |
| Creates strategic options | Final strategy selection |
| Suggests implementation approaches | Execution decisions |
What This Skill Does
1. Identifies key metrics by stage - What to measure when 2. Calculates core SaaS metrics - ARR, MRR, churn, LTV, CAC 3. Benchmarks performance - Good vs. great vs. concerning 4. Diagnoses metric problems - What poor metrics indicate 5. Prepares investor-ready dashboards - What VCs want to see 6. Prioritizes metric improvement - What to fix first
How to Use
Get Stage-Appropriate Metrics
I'm a [stage] startup in [industry].
What metrics should I be tracking?
What benchmarks should I aim for?Calculate Core Metrics
Help me calculate my SaaS metrics:
[Provide: MRR, customer count, churn data, acquisition costs]Diagnose Metric Problems
My metrics: [list metrics]
What's concerning? What should I focus on fixing?Instructions
Step 1: Understand Metrics by Stage
## Metrics Framework by Stage
### Pre-Seed (Validation Stage)
**Focus:** Is this a real problem worth solving?
| Metric | Why It Matters | Good Signal |
|--------|---------------|-------------|
| Problem interviews | Validate problem exists | 10+ interviews, 70%+ confirm |
| Solution interviews | Validate solution fits | 60%+ would use |
| LOIs/Waitlist | Real interest signal | Signed commitments |
| Engagement (if prototype) | People want to use it | Daily active usage |
**Not important yet:** Revenue, CAC, LTV, growth rate
---
### Seed (Product-Market Fit Stage)
**Focus:** Do people want this? Will they pay?
| Metric | Why It Matters | Good Signal |
|--------|---------------|-------------|
| **MRR/ARR** | Revenue traction | Any consistent revenue |
| **MoM Growth** | Trajectory | 15-20%+ MoM |
| **Retention** | PMF indicator | >80% monthly retention |
| **NPS** | Customer love | >50 NPS |
| **Engagement** | Product usage | DAU/MAU >20% |
**Emerging importance:** Early unit economics, CAC/LTV ratio
---
### Series A (Scale Stage)
**Focus:** Can this scale? Are unit economics viable?
| Metric | Why It Matters | Good Signal |
|--------|---------------|-------------|
| **ARR** | Revenue scale | $1-2M+ |
| **ARR Growth** | YoY trajectory | 3x YoY |
| **Net Revenue Retention** | Expansion + churn | >100% (ideally >120%) |
| **LTV/CAC** | Unit economics | >3:1 |
| **CAC Payback** | Efficiency | <18 months |
| **Gross Margin** | Business viability | >70% (SaaS) |
---
### Series B+ (Optimization Stage)
**Focus:** Efficiency and path to profitability
| Metric | Why It Matters | Good Signal |
|--------|---------------|-------------|
| **Magic Number** | Sales efficiency | >0.75 |
| **Rule of 40** | Growth + profitability | >40% |
| **Burn Multiple** | Cash efficiency | <2x |
| **Net Dollar Retention** | Account growth | >120% |
| **Quick Ratio** | Growth quality | >4 |---
Step 2: Calculate Core SaaS Metrics
## Metric Calculations
### Revenue Metrics
**MRR (Monthly Recurring Revenue):**
MRR = Sum of all recurring revenue per month
**ARR (Annual Recurring Revenue):**
ARR = MRR × 12
**MRR Components:**
- New MRR: Revenue from new customers
- Expansion MRR: Upgrades and cross-sells
- Contraction MRR: Downgrades
- Churned MRR: Lost customers
**Net New MRR:**
Net New MRR = New + Expansion - Contraction - Churned
---
### Growth Metrics
**MoM Growth Rate:**
Growth = (MRR this month - MRR last month) / MRR last month × 100
**YoY Growth Rate:**
YoY = (ARR this year - ARR last year) / ARR last year × 100
**CMGR (Compound Monthly Growth Rate):**
CMGR = (Ending MRR / Starting MRR)^(1/months) - 1
---
### Retention Metrics
**Gross Revenue Retention (GRR):**
GRR = (MRR - Churned MRR - Contraction MRR) / MRR × 100
Maximum: 100% (doesn't include expansion)
**Net Revenue Retention (NRR) / Net Dollar Retention (NDR):**
NRR = (MRR + Expansion - Contraction - Churned) / MRR × 100
Can be >100% (good!)
**Logo Churn:**
Logo Churn = Customers lost / Customers at start of period × 100
**Revenue Churn:**
Revenue Churn = Churned MRR / MRR at start of period × 100
---
### Unit Economics
**Customer Acquisition Cost (CAC):**
CAC = Total Sales & Marketing Spend / New Customers Acquired
**Lifetime Value (LTV):**
Simple: LTV = ARPU × Gross Margin × Customer Lifetime
With churn: LTV = (ARPU × Gross Margin) / Monthly Churn Rate
**LTV/CAC Ratio:**
LTV/CAC = LTV / CAC
Good: >3:1
**CAC Payback Period:**
Payback = CAC / (ARPU × Gross Margin)
Good: <18 months
---
### Efficiency Metrics
**Magic Number:**
Magic Number = Net New ARR this quarter / S&M Spend last quarter
>1.0 = Very efficient
0.75-1.0 = Good
<0.5 = Inefficient
**Rule of 40:**
Rule of 40 = Revenue Growth Rate + Profit Margin
>40% = Healthy balance of growth and profitability
**Burn Multiple:**
Burn Multiple = Net Burn / Net New ARR
<1x = Excellent
1-2x = Good
>2x = Concerning
**Quick Ratio:**
Quick Ratio = (New MRR + Expansion MRR) / (Churned MRR + Contraction MRR)
>4 = Excellent growth quality---
Step 3: Benchmark Against Standards
## Metric Benchmarks
### SaaS Benchmarks by Stage
| Metric | Seed | Series A | Series B |
|--------|------|----------|----------|
| ARR | <$1M | $1-5M | $5-15M |
| MoM Growth | 15-25% | 10-15% | 5-10% |
| YoY Growth | 3x+ | 2-3x | 1.5-2x |
| Gross Margin | >60% | >70% | >75% |
| LTV/CAC | >3x | >3x | >4x |
| CAC Payback | <24 mo | <18 mo | <12 mo |
| NRR | >100% | >110% | >120% |
| Logo Churn | <5%/mo | <3%/mo | <2%/mo |
### What "Good" Looks Like by Company Type
**SMB SaaS (low touch):**
- Logo churn: 3-5% monthly
- NRR: 80-100%
- LTV/CAC: >3x
- CAC: <$1,000
**Mid-Market SaaS:**
- Logo churn: 1-2% monthly
- NRR: 100-120%
- LTV/CAC: >4x
- CAC: $5,000-20,000
**Enterprise SaaS:**
- Logo churn: <1% monthly
- NRR: 110-150%
- LTV/CAC: >5x
- CAC: $20,000-100,000+
### Engagement Benchmarks
| Metric | Consumer | B2B SaaS |
|--------|----------|----------|
| DAU/MAU | >20% | >40% |
| D1 Retention | >40% | >50% |
| D7 Retention | >20% | >30% |
| D30 Retention | >10% | >20% |---
Step 4: Diagnose Problems
## Metric Diagnosis Guide
### If MRR Growth is Slowing...
**Possible causes:**
1. Market saturation (ran out of easy customers)
2. Product-market fit weakening (competition, changing needs)
3. Sales inefficiency (declining magic number)
4. High churn eating new growth
**Diagnostic questions:**
- Is logo churn increasing?
- Is CAC increasing?
- Is conversion rate declining?
- Is expansion revenue flat?
---
### If Churn is High...
**Possible causes:**
1. Onboarding problems (never got value)
2. Product gaps (missing critical features)
3. Wrong customers (sold to people who shouldn't buy)
4. Competition (better alternatives emerged)
5. Pricing mismatch (not worth it)
**Diagnostic questions:**
- When do customers churn? (early = onboarding, late = value)
- What's the churn reason? (survey departures)
- Which segments churn most?
- What's usage pattern before churn?
---
### If CAC is Too High...
**Possible causes:**
1. Wrong channel (expensive acquisition)
2. Poor targeting (low conversion)
3. Weak positioning (hard to differentiate)
4. Long sales cycles (expensive process)
5. Market competition (bidding up costs)
**Diagnostic questions:**
- What's CAC by channel?
- What's conversion rate at each stage?
- How long is sales cycle?
- What's win rate vs. competition?
---
### If LTV is Too Low...
**Possible causes:**
1. High churn (short lifetime)
2. Low ARPU (underpriced or wrong segment)
3. No expansion revenue (no upsell path)
4. Low gross margin (cost too high)
**Diagnostic questions:**
- What's average customer lifespan?
- What's ARPU distribution?
- What's expansion revenue %?
- Are costs scaling with revenue?
---
### Quick Diagnostic Table
| Symptom | Primary Metric | Secondary Checks |
|---------|---------------|------------------|
| Revenue plateau | MRR growth rate | New vs. expansion breakdown |
| Customers leaving | Churn rate | Cohort analysis, exit surveys |
| Expensive growth | CAC, Magic Number | Channel efficiency, conversion |
| Low profitability | Gross margin | COGS breakdown, pricing |
| "Leaky bucket" | Quick Ratio | Churn + expansion balance |---
Step 5: Create Investor Dashboard
## Investor Metrics Dashboard
### What Investors Want to See (by stage)
**Seed Deck Metrics:**
- MRR and growth trajectory
- Customer count and retention
- Engagement metrics
- Early unit economics (if available)
**Series A Deck Metrics:**
- ARR and YoY growth
- Net Revenue Retention
- LTV/CAC ratio
- CAC Payback
- Cohort analysis
- Customer breakdown by segment
**Series B+ Deck Metrics:**
All of above plus:
- Magic Number
- Rule of 40
- Burn Multiple
- Detailed unit economics by segment
- Efficiency trends over time
### Dashboard Template
[Company] Metrics Dashboard
As of [Date]
Revenue
- ARR: $[X]
- MRR: $[X]
- MoM Growth: [X]%
- YoY Growth: [X]%
Customers
- Total Customers: [X]
- New This Month: [X]
- Churned This Month: [X]
- Logo Churn Rate: [X]%
Retention
- Gross Revenue Retention: [X]%
- Net Revenue Retention: [X]%
- Average Customer Lifespan: [X] months
Unit Economics
- ARPU: $[X]
- CAC: $[X]
- LTV: $[X]
- LTV/CAC: [X]:1
- Payback: [X] months
Efficiency
- Gross Margin: [X]%
- Magic Number: [X]
- Burn Multiple: [X]
Engagement
- DAU: [X]
- DAU/MAU: [X]%
- Feature adoption: [X]%
---
Examples
Example 1: Seed Stage Metrics Analysis
Input:
"I'm raising Seed. Here are my metrics. How do they look?"
MRR: $15K, 6 months old, 40 customers
MoM growth: 20% average
Churn: 5% monthly
CAC: $200
Output:
Metrics Analysis: Seed Stage
Current State
| Metric | Value | Benchmark | Assessment |
|---|---|---|---|
| MRR | $15K | - | Early but positive |
| MoM Growth | 20% | 15-25% | ✅ Good |
| Customer Count | 40 | - | Reasonable for stage |
| Monthly Churn | 5% | <5% | ⚠️ At threshold |
| CAC | $200 | <$500 SMB | ✅ Efficient |
Calculated Metrics
ARPU: $15,000 / 40 = $375/month
Implied LTV (simple):
- Customer lifespan: 1 / 0.05 = 20 months
- LTV = $375 × 20 = $7,500
LTV/CAC: $7,500 / $200 = 37.5:1 ✅ Excellent
CAC Payback: $200 / $375 = 0.5 months ✅ Excellent
Analysis
Strengths:
- Growth rate is healthy (20% MoM = 8.9x annual)
- CAC is very efficient
- LTV/CAC is strong (though churn may be early-stage noise)
Concerns:
- 5% monthly churn = 60% annual churn (high for SaaS)
- Small sample size (40 customers)
- Need to see cohort retention to understand true churn
Questions to Answer: 1. Is 5% churn consistent across cohorts or improving? 2. What's the activation rate? (Are churners ever getting value?) 3. What's usage pattern of retained customers?
Investor Readiness
For Seed, you need to show:
- ✅ Growth trajectory (20% MoM is good)
- ✅ Efficient acquisition
- ⚠️ Retention story (need cohort data)
- ❓ Path to scale
Recommendation:
- Highlight growth and CAC efficiency
- Show cohort data if recent cohorts retain better
- Explain what you're doing to improve retention
- Project what metrics look like with improved retention
Projected Growth
| Metric | Now | +6 months (at 20% MoM) | +12 months |
|---|---|---|---|
| MRR | $15K | $45K | $133K |
| ARR | $180K | $540K | $1.6M |
| Customers | 40 | ~100 | ~250 |
---
Example 2: Diagnose Declining Growth
Input:
"My MoM growth dropped from 25% to 8% over 4 months. What's happening?"
Output:
Growth Decline Diagnosis
Data Needed
| Metric | 4 months ago | Now | Change |
|---|---|---|---|
| New MRR | ? | ? | |
| Expansion MRR | ? | ? | |
| Churned MRR | ? | ? | |
| Logo Churn | ? | ? | |
| New Customers | ? | ? | |
| Sales Pipeline | ? | ? | |
| CAC | ? | ? | |
| Conversion Rate | ? | ? |
Diagnostic Framework
Question 1: Is this a LEAKY BUCKET problem?
- Are you acquiring the same # of customers but losing more?
- Check: New MRR vs. Churned MRR
Question 2: Is this an ACQUISITION problem?
- Are you getting fewer new customers?
- Check: New customer count, pipeline, conversion rate
Question 3: Is this an EXPANSION problem?
- Has expansion revenue slowed?
- Check: Expansion MRR trend, upsell rate
Common Scenarios
Scenario A: Churn increased Symptoms: New MRR stable, but churned MRR grew Causes: Product issues, wrong customers, competition Fix: Churn analysis, customer success, product fixes
Scenario B: New acquisition slowed Symptoms: Churned MRR stable, but new MRR decreased Causes: Market saturation, CAC increased, marketing efficiency dropped Fix: New channels, positioning, sales optimization
Scenario C: Expansion stalled Symptoms: New + churn stable, but expansion dropped Causes: Product limits hit, no upsell path, customer saturation Fix: New features, pricing tiers, account management
Scenario D: Multiple factors Often it's a combination—growth hides problems until it slows
Investigation Checklist
□ Break down MRR: New, Expansion, Contraction, Churned
□ Compare ratios: Quick Ratio trend
□ Cohort analysis: Are newer cohorts worse?
□ Channel breakdown: Which channels slowed?
□ Segment analysis: Which customer type slowed?
□ Funnel metrics: Where is conversion dropping?
□ Win/loss analysis: Why are deals not closing?
□ Churn interviews: Why are customers leaving?Next Steps
1. Get the data breakdown (above table) 2. Identify primary driver (acquisition, churn, or expansion) 3. Root cause analysis on that driver 4. Hypothesis and test solutions 5. Monitor leading indicators weekly
---
Example 3: Series A Readiness Check
Input:
"Am I ready for Series A? ARR: $1.2M, NRR: 108%, LTV/CAC: 4.5x, YoY growth: 180%"
Output:
Series A Readiness Assessment
Metrics Scorecard
| Metric | Your Value | Series A Bar | Status |
|---|---|---|---|
| ARR | $1.2M | $1-2M | ✅ Pass |
| YoY Growth | 180% | 100-200% | ✅ Strong |
| NRR | 108% | >100% | ✅ Pass |
| LTV/CAC | 4.5x | >3x | ✅ Strong |
What You Have
✅ Revenue scale: $1.2M ARR is at the low end of Series A but acceptable with strong growth ✅ Growth rate: 180% YoY is excellent (shows demand) ✅ Retention: 108% NRR means customers expand (PMF signal) ✅ Unit economics: 4.5x LTV/CAC is healthy
What Investors Will Ask
You'll need answers to:
1. CAC Payback? (Need to calculate) 2. Gross Margin? (Should be >70% for SaaS) 3. Logo vs. Revenue Churn? (Both matter) 4. Cohort data? (Do later cohorts retain better?) 5. Segmentation? (Which customer type is best?) 6. Magic Number? (Sales efficiency) 7. Path to $10M ARR? (How do you 8x?)
Additional Metrics Needed
| Metric | Required | Nice to Have |
|---|---|---|
| CAC Payback | ✅ Yes | |
| Gross Margin | ✅ Yes | |
| MoM Growth Trend | ✅ Yes | |
| Customer Count | ✅ Yes | |
| Cohort Retention | ✅ Yes | |
| Magic Number | ✅ | |
| Burn Multiple | ✅ | |
| ACV Distribution | ✅ |
Series A Narrative
Based on your metrics, your story is:
"We've found product-market fit in [segment]. $1.2M ARR growing 180% YoY with 108% NRR proves customers want this and expand. Our 4.5x LTV/CAC shows we can acquire customers profitably. With Series A, we'll [go-to-market strategy] to reach $5M ARR in 18 months."
Recommendations
1. Strengthen weak spots before raising:
- Calculate and optimize CAC Payback
- Document gross margin
- Build cohort analysis
2. Prepare growth story:
- What drives growth? (channels, segments)
- Why will this continue?
- What does $10M ARR look like?
3. Document efficiency:
- Magic Number (if positive)
- Burn Multiple (if reasonable)
Verdict: You're in the range for Series A. Focus on the narrative and missing metrics before starting outreach.
---
Checklists & Templates
Metrics Tracking Checklist
## Monthly Metrics Review
### Revenue
□ MRR calculated (New + Expansion - Contraction - Churned)
□ ARR updated
□ MoM growth rate
□ YoY comparison (if applicable)
### Customers
□ Customer count
□ New customers
□ Churned customers
□ Logo churn rate
### Retention
□ Gross Revenue Retention
□ Net Revenue Retention
□ Cohort retention updated
### Unit Economics
□ CAC (by channel if possible)
□ LTV updated
□ LTV/CAC ratio
□ Payback period
### Engagement
□ DAU/MAU
□ Feature adoption
□ Key usage metrics
### Efficiency (Series A+)
□ Magic Number
□ Burn Multiple
□ Rule of 40---
Skill Boundaries
What This Skill Does Well
- Structuring strategic analysis
- Identifying market opportunities
- Creating strategic frameworks
- Synthesizing competitive data
What This Skill Cannot Do
- Replace market research
- Guarantee strategic success
- Know proprietary competitor info
- Make executive decisions
References
- A16Z. "16 Startup Metrics" (Andreessen Horowitz)
- YC. "Startup Metrics That Matter" (Y Combinator)
- Tunguz, Tomasz. "SaaS Metrics" (Redpoint Ventures)
- Reforge. "Retention Curves" & "Growth Accounting"
- OpenView Partners. "SaaS Benchmarks"
Related Skills
- yc-pitch-deck - Present metrics to investors
- lean-canvas - Business model context
- pricing-strategy - ARPU optimization
- first-principles - Challenge metric assumptions
---
Skill Metadata
- Mode: centaur
name: startup-metrics
category: startup
subcategory: measurement
version: 1.0
author: MKTG Skills
source_expert: A16Z, YC, SaaS Metrics Community
source_work: 16 Startup Metrics, YC Library
difficulty: intermediate
estimated_value: $5,000 financial modeling consulting
tags: [metrics, SaaS, startup, fundraising, KPIs, A16Z, YC]
created: 2026-01-25
updated: 2026-01-25#!/usr/bin/env python3
"""
Startup Metrics Calculator - Unit economics & cohort analysis.
Based on A16Z and YC frameworks for measuring startup progress.
Usage:
python main.py unit-economics 50000 100 500 --churn 0.05
python main.py benchmark --arr 1200000 --growth 180 --nrr 108 --ltv-cac 4.5
python main.py quick-ratio 10000 5000 3000 1000
"""
import click
from dataclasses import dataclass
from typing import Optional
@dataclass
class UnitEconomics:
"""Unit economics calculation results."""
mrr: float
customers: int
cac: float
churn_rate: float
arpu: float
ltv: float
ltv_cac: float
payback_months: float
customer_lifespan_months: float
def calculate_unit_economics(
mrr: float,
customers: int,
cac: float,
churn_rate: float = 0.05,
gross_margin: float = 0.80
) -> UnitEconomics:
"""Calculate core SaaS unit economics."""
arpu = mrr / customers if customers > 0 else 0
customer_lifespan = 1 / churn_rate if churn_rate > 0 else 100
ltv = arpu * gross_margin * customer_lifespan
ltv_cac = ltv / cac if cac > 0 else 0
payback = cac / (arpu * gross_margin) if arpu > 0 else 0
return UnitEconomics(
mrr=mrr,
customers=customers,
cac=cac,
churn_rate=churn_rate,
arpu=arpu,
ltv=ltv,
ltv_cac=ltv_cac,
payback_months=payback,
customer_lifespan_months=customer_lifespan
)
def get_benchmark_status(value: float, good: float, great: float, higher_is_better: bool = True) -> str:
"""Return status emoji based on benchmark."""
if higher_is_better:
if value >= great:
return "excellent"
elif value >= good:
return "good"
else:
return "needs work"
else:
if value <= great:
return "excellent"
elif value <= good:
return "good"
else:
return "needs work"
@click.group()
def cli():
"""Startup Metrics Calculator - A16Z/YC frameworks."""
pass
@cli.command()
@click.argument('mrr', type=float)
@click.argument('customers', type=int)
@click.argument('cac', type=float)
@click.option('--churn', '-c', default=0.05, help='Monthly churn rate (default: 0.05)')
@click.option('--margin', '-m', default=0.80, help='Gross margin (default: 0.80)')
def unit_economics(mrr: float, customers: int, cac: float, churn: float, margin: float):
"""Calculate unit economics (LTV, LTV/CAC, payback).
Arguments:
MRR: Monthly Recurring Revenue
CUSTOMERS: Number of customers
CAC: Customer Acquisition Cost
"""
result = calculate_unit_economics(mrr, customers, cac, churn, margin)
# Status indicators
ltv_cac_status = get_benchmark_status(result.ltv_cac, 3, 5)
payback_status = get_benchmark_status(result.payback_months, 18, 12, higher_is_better=False)
get_benchmark_status(result.churn_rate * 100, 5, 2, higher_is_better=False)
click.echo("\n Unit Economics Report")
click.echo(f" {'=' * 45}")
click.echo("\n Input Data")
click.echo(f" {'-' * 45}")
click.echo(f" MRR: ${result.mrr:,.2f}")
click.echo(f" Customers: {result.customers:,}")
click.echo(f" CAC: ${result.cac:,.2f}")
click.echo(f" Monthly Churn: {result.churn_rate * 100:.1f}%")
click.echo(f" Gross Margin: {margin * 100:.0f}%")
click.echo("\n Calculated Metrics")
click.echo(f" {'-' * 45}")
click.echo(f" ARPU: ${result.arpu:,.2f}/month")
click.echo(f" Customer Lifespan: {result.customer_lifespan_months:.1f} months")
click.echo(f" LTV: ${result.ltv:,.2f}")
click.echo(f" LTV/CAC: {result.ltv_cac:.1f}x [{ltv_cac_status}]")
click.echo(f" CAC Payback: {result.payback_months:.1f} months [{payback_status}]")
click.echo("\n Analysis")
click.echo(f" {'-' * 45}")
if result.ltv_cac >= 3:
click.echo(" [+] LTV/CAC ratio is healthy (>3x)")
else:
click.echo(f" [-] LTV/CAC ({result.ltv_cac:.1f}x) below 3x threshold")
click.echo(" Consider: Reduce CAC, increase prices, or reduce churn")
if result.payback_months <= 18:
click.echo(" [+] CAC payback is within acceptable range (<18mo)")
else:
click.echo(f" [-] CAC payback ({result.payback_months:.1f}mo) exceeds 18 months")
click.echo(" Consider: Lower CAC or increase ARPU")
if result.churn_rate <= 0.03:
click.echo(" [+] Monthly churn is low (<3%)")
elif result.churn_rate <= 0.05:
click.echo(" [~] Monthly churn is acceptable but improvable (3-5%)")
else:
click.echo(f" [-] Monthly churn ({result.churn_rate * 100:.1f}%) is high (>5%)")
click.echo(" Annual churn would be ~{:.0f}%".format((1 - (1 - result.churn_rate) ** 12) * 100))
# ARR projection
arr = result.mrr * 12
click.echo("\n Projections")
click.echo(f" {'-' * 45}")
click.echo(f" Current ARR: ${arr:,.0f}")
click.echo(f" Implied Annual Churn: {(1 - (1 - result.churn_rate) ** 12) * 100:.0f}%")
# Break-even customers
if result.ltv_cac < 1:
click.echo(" [!] Warning: LTV < CAC - losing money on each customer")
else:
break_even_cust = result.cac / (result.arpu * margin)
click.echo(f" Break-even: {break_even_cust:.1f} months of revenue")
@cli.command()
@click.argument('new_mrr', type=float)
@click.argument('expansion_mrr', type=float)
@click.argument('churned_mrr', type=float)
@click.argument('contraction_mrr', type=float)
def quick_ratio(new_mrr: float, expansion_mrr: float, churned_mrr: float, contraction_mrr: float):
"""Calculate Quick Ratio for growth quality.
Quick Ratio = (New + Expansion) / (Churn + Contraction)
>4 = Excellent, 2-4 = Good, <2 = Concerning
"""
additions = new_mrr + expansion_mrr
losses = churned_mrr + contraction_mrr
if losses > 0:
ratio = additions / losses
else:
ratio = float('inf')
net_new = additions - losses
click.echo("\n Quick Ratio Analysis")
click.echo(f" {'=' * 40}")
click.echo("\n MRR Components")
click.echo(f" {'-' * 40}")
click.echo(f" New MRR: +${new_mrr:,.0f}")
click.echo(f" Expansion MRR: +${expansion_mrr:,.0f}")
click.echo(f" Churned MRR: -${churned_mrr:,.0f}")
click.echo(f" Contraction MRR: -${contraction_mrr:,.0f}")
click.echo(f" {'-' * 40}")
click.echo(f" Net New MRR: ${net_new:,.0f}")
click.echo("\n Quick Ratio")
click.echo(f" {'-' * 40}")
if ratio == float('inf'):
click.echo(" Quick Ratio: Infinite (no losses)")
else:
status = get_benchmark_status(ratio, 2, 4)
click.echo(f" Quick Ratio: {ratio:.2f} [{status}]")
click.echo("\n Benchmarks")
click.echo(" >4 = Excellent growth quality")
click.echo(" 2-4 = Good, sustainable")
click.echo(" <2 = Leaky bucket, churn eating growth")
if ratio < 2:
click.echo("\n [!] Warning: Growth quality is poor")
click.echo(" For every $1 lost, only adding ${:.2f}".format(ratio))
@cli.command()
@click.option('--arr', type=float, help='Annual Recurring Revenue')
@click.option('--growth', type=float, help='YoY Growth Rate (%)')
@click.option('--nrr', type=float, help='Net Revenue Retention (%)')
@click.option('--ltv-cac', type=float, help='LTV/CAC Ratio')
@click.option('--payback', type=float, help='CAC Payback (months)')
@click.option('--margin', type=float, help='Gross Margin (%)')
@click.option('--magic', type=float, help='Magic Number')
def benchmark(
arr: Optional[float],
growth: Optional[float],
nrr: Optional[float],
ltv_cac: Optional[float],
payback: Optional[float],
margin: Optional[float],
magic: Optional[float]
):
"""Benchmark your metrics against Series A standards."""
click.echo("\n Series A Readiness Benchmark")
click.echo(f" {'=' * 50}")
# Benchmarks: (value, good, great, unit, higher_is_better)
benchmarks = {
'ARR': (arr, 1_000_000, 2_000_000, '$', True),
'YoY Growth': (growth, 100, 200, '%', True),
'NRR': (nrr, 100, 120, '%', True),
'LTV/CAC': (ltv_cac, 3, 5, 'x', True),
'CAC Payback': (payback, 18, 12, 'mo', False),
'Gross Margin': (margin, 70, 80, '%', True),
'Magic Number': (magic, 0.75, 1.0, '', True),
}
passed = 0
total = 0
click.echo(f"\n {'Metric':<15} {'Value':>12} {'Series A':>12} {'Status':>12}")
click.echo(f" {'-' * 51}")
for name, (value, good, great, unit, higher_is_better) in benchmarks.items():
if value is not None:
total += 1
status = get_benchmark_status(value, good, great, higher_is_better)
if unit == '$':
val_str = f"${value / 1_000_000:.1f}M"
bar_str = f"${good / 1_000_000:.0f}M+"
elif unit == '%':
val_str = f"{value:.0f}%"
bar_str = f">{good:.0f}%"
elif unit == 'x':
val_str = f"{value:.1f}x"
bar_str = f">{good:.0f}x"
elif unit == 'mo':
val_str = f"{value:.0f}mo"
bar_str = f"<{good:.0f}mo"
else:
val_str = f"{value:.2f}"
bar_str = f">{good:.2f}"
if status in ['excellent', 'good']:
passed += 1
status_str = f"[{status}]"
else:
status_str = f"[{status}]"
click.echo(f" {name:<15} {val_str:>12} {bar_str:>12} {status_str:>12}")
click.echo("\n Summary")
click.echo(f" {'-' * 51}")
click.echo(f" Metrics passing: {passed}/{total}")
if total > 0:
pct = (passed / total) * 100
if pct >= 80:
click.echo(" Overall: Strong Series A candidate")
elif pct >= 60:
click.echo(" Overall: Approaching Series A readiness")
else:
click.echo(" Overall: Need improvement before Series A")
@cli.command()
@click.argument('growth_rate', type=float)
@click.argument('profit_margin', type=float)
def rule_of_40(growth_rate: float, profit_margin: float):
"""Calculate Rule of 40 score.
Rule of 40 = Growth Rate + Profit Margin
Should be >40% for healthy SaaS at scale.
Arguments:
GROWTH_RATE: YoY revenue growth (%)
PROFIT_MARGIN: Operating profit margin (%)
"""
score = growth_rate + profit_margin
click.echo("\n Rule of 40 Analysis")
click.echo(f" {'=' * 40}")
click.echo("\n Inputs")
click.echo(f" {'-' * 40}")
click.echo(f" Growth Rate: {growth_rate:.0f}%")
click.echo(f" Profit Margin: {profit_margin:.0f}%")
click.echo(f" {'-' * 40}")
click.echo(f" Rule of 40: {score:.0f}%")
if score >= 40:
click.echo("\n [+] Passing Rule of 40")
click.echo(" Healthy balance of growth and profitability")
else:
gap = 40 - score
click.echo(f"\n [-] Below Rule of 40 by {gap:.0f} points")
click.echo(" Options to reach 40:")
click.echo(f" - Increase growth to {40 - profit_margin:.0f}% (current: {growth_rate:.0f}%)")
click.echo(f" - Increase margin to {40 - growth_rate:.0f}% (current: {profit_margin:.0f}%)")
@cli.command()
@click.argument('net_burn', type=float)
@click.argument('net_new_arr', type=float)
def burn_multiple(net_burn: float, net_new_arr: float):
"""Calculate Burn Multiple for cash efficiency.
Burn Multiple = Net Burn / Net New ARR
<1x = Excellent, 1-2x = Good, >2x = Concerning
"""
if net_new_arr > 0:
multiple = net_burn / net_new_arr
else:
multiple = float('inf')
click.echo("\n Burn Multiple Analysis")
click.echo(f" {'=' * 40}")
click.echo("\n Inputs")
click.echo(f" {'-' * 40}")
click.echo(f" Net Burn: ${net_burn:,.0f}")
click.echo(f" Net New ARR: ${net_new_arr:,.0f}")
click.echo(f" {'-' * 40}")
if multiple == float('inf'):
click.echo(" Burn Multiple: Infinite (no new ARR)")
click.echo("\n [!] Critical: Spending but not growing")
else:
status = get_benchmark_status(multiple, 2, 1, higher_is_better=False)
click.echo(f" Burn Multiple: {multiple:.1f}x [{status}]")
click.echo("\n Interpretation")
click.echo(f" Spending ${multiple:.2f} for every $1 of new ARR")
if multiple < 1:
click.echo(" [+] Excellent cash efficiency")
elif multiple < 2:
click.echo(" [~] Acceptable, but monitor closely")
else:
click.echo(" [-] Poor cash efficiency")
click.echo(" Consider: Reduce spend or improve sales efficiency")
if __name__ == "__main__":
cli()
click>=8.0