---
name: roi-estimator
description: "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."
---

# ROI Estimator Skill

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.

## Required Inputs

Ask for these only if they aren't already provided:

- **Costs** — upfront cost, and any ongoing/recurring cost (per period).
- **Benefits** — the expected gain per period (revenue uplift, cost saved, time saved × loaded rate). Quantify; if it's an estimate, say so.
- **Time horizon** — over how many periods to evaluate (e.g. 3 years).
- **Discount rate** — for NPV (default ~10%); state it.

## Output Format

### ROI: [investment]

**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.

## Programmatic Helper

`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
```

## Quality Checks

- [ ] Costs include recurring/ongoing, not just upfront
- [ ] NPV is computed (time value of money), not just raw ROI
- [ ] Benefits are given as a range (conservative/expected/optimistic), not a single optimistic point
- [ ] Every assumption is listed explicitly
- [ ] A sensitivity note names the assumption the verdict hinges on and its flip point

## Anti-Patterns

- [ ] Do not ignore ongoing costs — a low upfront, high-recurring option can lose to a pricier one-time buy
- [ ] Do not present a single benefit number as fact — it's the softest input; give a range and flag it
- [ ] Do not skip discounting for multi-year cases — $1 in year 3 isn't $1 today
- [ ] Do not bury the assumptions — a business case is only as credible as its stated inputs
- [ ] Do not omit payback — a great 5-year ROI with a 4-year payback may still be too slow to fund

## Based On

Business-case / capital-budgeting practice — ROI, payback period, NPV, and assumption sensitivity.
