ROIC calculator
NOPAT of 150,000 on invested capital of 1,000,000 gives a return on invested capital of 15%, or 0.15. Set it beside the cost of capital to see whether operations create value. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Nopat
- 150,000
- Invested capital
- 1,000,000
- Roic percent
- 15
- Roic decimal
- 0.15
Return on invested capital (ROIC) measures how well a firm turns the capital actually tied up in operations into after-tax operating profit. Analysts, CFOs, and valuation students compute it as net operating profit after taxes (NOPAT) divided by invested capital, then express the quotient as a percentage so it can sit next to WACC, ROE, and simple ROI on the same page. This ROIC calculator accepts those two inputs in the same currency and the same period, returns the percentage and the matching decimal ratio, and rejects a zero or negative invested-capital denominator because the ratio would be undefined. NOPAT may be negative when operations lose money after tax; the result is then a negative ROIC, not an error.
What ROIC measures and how NOPAT over invested capital is computed
Return on invested capital, abbreviated ROIC, is the operating-profit yield on the capital that remains committed to the business after surplus cash and other non-operating items are stripped out. Standard valuation texts and sell-side models write the identity as NOPAT divided by invested capital. NOPAT is net operating profit after taxes: the unlevered, after-tax profit generated by operations, often obtained as earnings before interest and tax times one minus the cash tax rate.
Invested capital is the stock of funds still tied to those operations—typically interest-bearing debt plus book equity minus surplus cash, or equivalently operating assets minus operating liabilities—measured at the same reporting date or as a beginning or average stock, and in the same currency as NOPAT. A firm that earned 150,000 of NOPAT on 1,000,000 of invested capital has a ROIC of 15 percent, because 150,000 divided by 1,000,000 is 0.15 and that decimal times one hundred is 15.
A firm that lost 25,000 after tax on 500,000 of capital has a ROIC of minus 5 percent; a negative numerator is allowed and simply produces a negative percentage.
Where a ROIC calculator earns its keep versus ROI, ROE, and WACC
Equity research and DCF practice need a reproducible ROIC so a name can be compared with its weighted average cost of capital: when ROIC exceeds WACC the firm is earning economic profit on the capital it actually uses, and when it falls short value is being destroyed. Capital-allocation committees use the same percentage to rank business units that look similar on sales growth but very different on the capital they absorb.
Classroom and CFA-style drills need an oracle that rejects a zero or negative invested-capital denominator and still returns a negative percentage when NOPAT is a loss, because those two cases are how students confuse ROIC with a simple leftover-profit figure. This search is not the same as a generic ROI calculator, which divides (gain minus cost) by cost for a single project or purchase, and it is not return on equity, which divides net income by book equity and therefore mixes leverage into the yield.
Engineers writing valuation tests pin known-good pairs—150,000 over 1,000,000, a negative NOPAT, and a zero-capital rejection—so a reporting library cannot silently treat ROIC as if it were ROE. Failed validation does not consume balance.
What you can do with it
Equity research and DCF screens
Divide NOPAT by invested capital to see whether a name earns more than its cost of capital before you layer on a full WACC or residual-income model.
Teaching and exam practice
Generate reproducible ROIC answers for homework keys, worksheets, and CFA-style valuation drills that ask for NOPAT divided by invested capital as a percent.
FAQ
Can NOPAT be negative or zero?
Yes. A period with no operating profit yields a ROIC of zero; an after-tax operating loss yields a negative ROIC. Those are valid results, not errors.
How is ROIC different from ROI or ROE?
Simple ROI divides (gain minus cost) by the cost of a single outlay. ROE divides net income by book equity and therefore includes leverage. ROIC uses unlevered after-tax operating profit over the capital actually invested in operations — a different search and a different valuation question.
What does the calculator cost?
It is free in your browser on this page.
How do I compare ROIC with the cost of capital?
Put the percentage next to the weighted average cost of capital. When ROIC is higher, the company earns an economic profit on the capital it actually uses; when it is lower, value is being destroyed.
What counts as invested capital?
The funds still tied to operations: usually interest-bearing debt plus book equity minus surplus cash, or operating assets minus operating liabilities. Measure it at the same date, or as an average, and in the same currency as NOPAT.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/roic \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"nopat":150000,"invested_capital":1000000}'const res = await fetch("https://api.kit.forhosting.com/fin/roic", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"nopat": 150000,
"invested_capital": 1000000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/roic",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"nopat": 150000,
"invested_capital": 1000000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/roic", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"nopat":150000,"invested_capital":1000000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"nopat":150000,"invested_capital":1000000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/roic", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"nopat": 150000,
"invested_capital": 1000000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.roic",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_abs | 1000000000000000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Successful API calls are billed at $0.002; invalid input is not charged.
What ROIC measures and how NOPAT over invested capital is computed
A zero or negative invested-capital stock is not allowed: dividing by it is undefined, and this calculator returns invalid_input instead of a fake infinity. This page does not build NOPAT from EBIT and a tax rate, and it does not assemble invested capital from a full statement of financial position.
Input contract, validation, rounding, and reading the result
There is no clock, locale, or randomness in the path. Prefer bare numbers over formatted strings; percent signs, thousands separators, and currency marks are not parsed. POST a JSON body with two required finite numbers in the same currency and the same period. nopat is net operating profit after taxes; it may be positive, zero, or negative. Aliases net_operating_profit_after_tax, net_operating_profit_after_taxes, and nopat_amount are accepted so a spreadsheet export does not need a rename step. invested_capital is the capital stock used as the denominator and must be strictly greater than zero, because ROIC divides NOPAT by that stock; aliases invested_capital_amount, ic, and capital_invested are accepted. Each field may arrive as a JSON number or as a numeric string that matches a strict finite decimal pattern. Absolute values must stay within one quadrillion so intermediate products remain finite in IEEE double precision on the Worker and in the browser. Missing fields, empty strings, non-finite values, an invested capital of zero or below, or a value outside those limits fail with invalid_input naming the field and are not billed. On success the body echoes rounded nopat and invested_capital, returns roic_percent as NOPAT over invested capital times one hundred, roic_decimal as the unscaled ratio, and a formula string set to roic_percent = (nopat / invested_capital) × 100. Pricing for a successful item is a flat $0.002.
Where a ROIC calculator earns its keep versus ROI, ROE, and WACC
Keep requests small, pin the rounded roic_percent in tests, and you get stable capital-return arithmetic for widgets, research notes, and edge workers without standing up a full fundamental-data stack of your own.
Integration use cases
Capital-allocation reviews
Batch the API across business units or reporting dates to flag any segment whose ROIC collapsed, or whose invested capital would make the ratio undefined.
Technical questions
What is the ROIC formula used here?
roic_percent = (nopat / invested_capital) × 100. The tool also returns roic_decimal, which is the same quotient before scaling by one hundred.
Why must invested capital be greater than zero?
ROIC divides NOPAT by invested capital, so a zero or negative invested_capital is undefined and returns invalid_input. The request is not billed.