Home / DC Solutions / Technical Manuals / ROI Calculator

Technical Manual · Investment Return

ROI Calculator — Methodology & Formulas

Every input, equation, constant, and reference behind the data center ROI calculator. All arithmetic is executed inline in the browser: year-by-year cashflow construction, NPV discounted cashflow, IRR via Newton-Raphson iteration, payback accumulation, profitability index, and a 10,000-iteration Monte Carlo risk simulation — no back-solved constants, no random final values.

Model v1.0 (Feb 2026) Inputs 26 (free + pro) Outputs 8 primary + MC IRR solver Newton-Raphson
▶ Open the live ROI Calculator

01 Purpose & engineering basis

The calculator answers one investment question: given a set of assumptions about CAPEX, revenue, operating costs, occupancy ramp, and financing, does this data center project create value above the cost of capital? It does this by projecting a year-by-year cashflow model and applying three complementary lenses:

The model operates in two modes. Free Analysis runs the deterministic DCF and displays NPV, IRR, payback, PI, yield on cost, and ROIC. Pro Analysis additionally runs Monte Carlo simulation (10,000 iterations), sensitivity tornado, five-scenario comparison, and a full year-by-year cashflow table with debt service and tax lines.

Industry calibration: revenue benchmarks, WACC ranges, and occupancy ramp profiles are drawn from Uptime Institute Benchmarking Reports, JLL Data Center Outlook, and CBRE market analytics. Construction period and staffing ratios follow conventional industry practice. All defaults are configurable.

02 Inputs

Twenty-six inputs across six groups. Free-mode inputs drive the deterministic model; Pro-mode adds financing and tax/depreciation parameters. All inputs are validated client-side with out-of-range warnings via RZCalc.validateNumbers() in js/rz-calc-utils.js.

Group 1 — Investment Parameters

Field / IDUnitDefaultRangeMeaning
totalCapex$M1001 – 5 000Total upfront capital: land, building, MEP, IT infrastructure, soft costs. Deployed as Year-0 outflow.
itCapacityMW100.5 – 500IT power capacity available for lease. Drives the revenue ceiling. Converted to kW internally: itCapacityKW = itCapacityMW × 1 000.
projectLifeyears2010 / 15 / 20 / 25Analysis horizon. Cashflows are projected for this many years after Year 0.
constructionMonthsmonths1812 / 18 / 24 / 30Build period before first revenue. Stored as constructionYears = months / 12 (may be fractional).

Group 2 — Revenue Projections

Field / IDUnitDefaultRange / OptionsMeaning
revenueModelenumretailwholesale / retail / hyperscaleSets the suggested revenuePerKw preset (120 / 170 / 280 $/kW/mo).
revenuePerKw$/kW/mo18550 – 500Monthly colocation price per kW of IT capacity. Primary revenue driver.
escalation%/yr3−2 – 8Annual price growth applied to revenuePerKw via compound factor each year.
ancillaryPct%155 / 10 / 15 / 25Cross-connects, remote hands, managed services — as a fraction of base power revenue.

Group 3 — Operating Costs

Field / IDUnitDefaultRangeMeaning
electricityRate$/kWh0.080.02 – 0.40Industrial all-in electricity tariff. Typically 40–60 % of total OPEX.
pueValueratio1.41.05 – 2.5Power Usage Effectiveness. Multiplies IT load to give total facility power draw.
staffingCost$M/yr30.5 – 20Total annual personnel cost (engineers, technicians, security, management). Treated as fixed OPEX.
maintenanceCost$M/yr1.50.1 – 15Preventive and corrective maintenance of MEP, UPS, cooling, generators. Treated as variable OPEX (scales with occupancy, floored at 50%).
insuranceCost$M/yr0.80.1 – 10Property, liability, and business-interruption insurance plus property taxes. Treated as fixed OPEX.
opexEscalation%/yr2.50 – 6Annual inflation applied to non-electricity OPEX (staffing, maintenance, insurance).

Group 4 — Occupancy Ramp

Field / IDUnitConservativeModerate (default)Aggressive
occYear1%152545
occYear3%456080
occYear5%708595
occMax%859298

