Skip to content

feat(finance): add saas-metrics-coach skill#298

Open
abbasmir12 wants to merge 1 commit intoalirezarezvani:mainfrom
abbasmir12:feat/finance-saas-metrics-coach
Open

feat(finance): add saas-metrics-coach skill#298
abbasmir12 wants to merge 1 commit intoalirezarezvani:mainfrom
abbasmir12:feat/finance-saas-metrics-coach

Conversation

@abbasmir12
Copy link

@abbasmir12 abbasmir12 commented Mar 8, 2026

Summary

Adds saas-metrics-coach skill to the finance domain - a specialized tool for SaaS financial health analysis with three production-ready calculators.

Motivation

SaaS founders and operators need quick access to SaaS-specific metrics (ARR, MRR, churn, CAC, LTV, Quick Ratio) that aren't covered by traditional financial analysis tools. This skill complements the existing financial-analyst skill by focusing exclusively on SaaS unit economics and growth metrics.

Features

Core Metrics Calculator

  • Computes ARR, MRR, churn rate, CAC, LTV, LTV:CAC ratio, CAC payback period, NRR
  • Benchmarks against industry standards by stage and segment
  • Prioritized health reports with actionable recommendations
  • Works with partial data (graceful degradation)

Quick Ratio Calculator

  • Growth efficiency metric: (New + Expansion) / (Churned + Contraction)
  • Benchmarks: <1 = Critical, 2-4 = Healthy, >4 = Excellent
  • Identifies if revenue is gained faster than lost

Unit Economics Simulator

  • Projects metrics forward 12 months based on growth/churn assumptions
  • Scenario planning for "what if" analysis
  • Shows MRR, ARR, revenue, and profit trajectory

Technical Details

Language: Python 3.7+
Dependencies: None (stdlib-only)
Lines of Code: 595 across 3 scripts
Output Formats: Human-readable text, JSON
CLI Support: All scripts support --help and --json flags

Files Added

finance/saas-metrics-coach/    
├── SKILL.md                           # Main skill instructions    
├── scripts/    
│   ├── metrics_calculator.py          # Core metrics (217 lines)    
│   ├── quick_ratio_calculator.py      # Growth efficiency (173 lines)    
│   └── unit_economics_simulator.py    # 12-month projections (205 lines)    
├── references/    
│   ├── formulas.md                    # Metric formulas with worked examples    
│   └── benchmarks.md                  # Industry benchmarks (OpenView, Bessemer, SaaS Capital)    
└── assets/    
    └── input-template.md              # User input template    

Testing

  • All scripts execute without errors in CLI and JSON modes
  • No external dependencies (stdlib-only verified)
  • Follows repo standards (YAML frontmatter, conventional commits)
  • No overlap with existing financial-analyst skill

Relationship to Existing Skills

Complements financial-analyst:

  • financial-analyst: Traditional corporate finance (DCF, budgets, variance analysis)
  • saas-metrics-coach: SaaS-specific metrics (ARR, churn, unit economics)

Different use cases and target audiences with no functional overlap.


Open with Devin

- SaaS metrics calculator (ARR, MRR, churn, CAC, LTV, NRR)
- Quick Ratio calculator for growth efficiency
- Unit economics simulator for 12-month projections
- Industry benchmarks by stage/segment (OpenView, Bessemer, SaaS Capital)
- 3 stdlib-only Python tools with CLI and JSON output
- Complements financial-analyst skill for SaaS founders
Copy link

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 4 potential issues.

View 5 additional findings in Devin Review.

Open in Devin Review

parser.add_argument("--churned-mrr", type=float, default=0, help="Churned MRR")
parser.add_argument("--contraction-mrr", type=float, default=0, help="Contraction MRR")
parser.add_argument("--profit-margin", type=float, help="Net profit margin %%")
parser.add_argument("--json", action="store_true", help="Output JSON format")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 metrics_calculator.py uses --json flag instead of required --format flag

The finance/CLAUDE.md:86 Quality Standards mandate: "Support both JSON and human-readable output via --format flag". All 4 existing finance tools (finance/financial-analyst/scripts/) implement this as --format json|text. This new script uses --json (a boolean flag) instead, violating the domain's mandatory convention and making the CLI interface inconsistent with all other finance tools.

Prompt for agents
In finance/saas-metrics-coach/scripts/metrics_calculator.py, replace the `--json` boolean flag (line 172) with a `--format` flag matching the existing finance tool convention. Change line 172 to: parser.add_argument("--format", choices=["text", "json"], default="text", help="Output format (default: text)"). Then update line 193 from `if args.json:` to `if args.format == "json":`. This matches the pattern used in finance/financial-analyst/scripts/ratio_calculator.py and all other existing finance tools.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 quick_ratio_calculator.py uses --json flag instead of required --format flag

The finance/CLAUDE.md:86 Quality Standards mandate: "Support both JSON and human-readable output via --format flag". All 4 existing finance tools use --format json|text. This new script uses --json (a boolean flag) instead, violating the domain's mandatory convention.

Prompt for agents
In finance/saas-metrics-coach/scripts/quick_ratio_calculator.py, replace the `--json` boolean flag (line 159) with: parser.add_argument("--format", choices=["text", "json"], default="text", help="Output format (default: text)"). Then update line 170 from `if args.json:` to `if args.format == "json":`. This matches the convention used by all existing finance tools.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

parser.add_argument(
"--months", type=int, default=12, help="Months to project (default: 12)"
)
parser.add_argument("--json", action="store_true", help="Output JSON format")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 unit_economics_simulator.py uses --json flag instead of required --format flag

The finance/CLAUDE.md:86 Quality Standards mandate: "Support both JSON and human-readable output via --format flag". All 4 existing finance tools use --format json|text. This new script uses --json (a boolean flag) instead, violating the domain's mandatory convention.

Prompt for agents
In finance/saas-metrics-coach/scripts/unit_economics_simulator.py, replace the `--json` boolean flag (line 188) with: parser.add_argument("--format", choices=["text", "json"], default="text", help="Output format (default: text)"). Then update line 202 from `if args.json:` to `if args.format == "json":`. This matches the convention used by all existing finance tools.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +93 to +94
if r.get("MoM_Growth_Pct") and profit_margin is not None:
r["Rule_of_40"] = round(r["MoM_Growth_Pct"] * 12 + profit_margin, 1)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Rule of 40 silently skipped when MoM growth is exactly 0%

Line 93 uses if r.get("MoM_Growth_Pct") and profit_margin is not None: — when MoM_Growth_Pct is 0.0 (flat month-over-month), r.get("MoM_Growth_Pct") returns 0.0 which is falsy in Python, so the Rule of 40 is never calculated. This is incorrect: 0% growth + profit margin is a perfectly valid Rule of 40 input (e.g., 0% growth + 40% profit margin = score of 40). The check should test is not None instead of truthiness.

Suggested change
if r.get("MoM_Growth_Pct") and profit_margin is not None:
r["Rule_of_40"] = round(r["MoM_Growth_Pct"] * 12 + profit_margin, 1)
if r.get("MoM_Growth_Pct") is not None and profit_margin is not None:
r["Rule_of_40"] = round(r["MoM_Growth_Pct"] * 12 + profit_margin, 1)
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant