IT Project Cost Categories
Understanding where money goes in IT projects is the first step to effective budgeting. Unlike construction where materials are a major cost, IT projects are predominantly labor-driven — 60-80% of the budget goes to people.
| Category | Typical % | Examples | Control Strategy |
|---|---|---|---|
| Labor (Internal) | 50-70% | Developer salaries, PM, QA, design | Capacity planning, right-sizing team |
| Labor (External) | 10-20% | Contractors, consultants, agencies | Fixed-price contracts, clear SOW |
| Infrastructure | 5-15% | Cloud (AWS/GCP/Azure), CI/CD, monitoring | Reserved instances, auto-scaling policies |
| Software & Licensing | 5-10% | SaaS tools, IDE licenses, APIs | Negotiate annual contracts, audit usage |
| Contingency | 10-15% | Unknown risks, scope changes | Release only when needed with approval |
Earned Value Management (EVM)
Earned Value Management is the gold standard for tracking project performance against the plan. It integrates scope, schedule, and cost into a single set of metrics that answer three questions: What did we plan to do? What did we actually do? What did it cost?
EVM Core Metrics
- Planned Value (PV): The budgeted cost of work that SHOULD have been done by now
- Earned Value (EV): The budgeted cost of work that HAS been completed
- Actual Cost (AC): The actual cost incurred for work completed
- Budget at Completion (BAC): The total project budget
// Earned Value Management Calculator
interface EVMData {
budgetAtCompletion: number; // BAC - total budget
plannedValue: number; // PV - what should be done by now
earnedValue: number; // EV - what has been done
actualCost: number; // AC - what it actually cost
}
interface EVMMetrics {
// Variances
scheduleVariance: number; // SV = EV - PV (negative = behind schedule)
costVariance: number; // CV = EV - AC (negative = over budget)
// Performance Indices
schedulePerformanceIndex: number; // SPI = EV / PV (< 1 = behind schedule)
costPerformanceIndex: number; // CPI = EV / AC (< 1 = over budget)
// Forecasts
estimateAtCompletion: number; // EAC = BAC / CPI
estimateToComplete: number; // ETC = EAC - AC
varianceAtCompletion: number; // VAC = BAC - EAC
// Percent Complete
percentComplete: number; // EV / BAC
percentSpent: number; // AC / BAC
// Health indicators
scheduleHealth: 'ahead' | 'on-track' | 'behind' | 'critical';
costHealth: 'under-budget' | 'on-budget' | 'over-budget' | 'critical';
}
function calculateEVM(data: EVMData): EVMMetrics {
const { budgetAtCompletion: BAC, plannedValue: PV, earnedValue: EV, actualCost: AC } = data;
const SV = EV - PV;
const CV = EV - AC;
const SPI = PV > 0 ? EV / PV : 0;
const CPI = AC > 0 ? EV / AC : 0;
const EAC = CPI > 0 ? BAC / CPI : BAC;
const ETC = EAC - AC;
const VAC = BAC - EAC;
return {
scheduleVariance: Math.round(SV),
costVariance: Math.round(CV),
schedulePerformanceIndex: Math.round(SPI * 100) / 100,
costPerformanceIndex: Math.round(CPI * 100) / 100,
estimateAtCompletion: Math.round(EAC),
estimateToComplete: Math.round(ETC),
varianceAtCompletion: Math.round(VAC),
percentComplete: Math.round((EV / BAC) * 100),
percentSpent: Math.round((AC / BAC) * 100),
scheduleHealth: SPI >= 1.05 ? 'ahead' : SPI >= 0.95 ? 'on-track' : SPI >= 0.8 ? 'behind' : 'critical',
costHealth: CPI >= 1.05 ? 'under-budget' : CPI >= 0.95 ? 'on-budget' : CPI >= 0.8 ? 'over-budget' : 'critical'
};
}
// Example: Project at month 4 of 8
const monthFourEVM = calculateEVM({
budgetAtCompletion: 800000, // $800K total budget
plannedValue: 400000, // Should have completed $400K of work
earnedValue: 350000, // Actually completed $350K of work
actualCost: 420000, // Spent $420K doing it
});
// Result:
// SV = -50,000 (behind schedule by $50K worth of work)
// CV = -70,000 (over budget by $70K)
// SPI = 0.875 (87.5% schedule efficiency)
// CPI = 0.833 (83.3% cost efficiency)
// EAC = 960,000 (project will cost $960K at this rate)
// VAC = -160,000 (will be $160K over budget)
// Burn Rate Calculator
interface BurnRate {
monthlyBurn: number;
weeklyBurn: number;
runwayMonths: number;
projectedEndDate: Date;
budgetSufficient: boolean;
}
function calculateBurnRate(
totalBudget: number,
spent: number,
monthsElapsed: number,
remainingWork: number // percentage
): BurnRate {
const monthlyBurn = spent / monthsElapsed;
const weeklyBurn = monthlyBurn / 4.33;
const remaining = totalBudget - spent;
const runwayMonths = remaining / monthlyBurn;
const monthsNeeded = (remainingWork / 100) * (monthsElapsed / (1 - remainingWork / 100));
const projectedEndDate = new Date();
projectedEndDate.setMonth(projectedEndDate.getMonth() + Math.ceil(monthsNeeded));
return {
monthlyBurn,
weeklyBurn: Math.round(weeklyBurn),
runwayMonths: Math.round(runwayMonths * 10) / 10,
projectedEndDate,
budgetSufficient: runwayMonths >= monthsNeeded
};
}
EVM Interpretation Guide
| Metric | Good | Warning | Critical |
|---|---|---|---|
| SPI | >= 1.0 (on/ahead of schedule) | 0.8 - 0.99 (behind) | < 0.8 (significantly behind) |
| CPI | >= 1.0 (on/under budget) | 0.8 - 0.99 (over budget) | < 0.8 (significantly over budget) |
| SV | >= 0 (on/ahead) | Negative (behind) | < -15% of PV |
| CV | >= 0 (on/under budget) | Negative (over budget) | < -15% of EV |
Budget Management Tips
- Track Weekly: Monthly tracking is too infrequent for IT projects. By the time you catch an overrun, it is too late.
- Separate Contingency: Keep contingency as a separate line item. Do not let the team treat it as available budget.
- Watch CPI Trends: A CPI that has been below 1.0 for 3+ months rarely recovers. Act early.
- Include All Costs: Do not forget infrastructure, licensing, training, and opportunity costs.