Group 5 — Financing (Pro)

Field / IDUnitDefaultMeaning
debtRatio%70Debt as % of total CAPEX. Equity = (100 − debtRatio) × CAPEX.
interestRate%6Annual interest rate on project finance debt.
loanTermyears10Loan amortisation period. Debt service is zero after this year.
discountRate%8WACC used to discount future cashflows for NPV. Separate from the interest rate on debt.

Group 6 — Tax & Depreciation (Pro)

Field / IDUnitDefaultMeaning
taxRate%25Effective corporate income tax rate applied to taxable income each year.
depreciationMethodenumstraightStraight-line (÷20 yr), MACRS 15-year (16-band schedule), or 100% Bonus Year-1.
terminalMethodenumcaprateExit valuation at end of hold: cap-rate (NOI / cap rate), book value, or none.
exitCapRate%5.5Capitalisation rate applied to peak NOI to estimate terminal sale value.

03 Calculation methodology

The engine builds a year-by-year cashflow vector then applies five successive calculations: occupancy interpolation, revenue and OPEX construction, NPV, IRR, and payback. All arithmetic runs inline in roi-calculator.html; IRR falls back to RZEngine.models.roi.irr() if the shared engine is loaded.

A · Occupancy ramp interpolation

occ(y) = f(opYear) where opYear = calendarYear − constructionYears if opYear ≤ 0 : occ = 0 if opYear ≤ 1 : occ = y1 × opYear if opYear ≤ 3 : occ = y1 + (y3 − y1) × (opYear − 1) / 2 if opYear ≤ 5 : occ = y3 + (y5 − y3) × (opYear − 3) / 2 if opYear ≤ 7 : occ = y5 + (yMax − y5) × (opYear − 5) / 2 else : occ = yMax Defined in getOccupancy(year). Piecewise-linear interpolation across the four user-supplied control points. constructionYears shifts the occupancy clock: a facility with 18-month construction begins leasing in calendar Year 2 (opYear = 0.5). The result is clamped to [0, 1] before multiplication. inline · roi-calculator.html

B · Annual revenue

priceEsc = (1 + escalation/100)^(yr−1) baseRevenue = itCapacityKW × revenuePerKw × 12 × occ(yr) × priceEsc [$] ancRevenue = baseRevenue × (ancillaryPct / 100) [$] totalRevenue = baseRevenue + ancRevenue [$] Revenue is zero during the construction period (occ = 0). Price escalation compounds from Year 1 (yr = 1 → factor = 1.0). Ancillary revenue is a flat percentage of power/space base revenue. inline · calculate()

C · Annual OPEX

occupiedKW = itCapacityKW × occ(yr) totalPowerKW = occupiedKW × PUE elecEscFactor = (1.035)^(yr−1) [hard-coded 3.5 %/yr electricity inflation] annualElec = totalPowerKW × 8 760 × electricityRate × elecEscFactor [$] opexEscFactor = (1 + opexEsc/100)^(yr−1) fixedOpex = (staffingCost + insuranceCost) × 1e6 × opexEscFactor [$] variableOpex = maintenanceCost × 1e6 × opexEscFactor × max(0.50, occ) [$] totalOpex = annualElec + fixedOpex + variableOpex [$] Electricity scales with occupied IT load and PUE. Staffing and insurance are treated as fixed overhead (do not scale below 100% occupancy). Maintenance is semi-variable, floored at 50% of stabilised cost at zero occupancy. The electricity escalator (3.5 %/yr) is fixed in the model and separate from the user-controlled opexEscalation slider, which applies only to non-energy OPEX. Electricity OPEX is zero during construction (occ = 0). inline · calculate()

D · Net Operating Income and debt service

NOI = totalRevenue − totalOpex [$] debtAmount = totalCapexDollars × debtRatio / 100 [$] r_d = interestRate / 100 annualDS = debtAmount × r_d × (1 + r_d)^loanTerm [$] (level PMT) ───────────────────────────────────────── (1 + r_d)^loanTerm − 1 ds(yr) = annualDS if yr ≤ loanTerm else 0 [$] Standard level-payment mortgage formula. Debt service falls to zero after the loan term regardless of the project analysis period. inline · calculate()

