Project Management & Agile Module 5 – Cost, budgets and earned value
Earned value management on a worked project
Compute planned value, earned value and actual cost from a project status, turn them into variances and indices, and read the S-curve they draw.
What you will learn
- Compute planned value, earned value and actual cost from a status report
- Calculate the cost and schedule variances and the CPI and SPI
- Estimate the final cost several ways and test the forecast with the TCPI
- Read an S-curve and explain what each index can and cannot show
Before you start
What you’ll learn · Before you start
What you will learn
- Compute planned value, earned value and actual cost from a status report
- Calculate the cost and schedule variances and the CPI and SPI
- Estimate the final cost several ways and test the forecast with the TCPI
- Read an S-curve and explain what each index can and cannot show
Before you start
On this page
Four months into a ten-month warehouse automation project, 11,300 thousand has been spent and the plan expected 11,225 by now: on the face of it, the project is on budget. Earned value says otherwise, because only 10,020 worth of the planned work is done, so the project is both over cost and behind schedule.
You will compute the three numbers of earned value from four A part of the project's work with one responsible manager and its own budget and plan, where actual costs are collected and earned value is measured., turn them into variances and indices, and read the S-curve they draw; then you will forecast the final cost from them and see where the method misleads.
Earned value adds a third number to the plan and the actual
Comparing spending with the plan mixes two questions: how much work is done, and what it cost. Earned value management separates them with three numbers taken at one status date, all in money:
- planned value (PV): The budget of the work the plan scheduled to be done by the status date, also called the budgeted cost of work scheduled. (PV), the budgeted cost of work scheduled: the budget of the work the plan said would be done by now, 11,225.
- earned value (EV): The budget of the work actually done by the status date, also called the budgeted cost of work performed; it measures progress in money. (EV), the budgeted cost of work performed: the budget of the work actually done, 10,020.
- actual cost (AC): What the work done by the status date really cost, also called the actual cost of work performed. (AC), the actual cost of work performed: what that work cost, 11,300.
Each is measured against the budget at completion (BAC): The total budget of all the work in the performance baseline: the sum of the control accounts' budgets, without the management reserve. (BAC), 24,000, the sum of the control accounts’ budgets. The program builds the three from the accounts’ status and prints their monthly totals:
"""Earned value at the month-4 status date of an invented warehouse-automation project (budget at completion 24,000).
Money is in thousands. Four control accounts, each with a budget and a monthly plan; for each the team reports the
work performed, valued at its budget (earned value), and what it actually cost. Planned value is the budget of the
work scheduled up to the status date. Decimal arithmetic, rounded half up for printing.
CV = EV - AC, SV = EV - PV, CPI = EV / AC, SPI = EV / PV.
"""
from decimal import ROUND_HALF_UP, Decimal
STATUS_MONTH = 4
# Control account: (name, budget, planned spend per month {month: amount}, EV by month, AC by month, cumulative)
ACCOUNTS = [
("Racking and civil works", 6000, {m: 1500 for m in range(1, 5)},
{1: 1200, 2: 2700, 3: 4300, 4: 6000}, {1: 1150, 2: 3000, 3: 4800, 4: 6600}),
("Conveyor and sorter", 9600, {m: 1600 for m in range(3, 9)},
{3: 800, 4: 2400}, {3: 1100, 4: 2900}),
("Warehouse software", 5400, {m: 675 for m in range(2, 10)},
{2: 450, 3: 1000, 4: 1620}, {2: 500, 3: 1150, 4: 1800}),
("Training and handover", 3000, {m: 1000 for m in range(8, 11)}, {}, {}),
]
def cumulative(by_month, month):
"""The latest cumulative value reported at or before this month (0 before the first report)."""
known = [m for m in by_month if m <= month]
return Decimal(by_month[max(known)]) if known else Decimal(0)
def planned(plan, month):
return sum((Decimal(v) for m, v in plan.items() if m <= month), Decimal(0))
def r(x, places="1"):
return x.quantize(Decimal(places), rounding=ROUND_HALF_UP)
BAC = sum(Decimal(a[1]) for a in ACCOUNTS)
assert all(sum(a[2].values()) == a[1] for a in ACCOUNTS), "each plan spreads its whole budget"
print(f"Status at the end of month {STATUS_MONTH}, budget at completion {r(BAC)}")
print(f"{'Control account':<24} {'Budget':>6} {'PV':>6} {'EV':>6} {'AC':>6} {'CV':>6} {'SV':>6}")
tot = {"pv": Decimal(0), "ev": Decimal(0), "ac": Decimal(0)}
for name, budget, plan, ev_m, ac_m in ACCOUNTS:
pv, ev, ac = planned(plan, STATUS_MONTH), cumulative(ev_m, STATUS_MONTH), cumulative(ac_m, STATUS_MONTH)
tot["pv"] += pv
tot["ev"] += ev
tot["ac"] += ac
print(f"{name:<24} {budget:>6} {r(pv):>6} {r(ev):>6} {r(ac):>6} {r(ev - ac):>6} {r(ev - pv):>6}")
pv, ev, ac = tot["pv"], tot["ev"], tot["ac"]
print(f"{'Project':<24} {r(BAC):>6} {r(pv):>6} {r(ev):>6} {r(ac):>6} {r(ev - ac):>6} {r(ev - pv):>6}")
print()
print(f"CPI = EV / AC = {r(ev)} / {r(ac)} = {r(ev / ac, '0.001')}: each 1.00 spent earned {r(ev / ac, '0.01')} of planned work")
print(f"SPI = EV / PV = {r(ev)} / {r(pv)} = {r(ev / pv, '0.001')}: {r(ev / pv * 100, '0.1')} % of the work planned by now is done")
print(f"Percent complete = EV / BAC = {r(ev / BAC * 100, '0.01')} %; percent spent = AC / BAC = {r(ac / BAC * 100, '0.01')} %")
print()
print("The S-curve, cumulative (PV for every month of the plan; EV and AC up to the status date):")
print(f"{'Month':<6} {'PV':>6} {'EV':>6} {'AC':>6}")
for month in range(1, 11):
pvm = sum(planned(a[2], month) for a in ACCOUNTS)
if month <= STATUS_MONTH:
evm = sum(cumulative(a[3], month) for a in ACCOUNTS)
acm = sum(cumulative(a[4], month) for a in ACCOUNTS)
print(f"{month:<6} {r(pvm):>6} {r(evm):>6} {r(acm):>6}")
else:
print(f"{month:<6} {r(pvm):>6}") Output
Status at the end of month 4, budget at completion 24000 Control account Budget PV EV AC CV SV Racking and civil works 6000 6000 6000 6600 -600 0 Conveyor and sorter 9600 3200 2400 2900 -500 -800 Warehouse software 5400 2025 1620 1800 -180 -405 Training and handover 3000 0 0 0 0 0 Project 24000 11225 10020 11300 -1280 -1205 CPI = EV / AC = 10020 / 11300 = 0.887: each 1.00 spent earned 0.89 of planned work SPI = EV / PV = 10020 / 11225 = 0.893: 89.3 % of the work planned by now is done Percent complete = EV / BAC = 41.75 %; percent spent = AC / BAC = 47.08 % The S-curve, cumulative (PV for every month of the plan; EV and AC up to the status date): Month PV EV AC 1 1500 1200 1150 2 3675 3150 3500 3 7450 6100 7050 4 11225 10020 11300 5 13500 6 15775 7 18050 8 21325 9 23000 10 24000
Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 evm.py
The racking is finished and has earned its whole 6,000, but it cost 6,600. The conveyor should have earned 3,200 by now and has earned 2,400 for 2,900 spent. Drawn over time, PV is the S-curve of the cost baseline, with EV and AC drawn against it up to the status date:
The cost baseline as an S-curve, with EV and AC at the status date
Text description of the diagram
The horizontal axis is the month, from 0 to 10; the vertical axis is cumulative money in thousands, from 0 to 24,000, the budget at completion (BAC), marked by the top grid line.
- Planned value (PV), a dashed grey line, rises along the cost baseline: 1,500 after month 1, 3,675 after month 2, 7,450 after month 3, 11,225 after month 4, then 13,500, 15,775, 18,050, 21,325 and 23,000, reaching 24,000 after month 10. - Actual cost (AC), a dark line with square markers, is drawn up to the status date: 1,150, 3,500, 7,050 and 11,300. It runs just above planned value at month 4. - Earned value (EV), a blue line with round markers, is drawn up to the status date: 1,200, 3,150, 6,100 and 10,020. It runs below both other lines from month 2 on. - A dotted vertical line marks the status date, the end of month 4.
At the status date the gap between AC and EV, 1,280, is the cost overrun, and the gap between PV and EV, 1,205, is the work behind schedule, measured in money.
The vertical gap between AC and EV is cost; the gap between PV and EV is schedule, measured in money.
Checkpoint
Check: Planned value, earned value and actual cost
Variances and indices say how far off the project is
Two subtractions and two divisions turn the three numbers into a verdict. GAO’s cost guide uses the usual signs: negative variances and indices below 1.0 are unfavourable.
In words, the cost variance (CV): Earned value minus actual cost. A negative value means the work done cost more than its budget. is −1,280 and the schedule variance (SV): Earned value minus planned value, in money. A negative value means less work is done than the plan scheduled by now. −1,205. The cost performance index (CPI): Earned value divided by actual cost: the budgeted work bought by each unit of money spent. Below 1.0 is unfavourable. of 0.887 says each 1.00 spent bought 0.89 of planned work, and the schedule performance index (SPI): Earned value divided by planned value: the share of the scheduled work that is done. Below 1.0 is unfavourable. of 0.893 says 89.3 % of the work planned by now is done. Step through how each figure follows, then two accounts:
The drawing shows the whole scene; its 9 steps are listed below.
Every step as text
- What the plan scheduled. By the end of month 4 the plan scheduled 11,225 of the budget's work, all of the racking, two months of the conveyor and three of the warehouse software.
- What the work is worth. The work actually done, valued at its budget, is worth 10,020, the racking's full 6,000 plus 2,400 of the conveyor and 1,620 of the software.
- What it cost. The same work cost 11,300. Against planned value alone, spending looks only 75 above the plan, which hides both problems.
- Behind, measured in money. The schedule variance is EV minus PV, 10,020 minus 11,225, or minus 1,205. Work worth 1,205 that the plan expected by now is not done.
- Over cost. The cost variance is EV minus AC, 10,020 minus 11,300, or minus 1,280. The work done cost 1,280 more than its budget.
- How much of the plan is done. The schedule index divides EV by PV, 10,020 by 11,225, which gives 0.893. Of the work planned by now, 89.3 % is done.
- What each 1.00 bought. The cost index divides EV by AC, 10,020 by 11,300, which gives 0.887. Each 1.00 spent so far bought 0.89 of planned work.
- Racking: finished, over cost. The racking is finished, so it has earned its whole budget and its schedule variance is 0. It still cost 6,600 for 6,000 of work, a cost variance of minus 600.
- Conveyor: behind and over. The conveyor earned 2,400 of the 3,200 planned and spent 2,900, so its schedule variance is minus 800 and its cost variance minus 500. It drives most of the schedule gap.
An index travels better than a variance: −1,280 is serious in a budget of 24,000 and trivial in one of 2,400,000, while 0.887 means the same in both. The racking shows why cost and schedule are read together: a finished account always has SV 0, whenever it finished, so only the racking’s CV of −600 shows its overrun.
Four more tools complete the method. An estimate at completion (EAC): A forecast of the final cost of the work: the actual cost so far plus the remaining work, re-priced with an efficiency index. (EAC) re-prices the remaining work with an efficiency index to forecast the final cost. The to-complete performance index (TCPI): The cost efficiency the remaining work would need for the project to finish at a target, such as the budget or a forecast. (TCPI) is the efficiency the remaining work needs to finish at a target. earning rule: The rule that decides how much of a work package's budget counts as earned at each stage of its work, such as 0/100 or 50/50. such as 0/100 and 50/50 decide how much of a started work package counts as earned. earned schedule: An extension of earned value management that states schedule performance in units of time, such as months, instead of money. restates the schedule gap in months.
Key idea
Spending against the plan says nothing on its own: earned value says how much planned work the money bought, so cost and schedule can be judged apart.
Checkpoint
Check: Cost and schedule variances and indices
Forecasting the final cost, with GAO's tests Pro: opens with a Pro, Premium or Ultimate pass
The month-4 numbers already hold several forecasts of the final cost. This part computes five of them, tests three targets against the efficiency the remaining work would need, and shows why an early overrun rarely goes away.
In this part:
- Five estimates at completion from one status report
- The to-complete index tests any target with numbers
- Why an early overrun rarely recovers, as a range
1 runnable example (Python) · about 5 minutes
Opening this part with your pass…
This part opens with any MySmartCoPilot pass.
- Pro pass · 1 week₹79$2.99
- 30 days₹179$5.99
- 1 year₹1,699$45
One payment; a pass never renews. The price shown is the total you pay: no fees or charges are added at checkout.
Passes can’t be bought right now, so this part can’t be opened at the moment. The free part above stands on its own. If you have a pass, enter your licence key.
It also opens every other in-depth part in Learn and every Pro tool. Sales are final, except where the law gives you a right to withdraw, for example in the EU and the UK (refund policy).
Where earned value misleads, reproduced in numbers Pro: opens with a Pro, Premium or Ultimate pass
Earned value is only as honest as the rule that decides what counts as earned, and its schedule index has a known flaw near the end of a project. This part reproduces both on the warehouse project and shows the fixes.
In this part:
- One status, four earning rules, and the CPI each gives
- SPI returns to 1.0 even when a project finishes two months late
1 runnable example (Python) · about 4 minutes
Opening this part with your pass…Pro part. It opens with the same pass as the part above.
Practise: the three numbers and their indices
The questions use the warehouse project’s month-4 status and a few new accounts. Work out each number before you choose:
Practice that adapts to you
Practise this lesson
6 questions about 4 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.
Interview questions
Warm-up: what do a CPI and an SPI below 1.0 mean?
A CPI below 1.0 means the work done so far cost more than its budget: at 0.887, each 1.00 spent earned 0.89 of planned work. An SPI below 1.0 means less work is done than the plan scheduled by now: at 0.893, 89.3 % of it. Both use earned value, the budget of the work actually done, which is what makes them comparable across projects.
Three harder questions follow, about a report that looks green, a supplier’s optimistic forecast and progress that is estimated rather than measured. Decide what you would check first, then open each first step:
-
Mid to senior
A monthly report shows a data-centre move at 6,100 spent against 6,000 planned and calls it green. You learn that the work done is worth 4,800 of budget. What is the real status, and what do you tell the steering group?
-
Mid to staff
A supplier's contract has a budget of 50,000. At 30 % complete its CPI is 0.85, and the supplier forecasts a final cost of 52,000. Do you accept the forecast, and how do you argue your answer?
-
Mid to senior
On a software programme, earned value comes from each team's own percent-complete estimates. For three months the CPI has been above 1.0, yet the releases keep slipping. What do you suspect, and what do you change?
Flashcards · 4 cards
Recall it, then check
Say the answer to yourself before you look: recalling it is what makes it stick.
-
What three numbers does earned value take at a status date?
Planned value (PV, budget of work scheduled), earned value (EV, budget of work actually done), actual cost (AC, what that work cost). All three are in money, so cost and schedule can be judged apart. BAC is the total budget.
-
What are CV, SV, CPI and SPI, and which values are unfavourable?
CV = EV − AC; SV = EV − PV; CPI = EV / AC; SPI = EV / PV. Negative variances and indices below 1.0 are unfavourable. CPI 0.887 means each 1.00 spent bought 0.89 of planned work; SPI 0.893 means 89.3 % of the planned work is done.
-
Why does an EVM index travel across projects while a variance does not?
A variance of −1,280 is serious in a 24,000 budget and trivial in a 2,400,000 one. CPI 0.887 means the same in both. A finished account always has SV 0 whenever it finished, so cost and schedule must be read together.
-
On an EVM S-curve, what do the two gaps mean?
PV is the cumulative baseline, with EV and AC drawn against it up to the status date. The vertical gap between AC and EV is the cost problem; the gap between PV and EV is the schedule problem, measured in money.
Key takeaways
- Planned value, earned value and actual cost, taken at one status date, separate how much work is done from what it cost.
- The cost and schedule variances are EV − AC and EV − PV, and the CPI and SPI divide EV by AC and by PV, with values below 1.0 unfavourable.
- Indices compare across projects of any size, and a finished account always shows a schedule variance of 0, so cost and schedule are read together.
- On an S-curve, the gap between AC and EV is the cost problem and the gap between PV and EV is the schedule problem.
Terms in this lesson
- actual cost (AC)
- What the work done by the status date really cost, also called the actual cost of work performed.
- budget at completion (BAC)
- The total budget of all the work in the performance baseline: the sum of the control accounts' budgets, without the management reserve.
- cost performance index (CPI)
- Earned value divided by actual cost: the budgeted work bought by each unit of money spent. Below 1.0 is unfavourable.
- cost variance (CV)
- Earned value minus actual cost. A negative value means the work done cost more than its budget.
- earned schedule
- An extension of earned value management that states schedule performance in units of time, such as months, instead of money.
- earned value (EV)
- The budget of the work actually done by the status date, also called the budgeted cost of work performed; it measures progress in money.
- earning rule
- The rule that decides how much of a work package's budget counts as earned at each stage of its work, such as 0/100 or 50/50.
- estimate at completion (EAC)
- A forecast of the final cost of the work: the actual cost so far plus the remaining work, re-priced with an efficiency index.
- planned value (PV)
- The budget of the work the plan scheduled to be done by the status date, also called the budgeted cost of work scheduled.
- schedule performance index (SPI)
- Earned value divided by planned value: the share of the scheduled work that is done. Below 1.0 is unfavourable.
- schedule variance (SV)
- Earned value minus planned value, in money. A negative value means less work is done than the plan scheduled by now.
- to-complete performance index (TCPI)
- The cost efficiency the remaining work would need for the project to finish at a target, such as the budget or a forecast.
References
- Cost Estimating and Assessment Guide: Best Practices for Developing and Managing Program Costs (GAO-20-195G), chapters 17 to 20 (U.S. Government Accountability Office)
- Earned Schedule: the official site for Earned Schedule information (Earned Schedule (Walt Lipke))
- Project Management Professional (PMP) Examination Content Outline (2026 edition) (Project Management Institute)
- decimal: decimal fixed-point and floating-point arithmetic (Python 3.14 standard library) (Python Software Foundation)
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress