Business Loan Calculator - Calculate Payments & Amortization

Calculate periodic business loan payments, total interest, payoff timeline, and a detailed amortization schedule by entering the amount, APR, term, frequency, and preferred start date.

Loan Details

APR combines the base rate plus lender fees so you can compare offers.

Frequency & Currency

Schedule reflects each payment date until the balance reaches zero.

How to Use This Calculator

Enter the business loan details such as the requested amount, APR, and term, then select how often you will make payments. The calculator refreshes the numbers as soon as you click Calculate or change a critical input.

  • Input the total principal you plan to borrow before interest and fees.
  • Supply the APR provided by your lender to capture both rate and overhead.
  • Choose the number of years you have to repay and a payment frequency that matches your cash flow.
  • Set the first payment date to align the amortization schedule with your bank calendar.
  • Review the periodic payment, total cost, and amortization table to compare scenarios.

Methodology

The calculator uses a fixed-rate amortization approach. Each payment applies interest to the remaining balance before shaving off the principal, so the portion applied to interest shrinks over time while the principal portion grows.

Results assume no prepayment penalties or late fees and that extra payments are not added. Figures are estimates; always confirm with a lender if precise numbers are required.

Full original guide (expanded)

Original How-To Steps

  • Enter the total principal amount you plan to borrow for your business.
  • Enter the APR quoted by your lender to capture the cost of borrowing.
  • Enter the total length of the loan in years to match the repayment horizon.
  • Select how often you will make payments (Monthly, Bi-Weekly, or Weekly).
  • Review your periodic payment, total interest, total cost, and the amortization schedule.

FAQ Snapshot

What is amortization?

Amortization spreads a loan into fixed payments that cover interest first, then principal as the balance shrinks.

What is the difference between APR and interest rate?

The APR includes the interest rate plus lender fees, offering a fuller picture of the borrowing cost.

Can I make extra payments?

Most business loans allow prepayments, but check for penalties. This model assumes the scheduled payment is made each cycle.

How is this different from a simple interest loan?

An amortizing loan calculates interest on the remaining balance, while simple interest loans calculate interest on the original principal throughout the term.

What information do I need to apply?

Bring your business plan, financial statements, tax returns, bank statements, and legal documentation so you can model offers accurately.

Formulas

Fixed-rate amortization (principal + interest):

M = P × [r(1+r)n] / [(1+r)n − 1]

  • P = Principal (loan amount)
  • r = Periodic interest rate (APR ÷ payments per year)
  • n = Total number of payments (term × payments per year)
  • M = Periodic payment for principal and interest

The amortization schedule iterates each period, applying the payment to interest first and the remainder to principal.

Citations
Home — calcDomain.com · Accessed 2026-01-19
https://calcdomain.com/
Finance — calcDomain.com · Accessed 2026-01-19
https://calcdomain.com/finance
Business & Small Biz — calcDomain.com · Accessed 2026-01-19
https://calcdomain.com/subcategories/business-small-biz
SBA Loan Calculator — calcDomain.com · Accessed 2026-01-19
https://calcdomain.com/sba-loan-calculator
Startup Costs Calculator — calcDomain.com · Accessed 2026-01-19
https://calcdomain.com/startup-costs
Business Valuation Calculator — calcDomain.com · Accessed 2026-01-19
https://calcdomain.com/business-valuation-calculator
Profit Margin Calculator — calcDomain.com · Accessed 2026-01-19
https://calcdomain.com/profit-margin-calculator
Changelog
  • 0.1.0-draft — 2026-01-19: Initial audit draft generated from HTML extraction; review required to confirm formulas and sources.
