============================================================ */ (function(){ 'use strict'; function init(){ var root = document.getElementById('zssb'); if(!root) return; /* ── State ──────────────────────────────────────── */ var s1Type = 'sleeper'; // 'sleeper' or 'offduty' var s2Type = 'sleeper'; /* ── Toggle button setup ────────────────────────── */ function setupToggle(slpId, offId, callback){ var slpBtn = document.getElementById(slpId); var offBtn = document.getElementById(offId); if(!slpBtn || !offBtn) return; slpBtn.addEventListener('click', function(){ slpBtn.classList.add('active'); offBtn.classList.remove('active'); callback('sleeper'); }); offBtn.addEventListener('click', function(){ offBtn.classList.add('active'); slpBtn.classList.remove('active'); callback('offduty'); }); } setupToggle('zssb-s1-sleeper', 'zssb-s1-offduty', function(t){ s1Type = t; }); setupToggle('zssb-s2-sleeper', 'zssb-s2-offduty', function(t){ s2Type = t; }); /* ── Format decimal hours → "Xh Ym" ─────────────── */ function fmtHrs(h){ if(isNaN(h) || h < 0) return '0h 0m'; var hh = Math.floor(h); var mm = Math.round((h - hh) * 60); if(mm === 60){ hh++; mm = 0; } if(hh === 0 && mm === 0) return '0h 0m'; if(hh === 0) return mm + 'm'; if(mm === 0) return hh + 'h'; return hh + 'h ' + mm + 'm'; } /* ── Add decimal hours to a time string ─────────── */ function addHrs(timeStr, hrs){ if(!timeStr || timeStr === '') return null; var parts = timeStr.split(':'); if(parts.length < 2) return null; var totalMins = parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10) + Math.round(hrs * 60); totalMins = ((totalMins % 1440) + 1440) % 1440; var h = Math.floor(totalMins / 60); var m = totalMins % 60; return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m; } /* ── Convert 24hr "HH:MM" → 12hr "H:MM AM/PM" ─── */ function to12hr(t24){ if(!t24) return null; var p = t24.split(':'); var h = parseInt(p[0], 10); var m = p[1]; var ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12; if(h === 0) h = 12; return h + ':' + m + ' ' + ampm; } /* ── Warning helpers ─────────────────────────────── */ function showWarn(msg){ var w = document.getElementById('zssb-warn'); var wm = document.getElementById('zssb-wmsg'); if(w && wm){ wm.textContent = msg; w.classList.add('show'); } } function hideWarn(){ var w = document.getElementById('zssb-warn'); if(w) w.classList.remove('show'); } /* ── Status bar progress ─────────────────────────── */ function setStatus(step){ var pills = ['zssb-pill-1', 'zssb-pill-2', 'zssb-pill-3']; for(var i = 0; i < pills.length; i++){ var el = document.getElementById(pills[i]); if(el){ el.classList[i < step ? 'add' : 'remove']('active'); } } } /* ════════════════════════════════════════════════ MAIN CALCULATION — FMCSA 49 CFR §395.1(g) ════════════════════════════════════════════════ */ function calc(){ hideWarn(); setStatus(2); /* Read inputs */ var drivenBefore = parseFloat(document.getElementById('zssb-driven').value) || 0; var drivenBetween = parseFloat(document.getElementById('zssb-driven-between').value) || 0; var s1h = parseFloat(document.getElementById('zssb-s1-hrs').value) || 0; var s1m = parseFloat(document.getElementById('zssb-s1-min').value) || 0; var s2h = parseFloat(document.getElementById('zssb-s2-hrs').value) || 0; var s2m = parseFloat(document.getElementById('zssb-s2-min').value) || 0; var s1Start = document.getElementById('zssb-s1-start').value; var s2Start = document.getElementById('zssb-s2-start').value; /* Convert to decimal hours */ var split1 = s1h + (s1m / 60); var split2 = s2h + (s2m / 60); /* ── Validation ────────────────────────────────── */ if(split1 <= 0 && split2 <= 0){ showWarn('Please enter the duration for at least one split rest period.'); return; } if(split1 < 0 || split2 < 0){ showWarn('Rest period durations cannot be negative.'); return; } if(drivenBefore < 0 || drivenBetween < 0){ showWarn('Driving hours cannot be negative.'); return; } var totalDriven = drivenBefore + drivenBetween; if(totalDriven > 11){ showWarn('Total hours driven (' + totalDriven.toFixed(2) + ' hrs) exceeds the 11-hour driving limit.'); return; } /* ── FMCSA Split Sleeper Berth Logic ───────────── RULE 1: Combined rest >= 10 hours RULE 2: The longer period must be >= 7 hrs AND in sleeper berth RULE 3: The shorter period must be >= 2 hrs (sleeper or off-duty) ─────────────────────────────────────────────────── */ var totalRest = split1 + split2; var combinedOk = totalRest >= 10; var longSplit = Math.max(split1, split2); var shortSplit = Math.min(split1, split2); var longIsS1 = split1 >= split2; var longType = longIsS1 ? s1Type : s2Type; /* Long split: must be >= 7 hrs AND sleeper berth */ var longOk = (longSplit >= 7) && (longType === 'sleeper'); /* Short split: must be >= 2 hrs (any type) */ var shortOk = (shortSplit >= 2); /* Single-split detection (only one period entered) */ var oneSplit = (split1 > 0 && split2 === 0) || (split1 === 0 && split2 > 0); var isCompliant = false; var reason = ''; if(oneSplit){ isCompliant = false; reason = 'Only one split period entered. Please enter both Split 1 and Split 2 durations to check full FMCSA compliance.'; } else { var failReasons = []; if(!longOk){ if(longSplit < 7){ failReasons.push('Longer split (' + fmtHrs(longSplit) + ') is under the required 7-hour minimum.'); } else { failReasons.push('Longer split (' + fmtHrs(longSplit) + ') must be in the sleeper berth, not off-duty.'); } } if(!shortOk){ failReasons.push('Shorter split (' + fmtHrs(shortSplit) + ') is under the required 2-hour minimum.'); } if(!combinedOk){ failReasons.push('Combined rest (' + fmtHrs(totalRest) + ') is under the 10-hour minimum required.'); } isCompliant = longOk && shortOk && combinedOk; if(isCompliant){ reason = 'Both splits meet FMCSA requirements. Your 14-hour clock is paused during both rest periods and restarts at the end of Split 2.'; } else { reason = failReasons.join(' '); } } /* ── Remaining drive time ───────────────────────── */ var driveRemaining = Math.max(0, 11 - totalDriven); /* ── Timeline data (if start times provided) ──── */ var timelineData = null; if(s1Start && s1Start !== ''){ var s1End = addHrs(s1Start, split1); var midDrive = s2Start && s2Start !== '' ? s2Start : (s1End ? addHrs(s1End, drivenBetween) : null); var s2End = midDrive ? addHrs(midDrive, split2) : null; timelineData = { s1Start: to12hr(s1Start), s1End: to12hr(s1End), s2Start: s2Start && s2Start !== '' ? to12hr(s2Start) : (midDrive ? to12hr(midDrive) : null), s2End: to12hr(s2End), resumeTime: s2End ? to12hr(s2End) : null }; } /* ── Render results ──────────────────────────────── */ renderResults(isCompliant, reason, { split1: split1, split2: split2, totalRest: totalRest, longSplit: longSplit, shortSplit: shortSplit, longOk: longOk, shortOk: shortOk, combinedOk: combinedOk, longType: longType, drivenBefore: drivenBefore, drivenBetween: drivenBetween, totalDriven: totalDriven, driveRemaining:driveRemaining, s1Type: s1Type, s2Type: s2Type, oneSplit: oneSplit }, timelineData); setStatus(3); } /* ════════════════════════════════════════════════ RENDER RESULTS ════════════════════════════════════════════════ */ function renderResults(isCompliant, reason, d, tl){ /* Element refs */ var resEl = document.getElementById('zssb-res'); var banner = document.getElementById('zssb-banner'); var bannerStatus= document.getElementById('zssb-banner-status'); var bannerReason= document.getElementById('zssb-banner-reason'); var bannerSvg = document.getElementById('zssb-banner-svg'); var cardsEl = document.getElementById('zssb-cards'); var breakdownEl = document.getElementById('zssb-breakdown'); var timelineEl = document.getElementById('zssb-timeline'); var tlWrap = document.getElementById('zssb-timeline-wrap'); /* ── Compliance Banner ──────────────────────────── */ if(d.oneSplit){ banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = 'Incomplete — Enter Both Splits'; bannerSvg.innerHTML = ''; } else if(isCompliant){ banner.className = 'compliance-banner compliant'; bannerStatus.textContent = '✅ FMCSA Compliant — Valid Split'; bannerSvg.innerHTML = ''; } else { banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = '❌ Non-Compliant — Invalid Split'; bannerSvg.innerHTML = ''; } bannerReason.textContent = reason; /* ── Summary Cards ──────────────────────────────── */ var cards = []; if(!d.oneSplit){ cards.push({ v: fmtHrs(d.split1), u: d.s1Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 1 Duration', cls: d.s1Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.split2), u: d.s2Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 2 Duration', cls: d.s2Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.totalRest), u: 'TOTAL REST', n: 'Combined Off-Duty', cls: d.combinedOk ? 'green' : 'red' }); cards.push({ v: fmtHrs(d.driveRemaining), u: 'REMAINING', n: 'Drive Time Left', cls: d.driveRemaining > 4 ? 'green' : (d.driveRemaining > 2 ? 'orange' : 'red') }); } cardsEl.innerHTML = cards.map(function(c){ return '
' + '
' + c.v + '
' + '
' + c.u + '
' + '
' + c.n + '
' + '
'; }).join(''); /* ── Breakdown Table ────────────────────────────── */ var rows = []; if(!d.oneSplit){ rows.push({lbl: 'Split 1 (' + (d.s1Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split1), cls: ''}); rows.push({lbl: 'Split 2 (' + (d.s2Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split2), cls: ''}); rows.push({lbl: 'Combined Rest Total', val: fmtHrs(d.totalRest) + (d.totalRest >= 10 ? ' ✓' : ' ✗ (Need ≥10h)'), cls: d.combinedOk ? 'ok' : 'fail'}); rows.push({lbl: 'Longer Split ≥7 hrs in Sleeper Berth', val: d.longOk ? '✓ Pass' : '✗ Fail', cls: d.longOk ? 'ok' : 'fail'}); rows.push({lbl: 'Shorter Split ≥2 hrs (any type)', val: d.shortOk ? '✓ Pass' : '✗ Fail', cls: d.shortOk ? 'ok' : 'fail'}); rows.push({lbl: 'Hours Driven Before Split 1', val: fmtHrs(d.drivenBefore), cls: 'info'}); rows.push({lbl: 'Hours Driven Between Splits', val: fmtHrs(d.drivenBetween), cls: 'info'}); rows.push({lbl: 'Total Hours Driven', val: fmtHrs(d.totalDriven) + ' / 11 hrs max', cls: d.totalDriven < 11 ? 'ok' : 'fail'}); rows.push({lbl: 'Drive Time Remaining After Splits', val: fmtHrs(d.driveRemaining), cls: d.driveRemaining > 0 ? 'ok' : 'fail'}); rows.push({lbl: '14-Hour Clock Paused During Splits', val: isCompliant ? 'Yes — Both periods excluded' : 'Not applicable (fix issues above)', cls: isCompliant ? 'ok' : 'fail'}); } breakdownEl.innerHTML = rows.map(function(r){ return '
' + '' + r.lbl + '' + '' + r.val + '' + '
'; }).join(''); /* ── Timeline ───────────────────────────────────── */ if(!d.oneSplit){ tlWrap.style.display = 'block'; var items = []; items.push({ dot: 'drive', label: 'Started Driving', desc: 'Drove ' + fmtHrs(d.drivenBefore) + ' before first rest period.' }); items.push({ dot: 'sleep', label: 'Split 1 Begins' + (tl && tl.s1Start ? ' at ' + tl.s1Start : ''), desc: fmtHrs(d.split1) + ' ' + (d.s1Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s1End ? ' → Ends: ' + tl.s1End : '') }); if(d.drivenBetween > 0){ items.push({ dot: 'drive', label: 'Resumed Driving Between Splits', desc: 'Drove ' + fmtHrs(d.drivenBetween) + ' between the two rest periods.' }); } items.push({ dot: 'sleep', label: 'Split 2 Begins' + (tl && tl.s2Start ? ' at ' + tl.s2Start : ''), desc: fmtHrs(d.split2) + ' ' + (d.s2Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s2End ? ' → Ends: ' + tl.s2End : '') }); if(isCompliant){ items.push({ dot: 'done', label: '14-Hour Clock Restarts' + (tl && tl.resumeTime ? ' at ' + tl.resumeTime : ''), desc: 'Both splits complete. ' + fmtHrs(d.driveRemaining) + ' drive time remaining.' }); } else { items.push({ dot: 'off', label: 'Non-Compliant — Cannot Resume', desc: 'Fix the split issues above before resuming driving.' }); } timelineEl.innerHTML = items.map(function(it){ return '
' + '
' + '
' + '
' + it.label + '
' + '
' + it.desc + '
' + '
'; }).join(''); } else { tlWrap.style.display = 'none'; } /* ── Show results panel ─────────────────────────── */ resEl.classList.add('show'); setTimeout(function(){ resEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 100); } /* ════════════════════════════════════════════════ RESET ════════════════════════════════════════════════ */ function resetAll(){ /* Clear number inputs */ var numIds = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numIds.forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Clear time inputs */ ['zssb-s1-start', 'zssb-s2-start'].forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Reset toggle states */ s1Type = 'sleeper'; s2Type = 'sleeper'; ['zssb-s1-sleeper', 'zssb-s2-sleeper'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.add('active'); }); ['zssb-s1-offduty', 'zssb-s2-offduty'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.remove('active'); }); /* Hide warning and results */ hideWarn(); var resEl = document.getElementById('zssb-res'); if(resEl) resEl.classList.remove('show'); setStatus(1); } /* ── Event Listeners ──────────────────────────────── */ var calcBtn = document.getElementById('zssb-btn'); if(calcBtn) calcBtn.addEventListener('click', calc); var rstBtn = document.getElementById('zssb-reset'); if(rstBtn) rstBtn.addEventListener('click', resetAll); /* Enter key triggers calculation */ var numFields = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numFields.forEach(function(id){ var el = document.getElementById(id); if(el) el.addEventListener('keydown', function(e){ if(e.key === 'Enter') calc(); }); }); } /* end init() */ /* ── Safe DOM-ready execution ───────────────────────── */ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })();
Cost Performance Index Calculator
Instantly measure budget efficiency — for any project, anywhere in the world.
Project Cost Inputs
Earned Value (EV) ?
$
Actual Cost (AC) ?
$
Currency (Display)
!
Please enter valid positive values for both Earned Value and Actual Cost.
On Budget
Your project is performing as planned.
CPI: 1.00
Critical
<0.60
0.00
Excellent
>1.20
0.600.801.001.201.40+
Detailed Results
CPI Performance Classification
CPI RangeStatusMeaning
< 0.60 🔴 Critical Severe cost overrun — escalate immediately
0.60 – 0.79 🟠 At Risk Significantly over budget — corrective action needed
0.80 – 0.99 🟩 Caution Slightly over budget — monitor closely
1.00 🔵 On Track Budget and work are perfectly aligned
1.01 – 1.19 🟢 Efficient Performing better than planned
> 1.20 🟢 Excellent Significantly under budget — verify scope completeness
Formula Reference & Notes
  • Core Formula: CPI = EV ÷ AC — where EV = Earned Value, AC = Actual Cost
  • Forecast Formula: EAC = BAC ÷ CPI — Estimate at Completion
  • Cost Variance: CV = EV − AC — negative value means over budget
  • Standard: PMI PMBOK Guide, 7th Edition — Earned Value Management (EVM)
  • CPI < 1.0 = spending more than value delivered. CPI > 1.0 = delivering more value than cost.
  • Results are for planning and educational reference. Consult a qualified PM for critical decisions.
  • Source: pmi.org | en.wikipedia.org/wiki/Earned_value_management

Cost Performance Index Calculation: Find Your Budget Efficiency Instantly

The Cost Performance Index (CPI) tells you exactly how efficiently your project is spending its budget — whether you’re getting full value for every dollar spent, or quietly burning through funds. This free cost performance index calculator on Zo Calculator is built for project managers, finance leads, and students who need a fast, accurate CPI reading without manually crunching numbers.


What This Calculator Tells You

Enter just two values and this tool instantly calculates:

  • CPI Value — the core efficiency ratio of earned value vs. actual cost
  • Budget Status — whether you’re under budget, on budget, or over budget
  • Performance Interpretation — a plain-language label (e.g., Efficient, Critical, On Track)
  • Variance Direction — how far your spending deviates from the planned baseline
  • Forecast Insight — a signal for whether your current trend is sustainable

How the Calculator Works (The Formula & Logic)

The cost performance index calculation uses a single, elegant formula from Earned Value Management (EVM):

CPI = Earned Value (EV) ÷ Actual Cost (AC)

Here’s what each term means in plain language:

  • Earned Value (EV): The budgeted value of the work you’ve actually completed so far
  • Actual Cost (AC): The real money you’ve actually spent to complete that work

So if you planned to complete $10,000 worth of work and spent $12,000 doing it, your CPI = 10,000 ÷ 12,000 = 0.83 — meaning you’re only getting 83 cents of value for every dollar spent.

The rule is simple:

  • CPI > 1.0 → Under budget (you’re efficient)
  • CPI = 1.0 → Exactly on budget
  • CPI < 1.0 → Over budget (you’re spending more than planned)

Standard CPI Ratings & Classifications

CPI RangePerformance StatusWhat It Means
CPI > 1.20🟢 Highly EfficientSignificantly under budget — verify scope isn’t missed
CPI 1.01–1.20🟢 EfficientPerforming better than planned
CPI = 1.00🟡 On TrackBudget and work are perfectly aligned
CPI 0.80–0.99🟠 CautionSlightly over budget — monitor closely
CPI 0.60–0.79🔴 At RiskNoticeably over budget — corrective action needed
CPI < 0.60🔴 CriticalSevere cost overrun — escalate immediately

Step-by-Step Practical Example

Here’s a real-world cost performance index calculation example you can follow manually:

Scenario: You’re managing a software development project. By the end of Month 2, here’s what you know:

Step 1 — Find your Earned Value (EV)
Your project plan said Month 2 work was budgeted at $8,000. Your team completed 100% of that planned work. So: EV = $8,000

Step 2 — Find your Actual Cost (AC)
Your finance team confirms you actually spent $10,000 in Month 2 to complete that work. So: AC = $10,000

Step 3 — Calculate CPI

CPI = EV ÷ AC = 8,000 ÷ 10,000 = 0.80

Result: Your CPI is 0.80, meaning you’re spending $1.00 to get only $0.80 of value. You’re over budget and need to investigate cost drivers before Month 3.


How to Use Zo Calculator’s Cost Performance Index Tool

Using the CPI tool on ZoCalculator.com takes under 60 seconds:

  1. Enter your Earned Value (EV) — Input the budgeted cost of all work completed to date (in any currency)
  2. Enter your Actual Cost (AC) — Input the total real money spent on the project so far
  3. Click “Calculate” — The tool runs the CPI formula instantly
  4. Read your CPI score — A value above, at, or below 1.0 tells you your budget efficiency at a glance
  5. Check the performance label — The result section shows you a plain-English status like “On Track,” “Caution,” or “Critical”
  6. Use the result to act — If CPI is below 0.85, it’s time to review your cost structure or re-baseline your schedule

Practical Applications and Real-World Uses

Knowing how to calculate cost performance index in project management has direct value across many fields:

  • Construction Project Management: Track material and labor cost efficiency on a weekly basis to prevent budget blowouts before they become unrecoverable
  • IT & Software Development: Monitor sprint-by-sprint spending efficiency using Agile EVM metrics for better stakeholder reporting
  • Government & Defense Contracts: CPI is a mandatory reporting metric on many public sector and federal contracts where earned value management is legally required
  • Finance & Business Analysis: Use CPI trends over multiple reporting periods to forecast final project cost at completion (EAC)
  • Academic & Certification Prep: Essential for PMP, CAPM, and PMI-ACP exam candidates who must understand EVM deeply
  • Client-Facing Project Reporting: Present a single, easy-to-explain number that communicates budget health to non-technical stakeholders instantly

Important Notes & Technical Limitations

Before relying solely on this tool for major financial decisions, keep these in mind:

  1. EV must be correctly defined: This calculator assumes you’ve accurately calculated your Earned Value using your approved performance measurement baseline. Garbage in, garbage out — if your EV is wrong, the CPI will be misleading.
  2. CPI is a point-in-time metric: A single CPI reading reflects efficiency so far, not a guaranteed final outcome. Always track CPI across multiple reporting periods for trend analysis.
  3. No scope change adjustments: This tool does not account for approved scope changes (change orders) or re-baselined project plans. Always recalculate EV after scope changes are approved.
  4. For planning and reference use: Results from this calculator are intended as a decision-support and educational reference. Final project reporting should always be reviewed by a qualified project management or finance professional.

Helpful References & Sources

  • Project Management Institute (PMI)pmi.org (publisher of the PMBOK Guide, the global standard for Earned Value Management and CPI methodology)
  • Wikipedia — Earned Value Managementen.wikipedia.org/wiki/Earned_value_management (a comprehensive overview of EVM concepts including CPI, SPI, and forecasting formulas)
  • Department of Defense EVM Guidelinesacq.osd.mil (U.S. federal source for mandatory EVM reporting standards used in government contracts)

🙋 Frequently Asked Questions (FAQs)

What is the Cost Performance Index (CPI) in project management?

The Cost Performance Index (CPI) is a key metric in Earned Value Management (EVM) that measures how efficiently a project is using its budget. A CPI of 1.0 means you’re spending exactly as planned, above 1.0 means you’re under budget, and below 1.0 means you’re over budget. It is one of the most widely used indicators in how to calculate cost performance index in project management courses and certifications like PMP.

How do you calculate cost performance index?

To calculate cost performance index, divide the Earned Value (EV) by the Actual Cost (AC): CPI = EV ÷ AC. Earned Value is the budgeted cost of work completed, and Actual Cost is what you actually spent. You can do this manually or use the free cost performance index calculator on ZoCalculator.com for instant results.

What is a good CPI value for a project?

A CPI of 1.0 is considered perfectly on budget. Most project managers aim for a CPI between 0.95 and 1.10 as an acceptable range. A CPI consistently above 1.0 is ideal, while anything below 0.80 is typically a red flag that requires immediate corrective action and escalation to stakeholders.

Can CPI change throughout a project’s life?

Yes, CPI can — and usually does — change across reporting periods as new work is completed and actual costs are tracked. In practice, CPI tends to stabilize after the first 20% of a project is complete, which is why many forecasting formulas (like EAC) use the CPI as a reliable predictor of final project cost.

What is the difference between CPI and SPI?

CPI (Cost Performance Index) measures budget efficiency — how much value you’re getting per dollar spent. SPI (Schedule Performance Index) measures schedule efficiency — how much progress you’re making per unit of planned time. Both are part of Earned Value Management, and together they give project managers a complete picture of project health. You can calculate both using tools available on Zo Calculator.

What happens if CPI is less than 1?

A CPI below 1.0 means your project is spending more money than the value of work it’s completing — in other words, you’re over budget. For example, a CPI of 0.75 means you’re spending $1.00 to get only $0.75 worth of completed work. This signals a need to review resource costs, productivity rates, or original budget assumptions.

Is CPI used only in construction and IT projects?

No — while construction and IT project management are common domains where CPI is applied, the metric is used across healthcare, defense, aerospace, government, marketing, and any industry that tracks project budgets formally. It’s particularly prominent in industries where Earned Value Management is mandated by contract or regulation.

How is CPI used to forecast final project cost?

CPI is used in the Estimate at Completion (EAC) formula: EAC = Budget at Completion (BAC) ÷ CPI. If your total project budget is $100,000 and your current CPI is 0.80, your forecasted final cost would be $125,000 — $25,000 over budget. This makes the cost performance index calculation one of the most powerful forecasting tools available to project managers.

What’s the difference between CPI and ROI?

CPI measures how efficiently a project is spending its approved budget relative to the work completed — it’s an internal project control metric. ROI (Return on Investment) measures the financial return on a completed investment relative to its total cost. CPI is used during a project to monitor execution; ROI is typically evaluated after a project or investment is complete.

Where can I practice cost performance index calculation examples?

You can practice directly on ZoCalculator.com, which provides a free, instant CPI tool where you can test different EV and AC combinations to see results immediately. For guided learning, the PMI’s PMBOK Guide and practice PMP exam question banks both include numerous cost performance index calculation examples with step-by-step solutions.


Explore Related Calculators on Zo Calculator