Engineering managers and ops leads need a defensible number when proposing automation projects. Hand-waving "it'll save us time" doesn't survive a CFO conversation. Here's the formula we use on every project and a worked example showing a 5x return on a typical Slack bot build.
The formula
Annual ROI = (hours_saved_per_week x fully_loaded_hourly_rate x 52) - one_time_build_cost - annual_maintenance_cost
Four numbers, no magic. The hard part is honest estimation, not the arithmetic.
Estimating each input
hours_saved_per_week
The most lied-about number in automation. Methodology:
- Pick 3 people who do the manual task today
- Ask each for an honest weekly time estimate — separately, not in a meeting
- Take the median, NOT the average (averages inflate)
- Multiply by 0.8 (the automation won't be perfect; humans will still touch some cases)
If two of three people say "1 hour per week" and one says "5 hours per week", your number is 1 hour x 0.8 = 0.8 hours, not 7/3 x 0.8 = 1.9 hours. The outlier is usually counting context switching, not task duration.
fully_loaded_hourly_rate
Salary alone undersells. Use: (salary + benefits + overhead) / 1,800 working hours per year.
European engineering rule of thumb: gross salary x 1.4 = fully loaded. Then divide by 1,800.
Examples:
- HR person at 45,000 euro: 63,000 / 1,800 = 35 euro/hour
- Mid-level engineer at 70,000 euro: 98,000 / 1,800 = 54 euro/hour
- Senior engineer at 100,000 euro: 140,000 / 1,800 = 78 euro/hour
one_time_build_cost
If you outsource: the contract price. If internal: engineer_count x build_duration_hours x fully_loaded_hourly_rate.
Critical: include the manager's time for spec review, design review, and QA. Typically 20% on top of engineer hours.
annual_maintenance_cost
Three components:
- Hosting (VPS, managed Postgres, OpenAI API): typically 50-150 euro per month for a Slack bot
- Bug fixes + minor updates: 2-4 hours per quarter at fully loaded engineer rate
- Major upgrades when a dependency breaks: 1 day per year
For a typical custom Slack bot: hosting 720 euro + maintenance 12 hours x 75 euro = 1,620 euro per year.
Worked example
Custom Slack bot that auto-routes customer support tickets in a 5-person support team.
| Variable | Value | Source |
|---|---|---|
| hours_saved_per_week | 6 | Median of 3 support agents' estimates x 0.8 |
| fully_loaded_hourly_rate | 40 euro | Support agent salary 50k / 1,800 x 1.4 |
| build_cost | 4,500 euro | Fixed-price contract |
| maintenance_cost | 1,200 euro/year | 60 euro hosting x 12 + minor fixes |
Annual ROI = (6 x 40 x 52) - 4,500 - 1,200 = 12,480 - 5,700 = 6,780 euro in year 1.
In year 2 there's no build cost: 12,480 - 1,200 = 11,280 euro.
3-year ROI: 6,780 + 11,280 + 11,280 = 29,340 euro on a 4,500 euro build. 6.5x return.
When to NOT automate
- The task changes every quarter. Automation amortizes over years; rebuilding it kills ROI.
- Frequency is too low. A task that happens 4 times per year saves at most 1 hour per year. Not worth a 3-week build.
- The human task involves judgment. If 30% of cases need human override, automation might add friction, not remove it.
- The team needs to learn the task. New hires need to do PTO requests by hand once to understand the policy.
Honest payback period
Most automations should pay back in under 12 months. If your spreadsheet shows 36 months, the project is marginal and you should pivot to a higher-ROI candidate. There are always 5 candidates competing for build budget — pick the one with sub-12-month payback.
What CFOs actually care about
The discounted version. Apply a discount rate (usually 10-15% for SMBs reflecting opportunity cost) to future savings:
NPV = Σ(annual_savings / (1 + discount_rate)^year) - build_cost
For our worked example at 12% discount rate over 3 years: NPV = 6,780/1.12 + 11,280/1.25 + 11,280/1.40 - 0 = 6,054 + 9,024 + 8,057 = 23,135 euro NPV. Positive NPV at 12% = the project beats putting the same cash in a 12% return investment. CFOs nod.
Comparison
| Build cost | Hours saved/week | Loaded rate | Year 1 ROI | Payback (months) |
|---|---|---|---|---|
| 3,000 euro | 2 | 40 euro | 1,000 euro | 12 |
| 3,000 euro | 4 | 40 euro | 5,000 euro | 5 |
| 5,000 euro | 6 | 50 euro | 9,000 euro | 5 |
| 8,000 euro | 8 | 60 euro | 16,000 euro | 4 |
| 15,000 euro | 10 | 75 euro | 23,000 euro | 5 |
FAQ
What discount rate should I use?
10-15% for SMBs (matches typical opportunity cost). Larger companies with cheaper capital can use 5-8%. Don't over-think it; the input estimates have more error than the discount rate.
Should I include freed-up capacity revenue?
Only if the freed time is provably redirected to revenue-generating work. Otherwise it's vanity savings — the person just works less, not more.
What about quality improvements?
Hard to monetize directly. Quantify the downstream effect: e.g., 'cuts ticket escalations by 30%' translates to fewer manager interventions. Use that as a separate line item.
How do I justify automation that doesn't save time?
It usually still does — it shifts time from low-value to high-value work. If the bot answers customer questions instantly, you're not saving support hours, you're saving customer churn. Quantify the right thing.
Need help building an ROI case for your project?
1-hour scoping call: we'll model hours saved, costs, and 3-year NPV for your top automation candidate.
Book a discovery call