Determine exactly how many months it will take to recover the costs of your new mortgage loan.
How to Calculate Your Mortgage Refinance Break-Even Point
Refinancing a mortgage can save you thousands of dollars over the life of the loan, but it isn't free. To determine if a refinance is financially sound, you must find your Break-Even Point. This is the moment when the monthly savings generated by a lower interest rate finally exceed the upfront costs (closing costs) required to get the loan.
The Refinance Break-Even Formula
The math used in this calculator is straightforward:
Break-Even (Months) = Total Closing Costs / Monthly Savings
For example, if your new loan costs $4,000 in fees but saves you $200 per month on your payment, your break-even point is 20 months ($4,000 / $200 = 20). If you plan to move in 12 months, you would lose money by refinancing.
Key Factors to Consider
Closing Costs: These typically range from 2% to 5% of the loan amount. They include appraisal fees, title insurance, and origination points.
Monthly Savings: Focus only on the Principal and Interest (P&I) portion. Taxes and insurance usually stay the same regardless of the lender.
Loan Term: If you reset a 30-year mortgage after paying on it for 5 years, you are extending your debt. Even if your monthly payment drops, you might pay more in total interest over the extra 5 years.
Tax Implications: Mortgage interest is often tax-deductible. A lower interest rate might slightly reduce your tax deduction, though the direct cash savings usually outweigh this.
Example Scenario
Imagine you have a current payment of $2,500. A new lender offers a rate that drops your payment to $2,200, saving you $300 monthly. However, the closing costs are $6,000. Using our calculator, you'll see a break-even point of 20 months. If you plan to stay in the home for 5 years (60 months), you will enjoy 40 months of "pure profit," totaling $12,000 in net savings.
function calculateRefiBreakEven() {
var currentPay = parseFloat(document.getElementById('currentPayment').value);
var newPay = parseFloat(document.getElementById('newPayment').value);
var costs = parseFloat(document.getElementById('closingCosts').value);
var yearsStay = parseFloat(document.getElementById('plannedStay').value);
var resultDiv = document.getElementById('refiResult');
if (isNaN(currentPay) || isNaN(newPay) || isNaN(costs) || currentPay <= 0 || newPay <= 0 || costs <= 0) {
resultDiv.style.display = 'block';
resultDiv.className = 'refi-result-box refi-warning';
resultDiv.innerHTML = '
Missing Information
Please enter valid positive numbers for payments and closing costs.';
return;
}
var monthlySavings = currentPay – newPay;
if (monthlySavings <= 0) {
resultDiv.style.display = 'block';
resultDiv.className = 'refi-result-box refi-warning';
resultDiv.innerHTML = '
No Monthly Savings
Your new payment is equal to or higher than your current payment. A refinance in this scenario would not have a break-even point based on monthly cash flow.';
return;
}
var breakEvenMonths = costs / monthlySavings;
var breakEvenYears = (breakEvenMonths / 12).toFixed(2);
var stayMonths = isNaN(yearsStay) ? 0 : yearsStay * 12;
var netSavingsAtStay = (monthlySavings * stayMonths) – costs;
resultDiv.style.display = 'block';
resultDiv.className = 'refi-result-box refi-success';
var htmlResult = '
Analysis Results
';
htmlResult += 'Monthly Savings: $' + monthlySavings.toFixed(2) + ";
htmlResult += 'Break-Even Point: ' + Math.ceil(breakEvenMonths) + ' months (' + breakEvenYears + ' years)';
if (!isNaN(yearsStay) && yearsStay > 0) {
if (stayMonths > breakEvenMonths) {
htmlResult += 'Verdict: This refinance makes sense! You will save $' + netSavingsAtStay.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' over your ' + yearsStay + ' years in the home.';
} else {
htmlResult += 'Verdict: Careful. You plan to move before reaching the break-even point. You would lose $' + Math.abs(netSavingsAtStay).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' on this deal.';
}
}
resultDiv.innerHTML = htmlResult;
}