Earned value management
With 100,000 of work planned, 90,000 of work earned and 110,000 actually spent, the project is 20,000 over budget and 10,000 behind schedule, with a CPI of 0.818 and an SPI of 0.9. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Planned value
- 100,000
- Earned value
- 90,000
- Actual cost
- 110,000
- Cost variance
- -20,000
- Schedule variance
- -10,000
- Cost performance index
- 0.8181818182
- Schedule performance index
- 0.9
Earned value management is the project-control method that puts planned work, completed work, and money spent on the same scale so one snapshot shows whether a project is over or under budget and ahead of or behind schedule. This earned value management calculator accepts planned value (PV), earned value (EV), and actual cost (AC) and returns the four classic indices used in PMI status reports: cost variance CV equals EV minus AC, schedule variance SV equals EV minus PV, cost performance index CPI equals EV divided by AC, and schedule performance index SPI equals EV divided by PV. Project managers, PMO analysts, contractors, and exam candidates need those four numbers every reporting period. Any negative input is rejected, and a zero earned value is rejected, because the ratios are not a useful performance signal when no budgeted work has been earned.
What CV, SV, CPI, and SPI mean in earned value management
In earned value management, three money figures describe the same slice of a project at a reporting date. Planned value (PV, also called BCWS) is the approved budget for the work that should have been finished by that date according to the baseline schedule. Earned value (EV, also called BCWP) is the approved budget for the work that actually has been finished.
Actual cost (AC, also called ACWP) is the money spent to accomplish that finished work. Cost variance is EV minus AC: a positive CV means the completed work cost less than its budget so the project is under budget in value terms, a negative CV means it cost more so the project is over budget, and a zero CV means the completed work landed exactly on its budget.
Schedule variance is EV minus PV: a positive SV means more budgeted work has been accomplished than the baseline called for so the project is ahead of schedule in value terms, a negative SV means less so the project is behind, and a zero SV means the earned work matches the plan. The two performance indices restate those gaps as ratios that travel well across projects of different size.
CPI equals EV divided by AC: greater than one is under budget, equal to one is on budget, and less than one is over budget. SPI equals EV divided by PV: greater than one is ahead, equal to one is on schedule, and less than one is behind. These four identities are the PMI and AACE first-line health check used on capital construction, software programs, defense contracts, and PMP exam items.
They do not by themselves predict calendar days of delay or a full estimate at completion; they tell you, from three numbers, whether cost and schedule are healthy right now against the approved baseline.
Who relies on earned value figures
Program controls teams and portfolio offices need a deterministic earned value management calculator that every status pack, owner report, and automated roll-up can call without opening a spreadsheet template that someone might have edited. Construction and engineering contractors pull PV, EV, and AC from their cost systems each period and must publish CV, SV, CPI, and SPI under contract language that already cites those PMI formulas.
Software product and IT program managers map completed backlog to earned value, the release plan to planned value, and burn to actual cost so executives see the same four indices they already know from capital projects. LMS platforms and PMP exam generators need an oracle that marks the four identities correctly for arbitrary triples, including the edges where the project is exactly on budget or exactly on schedule. Failed validation does not consume balance.
What you can do with it
PMO status packs and owner reports
Recompute CV, SV, CPI, and SPI each period from the cost system's planned value, earned value, and actual cost so every slide and claim uses the same PMI identities.
Contractor and capital-project controls
Publish cost and schedule performance against the approved baseline when the contract already requires earned-value indices, without a hand-edited spreadsheet.
PMP drills and LMS auto-grading
Mark earned-value exam items with a deterministic oracle that rejects negative inputs and a zero earned value instead of inventing a ratio.
FAQ
What happens if an input is negative?
Planned value, earned value, and actual cost are budgeted or spent amounts and cannot be below zero. Invalid input is not billed.
Why is a zero earned value rejected?
This calculator is a performance snapshot of work already earned.
What do CPI and SPI greater than one mean?
CPI greater than one (and positive CV) means under budget: earned work cost less than actual spend would suggest. SPI greater than one (and positive SV) means ahead of schedule in value terms: more budgeted work is complete than the plan called for.
What do cost variance and schedule variance tell me?
Cost variance is earned value minus actual cost: positive means the finished work cost less than budgeted. Schedule variance is earned value minus planned value: positive means more work is done than the baseline called for.
What is the difference between planned value, earned value and actual cost?
Planned value is the budget for the work that should be finished by the reporting date. Earned value is the budget for the work actually finished. Actual cost is the money really spent to finish that work.
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/earned-value-management \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"planned_value":100000,"earned_value":90000,"actual_cost":110000}'const res = await fetch("https://api.kit.forhosting.com/fin/earned-value-management", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"planned_value": 100000,
"earned_value": 90000,
"actual_cost": 110000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/earned-value-management",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"planned_value": 100000,
"earned_value": 90000,
"actual_cost": 110000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/earned-value-management", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"planned_value":100000,"earned_value":90000,"actual_cost":110000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"planned_value":100000,"earned_value":90000,"actual_cost":110000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/earned-value-management", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"planned_value": 100000,
"earned_value": 90000,
"actual_cost": 110000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.earned_value_management",
"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.
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
Input contract, response fields, and validation rules
POST a JSON body with three required finite numbers in the same project currency. planned_value (aliases pv, bcws) is the budgeted cost of work scheduled to date and must be strictly greater than zero, because SPI is defined as EV over PV and a zero or negative baseline would leave the index undefined or meaningless. earned_value (aliases ev, bcwp) is the budgeted cost of work performed to date and must be strictly greater than zero: a negative EV is not a valid budgeted amount, and a zero EV is rejected because the capability is a performance snapshot of work already earned, not a start-of-project placeholder. actual_cost (aliases ac, acwp) is the money spent on that performed work and must be strictly greater than zero so CPI equals EV over AC stays a finite JSON number. Each field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, non-finite values, any negative input, and a zero earned value (or zero planned value or actual cost) fail with invalid_input and are not billed. On success the response echoes the three inputs, then returns cost_variance, schedule_variance, cost_performance_index, schedule_performance_index, a cost_status of under_budget, on_budget, or over_budget, a schedule_status of ahead, on_schedule, or behind, a formula string restating the PMI identities, and a short interpretation sentence suitable for a status pack footnote. Example: planned value one hundred thousand, earned value ninety thousand, and actual cost one hundred ten thousand yields CV of negative twenty thousand, SV of negative ten thousand, CPI of about zero point eight one eight, SPI of zero point nine, cost_status over_budget, and schedule_status behind.
Where an earned value management API earns its keep
This endpoint does not compute estimate at completion, to-complete performance index, or critical-path days; those need extra assumptions this calculator refuses to invent.
Technical questions
How do I compute CV, SV, CPI, and SPI?
Send finite positive planned_value (PV), earned_value (EV), and actual_cost (AC). The API returns CV = EV − AC, SV = EV − PV, CPI = EV / AC, and SPI = EV / PV, plus cost and schedule status.
What does the earned value management calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.