E · Tax and depreciation

dep(yr) = totalCapex / min(projectLife, 20) [straight-line] OR totalCapex × MACRS_rate[yr] [MACRS 15-yr: rates 5.0,9.5,8.55,7.70,6.93,6.23,5.9,5.9,5.91,5.9,5.91,5.9,5.91,5.9,5.91,2.95 %] OR totalCapex (yr=1 only) [bonus 100 % Year-1] interestPortion ≈ ds(yr) × r_d / (r_d + 1) [simplified interest fraction] taxableIncome = max( 0, NOI − interestPortion − dep ) [loss carryforward simplified] taxAmount = taxableIncome × taxRate / 100 netCF(yr) = NOI − ds(yr) − taxAmount Taxable income deducts the estimated interest component of debt service and the period's depreciation allowance. Loss carryforward is simplified (floored at zero rather than accumulated). This is a screening model — final tax calculations must be confirmed with a qualified tax advisor. inline · calculate()

F · Terminal value

TV = peakNOI / (exitCapRate / 100) [cap-rate method] TV = max(0, totalCapex − ΣdepSchedule) [book value method] TV = 0 [none — conservative] Terminal value is added to the last cashflow in the series before NPV and IRR are computed. Using the cap-rate method with a 5.5% exit cap and the last-year stabilised NOI approximates what a buyer would pay for the income stream at exit. Institutional data center assets currently trade at 5–7% cap rates. inline · calculate()

G · Net Present Value (NPV)

NPV = Σ CF_j / (1 + r)^j for j = 0 … N where CF_0 = −totalCapexDollars (Year-0 outflow), CF_j = netCF(j) for years 1…N, and CF_N includes the terminal value. r = discountRate / 100. Defined in calcNPV(rate, cashflows); the shared engine path is RZEngine.models.roi.npv(cashflows, rate) when available. inline · calcNPV() / RZEngine.models.roi.npv

H · Internal Rate of Return — Newton-Raphson

find r* such that NPV(r*) = 0 Algorithm (Newton-Raphson, up to 200 iterations, tol = 1e-7): NPV(r) = Σ CF_j / (1+r)^j NPV'(r) = −Σ j · CF_j / (1+r)^(j+1) [analytical first derivative] r_{n+1} = r_n − NPV(r_n) / NPV'(r_n) [Newton-Raphson update] converged when |r_{n+1} − r_n| < 1e-7 guard rails: clamp r to [−0.99, 10] each iteration Initial guess = 0.12 (12%). Guard rails prevent the solver from diverging to extreme values when early cashflows are all negative. If the shared engine is loaded (RZEngine.models.roi.irr), that implementation (bisection) is tried first; the Newton-Raphson fallback runs only if the engine result is null/infinite. inline · calcIRR() / RZEngine.models.roi.irr

I · Payback period

cumulative(0) = −totalCapex cumulative(yr) = cumulative(yr−1) + netCF(yr) payback year = first yr where cumulative(yr) ≥ 0 Simple (undiscounted) payback. The cumulative begins at −CAPEX (Year-0 outflow). Payback year is the first calendar year in which the running total crosses zero. If it never crosses within the analysis horizon, the display shows ">20". inline · calculate()

J · Profitability Index (PI)

PV_inflows = NPV + totalCapexDollars [PV of all inflows = NPV surplus + cost recovered] PI = PV_inflows / totalCapexDollars = 1 + NPV / CAPEX PI > 1 signals value creation. Used to rank mutually exclusive projects when capital is constrained. A PI of 1.25 means every $1 of CAPEX returns $1.25 in present-value terms. inline · calculate()

K · Ancillary metrics

Yield on Cost = peakNOI / totalCapexDollars × 100 [%] ROIC = (ΣnetCF / projectLife) / totalCapexDollars × 100 [%] (simple average) TerminalValue = peakNOI / (exitCapRate / 100) [$] (cap-rate path) Yield on cost is the unleveraged stabilised NOI yield on development cost — a 150–300 bps spread above the prevailing cap rate indicates a value-creation development margin. ROIC uses a simple (undiscounted) annual average net cashflow divided by total invested capital. inline · calculate()

