Loan Amortization Schedule Calculator

Build a complete loan amortization schedule with extras, PMI and escrow options, multiple payment frequencies, CSV export, and print-friendly layout. Professional, WCAG-compliant, mobile-first.

Each row shows how your payment is split across interest and principal, extras, PMI/escrow, and the remaining balance.
# Date Payment Interest Principal Extra PMI Escrow All-in Balance
Page — of —

Full original guide (expanded)

Loan Amortization Schedule Calculator

Build a complete amortization schedule with extras, multiple payment frequencies, optional escrow & PMI, CSV export, and print-friendly output. Accurate, accessible, and fast for professional use.

%
Payment frequency *

Extra payments (optional)

$
$

Escrow & PMI (optional)

$
$
$

PMI applies until LTV ≤ 80% (when balance ≤ 80% of home value). We compute PMI each period from the current balance and allocate it to the all-in payment.

Results

Periodic payment

# Payments

Total interest

Total paid (loan)

Payoff date

All-in payment*

* All-in includes escrow (tax + insurance) and PMI while applicable.

Data Source and Methodology

Authoritative reference: OpenStax, “Algebra and Trigonometry,” Section 3.7 Financial Formulas (Amortization), 2016 — and standard finance texts on fixed-rate amortization. These sources ground the formulas and definitions used here.

Modeling notes: Payments follow a fixed-rate amortization with period rate \( r = \frac{\text{APR}}{m} \) where \( m \) is payments per year (12, 26, or 52). Extras shorten the term unless your lender recasts. Escrow (tax + insurance) and PMI are added to show an “all-in” outflow; the core schedule remains P&I.

The Formula Explained

Payment: \( P = \dfrac{L\,r}{1 - (1+r)^{-n}} \), where \( L \) is principal, \( r \) the period rate, and \( n \) total periods.
Per period \(k\): \( \text{Interest}_k = B_{k-1}\,r \), \( \text{Principal}_k = P - \text{Interest}_k \), \( B_k = B_{k-1} - \text{Principal}_k - \text{Extra}_k \).
Zero-rate case: \( P = \dfrac{L}{n} \), \( \text{Interest}_k = 0 \).

Frequently Asked Questions (FAQ)

Do extra payments change my required payment?

No. Required payment stays fixed; extras reduce term and total interest. Some lenders offer optional recast programs—check your agreement.

How does PMI end?

PMI is applied each period until LTV ≤ 80% (balance ≤ 80% of home value). The tool removes PMI automatically once the condition is met.

Why might my lender’s numbers differ?

Daily interest accrual, posting dates, rounding, and fees can create small differences versus this idealized monthly model.

Last accuracy review:


