Direct capitalization calculator (cap rate value)

Direct capitalization calculator: property value from NOI and a cap rate, or the cap rate a price implies, with reserves and lease-up deductions.

What it computes

Direct capitalization values an income property by dividing one year's net operating income (NOI) by a capitalization rate. The calculator works in both directions. Given a cap rate, it returns a stabilized value and an as-is value after reserves and below-the-line adjustments. Given a price, it returns the cap rate that price implies. With both, it also reports the difference between the as-is value and the price.

Method and conventions

  1. Capitalized income = noi − capex_reserve_annual. It must be positive.
  2. Below-the-line deductions = lease_up_costs + free_rent_burn_off − Σ other_adjustments.amount. Other adjustments are signed: a negative amount (deferred maintenance) reduces value and a positive amount (excess land) adds to it.
  3. Stabilized value = capitalized income ÷ cap_rate, rounded to the cent.
  4. As-is value = stabilized value − deductions. With round_value_to, it is also reported rounded to that increment, half away from zero (for example to the nearest 100,000). Value per square foot uses the unrounded as-is value.
  5. Implied cap rate = capitalized income ÷ price. Two variants are also returned: before reserves (noi ÷ price) and all-in (capitalized income ÷ (price + deductions)), which is the yield on the price once the below-the-line costs are paid.

A cap rate applies only to income on the same basis as the market evidence it came from. FactLot records the basis in noi_basis as trailing_12, forward_12 or stabilized. It does not check the basis against the cap rate, and it warns when the basis is missing. The usual sequence for a property that is not yet stabilized is to capitalize stabilized NOI and then deduct the cost of getting there. That is what lease_up_costs and free_rent_burn_off do. The output is labeled stabilized value whatever basis is chosen.

Sources differ on where capital reserves sit. Some cap rates are quoted on NOI before reserves and others after. FactLot deducts capex_reserve_annual before capitalizing and reports the implied cap rate both ways. When the reserve is zero, it warns that comparables quoted after reserves would need one. Practice also varies on below-the-line items. Some appraisers discount lease-up costs for the time they take or add an entrepreneurial incentive. FactLot deducts the amounts at face value, with no discounting and no profit allowance. Rounding of the final value, common in appraisal reports, is optional and reported separately, so the exact figure is still available.

Inputs that matter

  • noi: annual net operating income before capital reserves.
  • noi_basis: trailing_12, forward_12 or stabilized; recorded in the steps.
  • cap_rate: capitalization rate as a decimal; it gives the value.
  • price: purchase or asking price; it gives the implied cap rate.
  • capex_reserve_annual: annual replacement reserve deducted before capitalizing.
  • lease_up_costs: one-time tenant improvements, commissions and lost rent needed to reach stabilized NOI.
  • free_rent_burn_off: free rent still owed under signed leases that the stabilized NOI assumes is collected.
  • other_adjustments: up to 20 labeled, signed value adjustments.
  • area_sf and round_value_to: optional value and price per square foot, and a rounded as-is value.

Limits

  • It capitalizes a single year of income. There is no holding period, no income growth and no reversion; that is a discounted cash flow, not direct capitalization.
  • It does not build NOI from a rent roll or operating statement.
  • It does not derive or select a cap rate. Market surveys, band-of-investment and comparable-sale extraction happen outside the calculator.
  • Lease-up costs and free rent are deducted undiscounted. Transaction costs, taxes and financing are not considered.
  • At least one of cap_rate and price is required. A reserve at or above NOI is an error.
  • Deductions larger than the stabilized value give a non-positive as-is value, with a warning. Per-unit values (per apartment or per key) are not reported; only per square foot.

Worked example

Inputs from FactLot's shared test case "value with reserves and below-the-line adjustments, and the cap rate the price implies (hand check: 975,000 ÷ 6.5% = 15,000,000)", which the TypeScript and Python libraries must both reproduce:

{
  "noi": 1000000,
  "noi_basis": "forward_12",
  "cap_rate": 0.065,
  "price": 15000000,
  "capex_reserve_annual": 25000,
  "lease_up_costs": 300000,
  "free_rent_burn_off": 100000,
  "other_adjustments": [
    {
      "label": "excess land",
      "amount": 50000
    }
  ],
  "area_sf": 100000,
  "round_value_to": 100000
}

Result

Result values
ResultValue
noi1,000,000
capitalized_income975,000
cap_rate0.065
stabilized_value15,000,000
total_deductions350,000
as_is_value14,650,000
as_is_value_rounded14,700,000
value_per_sf146.5
price15,000,000
implied_cap_rate0.065
implied_cap_rate_before_reserves0.066667
implied_cap_rate_all_in0.063518
price_per_sf150

Audit trail

Every intermediate value, in order, with the formula that produced it. Formula calc.direct_cap@1.

Audit trail
StepValueFormula
NOI basisforward 12
Capitalized income975,000 USD/yr$1,000,000.00 NOI − $25,000.00 capital reserve
Below-the-line deductions$350,000.00$300,000.00 lease-up + $100,000.00 free-rent burn-off − $50,000.00 excess land
Stabilized value$15,000,000.00$975,000.00 ÷ 6.5%
As-is value$14,650,000.00$15,000,000.00 − $350,000.00 below-the-line
As-is value, rounded$14,700,000.00to the nearest $100,000.00
Implied cap rate0.065$975,000.00 capitalized income ÷ $15,000,000.00 price
Implied cap rate before reserves0.066667$1,000,000.00 NOI ÷ $15,000,000.00
Implied cap rate, all-in0.063518$975,000.00 ÷ ($15,000,000.00 price + $350,000.00 below-the-line)
Value versus price-$350,000.00$14,650,000.00 as-is value − $15,000,000.00 price

Use it from an agent or your code

  • MCP: tool calc_direct_cap on https://api.factlot.com/mcp (connect a client).
  • Python: factlot.run_tool("calc_direct_cap", input) runs the same calculation offline (Python SDK).
  • Input schema: every field is described in tools.json.
curl -s https://api.factlot.com/v1/calc/direct_cap \
  -H 'content-type: application/json' \
  -d '{"noi":1000000,"noi_basis":"forward_12","cap_rate":0.065,"price":15000000,"capex_reserve_annual":25000,"lease_up_costs":300000,"free_rent_burn_off":100000,"other_adjustments":[{"label":"excess land","amount":50000}],"area_sf":100000,"round_value_to":100000}'