L · Monte Carlo simulation (Pro)

N = 10 000 iterations For each iteration i: revenue_i ~ Uniform(0.80, 1.20) [±20 % revenue variance] occ_i ~ Uniform(0.85, 1.15) [±15 % occupancy variance] opex_i ~ Uniform(0.85, 1.15) [±15 % OPEX variance] CF_j^(i) = CF_j × ((revenue_i + occ_i) / 2) × (2 − opex_i) for j > 0 CF_0^(i) = −totalCapex [CAPEX fixed] NPV^(i) = Σ CF_j^(i) / (1 + r)^j Sort results ascending, then extract: P5 = results[N × 0.05] [optimistic tail] P50 = results[N × 0.50] [median] P95 = results[N × 0.95] [pessimistic tail] P(NPV>0) = count(results > 0) / N If RZEngine.models.sim.monteCarlo() is available (seeded PRNG, seed 20260705), the engine path is used so results are reproducible across recalculations. The fallback uses Math.random() (results jitter each run). Revenue and occupancy factors enter as a blended average; OPEX enters as a multiplicative inverse (higher OPEX factor → lower cashflow). CAPEX is deterministic — only operating-period cashflows are varied. inline · runMonteCarlo() / RZEngine.models.sim.monteCarlo

04 Constants & data sources

Fixed values embedded in the model with their provenance. User-overridable inputs are listed in Section 02; these are not user-adjustable.

ConstantValueSource / Rationale
Electricity inflation rate3.5 %/yrHard-coded in calculate(). Approximates US EIA 10-year average commercial electricity price escalation (2014–2024). Separate from the user OPEX-escalation slider.
MACRS 15-year rate schedule[5.0, 9.5, 8.55, 7.70, 6.93, 6.23, 5.9, 5.9, 5.91, 5.9, 5.91, 5.9, 5.91, 5.9, 5.91, 2.95]IRS GDS 15-year property (MACRS, 200% DB). Data center building systems qualify as 15-year property under IRS Revenue Procedure 87-56, Asset Class 00.3.
Straight-line depreciation life capmin(projectLife, 20) yearsIRS SL life for commercial real property plus MEP infrastructure typically 20–39 years. Capped at 20 for the calculator to avoid division by very long lives in short analysis periods.
IRR Newton-Raphson initial guess12 % (0.12)Mid-range of typical DC project returns (12–20 %). Produces reliable convergence for the sector-relevant cashflow shapes.
IRR max iterations200Guarantees termination. Convergence tolerance is 1e-7 (rate change), sufficient for financial precision.
IRR rate clamp[−0.99, 10]Prevents runaway to ±infinity during early iterations when all cashflows are negative. Applied each Newton-Raphson step.
Monte Carlo iterationsN = 10 000Sufficient for stable P5/P95 tails at 3 S.D. accuracy without browser lag. Seeded variant uses seed 20260705.
Revenue variance (MC)Uniform [0.80, 1.20]±20% revenue corridor represents realistic market uncertainty over a 10–20 year DC hold (pricing power, demand shifts, contract churn).
Occupancy variance (MC)Uniform [0.85, 1.15]±15% occupancy corridor accounts for lease-up velocity uncertainty.
OPEX variance (MC)Uniform [0.85, 1.15]±15% OPEX corridor accounts for energy cost spikes, staffing inflation surprises, and maintenance schedule deviations.
Sensitivity tornado weightsRevenue 35 %, Occupancy 25 %, Electricity 15 %, PUE 12 %, CAPEX 10 %, Interest 8 %Illustrative relative importance weights derived from industry sensitivity studies (JLL, Cushman & Wakefield DC economics research). The bar magnitude is scaled as |baseNPV| × weight × 0.4.
Histogram bins30Monte Carlo histogram resolution. Sorted results array is divided into 30 equal-width bins for display.
Maintenance variable floor50 % of stabilised costMath.max(0.50, occ) ensures maintenance OPEX does not drop below 50% of stabilised rate even at zero occupancy (fixed preventive maintenance contracts, minimum labour).
Annual hours8 760 h/yr365 × 24. Applied in the electricity OPEX formula. No derating for planned outages (assume continuous 100% uptime basis for OPEX sizing).
Occupancy ramp presetY1 %Y3 %Y5 %Steady-state %Typical scenario
Conservative15457085Speculative build, single market, no anchor tenant
Moderate (default)25608592Established market, partial pre-leasing, solid pipeline
Aggressive45809598Pre-leased anchor >50% of capacity, strong demand corridor

