Nominal Rate of Interest Calculator with Inflation
by
Rental Property ROI Calculator
Calculate Cash-on-Cash Return, Cap Rate, and Monthly Cash Flow
Acquisition & Setup
Monthly Income & Expenses
Investment Summary
Total Investment
$0.00
Monthly Cash Flow
$0.00
Annual Net Operating Income:$0.00
Cap Rate:0.00%
Cash-on-Cash Return:0.00%
Pro Tip: A "good" ROI depends on your market, but many investors aim for a Cap Rate between 4% and 10% for residential properties.
How to Calculate Rental Property ROI
Investing in real estate is one of the most proven paths to wealth, but buying the wrong property can lead to financial strain. This calculator helps you determine the profitability of a potential rental property by analyzing key financial metrics.
Key Metrics Explained
Net Operating Income (NOI): This is your total annual rental income minus all operating expenses (taxes, insurance, maintenance). It does not include mortgage payments.
Cap Rate (Capitalization Rate): Calculated as (Annual NOI / Purchase Price). It helps you compare different real estate investments regardless of how they are financed.
Cash-on-Cash (CoC) Return: Calculated as (Annual Cash Flow / Total Cash Invested). This is arguably the most important metric because it shows the actual return on the money you physically took out of your bank account.
Example Calculation
Imagine you buy a house for $200,000. You spend $5,000 on closing and $15,000 on a new kitchen (Total Investment: $220,000). You rent it for $2,000 a month.
After paying $400/month for taxes, insurance, and repairs, your monthly cash flow is $1,600. Your annual cash flow is $19,200. Your Cash-on-Cash return would be 8.7% ($19,200 / $220,000).
Don't Forget Hidden Costs
Many new investors fail because they forget to account for vacancy and property management. Even if your tenant is perfect, you should set aside 5-10% of rent for the months the property sits empty between leases. If you don't plan to manage the property yourself, expect to pay a manager 8-12% of the monthly rent.
function calculateRentalROI() {
// Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var closing = parseFloat(document.getElementById('closingCosts').value) || 0;
var rehab = parseFloat(document.getElementById('repairBudget').value) || 0;
var rent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var tax = parseFloat(document.getElementById('monthlyTaxes').value) || 0;
var insurance = parseFloat(document.getElementById('monthlyInsurance').value) || 0;
var maintPerc = parseFloat(document.getElementById('maintPerc').value) || 0;
// Calculations
var totalInvestment = price + closing + rehab;
// Monthly Operating Expenses
var maintenanceReserve = rent * (maintPerc / 100);
var totalMonthlyExpenses = tax + insurance + maintenanceReserve;
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// Cap Rate (Based on Purchase Price)
var capRate = 0;
if (price > 0) {
capRate = (annualCashFlow / price) * 100;
}
// Cash on Cash Return (Based on Total Cash Out)
var cocReturn = 0;
if (totalInvestment > 0) {
cocReturn = (annualCashFlow / totalInvestment) * 100;
}
// Update UI
document.getElementById('resTotalInvest').innerText = '$' + totalInvestment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resCashFlow').innerText = '$' + monthlyCashFlow.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resAnnualNOI').innerText = '$' + annualCashFlow.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + '%';
document.getElementById('resCoC').innerText = cocReturn.toFixed(2) + '%';
// Change color if negative
if (monthlyCashFlow < 0) {
document.getElementById('resCashFlow').style.color = '#e74c3c';
} else {
document.getElementById('resCashFlow').style.color = '#27ae60';
}
}
// Run calculation once on load
window.onload = function() {
calculateRentalROI();
};