Rental Property Cash on Cash Return Calculator
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.calculator-container {
background-color: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 8px;
padding: 30px;
margin-bottom: 40px;
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
}
.calc-header {
text-align: center;
margin-bottom: 25px;
color: #2c3e50;
}
.input-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
@media (max-width: 600px) {
.input-grid {
grid-template-columns: 1fr;
}
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: 600;
font-size: 0.9em;
color: #495057;
}
input[type="number"] {
width: 100%;
padding: 10px;
border: 1px solid #ced4da;
border-radius: 4px;
font-size: 16px;
box-sizing: border-box;
}
input[type="number"]:focus {
border-color: #4dabf7;
outline: none;
box-shadow: 0 0 0 3px rgba(77, 171, 247, 0.25);
}
.section-title {
grid-column: 1 / -1;
margin-top: 10px;
margin-bottom: 5px;
font-size: 1.1em;
font-weight: bold;
color: #2c3e50;
border-bottom: 2px solid #e9ecef;
padding-bottom: 5px;
}
button.calc-btn {
grid-column: 1 / -1;
background-color: #228be6;
color: white;
border: none;
padding: 15px;
font-size: 18px;
font-weight: bold;
border-radius: 5px;
cursor: pointer;
margin-top: 20px;
transition: background-color 0.2s;
width: 100%;
}
button.calc-btn:hover {
background-color: #1c7ed6;
}
#resultContainer {
margin-top: 30px;
padding: 20px;
background-color: #fff;
border-radius: 5px;
border-left: 5px solid #228be6;
display: none;
}
.result-row {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #f1f3f5;
}
.result-row:last-child {
border-bottom: none;
}
.result-label {
font-weight: 500;
}
.result-value {
font-weight: bold;
}
.highlight-result {
font-size: 1.2em;
color: #228be6;
}
.content-section {
background: #fff;
padding: 20px 0;
}
h2 {
color: #2c3e50;
margin-top: 30px;
}
h3 {
color: #495057;
}
p {
margin-bottom: 15px;
color: #555;
}
ul {
margin-bottom: 20px;
padding-left: 20px;
}
li {
margin-bottom: 8px;
}
Monthly Mortgage Payment (P&I):
$0.00
Total Monthly Expenses:
$0.00
Monthly Cash Flow:
$0.00
Annual Cash Flow (NOI – Debt):
$0.00
Total Cash Invested:
$0.00
Cash on Cash Return:
0.00%
Understanding the Rental Property Cash on Cash Return Calculator
For real estate investors, the Cash on Cash (CoC) Return is one of the most critical metrics to evaluate the performance of a rental property. Unlike strictly looking at equity growth or total ROI, CoC measures the annual cash flow generated by the property relative to the actual cash you invested upfront. This calculator helps you determine if a potential deal meets your investment criteria.
How is Cash on Cash Return Calculated?
The formula for calculating Cash on Cash return is straightforward, yet it requires several distinct inputs to be accurate. The basic formula is:
Cash on Cash Return = (Annual Pre-Tax Cash Flow / Total Cash Invested) × 100
1. Annual Cash Flow
This is your Net Operating Income (NOI) minus your debt service (mortgage payments). To find this, we take your Gross Annual Rent and subtract all operating expenses (taxes, insurance, maintenance reserves, vacancy reserves, HOA fees) and your annual mortgage payments.
2. Total Cash Invested
This isn't just the purchase price. It is the actual cash that left your bank account to acquire the asset. This typically includes:
- Down Payment: The percentage of the price paid upfront.
- Closing Costs: Title fees, loan origination fees, recording fees, etc.
- Rehab/Repairs: Initial cash spent to get the property rent-ready.
Example Calculation
Let's say you purchase a property for $250,000.
- You put 20% down: $50,000.
- You pay $5,000 in closing costs.
- Total Invested: $55,000.
After collecting rent and paying the mortgage, taxes, and repairs, you have $300 per month in positive cash flow.
- Annual Cash Flow = $300 × 12 = $3,600.
- CoC Return = ($3,600 / $55,000) × 100 = 6.54%.
What is a "Good" Cash on Cash Return?
A "good" return varies by investor and market strategy. Generally:
- 8-12%: Often considered a solid target for long-term buy-and-hold investors.
- 15%+: Excellent returns, often found in riskier markets or properties requiring significant "sweat equity" (BRRRR strategy).
- Under 5%: Might be acceptable in high-appreciation markets (like San Francisco or NYC) where the primary goal is equity growth rather than immediate cash flow.
Why Use This Calculator?
Using a specific Rental Property CoC Calculator prevents emotional buying. By inputting realistic estimates for maintenance (typically 5-10%) and vacancy (typically 5-8%), you protect yourself from buying a liability instead of an asset. Always run the numbers conservatively to ensure your investment can withstand market fluctuations.
function calculateCoC() {
// Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPayment = parseFloat(document.getElementById('downPayment').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTerm = parseFloat(document.getElementById('loanTerm').value) || 0;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var propertyTax = parseFloat(document.getElementById('propertyTax').value) || 0;
var insurance = parseFloat(document.getElementById('insurance').value) || 0;
var maintenancePercent = parseFloat(document.getElementById('maintenance').value) || 0;
var otherExpenses = parseFloat(document.getElementById('otherExpenses').value) || 0;
// Derived Loan Calculations
var loanAmount = price – downPayment;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
// Mortgage Payment (Principal + Interest)
var mortgagePayment = 0;
if (loanAmount > 0 && interestRate > 0 && loanTerm > 0) {
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else if (loanAmount > 0 && interestRate === 0) {
mortgagePayment = loanAmount / numberOfPayments;
}
// Expense Calculations
var monthlyTax = propertyTax / 12;
var monthlyInsurance = insurance / 12;
var monthlyMaintenance = monthlyRent * (maintenancePercent / 100);
var totalMonthlyExpenses = mortgagePayment + monthlyTax + monthlyInsurance + monthlyMaintenance + otherExpenses;
// Cash Flow Calculations
var monthlyCashFlow = monthlyRent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var totalInvested = downPayment + closingCosts;
// ROI Calculation
var cocReturn = 0;
if (totalInvested > 0) {
cocReturn = (annualCashFlow / totalInvested) * 100;
}
// Formatting Function
function formatMoney(num) {
return '$' + num.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
}
// Update DOM
document.getElementById('displayMortgage').innerText = formatMoney(mortgagePayment);
document.getElementById('displayExpenses').innerText = formatMoney(totalMonthlyExpenses);
document.getElementById('displayCashFlow').innerText = formatMoney(monthlyCashFlow);
document.getElementById('displayAnnualCashFlow').innerText = formatMoney(annualCashFlow);
document.getElementById('displayTotalInvested').innerText = formatMoney(totalInvested);
var cocDisplay = document.getElementById('displayCoC');
cocDisplay.innerText = cocReturn.toFixed(2) + '%';
// Styling logic for positive/negative cash flow
if (monthlyCashFlow >= 0) {
document.getElementById('displayCashFlow').style.color = "green";
cocDisplay.style.color = "#228be6";
} else {
document.getElementById('displayCashFlow').style.color = "red";
cocDisplay.style.color = "red";
}
// Show result block
document.getElementById('resultContainer').style.display = 'block';
}
// Initialize on load just to prevent empty styles if user wants immediate feedback?
// Better to wait for click or just allow the onchange events to handle it naturally.
// We will leave the display:none until calculated.