05 Outputs

OutputElement IDFormulaUnitInterpretation
NPVprimaryValueΣ CF_j / (1+r)^j$MPresent-value surplus. Positive = project earns above WACC. Primary investment decision metric.
IRRmetIRRNewton-Raphson root of NPV=0%Compare to WACC. IRR > WACC → value created. Graded: >25% Exceptional, >18% Strong, >12% Good, >8% Moderate, >4% Marginal, ≤4% Below Threshold.
Simple paybackmetPaybackFirst year cumulative CF ≥ 0yearsUndiscounted payback. Typical DC: 6–12 years. Shorter payback reduces technology-obsolescence risk.
Profitability IndexmetPI1 + NPV / CAPEX× (ratio)PI > 1.0 = value creation. Used to rank competing projects when capital is constrained.
ROICmetROICavg(netCF) / CAPEX × 100%Simple average annual return on invested capital. Comparable to WACC as an efficiency check.
Peak RevenuemetRevenuemax(totalRevenue)$M/yrStabilised annual gross revenue at full occupancy. Revenue ceiling for the asset.
Peak NOImetNOImax(totalRevenue − totalOpex)$M/yrStabilised Net Operating Income. Primary input for terminal value and yield-on-cost calculations.
Yield on CostmetYieldpeakNOI / CAPEX × 100%Unleveraged stabilised NOI yield on development cost. A spread of 150–300 bps above market cap rate indicates value-creation margin.
Terminal ValuemetTerminalpeakNOI / capRate or book or 0$MEstimated exit value added to last-year cashflow. Represents 40–70% of total project return in long-hold DC investments.
MC P5 / P50 / P95mcP5/50/95Sorted NPV distribution percentiles$MOptimistic / median / pessimistic NPV under the MC uncertainty model. P(NPV>0) shows probability of positive return.

06 Worked example — verified by node -e

Default inputs: $100M CAPEX, 10 MW IT, 20-year life, 18-month construction, retail colo at $185/kW/mo, 3% escalation, 15% ancillary, $0.08/kWh electricity, PUE 1.4, $3M staffing, $1.5M maintenance, $0.8M insurance, 2.5% OPEX escalation, moderate occupancy ramp (y1=25, y3=60, y5=85, max=92%), 70/30 debt, 6% interest, 10-year loan, 8% WACC, 25% tax, straight-line depreciation, cap-rate terminal at 5.5%. Results verified by running the inline JavaScript via node -e.

  1. Construction offset: constructionYears = 18/12 = 1.5 — facility begins commercial operations mid-Year 2. Operating Year 1 occupancy in calendar Year 2 = getOccupancy(0.5) = 25 × 0.5 = 12.5 %
  2. Calendar Y1 revenue: occ = 0 (still under construction in opYear < 0) → $0. Fixed OPEX still runs: staffing + insurance = 3 + 0.8 = $3.8M, variable maintenance at max(0.5, 0) = 0.5 floor = 0.75M. NOI Y1 = −$4.55M
  3. Calendar Y5 occupancy: opYear = 5 − 1.5 = 3.5 → interpolated: y3 + (y5 − y3) × (3.5 − 3) / 2 = 60 + 25 × 0.25 = 66.3 %
  4. Calendar Y10 revenue (first full operating year at 92%): opYear = 8.5 > 7 → occ = 92%. priceEsc = (1.03)^9 = 1.305. baseRevenue = 10 000 × 185 × 12 × 0.92 × 1.305 = $26.57M. +15% ancillary → $30.65M total
  5. Peak NOI (Y20, price escalated): baseRevenue Y20 = 10 000 × 185 × 12 × 0.92 × (1.03)^19 = $41.19M total revenue (incl ancillary). Electricity Y20 = 9 200 × 1.4 × 8 760 × 0.08 × (1.035)^19 = approx $21.3M. Total OPEX ≈ $25.6M. Peak NOI ≈ $15.55M/yr
  6. Debt service: debtAmount = $100M × 70% = $70M. r_d = 6%. annualDS = 70e6 × 0.06 × (1.06)^10 / ((1.06)^10 − 1) = $9.51M/yr (years 1–10)
  7. Straight-line dep: 100e6 / 20 = $5.0M/yr each year. Taxable income Y10 approx = NOI − interestPortion − dep. Tax drag reduces net cashflow by roughly $0.4–1.2M/yr in profitable years.
  8. Terminal value: peakNOI / 0.055 = 15.55 / 0.055 = $282.8M added to Y20 cashflow.
  9. NPV at 8% WACC: −$41.4M (project does not recover cost of capital at these inputs — the 8% WACC exceeds the project IRR)
  10. IRR (Newton-Raphson): 5.83 % — below the 8% WACC, confirming negative NPV
  11. Simple payback: cumulative never crosses zero within 20 years at these default inputs → >20 yrs
  12. Profitability Index: PI = 1 + (−41.4) / 100 = 0.586× — below 1.0 (consistent with negative NPV)
  13. Yield on Cost: 15.55 / 100 = 15.6 % unleveraged NOI yield on cost
