foldout

Loan amortization in Excel: PMT, month-by-month interest, and extra payments

IPMT gives you the right number and no idea why. Compute interest from the previous balance each month and every figure is visible — and extra payments become one extra column.

The four inputs and one formula

Amount borrowed, annual rate, term in years, first payment date. The monthly payment is Excel’s PMT with the rate and the term converted to months:

monthly payment
=-PMT(B4/12, B5*12, B3)      ← rate per month, number of months, amount

PMT returns a negative number (money leaving you); the minus sign in front flips it. For $250,000 at 5.9% over 25 years that’s $1,595.51. Total interest over the scheduled life is payment × months − amount.

One row of the schedule

Five columns: payment number, date, payment, interest, principal, balance. The first row reads the loan amount as its “previous balance”; every row after reads the row above.

row 12 (first payment), balance in column G
A12  #:          =IF($B$3<=0, "", 1)
B12  Date:       =IF(A12="", "", EDATE($B$6, 0))
F12  Interest:   =IF(A12="", 0, ROUND($B$3 * $B$4/12, 2))
C12  Payment:    =IF(A12="", 0, MIN($E$3, $B$3 + F12))
D12  Principal:  =IF(A12="", 0, C12 - F12)
G12  Balance:    =IF(A12="", 0, ROUND($B$3 - D12, 2))
row 13 and every row after — previous balance is G12
A13:  =IF(G12<=0, "", 2)
B13:  =IF(A13="", "", EDATE($B$6, 1))
F13:  =IF(A13="", 0, ROUND(G12 * $B$4/12, 2))
C13:  =IF(A13="", 0, MIN($E$3, G12 + F13))
D13:  =IF(A13="", 0, C13 - F13)
G13:  =IF(A13="", 0, ROUND(G12 - D13, 2))

Three details carry the whole thing:

  • Interest is previous balance × rate ÷ 12, rounded to cents. That’s how a lender computes it. IPMT would give an unrounded theoretical figure that drifts from the statement by a few cents.
  • The payment is MIN(scheduled, balance + interest). On the last row the balance plus interest is less than a full payment; MIN takes the smaller, so the balance lands on exactly 0.00 instead of −3 cents.
  • The row number appears only while the previous balance is above zero. That’s how the schedule stops itself. Fill the formulas down 480 rows (40 years) and forget about them.

Zero, not blank

The money columns return 0 on rows past the end, and the number format #,##0.00;-#,##0.00;;@ hides zeros. If they returned "", SUM over the interest column would still work in Excel — but (previous balance − principal) in the next row would not, and neither would a recalculation check. Keep numeric columns numeric.

Extra payments

Add a column, Extra, that you type into on any month, and a cell for a monthly extra in the inputs. The payment formula becomes:

payment with extras
=IF(A13="", 0, MIN($E$3 + $B$7 + N(D13),  G12 + F13))
                        ↑ scheduled  ↑ monthly extra  ↑ one-off this row     ↑ never more than owed

N(D13) turns an empty Extra cell into 0. Nothing else changes: interest is still on the previous balance, principal is still payment minus interest, and the schedule still stops at zero — just sooner. Three summary formulas tell you what the extras bought:

payoff summary
Payments made:   =COUNTIF(G12:G491, ">0") + 1
Total interest:  =SUM(F12:F491)
Interest saved:  =scheduled total interest − that
Paid off:        =INDEX(B12:B491, payments made)

Comparing rates and terms

Once PMT is in one cell, a grid is cheap: rates down the side, terms across the top, and =-PMT($A5/12, B$4*12, $B$3) in each cell with mixed references. A second grid of payment × months − amount shows total interest. Highlight the row matching your rate with a conditional-format rule =ABS($A5-$B$4)<0.0001.

Fortnightly or weekly

Change two numbers: the rate divisor (26 or 52 instead of 12) and the period count (years × 26), and use $B$6 + 14 × (n−1) instead of EDATE for the dates. The schedule’s logic is the same.

Principal is this schedule built out to 480 rows with the extras column, the comparison grids and a sheet explaining each formula; the free version is the plain schedule.