Understanding how your loan payments impact the balance of your loan means taking the time to get to know and understand the concept of amortization – how your total loan payment will be allocated between principal and interest over the life of the loan.

The amount of an installment loan payment typically remains fixed for the duration of the loan. What changes, however, is the amount of a given payment that goes to principal and interest. As the loan progresses, the amount of your payment that is allocated towards your principal balance should increase, which, in turn, reduces the total amount owed.

We’ve constructed an easy-to-use amortization calculator to help show you how your payments will be broken down between principal and interest over the lifespan of your loan. You’ll see how changes in principal and interest impact your loan over time.

## How to Use Our Amortization calculator

Use the amortization calculator below to determine the periodic payment due on a loan and see how your payments impact your overall loan balance over time.

Since the amortization repayment model factors both interest and principal fluctuations throughout the life of the loan, the calculator will show the amount of each payment that will go towards interest and the amount that will go towards the principal.

Once you enter the terms of your loan, the calculator will provide an amortization schedule showing a fixed amount of each payment, and changes to both the interest and principal amounts of your loan.

To create your own custom schedule based on potential loan terms, use our calculator below.

## Payment Plan

Total Interest:

MAX_LOAN_AMOUNT = 1000000000; MAX_INTEREST_RATE = 40; MAX_MONTHS = 36; function concat(a, b) { return a.concat(b); } function normalizeNonNumeric(s) { if (s == "") return ""; parts = s.replace(/[^0-9.]+/g, "").split("."); switch (parts.length) { case 1: result = parts[0]; break; case 2: result = parts.join("."); default: result = parts.map((x, i) => (i ? x : x + ".")).join(""); } return result; } function normalizeValue(s, float, maxValue) { let result; result = isNumeric(s) ? s : normalizeNonNumeric(s); if (!float) { result = result.split(".")[0]; } if (Number(result) > maxValue) { result = result.substring(0, result.length - 1); } return result; } function amendInput(el) { let id = el.getAttribute("id"); el.value = calcInputs[id].normalizeFn(el.value); } function showError(el) { let id = el.getAttribute("id"); \$id(id + "ValidationMessage").innerHTML = ""; if (calcInputs[id].validationRules) { calcInputs[id].validationRules.forEach((rule) => { if (!rule.validFn(el.value)) { \$id(id + "ValidationMessage").innerHTML = rule.errorMessage; } }); } } let reactive = (el) => () => { amendInput(el); showError(el); }; let addMonths = (date, n) => { let d1, x; d1 = new Date(date.getTime()); //making copy of object x = d1.getMonth() + n; d1.setMonth(x); return d1; }; var calcInputs = { loanAmount: { normalizeFn: ((float, maxValue) => (x) => normalizeValue(x, float, maxValue))(true, MAX_LOAN_AMOUNT), validFn: isNumeric, validationRules: [ { validFn: (x) => x != "", errorMessage: "input value must be not empty", }, { validFn: (x) => x == "" || x > 0, errorMessage: "input value must be greater than zero", }, ], events: { keyup: reactive }, }, interestRate: { normalizeFn: ((float, maxValue) => (x) => normalizeValue(x, float, maxValue))(true, MAX_INTEREST_RATE), validFn: isNumeric, validationRules: [ { validFn: (x) => x != "", errorMessage: "input value must be not empty", }, { validFn: (x) => x == "" || x > 0, errorMessage: "input value must be greater than zero", }, ], events: { keyup: reactive }, }, termMonths: { normalizeFn: ((float, maxValue) => (x) => normalizeValue(x, float, maxValue))(false, MAX_MONTHS), validFn: isNumeric, validationRules: [ { validFn: (x) => x != "", errorMessage: "input value must be not empty", }, { validFn: (x) => { let res = x == "" || x > 0; console.log(res); return x == "" || x > 0; }, errorMessage: "input value must be greater than zero", }, ], events: { keyup: reactive }, }, startDate: { validFn: (x) => true, validationRules: [], }, }; let sum = (a, b) => a + b; let range = (n) => [...Array(n).keys()]; let K = (n, k) => range(n) .map((i) => Math.pow(k, i)) .reduce(sum, 0); let s_i = (s, k, d, n) => Math.pow(k, n) * s - d * K(n, k); let round = (x, n) => Math.abs(x).toFixed(0); let toIso8601d = (d) => d.toISOString().split("T")[0]; var scheduleRowStructure = { byId: { date: { title: "Date", calcFn: ({ date, i }) => addMonths(date, i), showFn: toIso8601d, }, n: { title: "Month", calcFn: ({ i }) => i + 1, showFn: (x) => x, }, beginingBalance: { title: "Beginning Balance", calcFn: ({ s, p, d, i }) => s_i(s, p + 1, d, i), showFn: (x) => round(x, 2), }, endingBalance: { title: "Ending Balance", calcFn: ({ s, p, d, i }) => s_i(s, p + 1, d, i + 1), showFn: (x) => round(x, 2), }, payment: { title: "Payment", calcFn: ({ d }) => d, showFn: (x) => round(x, 0), }, interestAmount: { title: "Interest", calcFn: ({ s, p, d, i }) => s_i(s, p + 1, d, i) * p, showFn: (x) => round(x, 2), }, }, ids: [ "n", "date", "beginingBalance", "interestAmount", "payment", "endingBalance", ], }; let genStructure = (context, structure) => { let res = {}; for (let p in structure.byId) { res[p] = structure.byId[p].calcFn(context); } return res; }; let gS = ({ date, s, iters, p, d }) => { return range(iters).map((i) => { return genStructure({ date, s, p, d, i }, scheduleRowStructure); }); }; genStructurePresentation = (h, structure) => { return structure.ids.map((id) => structure.byId[id].showFn(h[id])); }; let w = (s, tag) => "" + s + ""; let wArray = (xs, tag) => xs.map((x) => w(x, tag)).join(""); let wtd = (xs) => wArray(xs, "td"); let wtr = (xs) => wArray(xs, "tr"); let scheduleSlotToTableRow = (x) => Object.keys(x) .map((p) => w(x[p], "td")) .join(""); function show_schedule() { let xss = schedule.map((h) => genStructurePresentation(h, scheduleRowStructure) ); let titles = scheduleRowStructure.ids.map( (id) => scheduleRowStructure.byId[id].title ); let headers = wArray(titles, "th"); let tbody = headers + wtr(xss.map(wtd)); let table = \$id("schedule"); table.innerHTML = tbody; } function valid(structure) { return Object.keys(structure) .map((id) => { return structure[id].validationRules.map((rule) => { return rule.validFn(structure[id].value); }); }) .reduce(concat, []) .reduce((a, b) => a && b); } function readValues(structure) { Object.keys(structure).forEach((id) => { structure[id].value = structure[id].elem.value; }); } function isNumeric(n) { return !isNaN(parseFloat(n)) && isFinite(n); } function \$id(id) { return document.getElementById(id); } function maybeCalc() { let paymentElement = \$id("payment"); let totalInterestElement = \$id("totalInterest"); readValues(calcInputs); if (valid(calcInputs)) { let loanAmount = calcInputs["loanAmount"].value; let rate = calcInputs["interestRate"].value; let months = calcInputs["termMonths"].value; let startDate = calcInputs["startDate"].value; let iterations = Number(months); let interestPerIteration = rate / 100 / 12; let a = Math.pow(1 + interestPerIteration, iterations); let r = a / (a - 1); let payment = loanAmount * interestPerIteration * r; let totalInterest = iterations * payment - loanAmount; paymentElement.innerHTML = round(payment); totalInterestElement.innerHTML = round(totalInterest); startDate = new Date(startDate); schedule = gS({ date: startDate, s: loanAmount, p: interestPerIteration, d: payment, iters: iterations, }); show_schedule(); \$id("results").scrollIntoView({ block: "nearest", behavior: "smooth", }); } else { paymentElement.innerHTML = ""; totalInterestElement.innerHTML = ""; let table = \$id("schedule"); table.innerHTML = ""; } } function addEventHandler(elem, eventType, handler) { if (elem.addEventListener) elem.addEventListener(eventType, handler, false); else if (elem.attachEvent) elem.attachEvent("on" + eventType, handler); } var schedule = []; function initInputs(structure) { Object.keys(structure).forEach((id) => { let elem = \$id(id); let value = elem.value; structure[id] = Object.assign(structure[id], { elem, value, }); }); } initInputs(calcInputs); var startDateElement = \$id("startDate"); startDateElement.value = toIso8601d(new Date()); Object.keys(calcInputs).forEach((id) => { if (calcInputs[id].events) { Object.keys(calcInputs[id].events).forEach((eventName) => { let elem = calcInputs[id].elem; addEventHandler(elem, eventName, calcInputs[id].events[eventName](elem)); }); } });

## Amortization Explained

If you’ve ever been in the market for a loan, you’ve heard the term “amortization.” While the concept of amortization seems complex, it’s not too tough to understand. Think of amortization as a method to stabilize the amount of your loan payment through the life of the loan and fix regular payments on a predetermined schedule throughout the life of the loan.

While your monthly payments will remain fixed, the proportion of the loan allocated to interest and principal will change. In your first few payments, you will notice a large portion of your payment is allocated to interest. The more time that passes and the more on-time payments that you make, the more your payments will shift toward paying off your core principal.

## Amortization Schedule

To calculate the amortization of your loan, it is important to have an accurate amortization schedule. An amortization schedule will allow you to determine how to best repay the loan, steadily and over time. Working out an amortization schedule means working out both the amount of each payment as well as the changes to the principal and interest amounts over the life of the loan.

Using our amortization calculator will help assist you in making informed  decisions to meet both your immediate and long-term financial goals.

## Benefits of Amortization

Understanding your amortized loan schedule will help to  ensure that you have ample time and budget to repay your loan. By adhering to a fixed payment schedule every month, one planned out in advance, you’ll always know what your balance is and how your payments are being allocated.

An amortized loan allows for the principal to be directly scaled with interest. What you get out of such a loan is a clear, manageable repayment schedule.

An unamortized loan, one where you make only interest payments, does not offer the same level of certainty. Often the payments you make are only applied to interest and the amount of principal owed is not reduced over the life of the loan. For these types of loans, the entire principal amount is typically due at the end of the loan, which is often referred to as a balloon payment.”

## Considering the “Negative”

When calculating payments, it is important to understand how the interest is accruing over time and what the interest charges are. The payments calculated by an amortization schedule should be evenly spread out over the life of the loan to account for all fees which may accrue.

If your regular payment does not cover the amount of interest that has  accumulated  on your loan, negative amortization may result. This means that the amount of interest that is not covered in your previous loan payment will be added to your principal balance, and thus increasing the amount of principal due on your loan to your outstanding balance.

## Using CreditNinja’s Amortization Calculator

Using CreditNinja’s amortization calculator will provide insight into the elements making up your loan payments, so you have the information needed to consider how much you pay in interest.

Be aware that what may initially come across as an ‘affordable’ fixed payment, may in fact be made up of high-interest costs. In contrast, the higher monthly payment may mean that you are paying down more of your principal balance with each payment.

All things considered, knowing how loan amortization works can help you make a better decision for your financial future. While the idea behind amortization is fairly simple, crunching out the actual numbers with a pen and paper can prove to be a challenge.