Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Estimate the ROI, payback, and NPV of an investment, project, or purchase. Use when asked to calculate ROI, build a business case, justify a purchase/initiative, work out payback period, or compare options by return. Produces a computed ROI summary (net benefit, ROI %, payback, simple NPV) with the assumptions made explicit and a sensitivity note, so a business case is defensible.
.claude/skills/mohitagw15856-roi-estimator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 87% | 0% |
Every "should we spend on this?" decision needs a defensible number. This skill estimates the return — ROI %, payback period, and a simple NPV that accounts for the time value of money — from costs and expected benefits, with the assumptions stated and a sensitivity check, so a business case survives the first sceptical question instead of collapsing.
Ask for these only if they aren't already provided:
1. The numbers (via the helper):
| Metric | Value | |---|---| | Total cost (over horizon) | | | Total benefit (over horizon) | | | Net benefit | | | ROI % | | | Payback period | | | Simple NPV (@ discount rate) | |
2. The verdict — worth it / marginal / no, in one line, and against what bar (e.g. beats the discount-rate hurdle, payback within tolerance).
3. Assumptions — list them explicitly. The benefit is usually the soft number — flag it, and give a conservative / expected / optimistic range rather than a single point.
4. Sensitivity — the one assumption the conclusion hinges on, and at what value the decision flips.
scripts/roi.py (stdlib only) computes ROI, payback, and NPV:
bash# in.json: {"upfront_cost":50000,"recurring_cost":2000,"benefit_per_period":18000,"periods":36,"discount_rate_annual":0.1,"period":"month"} python3 scripts/roi.py in.json python3 scripts/roi.py in.json --json
Business-case / capital-budgeting practice — ROI, payback period, NPV, and assumption sensitivity.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 25,277 | 29,031 | +15% | 1 | 1 | 0% | 4,528 | 6,061 | +34% | 0 | 0 | — |
case-02 | pass→pass | 30,238 | 27,231 | -10% | 1 | 1 | 0% | 4,366 | 5,212 | +19% | 0 | 0 | — |
case-03 | pass→pass | 35,567 | 19,539 | -45% | 1 | 1 | 0% | 4,900 | 3,914 | -20% | 0 | 0 | — |
case-04 | pass→pass | 16,196 | 24,836 | +53% | 1 | 1 | 0% | 3,472 | 5,129 | +48% | 0 | 0 | — |
case-05 | pass→pass | 12,906 | 19,255 | +49% | 1 | 1 | 0% | 1,570 | 3,350 | +113% | 0 | 0 | — |
case-06 | pass→pass | 14,392 | 24,580 | +71% | 1 | 1 | 0% | 1,915 | 4,528 | +136% | 0 | 0 | — |
case-07 | pass→pass | 23,083 | 27,326 | +18% | 1 | 1 | 0% | 3,822 | 4,380 | +15% | 0 | 0 | — |
case-08 | pass→pass | 25,762 | 19,622 | -24% | 1 | 1 | 0% | 4,191 | 4,540 | +8% | 0 | 0 | — |
case-09 | fail→fail | 23,745 | 15,940 | -33% | 1 | 1 | 0% | 2,703 | 1,675 | -38% | 0 | 0 | — |
case-10 | fail→pass | 35,217 | 26,532 | -25% | 1 | 1 | 0% | 4,620 | 4,134 | -11% | 0 | 0 | — |
case-11 | fail→pass | 29,696 | 31,386 | +6% | 1 | 1 | 0% | 4,667 | 5,062 | +8% | 0 | 0 | — |
case-12 | fail→pass | 14,710 | 26,255 | +78% | 1 | 1 | 0% | 2,749 | 4,164 | +51% | 0 | 0 | — |
case-13 | fail→pass | 20,759 | 20,428 | -2% | 1 | 1 | 0% | 3,266 | 4,065 | +24% | 0 | 0 | — |
case-14 | pass→pass | 32,528 | 26,404 | -19% | 1 | 1 | 0% | 4,059 | 4,154 | +2% | 0 | 0 | — |
case-15 | pass→pass | 20,895 | 27,872 | +33% | 1 | 1 | 0% | 3,262 | 5,153 | +58% | 0 | 0 | — |
case-16 | fail→pass | 19,691 | 27,094 | +38% | 1 | 1 | 0% | 2,857 | 5,341 | +87% | 0 | 0 | — |
case-17 | fail→pass | 25,690 | 30,115 | +17% | 1 | 1 | 0% | 3,936 | 5,493 | +40% | 0 | 0 | — |
case-18 | pass→pass | 23,470 | 26,283 | +12% | 1 | 1 | 0% | 3,681 | 4,816 | +31% | 0 | 0 | — |
case-19 | pass→pass | 28,085 | 28,532 | +2% | 1 | 1 | 0% | 4,380 | 4,632 | +6% | 0 | 0 | — |
case-20 | pass→pass | 26,439 | 24,191 | -9% | 1 | 1 | 0% | 3,380 | 4,517 | +34% | 0 | 0 | — |
case-21 | fail→pass | 28,711 | 28,425 | -1% | 1 | 1 | 0% | 4,376 | 4,475 | +2% | 0 | 0 | — |
case-22 | fail→fail | 32,625 | 26,145 | -20% | 1 | 1 | 0% | 4,114 | 5,428 | +32% | 0 | 0 | — |
case-23 | fail→pass | 39,117 | 21,341 | -45% | 1 | 1 | 0% | 3,924 | 4,663 | +19% | 0 | 0 | — |
case-24 | pass→pass | 26,721 | 38,329 | +43% | 1 | 1 | 0% | 4,037 | 4,225 | +5% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +33 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.