Calculate your mortgage payoff schedule, including biweekly payments and extra payments.
Monthly
Biweekly (Every 2 Weeks)
Your Mortgage Breakdown
$0.00
Total Payments Made
$0.00
Total Interest Paid
N/A
Estimated Payoff Time
Understanding Your Biweekly Mortgage Calculator
A mortgage is one of the most significant financial commitments most people will ever make.
Understanding how your payments affect your loan's amortization schedule, interest paid, and payoff time is crucial for effective financial planning.
This calculator helps you visualize the impact of different payment strategies, including biweekly payments and making extra payments, to pay off your mortgage faster and save money on interest.
How the Calculator Works: The Math Behind the Savings
The core of this calculator is the mortgage amortization formula, which determines your regular monthly payment. However, it goes further by simulating accelerated payment schedules.
1. Calculating the Standard Monthly Payment
The formula for the monthly payment (M) is derived from the loan principal (P), the monthly interest rate (r), and the total number of payments (n):
n = Total Number of Payments (Loan Term in Years * 12)
2. Biweekly Payment Strategy
A common strategy to accelerate mortgage payoff is the biweekly payment plan. Instead of making 12 monthly payments per year, you make a payment every two weeks. Since there are 52 weeks in a year, this amounts to 26 half-payments, which is equivalent to 13 full monthly payments annually (26 / 2 = 13).
This strategy effectively results in one extra monthly payment per year. The calculator takes your standard monthly payment, divides it by two, and applies this amount biweekly. Any additional 'extra biweekly payment' specified is also added to this amount.
3. Incorporating Extra Payments
Making extra payments, whether monthly or biweekly, directly reduces the principal loan balance faster. The calculator allows you to specify an 'Extra Monthly Payment' or an 'Extra Biweekly Payment'.
Extra Monthly Payment: This amount is added to your regular monthly payment.
Extra Biweekly Payment: This amount is added to your biweekly payment (on top of the half-monthly payment).
When you make an extra payment, it is applied directly to the principal. This not only shortens the loan term but also reduces the total interest paid over the life of the loan because a smaller principal balance accrues interest.
4. Simulation and Results
The calculator simulates the loan amortization month-by-month (or bi-weekly, effectively). In each period, it calculates the interest accrued on the remaining balance, subtracts the payment (including any extra amounts), and reduces the principal. This process continues until the loan balance reaches zero. The calculator then reports:
Total Payments Made: The sum of all payments (principal and interest) made until the loan is fully paid off.
Total Interest Paid: The difference between the total payments made and the original loan amount.
Estimated Payoff Time: The calculated duration in years and months to pay off the loan under the specified payment strategy.
Who Should Use This Calculator?
This calculator is beneficial for:
First-time Homebuyers: To understand the long-term implications of their mortgage choices.
Existing Homeowners: To explore strategies for paying off their mortgage early, potentially saving significant amounts of money.
Financial Planners: To model different scenarios and advise clients on optimizing their mortgage payments.
By understanding and utilizing these payment strategies, you can take control of your mortgage and achieve financial freedom sooner.
function calculateMortgage() {
var principal = parseFloat(document.getElementById("loanAmount").value);
var annualRate = parseFloat(document.getElementById("annualInterestRate").value);
var years = parseInt(document.getElementById("loanTermYears").value);
var extraMonthlyPayment = parseFloat(document.getElementById("extraPaymentAmount").value);
var paymentFrequency = document.getElementById("paymentFrequency").value;
var extraBiweeklyPayment = parseFloat(document.getElementById("extraBiweeklyPayment").value);
if (isNaN(principal) || principal <= 0 ||
isNaN(annualRate) || annualRate <= 0 ||
isNaN(years) || years <= 0 ||
isNaN(extraMonthlyPayment) || extraMonthlyPayment < 0 ||
isNaN(extraBiweeklyPayment) || extraBiweeklyPayment < 0) {
document.getElementById("result").innerHTML = "
Please enter valid positive numbers for all fields.
";
return;
}
var monthlyRate = (annualRate / 100) / 12;
var numberOfPayments = years * 12;
// Calculate standard monthly payment
var monthlyPayment = 0;
if (monthlyRate > 0) {
monthlyPayment = principal * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
// If interest rate is 0, payment is just principal divided by number of months
monthlyPayment = principal / numberOfPayments;
}
var totalInterestPaid = 0;
var totalPaid = 0;
var remainingBalance = principal;
var paymentsCount = 0;
var simulatedPayments = []; // To store details for later calculation if needed
var currentExtraMonthly = extraMonthlyPayment;
var currentExtraBiweekly = extraBiweeklyPayment;
var paymentAmount = 0;
var paymentInterval = 0; // In months or biweeks
if (paymentFrequency === "monthly") {
paymentAmount = monthlyPayment + currentExtraMonthly;
paymentInterval = 1; // Monthly
while (remainingBalance > 0) {
var interestThisPeriod = remainingBalance * monthlyRate;
var principalThisPeriod = paymentAmount – interestThisPeriod;
// Ensure we don't overpay in the final payment
if (principalThisPeriod > remainingBalance) {
principalThisPeriod = remainingBalance;
paymentAmount = remainingBalance + interestThisPeriod;
}
remainingBalance -= principalThisPeriod;
totalInterestPaid += interestThisPeriod;
totalPaid += paymentAmount;
paymentsCount++;
simulatedPayments.push({
paymentNum: paymentsCount,
paymentAmount: paymentAmount,
interest: interestThisPeriod,
principal: principalThisPeriod,
balance: remainingBalance
});
if (remainingBalance 0) {
// Add the extra monthly payment spread across the year's biweekly payments
// This effectively adds one extra monthly payment per year
var effectiveBiweeklyPayment = halfMonthlyPayment + currentExtraBiweekly;
if ((paymentsCount + 1) % biWeeksInYear === 0 && annualRate > 0) {
// Add the equivalent of one extra monthly payment spread over the year
// (i.e., 13th monthly payment equivalent)
// We add the standard monthly payment once per year, distributed
effectiveBiweeklyPayment += monthlyPayment / biWeeksInYear;
}
// Add any extra monthly payment not already accounted for
// This logic can get complex. A simpler approach is to calculate effective payment first.
// Let's refine: use the half-monthly payment + extra biweekly, and then add the *extra* monthly payment.
// The most straightforward way to handle both extra monthly and extra biweekly is to calculate total paid per year and spread it.
// Alternative Biweekly Logic: Pay half monthly payment + half of extra monthly payment + extra biweekly payment.
// This often results in paying more than 13 months equivalent if extraBiweekly is high.
// Let's use the common "pay half of your monthly payment every two weeks" strategy,
// and add the specified extra biweekly. The extra *monthly* payment will also be applied.
// The simplest interpretation for the user interface:
// "Biweekly" means 26 payments of (standard_monthly_payment / 2 + extra_biweekly_payment).
// "Extra Monthly Payment" is added *on top* of the scheduled payment for that month.
// This means if they select Biweekly, the calculator should add the *full* extra monthly payment once per month equivalent.
// Let's simplify the model: Biweekly = 26 half-payments. Total annual payments = 26 * (monthly_payment/2 + extra_biweekly_payment).
// If extra_monthly_payment is also specified, it's added ONCE per month. This gets confusing.
// Standard Biweekly: Make 26 payments of (monthlyPayment / 2). This results in 13 monthly payments per year.
// With Extra Biweekly: Make 26 payments of (monthlyPayment / 2 + extraBiweeklyPayment).
// With Extra Monthly: Make a standard monthly payment + extraMonthlyPayment. If biweekly is selected, this means 12 times a year, they pay an additional amount.
// Let's re-evaluate the user inputs for clarity:
// 1. Loan Amount, Rate, Term -> Standard Monthly Payment
// 2. Payment Frequency: Monthly or Biweekly
// 3. Extra Monthly Payment: ADDED to scheduled payment.
// 4. Extra Biweekly Payment: ADDED to scheduled biweekly payment.
// Scenario: Biweekly selected.
// User pays (monthlyPayment / 2) every two weeks. This is 26 payments/year. Effectively 13 monthly payments.
// User ALSO pays extraBiweeklyPayment every two weeks. Total biweekly payment = (monthlyPayment / 2) + extraBiweeklyPayment.
// User ALSO pays extraMonthlyPayment. When is this applied? This is the tricky part.
// The most common interpretation of "extra monthly payment" with biweekly is that once a year,
// you might make an additional payment equivalent to the monthly payment amount.
// OR, it means you make the regular biweekly payment, and once a month, you ALSO add the extra monthly payment.
// Let's use the interpretation that makes the most sense for acceleration:
// The calculator will simulate payments by *reducing the balance*.
// We'll calculate the total amount paid towards principal and interest per simulation step.
// The user wants to pay off faster. The options are:
// A) Pay more regularly (biweekly).
// B) Add extra lump sums (extraMonthly, extraBiweekly).
// Proposed Biweekly Logic:
// Base biweekly payment: (monthlyPayment / 2)
// Extra biweekly: extraBiweeklyPayment
// Total scheduled biweekly payment = (monthlyPayment / 2) + extraBiweeklyPayment.
// We will make 26 such payments per year. This already pays off faster.
// The 'extraMonthlyPayment' is a bit redundant or confusing if 'extraBiweeklyPayment' is also used.
// A common approach is that the *total* extra amount you want to pay annually is specified.
// If the user wants to pay X extra per year, and they choose biweekly, they will pay X/26 more per biweekly payment.
// If they choose monthly, they pay X/12 more per month.
// Let's use the most straightforward interpretation for the user:
// If BIWEEKLY is selected:
// Each payment is (monthlyPayment / 2) + extraBiweeklyPayment.
// We will simulate 26 payments of this amount per year.
// We ALSO need to account for the EXTRA MONTHLY payment. This is essentially ONE additional monthly payment per year.
// The simplest way to model this is to add (extraMonthlyPayment) ONCE per 12 scheduled bi-weekly payments.
// This means 13 payments effectively include extraMonthlyPayment distributed.
// Total paid per year = 26 * ((monthlyPayment / 2) + extraBiweeklyPayment) + extraMonthlyPayment.
// Let's assume the user wants to pay their standard biweekly payment + extra biweekly, AND THEN an additional extra monthly payment amount in total over the year.
// So, the total annual payment will be (26 * (monthlyPayment / 2 + extraBiweeklyPayment)) + extraMonthlyPayment.
// We can simulate this by advancing the loan balance.
// Simpler Simulation:
// We advance the simulation by one period.
// If frequency is Monthly: Payment = monthlyPayment + extraMonthlyPayment.
// If frequency is Biweekly: Payment = (monthlyPayment / 2) + extraBiweeklyPayment. We simulate 26 times a year.
// The 'extraMonthlyPayment' when biweekly is selected needs careful handling.
// Let's assume the user means: "I want to pay my biweekly payment (which is half monthly + extra biweekly), AND I ALSO want to add an EXTRA $X per month".
// This means for 12 months of the year, they make (monthlyPayment/2 + extraBiweeklyPayment) biweekly, AND THEN an additional extraMonthlyPayment.
// This would mean 26 biweekly payments AND 12 additional monthly payments. This is not how biweekly usually works for acceleration.
// Let's go with the most common and effective interpretation of biweekly acceleration:
// 1. Calculate standard monthly payment.
// 2. Biweekly payment = (standard monthly payment / 2). This is paid every 2 weeks (26 times a year). This equals 13 standard monthly payments per year.
// 3. Additional Extra Biweekly Payment: This is added to EACH of the 26 biweekly payments. So EACH biweekly payment is (monthlyPayment/2 + extraBiweeklyPayment).
// 4. Additional Extra Monthly Payment: This amount is added *on top* of the biweekly payment schedule, effectively simulating an extra monthly payment. The most straightforward way to model this acceleration for simplicity within the loop is to consider the total amount paid per year.
// Total intended annual payment = (12 * monthlyPayment) + extraMonthlyPayment + (26 * extraBiweeklyPayment).
// This implies the biweekly payment should be: (monthlyPayment/2) + extraBiweeklyPayment + (extraMonthlyPayment / 26).
// This is becoming too complex for a simple JS calculator without a full amortization table.
// Let's revert to a simpler model that clearly maps to user input:
// Biweekly Frequency Selected:
// Base Payment amount per period = (monthlyPayment / 2) + extraBiweeklyPayment
// Number of periods per year = 26
// Additional Monthly Payment: This is paid as a lump sum 12 times a year.
// To simplify the simulation loop: we will process payments sequentially.
// If biweekly, we simulate 26 steps per year. In each step: payment = (monthlyPayment/2 + extraBiweeklyPayment).
// We need to add the extraMonthlyPayment somewhere.
// The most effective way to add extraMonthly is to treat it as an additional payment when it's "due" (i.e., once a month).
// This requires tracking months vs. bi-weeks.
// Simplified approach: Let's just calculate the total amount paid per year and see if it reduces the loan faster.
// Standard Annual Payment = 12 * monthlyPayment
// Biweekly Annual Payment (no extra) = 26 * (monthlyPayment / 2) = 13 * monthlyPayment
// With Extra Biweekly Payment: Annual Payment = 26 * (monthlyPayment / 2 + extraBiweeklyPayment)
// With Extra Monthly Payment: Annual Payment = 12 * (monthlyPayment + extraMonthlyPayment)
// If BOTH are selected for Biweekly:
// Annual payments = (12 * monthlyPayment) + extraMonthlyPayment + (26 * extraBiweeklyPayment)
// Total paid per period (biweekly) = (monthlyPayment / 2) + extraBiweeklyPayment + (extraMonthlyPayment / 26) remainingBalance) {
principalThisPeriod = remainingBalance;
biweeklyPaymentThisPeriod = remainingBalance + interestThisPeriod;
}
remainingBalance -= principalThisPeriod;
totalInterestPaid += interestThisPeriod;
totalPaid += biweeklyPaymentThisPeriod;
paymentsCount++;
simulatedPayments.push({
paymentNum: paymentsCount,
paymentAmount: biweeklyPaymentThisPeriod,
interest: interestThisPeriod,
principal: principalThisPeriod,
balance: remainingBalance
});
if (remainingBalance 0
? payoffTimeYears + " year" + (payoffTimeYears !== 1 ? "s" : "") + (payoffTimeMonths > 0 ? ", " + payoffTimeMonths + " month" + (payoffTimeMonths !== 1 ? "s" : "") : "")
: payoffTimeMonths + " month" + (payoffTimeMonths !== 1 ? "s" : "");
document.getElementById("totalPaymentsResult").innerText = "$" + totalPaid.toFixed(2);
document.getElementById("totalInterestResult").innerText = "$" + totalInterestPaid.toFixed(2);
document.getElementById("payoffTimeResult").innerText = payoffTimeFormatted;
}