Mortgage Amortization Schedule Calculator
A mortgage amortization schedule is a table that shows the payment schedule for a loan, detailing how much of each payment goes towards the principal and interest over the life of the loan. Understanding your amortization schedule helps you see how your loan balance decreases over time and how much interest you'll pay in the long run.
This calculator will help you generate an amortization schedule for your mortgage. Simply enter the loan details below.
Loan Amount ($):
Annual Interest Rate (%):
Loan Term (Years):
Payments Per Year:
Monthly (12)
Bi-Weekly (26)
Quarterly (4)
Semi-Annually (2)
Annually (1)
Calculate Amortization Schedule
Mortgage Amortization Schedule
This table shows a breakdown of your monthly payments over the life of your loan.
Payment #
Payment Date
Beginning Balance
Payment Amount
Interest Paid
Principal Paid
Ending Balance
Loan Summary
Total Paid:
Total Interest Paid:
Total Principal Paid:
#amortization-calculator {
font-family: sans-serif;
max-width: 900px;
margin: 20px auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #f9f9f9;
}
#amortization-calculator h2, #amortization-calculator h3, #amortization-calculator h4 {
color: #333;
}
.input-section {
margin-bottom: 15px;
}
.input-section label {
display: inline-block;
width: 200px;
margin-right: 10px;
font-weight: bold;
}
.input-section input[type="number"],
.input-section select {
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
width: 150px;
}
button {
padding: 10px 15px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
margin-top: 10px;
}
button:hover {
background-color: #0056b3;
}
#result {
margin-top: 30px;
border-top: 1px solid #eee;
padding-top: 20px;
}
#amortizationTable {
width: 100%;
border-collapse: collapse;
margin-top: 15px;
font-size: 13px;
}
#amortizationTable th, #amortizationTable td {
border: 1px solid #ddd;
padding: 8px;
text-align: right;
}
#amortizationTable th {
background-color: #e9ecef;
text-align: center;
}
#amortizationTable tbody tr:nth-child(even) {
background-color: #f2f2f2;
}
#summary {
margin-top: 20px;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
background-color: #e9ecef;
}
#summary p {
margin: 5px 0;
}
#summary span {
font-weight: bold;
}
function calculateAmortization() {
var loanAmount = parseFloat(document.getElementById("loanAmount").value);
var annualInterestRate = parseFloat(document.getElementById("annualInterestRate").value);
var loanTermYears = parseFloat(document.getElementById("loanTermYears").value);
var paymentFrequency = parseInt(document.getElementById("paymentFrequency").value);
var tableBody = document.getElementById("amortizationTable").getElementsByTagName("tbody")[0];
tableBody.innerHTML = ""; // Clear previous results
var totalPaid = 0;
var totalInterest = 0;
var totalPrincipal = 0;
if (isNaN(loanAmount) || isNaN(annualInterestRate) || isNaN(loanTermYears) || isNaN(paymentFrequency) ||
loanAmount <= 0 || annualInterestRate < 0 || loanTermYears <= 0 || paymentFrequency <= 0) {
alert("Please enter valid numbers for all fields.");
return;
}
var monthlyInterestRate = (annualInterestRate / 100) / paymentFrequency;
var numberOfPayments = loanTermYears * paymentFrequency;
var monthlyPayment;
if (monthlyInterestRate === 0) {
monthlyPayment = loanAmount / numberOfPayments;
} else {
monthlyPayment = loanAmount * (monthlyInterestRate * Math.pow(1 + monthlyInterestRate, numberOfPayments)) / (Math.pow(1 + monthlyInterestRate, numberOfPayments) – 1);
}
var currentBalance = loanAmount;
var paymentDate = new Date(); // Start with today, will adjust logic for actual date context if needed
for (var i = 0; i currentBalance) {
principalPayment = currentBalance;
monthlyPayment = interestPayment + principalPayment;
}
currentBalance -= principalPayment;
// Handle potential floating point inaccuracies for the final balance
if (currentBalance < 0.01 && i === numberOfPayments – 1) {
currentBalance = 0;
}
var row = tableBody.insertRow();
var cellPaymentNum = row.insertCell();
var cellPaymentDate = row.insertCell();
var cellBeginningBalance = row.insertCell();
var cellPaymentAmount = row.insertCell();
var cellInterestPaid = row.insertCell();
var cellPrincipalPaid = row.insertCell();
var cellEndingBalance = row.insertCell();
cellPaymentNum.textContent = (i + 1);
cellPaymentDate.textContent = (i + 1) + "/" + paymentFrequency + "/" + paymentDate.getFullYear(); // Simple date representation
cellBeginningBalance.textContent = formatCurrency(loanAmount – totalPrincipal);
cellPaymentAmount.textContent = formatCurrency(monthlyPayment);
cellInterestPaid.textContent = formatCurrency(interestPayment);
cellPrincipalPaid.textContent = formatCurrency(principalPayment);
cellEndingBalance.textContent = formatCurrency(currentBalance);
totalPaid += monthlyPayment;
totalInterest += interestPayment;
totalPrincipal += principalPayment;
// A more robust date calculation would increment month by month. This is simplified.
// For bi-weekly, quarterly etc., this date logic would need significant enhancement.
// This example assumes monthly payments for date purposes.
if (paymentFrequency === 12) {
paymentDate.setMonth(paymentDate.getMonth() + 1);
}
}
document.getElementById("totalPaid").textContent = formatCurrency(totalPaid);
document.getElementById("totalInterest").textContent = formatCurrency(totalInterest);
document.getElementById("totalPrincipal").textContent = formatCurrency(totalPrincipal);
}
function formatCurrency(amount) {
if (isNaN(amount)) {
return "$0.00";
}
return "$" + amount.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}
// Initial calculation on page load if desired, or trigger manually with button
// calculateAmortization();