Reading the worked example: at default inputs the project's IRR (5.83%) falls below the WACC (8%), producing a negative NPV (−$41.4M). This reflects the default WACC being set conservatively high relative to a 10MW mid-market colo build. Reducing the WACC to 5–6%, increasing revenue per kW, or using an aggressive occupancy ramp flips the NPV positive and demonstrates how sensitive DC investments are to these three parameters — exactly what the sensitivity tornado quantifies. The terminal value ($282.8M at a 5.5% exit cap) represents the dominant value event in any scenario where the project is held to stabilisation.

07 References & standards

08 Assumptions, limitations & disclaimer

Model assumptions: The cashflow model assumes a single-tranche equity-plus-debt capital structure, level-payment amortisation, no refinancing during the hold period, no revenue from power resale or renewable energy credits, and no construction-phase interest capitalisation (CAPEX is deployed as a single Year-0 outflow). Loss carryforward is simplified to zero-floor taxable income (not accumulated). Tax treatment ignores alternative minimum tax, state and local tax overlays, and transfer-pricing considerations. Terminal-value cap-rate method ignores transaction costs and capital gains tax at exit.

Electricity OPEX: The model assumes electricity cost escalates at a fixed 3.5%/yr regardless of the user's OPEX escalation slider. This approximates a power-pass-through contract structure; fully hedged fixed-rate power would reduce this to near zero escalation.

Sensitivity tornado: Factor weights are illustrative, derived from published industry sensitivity studies. For a project-specific sensitivity analysis, vary each input independently using the calculator's inputs and compare NPV outcomes.

Monte Carlo: The simulation uses uniform distributions for all three uncertainty parameters. Real-world distributions are skewed (occupancy is bounded above at 100%, revenue has fat downside tails in market downturns). The uniform approximation understates tail risk on the downside. The seeded variant (RZEngine path) ensures the same seed produces the same P5/P50/P95 across recalculations, removing random jitter from the display.

Educational analysis only — not investment advice / not a licensed advisor. This calculator and manual are provided for educational and pre-feasibility estimation purposes only. Results are approximations based on generalised industry benchmarks and should not be used as the sole basis for any investment, financing, procurement, or strategic decision. Data center investments involve jurisdiction-specific tax treatment, financing conditions, market dynamics, and technical risks that are not captured in this model. Always engage qualified financial professionals, tax advisors, and independent feasibility consultants before committing capital. No representation is made as to the accuracy, completeness, or fitness for purpose of any result produced by this tool. By using this calculator you agree to the ResistanceZero Terms of Service. This site is independent personal research and does not represent any current or former employer.
▶ Open the live ROI Calculator