#!/usr/bin/env python3 """ Quick Ratio Calculator - SaaS growth efficiency metric. Quick Ratio = (New MRR + Expansion MRR) / (Churned MRR + Contraction MRR) A ratio > 4 indicates healthy, efficient growth. A ratio < 1 means you're losing revenue faster than gaining it. Usage: python quick_ratio_calculator.py --new-mrr 10000 --expansion 2000 --churned 3000 --contraction 500 python quick_ratio_calculator.py --new-mrr 10000 --expansion 2000 --churned 3000 --contraction 500 --json """ import json import sys import argparse def calculate_quick_ratio(new_mrr, expansion_mrr, churned_mrr, contraction_mrr): """ Calculate Quick Ratio and provide interpretation. Args: new_mrr: New MRR from new customers expansion_mrr: Expansion MRR from existing customers (upsells) churned_mrr: MRR lost from churned customers contraction_mrr: MRR lost from downgrades Returns: dict with quick ratio and analysis """ # Calculate components growth_mrr = new_mrr + expansion_mrr lost_mrr = churned_mrr + contraction_mrr # Quick Ratio if lost_mrr == 0: quick_ratio = float('inf') if growth_mrr > 0 else 0 quick_ratio_display = "āˆž" if growth_mrr > 0 else "0" else: quick_ratio = growth_mrr / lost_mrr quick_ratio_display = f"{quick_ratio:.2f}" # Status assessment if lost_mrr == 0 and growth_mrr > 0: status = "EXCELLENT" interpretation = "No revenue loss - perfect retention with growth" elif quick_ratio >= 4: status = "EXCELLENT" interpretation = "Strong, efficient growth - gaining revenue 4x faster than losing it" elif quick_ratio >= 2: status = "HEALTHY" interpretation = "Good growth efficiency - gaining revenue 2x+ faster than losing it" elif quick_ratio >= 1: status = "WATCH" interpretation = "Marginal growth - barely gaining more than losing" else: status = "CRITICAL" interpretation = "Losing revenue faster than gaining - growth is unsustainable" # Breakdown percentages if growth_mrr > 0: new_pct = (new_mrr / growth_mrr) * 100 expansion_pct = (expansion_mrr / growth_mrr) * 100 else: new_pct = expansion_pct = 0 if lost_mrr > 0: churned_pct = (churned_mrr / lost_mrr) * 100 contraction_pct = (contraction_mrr / lost_mrr) * 100 else: churned_pct = contraction_pct = 0 results = { "quick_ratio": quick_ratio if quick_ratio != float('inf') else None, "quick_ratio_display": quick_ratio_display, "status": status, "interpretation": interpretation, "components": { "growth_mrr": round(growth_mrr, 2), "lost_mrr": round(lost_mrr, 2), "new_mrr": round(new_mrr, 2), "expansion_mrr": round(expansion_mrr, 2), "churned_mrr": round(churned_mrr, 2), "contraction_mrr": round(contraction_mrr, 2), }, "breakdown": { "new_mrr_pct": round(new_pct, 1), "expansion_mrr_pct": round(expansion_pct, 1), "churned_mrr_pct": round(churned_pct, 1), "contraction_mrr_pct": round(contraction_pct, 1), }, } return results def format_report(results): """Format quick ratio results as human-readable report.""" lines = [] lines.append("\n" + "=" * 70) lines.append("QUICK RATIO ANALYSIS") lines.append("=" * 70) # Quick Ratio lines.append(f"\n⚔ QUICK RATIO: {results['quick_ratio_display']}") lines.append(f" Status: {results['status']}") lines.append(f" {results['interpretation']}") # Components comp = results["components"] lines.append("\nšŸ“Š COMPONENTS") lines.append(f" Growth MRR (New + Expansion): ${comp['growth_mrr']:,.2f}") lines.append(f" • New MRR: ${comp['new_mrr']:,.2f}") lines.append(f" • Expansion MRR: ${comp['expansion_mrr']:,.2f}") lines.append(f" Lost MRR (Churned + Contraction): ${comp['lost_mrr']:,.2f}") lines.append(f" • Churned MRR: ${comp['churned_mrr']:,.2f}") lines.append(f" • Contraction MRR: ${comp['contraction_mrr']:,.2f}") # Breakdown bd = results["breakdown"] lines.append("\nšŸ“ˆ GROWTH BREAKDOWN") lines.append(f" New customers: {bd['new_mrr_pct']:.1f}%") lines.append(f" Expansion: {bd['expansion_mrr_pct']:.1f}%") lines.append("\nšŸ“‰ LOSS BREAKDOWN") lines.append(f" Churn: {bd['churned_mrr_pct']:.1f}%") lines.append(f" Contraction: {bd['contraction_mrr_pct']:.1f}%") # Benchmarks lines.append("\nšŸŽÆ BENCHMARKS") lines.append(" < 1.0 = CRITICAL (losing revenue faster than gaining)") lines.append(" 1-2 = WATCH (marginal growth)") lines.append(" 2-4 = HEALTHY (good growth efficiency)") lines.append(" > 4 = EXCELLENT (strong, efficient growth)") lines.append("\n" + "=" * 70 + "\n") return "\n".join(lines) if __name__ == "__main__": parser = argparse.ArgumentParser( description="Calculate SaaS Quick Ratio (growth efficiency metric)" ) parser.add_argument( "--new-mrr", type=float, required=True, help="New MRR from new customers" ) parser.add_argument( "--expansion", type=float, default=0, help="Expansion MRR from upsells (default: 0)" ) parser.add_argument( "--churned", type=float, required=True, help="Churned MRR from lost customers" ) parser.add_argument( "--contraction", type=float, default=0, help="Contraction MRR from downgrades (default: 0)" ) parser.add_argument("--json", action="store_true", help="Output JSON format") args = parser.parse_args() results = calculate_quick_ratio( new_mrr=args.new_mrr, expansion_mrr=args.expansion, churned_mrr=args.churned, contraction_mrr=args.contraction, ) if args.json: print(json.dumps(results, indent=2)) else: print(format_report(results))