Verified by Ugo Candido Last Updated: 2026-01-19 Version 0.1.0-draft
Version 1.5.0
; return symbol + round2(safe).toFixed(2); } }; const parseDateValue = (value) => { if (!value) return null; const parsed = new Date(value); return Number.isNaN(parsed.getTime()) ? null : parsed; }; const incrementDate = (date, perYear) => { const next = new Date(date.getTime()); if (perYear === 52) next.setDate(next.getDate() + 7); else if (perYear === 26) next.setDate(next.getDate() + 14); else next.setMonth(next.getMonth() + 1); return next; }; const payoffLabel = (paymentsCount, perYear) => { const years = paymentsCount / perYear; const wholeYears = Math.floor(years); const remMonths = Math.round((years - wholeYears) * 12); if (wholeYears <= 0) return `${Math.max(1, remMonths)} months`; if (remMonths <= 0) return `${wholeYears} years`; return `${wholeYears} yrs ${remMonths} mos`; }; function parseInputs() { return { principal: parseFloat(els.loanAmount.value), annualRatePct: parseFloat(els.interestRate.value), years: parseFloat(els.loanTerm.value), paymentsPerYear: parseInt(els.paymentFrequency.value, 10), startDate: els.startDate.value, currency: els.currency.value }; } function validate(inputs) { const errors = []; const allowedFreq = new Set([12, 26, 52]); if (!Number.isFinite(inputs.principal) || inputs.principal <= 0) errors.push('Loan amount must be greater than 0.'); if (!Number.isFinite(inputs.years) || inputs.years <= 0) errors.push('Term (years) must be greater than 0.'); if (!Number.isFinite(inputs.annualRatePct) || inputs.annualRatePct < 0) errors.push('Interest rate must be 0 or greater.'); if (!allowedFreq.has(inputs.paymentsPerYear)) errors.push('Payment frequency is invalid.'); if (inputs.startDate) { const parsed = parseDateValue(inputs.startDate); if (!parsed) errors.push('Start date is invalid.'); } if (!inputs.currency) errors.push('Select a currency.'); return { ok: errors.length === 0, errors }; } function compute(inputs) { const { principal, annualRatePct, years, paymentsPerYear, startDate } = inputs; const totalPeriods = Math.round(years * paymentsPerYear); const periodicRate = (annualRatePct / 100) / paymentsPerYear; if (!(principal > 0) || !(totalPeriods > 0) || !Number.isFinite(periodicRate) || periodicRate < 0) { return null; } let periodicPayment; if (periodicRate === 0) { periodicPayment = principal / totalPeriods; } else { const pow = Math.pow(1 + periodicRate, totalPeriods); periodicPayment = principal * (periodicRate * pow) / (pow - 1); } if (!Number.isFinite(periodicPayment)) return null; let balance = principal; const schedule = []; const baseDate = parseDateValue(startDate) || new Date(); const scheduledDate = new Date(baseDate.getTime()); scheduledDate.setHours(12, 0, 0, 0); let currentDate = new Date(scheduledDate.getTime()); const maxIterations = Math.min(totalPeriods + 120, 2000); for (let idx = 1; idx <= maxIterations; idx++) { if (balance <= 0.005 && idx > totalPeriods) break; const interest = balance * periodicRate; let principalPaid = periodicPayment - interest; if (idx === totalPeriods) { principalPaid = balance; periodicPayment = balance + interest; } if (principalPaid < 0) principalPaid = 0; balance = Math.max(0, balance - principalPaid); schedule.push({ num: idx, date: new Date(currentDate.getTime()), payment: round2(principalPaid + interest), interest: round2(interest), principal: round2(principalPaid), balance: round2(balance) }); currentDate = incrementDate(currentDate, paymentsPerYear); if (schedule.length >= totalPeriods && balance <= 0.005) break; } const totalCost = round2(schedule.reduce((sum, row) => sum + row.payment, 0)); const totalInterest = Math.max(0, round2(totalCost - principal)); return { periodicPayment: round2(periodicPayment), totalInterest, totalCost, schedule, periods: totalPeriods }; } function format(outputs, inputs) { const freqLabel = freqText[inputs.paymentsPerYear] || `${inputs.paymentsPerYear} payments/year`; return { periodicPayment: fmtCurrency(outputs.periodicPayment, inputs.currency), frequencyLabel: `${freqLabel}`, totalPrincipal: fmtCurrency(inputs.principal, inputs.currency), totalInterest: fmtCurrency(outputs.totalInterest, inputs.currency), totalCost: fmtCurrency(outputs.totalCost, inputs.currency), payoffLabel: `${outputs.schedule.length} payments (~${payoffLabel(outputs.schedule.length, inputs.paymentsPerYear)})`, schedule: outputs.schedule }; } function renderTable(currency, schedule) { els.scheduleBody.innerHTML = ''; const rows = Array.isArray(schedule) ? schedule.slice(0, 360) : []; if (!rows.length) { const tr = document.createElement('tr'); tr.innerHTML = 'Enter valid loan details to generate the schedule.'; els.scheduleBody.appendChild(tr); return; } const frag = document.createDocumentFragment(); for (const row of rows) { const tr = document.createElement('tr'); tr.innerHTML = `${row.num} ${dateFormatter.format(row.date)} ${fmtCurrency(row.payment, currency)} ${fmtCurrency(row.interest, currency)} ${fmtCurrency(row.principal, currency)} ${fmtCurrency(row.balance, currency)}`; frag.appendChild(tr); } els.scheduleBody.appendChild(frag); } function render(formatted, errors) { if (errors && errors.length) { els.errorBox.style.display = 'block'; els.errorBox.textContent = errors.join(' '); els.periodicPayment.textContent = '—'; els.frequencyLabel.textContent = ''; els.totalPrincipal.textContent = '—'; els.totalInterest.textContent = '—'; els.totalCost.textContent = '—'; els.payoffTime.textContent = '—'; els.downloadCsv.disabled = true; currentSchedule = []; return; } els.errorBox.style.display = 'none'; els.errorBox.textContent = ''; els.periodicPayment.textContent = formatted.periodicPayment; els.frequencyLabel.textContent = formatted.frequencyLabel; els.totalPrincipal.textContent = formatted.totalPrincipal; els.totalInterest.textContent = formatted.totalInterest; els.totalCost.textContent = formatted.totalCost; els.payoffTime.textContent = formatted.payoffLabel; els.downloadCsv.disabled = formatted.schedule.length === 0; } function update() { const inputs = parseInputs(); const validation = validate(inputs); if (!validation.ok) { render(null, validation.errors); return; } const result = compute(inputs); if (!result) { render(null, ['Calculation failed with the provided values.']); return; } currentSchedule = result.schedule; lastInputs = inputs; const formatted = format(result, inputs); render(formatted); if (els.scheduleWrap.style.display === 'block') { renderTable(inputs.currency, currentSchedule); } } function resetForm() { els.loanAmount.value = defaults.principal; els.interestRate.value = defaults.annualRatePct; els.loanTerm.value = defaults.years; els.paymentFrequency.value = defaults.paymentsPerYear; els.startDate.value = defaults.startDate; els.currency.value = defaults.currency; els.scheduleWrap.style.display = 'none'; els.toggleSchedule.textContent = 'View Amortization Schedule'; currentSchedule = []; lastInputs = null; } els.calcBtn.addEventListener('click', update); els.resetBtn.addEventListener('click', () => { resetForm(); const debouncedUpdate = debounce(update, 100); document.querySelectorAll('#inputsCard input, #inputsCard select, #inputsCard textarea') .forEach((el) => { el.addEventListener('input', debouncedUpdate); el.addEventListener('change', debouncedUpdate); }); update(); }); els.toggleSchedule.addEventListener('click', () => { const shouldShow = els.scheduleWrap.style.display !== 'block'; els.scheduleWrap.style.display = shouldShow ? 'block' : 'none'; els.toggleSchedule.textContent = shouldShow ? 'Hide Amortization Schedule' : 'View Amortization Schedule'; if (shouldShow && currentSchedule.length && lastInputs) { renderTable(lastInputs.currency, currentSchedule); } }); els.downloadCsv.addEventListener('click', () => { if (!currentSchedule.length) return; const cur = (lastInputs && lastInputs.currency) || 'USD'; let csv = '#,Date,Payment,Interest,Principal,Balance\n'; for (const row of currentSchedule) { const periodDate = row.date.toISOString().split('T')[0]; csv += `${row.num},${periodDate},${row.payment.toFixed(2)},${row.interest.toFixed(2)},${row.principal.toFixed(2)},${row.balance.toFixed(2)}\n`; } const blob = new Blob([csv], { type: 'text/csv' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'business-loan-schedule.csv'; a.click(); URL.revokeObjectURL(url); }); el.addEventListener('change', debouncedUpdate); }); resetForm(); update(); })();