Audit: Complete
Formula (LaTeX) + variables + units
This section shows the formulas used by the calculator engine, plus variable definitions and units.
Formula (extracted LaTeX)
\[','\\]
','\
Formula (extracted LaTeX)
\[= (sel, ctx=document) => Array.from(ctx.querySelectorAll(sel)); function guessCurrency(){ try{ const region = Intl.DateTimeFormat().resolvedOptions().locale?.split('-')[1] || ''; if(region === 'GB') return 'GBP'; if(region === 'CA') return 'CAD'; if(region === 'AU') return 'AUD'; if(['EU','DE','FR','ES','IT','NL','IE','PT'].includes(region)) return 'EUR'; }catch(e){} return 'USD'; } const currFmt = () => new Intl.NumberFormat(undefined, { style:'currency', currency: $('#currency')?.value || guessCurrency() }); function fmt(n){ const c = currFmt(); return Number.isFinite(n) ? c.format(n) : '—'; } function getFreq(){ const r =\]
= (sel, ctx=document) => Array.from(ctx.querySelectorAll(sel)); function guessCurrency(){ try{ const region = Intl.DateTimeFormat().resolvedOptions().locale?.split('-')[1] || ''; if(region === 'GB') return 'GBP'; if(region === 'CA') return 'CAD'; if(region === 'AU') return 'AUD'; if(['EU','DE','FR','ES','IT','NL','IE','PT'].includes(region)) return 'EUR'; }catch(e){} return 'USD'; } const currFmt = () => new Intl.NumberFormat(undefined, { style:'currency', currency: $('#currency')?.value || guessCurrency() }); function fmt(n){ const c = currFmt(); return Number.isFinite(n) ? c.format(n) : '—'; } function getFreq(){ const r =
Formula (extracted text)
Payment: \( P = \dfrac{L\,r}{1 - (1+r)^{-n}} \), where \( L \) is principal, \( r \) the period rate, and \( n \) total periods. Per period \(k\): \( \text{Interest}_k = B_{k-1}\,r \), \( \text{Principal}_k = P - \text{Interest}_k \), \( B_k = B_{k-1} - \text{Principal}_k - \text{Extra}_k \). Zero-rate case: \( P = \dfrac{L}{n} \), \( \text{Interest}_k = 0 \).
Variables and units
  • P = principal (loan amount) (currency)
  • r = periodic interest rate (annual rate ÷ payments per year) (1)
  • n = total number of payments (years × payments per year) (count)
  • M = periodic payment for principal + interest (currency)
  • T = property tax (annual or monthly depending on input) (currency)
  • I = homeowners insurance (annual or monthly depending on input) (currency)
  • PMI = private mortgage insurance (monthly) (currency)
Sources (authoritative):
Changelog
Version: 0.1.0-draft
Last code update: 2026-01-19
0.1.0-draft · 2026-01-19
  • Initial audit spec draft generated from HTML extraction (review required).
  • Verify formulas match the calculator engine and convert any text-only formulas to LaTeX.
  • Confirm sources are authoritative and relevant to the calculator methodology.
Verified by Ugo Candido on 2026-01-19
Profile · LinkedIn

Loan Amortization Schedule Calculator

Build a complete amortization schedule with extras, multiple payment frequencies, optional escrow & PMI, CSV export, and print-friendly output. Accurate, accessible, and fast for professional use.

%
Payment frequency *

Extra payments (optional)

$
$

Escrow & PMI (optional)

$
$
$

PMI applies until LTV ≤ 80% (when balance ≤ 80% of home value). We compute PMI each period from the current balance and allocate it to the all-in payment.

Results

Periodic payment

# Payments

Total interest

Total paid (loan)

Payoff date

All-in payment*

* All-in includes escrow (tax + insurance) and PMI while applicable.

Each row shows how your payment is split across interest and principal, extras, PMI/escrow, and the remaining balance.
# Date Payment Interest Principal Extra PMI Escrow All-in Balance
Page — of —

Data Source and Methodology

Authoritative reference: OpenStax, “Algebra and Trigonometry,” Section 3.7 Financial Formulas (Amortization), 2016 — and standard finance texts on fixed-rate amortization. These sources ground the formulas and definitions used here.

Modeling notes: Payments follow a fixed-rate amortization with period rate \( r = \frac{\text{APR}}{m} \) where \( m \) is payments per year (12, 26, or 52). Extras shorten the term unless your lender recasts. Escrow (tax + insurance) and PMI are added to show an “all-in” outflow; the core schedule remains P&I.

The Formula Explained

Payment: \( P = \dfrac{L\,r}{1 - (1+r)^{-n}} \), where \( L \) is principal, \( r \) the period rate, and \( n \) total periods.
Per period \(k\): \( \text{Interest}_k = B_{k-1}\,r \), \( \text{Principal}_k = P - \text{Interest}_k \), \( B_k = B_{k-1} - \text{Principal}_k - \text{Extra}_k \).
Zero-rate case: \( P = \dfrac{L}{n} \), \( \text{Interest}_k = 0 \).

Frequently Asked Questions (FAQ)

Do extra payments change my required payment?

No. Required payment stays fixed; extras reduce term and total interest. Some lenders offer optional recast programs—check your agreement.

How does PMI end?

PMI is applied each period until LTV ≤ 80% (balance ≤ 80% of home value). The tool removes PMI automatically once the condition is met.

Why might my lender’s numbers differ?

Daily interest accrual, posting dates, rounding, and fees can create small differences versus this idealized monthly model.

Last accuracy review:


Audit: Complete
Formula (LaTeX) + variables + units
This section shows the formulas used by the calculator engine, plus variable definitions and units.
Formula (extracted LaTeX)
\[','\\]
','\
Formula (extracted LaTeX)
\[= (sel, ctx=document) => Array.from(ctx.querySelectorAll(sel)); function guessCurrency(){ try{ const region = Intl.DateTimeFormat().resolvedOptions().locale?.split('-')[1] || ''; if(region === 'GB') return 'GBP'; if(region === 'CA') return 'CAD'; if(region === 'AU') return 'AUD'; if(['EU','DE','FR','ES','IT','NL','IE','PT'].includes(region)) return 'EUR'; }catch(e){} return 'USD'; } const currFmt = () => new Intl.NumberFormat(undefined, { style:'currency', currency: $('#currency')?.value || guessCurrency() }); function fmt(n){ const c = currFmt(); return Number.isFinite(n) ? c.format(n) : '—'; } function getFreq(){ const r =\]
= (sel, ctx=document) => Array.from(ctx.querySelectorAll(sel)); function guessCurrency(){ try{ const region = Intl.DateTimeFormat().resolvedOptions().locale?.split('-')[1] || ''; if(region === 'GB') return 'GBP'; if(region === 'CA') return 'CAD'; if(region === 'AU') return 'AUD'; if(['EU','DE','FR','ES','IT','NL','IE','PT'].includes(region)) return 'EUR'; }catch(e){} return 'USD'; } const currFmt = () => new Intl.NumberFormat(undefined, { style:'currency', currency: $('#currency')?.value || guessCurrency() }); function fmt(n){ const c = currFmt(); return Number.isFinite(n) ? c.format(n) : '—'; } function getFreq(){ const r =
Formula (extracted text)
Payment: \( P = \dfrac{L\,r}{1 - (1+r)^{-n}} \), where \( L \) is principal, \( r \) the period rate, and \( n \) total periods. Per period \(k\): \( \text{Interest}_k = B_{k-1}\,r \), \( \text{Principal}_k = P - \text{Interest}_k \), \( B_k = B_{k-1} - \text{Principal}_k - \text{Extra}_k \). Zero-rate case: \( P = \dfrac{L}{n} \), \( \text{Interest}_k = 0 \).
Variables and units
  • P = principal (loan amount) (currency)
  • r = periodic interest rate (annual rate ÷ payments per year) (1)
  • n = total number of payments (years × payments per year) (count)
  • M = periodic payment for principal + interest (currency)
  • T = property tax (annual or monthly depending on input) (currency)
  • I = homeowners insurance (annual or monthly depending on input) (currency)
  • PMI = private mortgage insurance (monthly) (currency)
Sources (authoritative):
Changelog
Version: 0.1.0-draft
Last code update: 2026-01-19
0.1.0-draft · 2026-01-19
  • Initial audit spec draft generated from HTML extraction (review required).
  • Verify formulas match the calculator engine and convert any text-only formulas to LaTeX.
  • Confirm sources are authoritative and relevant to the calculator methodology.
Verified by Ugo Candido on 2026-01-19
Profile · LinkedIn

Loan Amortization Schedule Calculator

Build a complete amortization schedule with extras, multiple payment frequencies, optional escrow & PMI, CSV export, and print-friendly output. Accurate, accessible, and fast for professional use.

%
Payment frequency *

Extra payments (optional)

$
$

Escrow & PMI (optional)

$
$
$

PMI applies until LTV ≤ 80% (when balance ≤ 80% of home value). We compute PMI each period from the current balance and allocate it to the all-in payment.

Results

Periodic payment

# Payments

Total interest

Total paid (loan)

Payoff date

All-in payment*

* All-in includes escrow (tax + insurance) and PMI while applicable.

Each row shows how your payment is split across interest and principal, extras, PMI/escrow, and the remaining balance.
# Date Payment Interest Principal Extra PMI Escrow All-in Balance
Page — of —

Data Source and Methodology

Authoritative reference: OpenStax, “Algebra and Trigonometry,” Section 3.7 Financial Formulas (Amortization), 2016 — and standard finance texts on fixed-rate amortization. These sources ground the formulas and definitions used here.

Modeling notes: Payments follow a fixed-rate amortization with period rate \( r = \frac{\text{APR}}{m} \) where \( m \) is payments per year (12, 26, or 52). Extras shorten the term unless your lender recasts. Escrow (tax + insurance) and PMI are added to show an “all-in” outflow; the core schedule remains P&I.

The Formula Explained

Payment: \( P = \dfrac{L\,r}{1 - (1+r)^{-n}} \), where \( L \) is principal, \( r \) the period rate, and \( n \) total periods.
Per period \(k\): \( \text{Interest}_k = B_{k-1}\,r \), \( \text{Principal}_k = P - \text{Interest}_k \), \( B_k = B_{k-1} - \text{Principal}_k - \text{Extra}_k \).
Zero-rate case: \( P = \dfrac{L}{n} \), \( \text{Interest}_k = 0 \).

Frequently Asked Questions (FAQ)

Do extra payments change my required payment?

No. Required payment stays fixed; extras reduce term and total interest. Some lenders offer optional recast programs—check your agreement.

How does PMI end?

PMI is applied each period until LTV ≤ 80% (balance ≤ 80% of home value). The tool removes PMI automatically once the condition is met.

Why might my lender’s numbers differ?

Daily interest accrual, posting dates, rounding, and fees can create small differences versus this idealized monthly model.

Last accuracy review:


Audit: Complete
Formula (LaTeX) + variables + units
This section shows the formulas used by the calculator engine, plus variable definitions and units.
Formula (extracted LaTeX)
\[','\\]
','\
Formula (extracted LaTeX)
\[= (sel, ctx=document) => Array.from(ctx.querySelectorAll(sel)); function guessCurrency(){ try{ const region = Intl.DateTimeFormat().resolvedOptions().locale?.split('-')[1] || ''; if(region === 'GB') return 'GBP'; if(region === 'CA') return 'CAD'; if(region === 'AU') return 'AUD'; if(['EU','DE','FR','ES','IT','NL','IE','PT'].includes(region)) return 'EUR'; }catch(e){} return 'USD'; } const currFmt = () => new Intl.NumberFormat(undefined, { style:'currency', currency: $('#currency')?.value || guessCurrency() }); function fmt(n){ const c = currFmt(); return Number.isFinite(n) ? c.format(n) : '—'; } function getFreq(){ const r =\]
= (sel, ctx=document) => Array.from(ctx.querySelectorAll(sel)); function guessCurrency(){ try{ const region = Intl.DateTimeFormat().resolvedOptions().locale?.split('-')[1] || ''; if(region === 'GB') return 'GBP'; if(region === 'CA') return 'CAD'; if(region === 'AU') return 'AUD'; if(['EU','DE','FR','ES','IT','NL','IE','PT'].includes(region)) return 'EUR'; }catch(e){} return 'USD'; } const currFmt = () => new Intl.NumberFormat(undefined, { style:'currency', currency: $('#currency')?.value || guessCurrency() }); function fmt(n){ const c = currFmt(); return Number.isFinite(n) ? c.format(n) : '—'; } function getFreq(){ const r =
Formula (extracted text)
Payment: \( P = \dfrac{L\,r}{1 - (1+r)^{-n}} \), where \( L \) is principal, \( r \) the period rate, and \( n \) total periods. Per period \(k\): \( \text{Interest}_k = B_{k-1}\,r \), \( \text{Principal}_k = P - \text{Interest}_k \), \( B_k = B_{k-1} - \text{Principal}_k - \text{Extra}_k \). Zero-rate case: \( P = \dfrac{L}{n} \), \( \text{Interest}_k = 0 \).
Variables and units
  • P = principal (loan amount) (currency)
  • r = periodic interest rate (annual rate ÷ payments per year) (1)
  • n = total number of payments (years × payments per year) (count)
  • M = periodic payment for principal + interest (currency)
  • T = property tax (annual or monthly depending on input) (currency)
  • I = homeowners insurance (annual or monthly depending on input) (currency)
  • PMI = private mortgage insurance (monthly) (currency)
Sources (authoritative):
Changelog
Version: 0.1.0-draft
Last code update: 2026-01-19
0.1.0-draft · 2026-01-19
  • Initial audit spec draft generated from HTML extraction (review required).
  • Verify formulas match the calculator engine and convert any text-only formulas to LaTeX.
  • Confirm sources are authoritative and relevant to the calculator methodology.
Verified by Ugo Candido on 2026-01-19
Profile · LinkedIn
Formulas

(Formulas preserved from original page content, if present.)

Version 1.5.0
Citations

Add authoritative sources relevant to this calculator (standards bodies, manuals, official docs).

Changelog
  • 0.1.0-draft — 2026-01-19: Initial draft (review required).