Residual income calculator
Net operating income of 50,000 on 200,000 of invested capital with a 10% required return leaves a residual income of 30,000 after a capital charge of 20,000. Enter the return as a decimal, 0.10. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Net operating income
- 50,000
- Required return
- 0.1
- Invested capital
- 200,000
- Capital charge
- 20,000
- Residual income
- 30,000
Residual income, also called economic profit in managerial accounting, is the operating surplus that remains after a firm has covered the opportunity cost of the capital tied up in the business. Searchers who type residual income calculator want that leftover in currency units, not a debt-coverage ratio, not household discretionary income after bills, and not a pitch about mailbox money. This calculator accepts net operating income, a required return as a decimal fraction, and invested capital, multiplies the rate by the capital base to form the capital charge, and subtracts that charge from operating income. A positive result means operations beat the hurdle on the capital employed; a negative result means the firm destroyed value relative to that hurdle even if accounting profit looked healthy.
What residual income measures and how the figure is formed
Residual income answers a single performance question: after covering the opportunity cost of the capital that sits in the business, did operations still earn a surplus? Searchers who type residual income calculator want that leftover in currency units, not a coverage ratio, not a household leftover after bills, and not a royalty stream from a side hustle.
Net operating income is the operating surplus for the same period as the capital stock, typically before financing costs when the required return already prices the capital; many CFA residual-income equity models and EVA-style scorecards place net operating profit after tax in the same slot. The required return is the hurdle on that capital — a cost of equity, a weighted average cost of capital, or a divisional charge-out rate — entered as a decimal fraction so 0.10 means ten percent, not ten percent points typed as the integer 10.
Invested capital is the stock of capital the hurdle applies to: book capital, net operating assets, or the equity book value in an equity residual-income model, as long as the rate and the stock tell the same story. A positive result means operations beat the hurdle. Zero means they earned exactly the required return.
A negative result means they destroyed value relative to that hurdle even if accounting profit was positive, which is the whole point of charging capital instead of stopping at net income. Negative invested capital is rejected because a negative capital base is not the stock this identity describes. The calculator does not convert currencies, does not annualize a stub period, and does not pick a WACC for you: those belong in the calling workbook.
What you can do with it
Divisional performance against the cost of capital
Turn a period's net operating income, the hurdle rate, and invested capital into the residual income a bonus plan or capital-allocation meeting uses to judge whether a division beat its cost of capital.
CFA residual-income equity check
Confirm the one-period leftover (NOI or NOPAT minus r times book capital) before rolling it into a residual-income valuation model or an exam working.
Classroom and exam auto-grading
Mark residual-income items with a deterministic oracle that rejects negative invested capital and never treats a value-destroying leftover as a silent empty success.
FAQ
What happens if invested capital is negative?
A negative capital base is not the invested-capital stock this identity describes, and the failure is not billed.
Is the required return a percent or a decimal?
A decimal fraction, not percent points. Send 0.10 for a 10% hurdle. Sending 10 would treat the rate as one thousand percent and inflate the capital charge.
Can net operating income be negative?
Yes. A loss-making period is allowed and usually yields a more negative residual income, which honestly describes operations that missed the hurdle.
What does a negative residual income mean?
That operations did not cover the required return on the capital tied up in them, so value was destroyed against that hurdle even if accounting profit looked healthy. Zero means they earned exactly the required return.
Which required return should I use?
Use the hurdle that fits your capital base: a cost of equity, a weighted average cost of capital or a divisional charge-out rate. The rate and the capital must tell the same story; the calculator does not choose one for you.
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/residual-income \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"net_operating_income":50000,"required_return":0.1,"invested_capital":200000}'const res = await fetch("https://api.kit.forhosting.com/fin/residual-income", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"net_operating_income": 50000,
"required_return": 0.1,
"invested_capital": 200000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/residual-income",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"net_operating_income": 50000,
"required_return": 0.1,
"invested_capital": 200000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/residual-income", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"net_operating_income":50000,"required_return":0.1,"invested_capital":200000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"net_operating_income":50000,"required_return":0.1,"invested_capital":200000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/residual-income", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"net_operating_income": 50000,
"required_return": 0.1,
"invested_capital": 200000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.residual_income",
"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_value | 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
Negative invested capital is rejected with invalid_input because a negative capital base is not the invested-capital stock this identity describes.
What residual income measures and how the figure is formed
The identity this endpoint implements is the textbook one: residual income equals net operating income minus the capital charge, and the capital charge equals the required return times invested capital. Multiply the rate by the stock to obtain capital_charge, then subtract that charge from net operating income to obtain residual_income.
Input contract, response shape, and error behaviour
Zero invested capital is allowed and yields residual income equal to net operating income, because the capital charge is then zero. A required return of zero is likewise allowed and yields residual income equal to net operating income. POST a JSON body that supplies net_operating_income, required_return, and invested_capital. net_operating_income is the period operating surplus in a single currency unit, a finite number that may be negative when operations currently lose money, with aliases noi, nopat, operating_income, and net_operating_profit. required_return is the hurdle rate on invested capital as a decimal fraction, not percent points — send 0.10 for ten percent — a finite number with aliases r, cost_of_capital, wacc, and hurdle_rate. invested_capital is the capital stock in the same currency as net operating income, a finite number that must not be negative, with aliases capital, ic, invested_capital_amount, and book_capital. Each numeric field may arrive as a JSON number or as a numeric string. Missing net_operating_income, missing required_return, missing invested_capital, empty strings, non-finite values, or a magnitude above the declared limit fail with invalid_input naming the field and are not billed. Negative invested capital is the error this landing exists to catch: the message contains invested_capital and must not be negative so a form can highlight that control instead of showing a global alert. On success the body echoes the three inputs, returns capital_charge as required_return times invested_capital, returns residual_income as net operating income minus that charge, and includes a formula string restating the identity. Example: net_operating_income of fifty thousand against a required_return of 0.10 and invested_capital of two hundred thousand yields a capital charge of twenty thousand and residual income of thirty thousand. Example: net_operating_income of ten thousand against a required_return of 0.15 and invested_capital of one hundred thousand yields a negative leftover, which is a clear value shortfall rather than a silent empty payload. Pair the leftover with your own pass or fail rule if a bonus plan needs a sign flag; this endpoint computes residual income only and does not invent a compensation result.
Where a residual income calculator earns its keep
Equity analysts and CFA candidates rank for residual income calculator because the residual-income valuation model capitalizes the leftover after the required return on book capital, and a live identity check beats a spreadsheet cell that silently used percent points in place of a decimal fraction. Lenders and asset managers who already compute DSCR still need residual income when the question is value creation rather than debt coverage — the two identities share net operating income and then diverge, so this landing stays on the capital-charge side and does not divide by annual debt service. Educators teaching managerial finance can seed classroom examples that fail loudly on negative invested capital instead of printing a leftover a student might treat as a valid surplus. Failed validation does not consume balance. Corporate finance and managerial accounting use the same leftover as economic profit or an EVA-style score of value created: a division that reports accounting profit can still destroy value once the capital charge is subtracted, and this JSON contract is the figure a bonus plan or a capital-allocation meeting actually needs. Keep invested capital non-negative, enter the required return as a decimal fraction, pin the rounded residual_income field in tests, and you get a reproducible leftover for widgets, course modules, and edge workers without standing up a valuation engine of your own. Portfolio scripts can call the same module in a loop over many firms; each item is one request, the unit is item, and the free browser path remains byte-for-byte identical to the API so a landing-page preview never lies about the figure that will be stored after a save.
Technical questions
How is residual income calculated from NOI and invested capital?
Send finite numbers net_operating_income, required_return (decimal, e.g. 0.10 for 10%), and invested_capital. The API returns residual_income as net_operating_income minus required_return times invested_capital, plus the capital_charge intermediate.
What does the residual income calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.