Calculate your monthly cash flow, NOI, and Cash-on-Cash Return.
Monthly Mortgage (P&I):$0.00
Total Monthly Expenses:$0.00
Net Operating Income (NOI) / Mo:$0.00
Monthly Cash Flow:$0.00
Cash-on-Cash Return:0.00%
Cap Rate:0.00%
Analyzing Your Rental Property Investment
Success in real estate investing ultimately comes down to the numbers. While location and property condition are vital, a property is only a good investment if it generates positive cash flow or strong appreciation potential. This Rental Property Cash Flow Calculator helps investors analyze deals quickly by accounting for all major expense categories.
Understanding the Metrics
When analyzing a potential rental property, you should focus on four key indicators provided by this calculator:
Monthly Cash Flow: This is your "take-home" profit after all expenses and mortgage payments are made. Positive cash flow is essential for long-term sustainability. It is calculated as Income – Operating Expenses – Debt Service.
Net Operating Income (NOI): This represents the profitability of the property before financing costs. It is crucial for calculating the Cap Rate and is calculated as Gross Income – Operating Expenses (excluding mortgage payments).
Cash-on-Cash Return (CoC): This measures the return on the actual cash you invested (down payment + estimated closing costs). A CoC return of 8-12% is often considered a strong target for residential rentals.
Cap Rate (Capitalization Rate): This metric helps you compare the profitability of different properties regardless of how they are financed. It is calculated as Annual NOI / Purchase Price.
How to Estimate Expenses accurately
One of the most common mistakes new investors make is underestimating expenses. Ensure you account for:
Vacancy: Even in hot markets, tenants move out. A standard conservative estimate is 5-8% (about 2-3 weeks of vacancy per year).
Maintenance: Using a percentage of rent (typically 5-15%) helps set aside money for future repairs, such as water heater replacements or roof patches.
Management Fees: Even if you plan to self-manage, include this cost (usually 8-10%) to see if the deal still works if you decide to hire a professional later.
function calculateCashFlow() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('rpcPurchasePrice').value);
var downPct = parseFloat(document.getElementById('rpcDownPayment').value);
var interest = parseFloat(document.getElementById('rpcInterestRate').value);
var years = parseFloat(document.getElementById('rpcLoanTerm').value);
var rent = parseFloat(document.getElementById('rpcMonthlyRent').value);
var vacancyPct = parseFloat(document.getElementById('rpcVacancy').value);
var taxAnnual = parseFloat(document.getElementById('rpcPropertyTax').value);
var insAnnual = parseFloat(document.getElementById('rpcInsurance').value);
var maintPct = parseFloat(document.getElementById('rpcMaintenance').value);
var mgmtPct = parseFloat(document.getElementById('rpcManagement').value);
// Validation
if (isNaN(price) || isNaN(rent) || isNaN(years) || price 0) {
cocReturn = (cashFlowAnnual / cashInvested) * 100;
}
// 5. Update UI
document.getElementById('resMortgage').innerHTML = '$' + monthlyMortgage.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
var totalMonthlyOutflow = totalOperatingExpenses + monthlyMortgage;
document.getElementById('resExpenses').innerHTML = '$' + totalMonthlyOutflow.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resNOI').innerHTML = '$' + noiMonthly.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
var cfElement = document.getElementById('resCashFlow');
cfElement.innerHTML = '$' + cashFlowMonthly.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
// Color coding for cash flow
if (cashFlowMonthly >= 0) {
cfElement.style.color = '#27ae60';
} else {
cfElement.style.color = '#c0392b';
}
document.getElementById('resCoC').innerHTML = cocReturn.toFixed(2) + '%';
document.getElementById('resCapRate').innerHTML = capRate.toFixed(2) + '%';
// Show results area
document.getElementById('rpcResults').style.display = 'block';
}