PageSourceSearch

https://student-loan-calc.zivtools.workers.dev/

html student-loan-calc.zivtools.workers.dev collected 2026-10-03 08:11:04 UTC 66,726 bytes, 960 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4<meta charset="UTF-8">
5<meta name="viewport" content="width=device-width, initial-scale=1.0">
6<title>Student Loan Payoff Calculator - Pay Off Student Debt Faster</title>
7<meta name="description" content="Free student loan payoff calculator. Compare repayment strategies, estimate refinance savings, explore income-driven plans, and create your debt-free timeline.">
8<meta name="keywords" content="student loan calculator, student loan payoff, refinance student loans, income driven repayment, student debt calculator, loan payoff calculator">
9<link rel="canonical" href="https://student-loan-calc.zivtools.workers.dev/">
10<meta property="og:title" content="Student Loan Payoff Calculator - Pay Off Student Debt Faster">
11<meta property="og:description" content="Free calculator to plan your student loan payoff. Compare strategies, estimate refinance savings, and find your path to debt freedom.">
12<meta property="og:type" content="website">
13<meta property="og:url" content="https://student-loan-calc.zivtools.workers.dev/">
14<meta name="twitter:card" content="summary_large_image">
15<meta name="twitter:title" content="Student Loan Payoff Calculator">
16<meta name="twitter:description" content="Plan your student loan payoff. Compare strategies, estimate refinance savings, find your debt-free date.">
17<script type="application/ld+json">
18{
19  "@context": "https://schema.org",
20  "@type": "WebApplication",
21  "name": "Student Loan Payoff Calculator",
22  "description": "Free student loan payoff calculator with refinance comparison and income-driven repayment estimator.",
23  "url": "https://aihowtoinvest.com/student-loans",
24  "applicationCategory": "FinanceApplication",
25  "operatingSystem": "Any",
26  "offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" }
27}
28</script>
28
29<!-- FAQPage schema removed - deprecated by Google -->
30<style>
31*{margin:0;padding:0;box-sizing:border-box}
32:root{--bg:#0f1117;--surface:#1a1d27;--surface2:#242836;--surface3:#2d3143;--border:#363b50;--text:#e8eaf0;--text2:#a0a6b8;--text3:#6b7280;--accent:#38bdf8;--accent2:#06b6d4;--accent-dim:rgba(56,189,248,0.12);--green:#34d399;--green-dim:rgba(52,211,153,0.12);--red:#f87171;--orange:#fb923c;--purple:#a78bfa;--radius:12px;--radius-sm:8px}
33body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.6;min-height:100vh}
34.container{max-width:1100px;margin:0 auto;padding:0 20px}
35header{padding:32px 0 24px;text-align:center;border-bottom:1px solid var(--border)}
36header h1{font-size:28px;font-weight:700;margin-bottom:6px;background:linear-gradient(135deg,var(--accent),var(--accent2));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
37header p{color:var(--text2);font-size:15px;max-width:520px;margin:0 auto}
38.quick-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:24px 0}
39.stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:16px;text-align:center}
40.stat-card .val{font-size:22px;font-weight:700;color:var(--accent)}
41.stat-card .lbl{font-size:12px;color:var(--text3);margin-top:2px}
42.tabs{display:flex;gap:4px;margin:28px 0 20px;overflow-x:auto;padding-bottom:4px}
43.tab{padding:10px 18px;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;font-size:14px;font-weight:500;white-space:nowrap;transition:all .2s}
44.tab:hover{border-color:var(--accent);color:var(--text)}
45.tab.active{background:var(--accent-dim);border-color:var(--accent);color:var(--accent)}
46.panel{display:none}
47.panel.active{display:block}
48.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin-bottom:16px}
49.card h2{font-size:18px;margin-bottom:16px;display:flex;align-items:center;gap:8px}
50.card h3{font-size:15px;color:var(--text2);margin:16px 0 10px;font-weight:600}
51.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
52.form-group{display:flex;flex-direction:column;gap:4px}
53.form-group label{font-size:13px;color:var(--text2);font-weight:500}
54.form-group input,.form-group select{background:var(--surface2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;color:var(--text);font-size:15px;outline:none;transition:border-color .2s}
55.form-group input:focus,.form-group select:focus{border-color:var(--accent)}
56.form-group select{cursor:pointer}
57.full-width{grid-column:1/-1}
58.btn{padding:10px 20px;border-radius:var(--radius-sm);font-size:14px;font-weight:600;cursor:pointer;border:none;transition:all .2s}
59.btn-primary{background:linear-gradient(135deg,var(--accent),var(--accent2));color:#000}
60.btn-primary:hover{opacity:0.9;transform:translateY(-1px)}
61.btn-outline{background:transparent;border:1px solid var(--border);color:var(--text2)}
62.btn-outline:hover{border-color:var(--accent);color:var(--accent)}
63.btn-cta{background:linear-gradient(135deg,#22c55e,#16a34a);color:#fff;padding:14px 28px;font-size:16px;border-radius:var(--radius);display:inline-flex;align-items:center;gap:8px;text-decoration:none}
64.btn-cta:hover{opacity:0.9;transform:translateY(-1px)}
65.btn-sm{padding:6px 14px;font-size:13px}
66.btn-row{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}
67.loan-list{margin:12px 0}
68.loan-item{display:flex;align-items:center;gap:12px;background:var(--surface2);border-radius:var(--radius-sm);padding:10px 14px;margin-bottom:8px}
69.loan-item .li-info{flex:1;display:flex;gap:16px;flex-wrap:wrap;font-size:14px}
70.loan-item .li-info span{color:var(--text2)}
71.loan-item .li-info strong{color:var(--text);margin-left:4px}
72.loan-item .li-remove{color:var(--red);cursor:pointer;font-size:18px;padding:4px 8px;border:none;background:none}
73.results{margin-top:20px}
74.result-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:12px 0}
75.result-box{background:var(--surface2);border-radius:var(--radius-sm);padding:16px}
76.result-box .rb-label{font-size:12px;color:var(--text3);text-transform:uppercase;letter-spacing:0.5px}
77.result-box .rb-value{font-size:24px;font-weight:700;margin-top:4px}
78.result-box .rb-sub{font-size:13px;color:var(--text2);margin-top:2px}
79.result-box.highlight{border:1px solid var(--green);background:var(--green-dim)}
80.result-box.highlight .rb-value{color:var(--green)}
81.result-box.warn .rb-value{color:var(--orange)}
82.slider-group{margin:16px 0}
83.slider-group label{font-size:14px;color:var(--text2);display:flex;justify-content:space-between}
84.slider-group label span{color:var(--accent);font-weight:600}
85.slider-group input[type=range]{-webkit-appearance:none;width:100%;height:6px;border-radius:3px;background:var(--surface3);outline:none;margin-top:8px}
86.slider-group input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:20px;height:20px;border-radius:50%;background:var(--accent);cursor:pointer;border:2px solid var(--bg)}
87.comparison-table{width:100%;border-collapse:collapse;margin:12px 0;font-size:14px}
88.comparison-table th{text-align:left;padding:10px 12px;background:var(--surface2);color:var(--text2);font-weight:600;font-size:13px;border-bottom:1px solid var(--border)}
89.comparison-table td{padding:10px 12px;border-bottom:1px solid var(--border)}
90.comparison-table tr:hover td{background:var(--surface2)}
91.comparison-table .best{color:var(--green);font-weight:600}
92.comparison-table .strategy-label{display:flex;align-items:center;gap:6px}
93.chart-area{margin:16px 0}
94.bar-chart{display:flex;flex-direction:column;gap:3px}
95.bar-row{display:flex;align-items:center;gap:8px;font-size:11px}
96.bar-row .bar-label{width:40px;text-align:right;color:var(--text3);flex-shrink:0}
97.bar-row .bar-track{flex:1;height:18px;background:var(--surface3);border-radius:3px;overflow:hidden;display:flex}
98.bar-row .bar-principal{background:var(--accent);height:100%;transition:width .3s}
99.bar-row .bar-interest{background:var(--orange);height:100%;transition:width .3s}
100.bar-legend{display:flex;gap:16px;margin-top:8px;font-size:12px;color:var(--text2)}
101.bar-legend span{display:flex;align-items:center;gap:4px}
102.bar-legend .dot{width:10px;height:10px;border-radius:2px;display:inline-block}
103.refi-side{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:16px 0}
104.refi-col{background:var(--surface2);border-radius:var(--radius-sm);padding:16px}
105.refi-col h4{font-size:14px;color:var(--text2);margin-bottom:12px;text-align:center}
106.refi-col .rc-row{display:flex;justify-content:space-between;padding:6px 0;font-size:14px;border-bottom:1px solid var(--border)}
107.refi-col .rc-row:last-child{border:none}
108.refi-col .rc-label{color:var(--text3)}
109.refi-col .rc-val{font-weight:600}
110.refi-col.savings{border:1px solid var(--green)}
111.refi-col.savings h4{color:var(--green)}
112.idr-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:12px 0}
113.idr-card{background:var(--surface2);border-radius:var(--radius-sm);padding:16px;border-left:3px solid var(--accent)}
114.idr-card h4{font-size:14px;font-weight:600;margin-bottom:8px}
115.idr-card .idr-row{display:flex;justify-content:space-between;font-size:13px;padding:4px 0;color:var(--text2)}
116.idr-card .idr-row .idr-val{color:var(--text);font-weight:500}
117.idr-card.best-plan{border-left-color:var(--green)}
118.idr-card.best-plan h4{color:var(--green)}
119.affiliate-box{background:linear-gradient(135deg,rgba(56,189,248,0.08),rgba(6,182,212,0.08));border:1px solid rgba(56,189,248,0.2);border-radius:var(--radius);padding:24px;text-align:center;margin:20px 0}
120.affiliate-box h3{font-size:17px;margin-bottom:6px}
121.affiliate-box p{color:var(--text2);font-size:14px;margin-bottom:16px}
122.affiliate-links{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin-top:12px}
123.affiliate-links a{padding:10px 20px;border-radius:var(--radius-sm);font-size:14px;font-weight:600;text-decoration:none;transition:all .2s;border:1px solid var(--border);color:var(--text);background:var(--surface)}
124.affiliate-links a:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-1px)}
125.cross-promo{margin:24px 0;display:grid;grid-template-columns:1fr 1fr;gap:12px}
126.cross-promo a{display:block;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:16px;text-decoration:none;color:var(--text);transition:all .2s}
127.cross-promo a:hover{border-color:var(--accent);transform:translateY(-2px)}
128.cross-promo a .cp-title{font-weight:600;font-size:14px;margin-bottom:4px}
129.cross-promo a .cp-desc{font-size:12px;color:var(--text3)}
130.progress-visual{margin:16px 0}
131.progress-track{height:24px;background:var(--surface3);border-radius:12px;overflow:hidden;position:relative}
132.progress-fill{height:100%;background:linear-gradient(90deg,var(--accent),var(--green));border-radius:12px;transition:width .5s;display:flex;align-items:center;justify-content:flex-end;padding-right:8px;font-size:11px;font-weight:700;color:#000;min-width:40px}
133.progress-labels{display:flex;justify-content:space-between;font-size:12px;color:var(--text3);margin-top:4px}
134.empty-state{text-align:center;padding:40px 20px;color:var(--text3)}
135.empty-state p{margin-bottom:12px}
136.seo-content{max-width:800px;margin:40px auto;padding:30px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);line-height:1.8}
137.seo-content h2{color:var(--accent);margin:28px 0 12px;font-size:1.3rem}
138.seo-content h2:first-child{margin-top:0}
139.seo-content h3{color:var(--green);margin:20px 0 8px;font-size:1.05rem}
140.seo-content p{color:var(--text2);margin-bottom:14px;font-size:.92rem}
141.seo-content ol,.seo-content ul{color:var(--text2);margin:10px 0 16px 20px;font-size:.92rem}
142.seo-content li{margin-bottom:8px}
143footer{text-align:center;padding:32px 0;color:var(--text3);font-size:13px;border-top:1px solid var(--border);margin-top:32px}
144footer a{color:var(--accent);text-decoration:none}
145.ad-slot{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px;text-align:center;margin:16px 0;min-height:90px}
146@media(max-width:640px){
147  .form-grid{grid-template-columns:1fr}
148  .refi-side{grid-template-columns:1fr}
149  .cross-promo{grid-template-columns:1fr}
150  .tabs{gap:2px}
151  .tab{padding:8px 12px;font-size:13px}
152  header h1{font-size:22px}
153  .result-grid{grid-template-columns:1fr 1fr}
154  .idr-grid{grid-template-columns:1fr}
155}
156</style>
157</head>
158<body>
159<div class="container">
160<header>
161  <h1>Student Loan Payoff Calculator</h1>
162  <p>Plan your path to debt freedom. Compare strategies, explore refinancing, and find the fastest way to pay off your student loans.</p>
163</header>
164
165<div class="quick-stats">
166  <div class="stat-card"><div class="val">$37,574</div><div class="lbl">Avg. Student Debt</div></div>
167  <div class="stat-card"><div class="val">$350/mo</div><div class="lbl">Avg. Monthly Payment</div></div>
168  <div class="stat-card"><div class="val">$1.77T</div><div class="lbl">Total US Student Debt</div></div>
169  <div class="stat-card"><div class="val">45M</div><div class="lbl">Americans with Student Debt</div></div>
170</div>
171
172<div style="margin:20px 0;min-height:90px;text-align:center">
173<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8768030543576045" data-ad-slot="auto" data-ad-format="auto" data-full-width-responsive="true"></ins>
174<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
174
175</div>
176
177<div class="tabs">
178  <button class="tab active" onclick="switchTab('payoff')">Payoff Calculator</button>
179  <button class="tab" onclick="switchTab('refinance')">Refinance Comparison</button>
180  <button class="tab" onclick="switchTab('idr')">Income-Driven Plans</button>
181</div>
182
183<!-- PAYOFF CALCULATOR -->
184<div id="panel-payoff" class="panel active">
185<div class="card">
186  <h2>Add Your Loans</h2>
187  <div class="form-grid">
188    <div class="form-group">
189      <label>Loan Name</label>
190      <input type="text" id="loanName" placeholder="e.g. Federal Direct" value="Federal Direct">
191    </div>
192    <div class="form-group">
193      <label>Loan Type</label>
194      <select id="loanType">
195        <option value="fed-sub">Federal Subsidized</option>
196        <option value="fed-unsub">Federal Unsubsidized</option>
197        <option value="plus">Federal PLUS</option>
198        <option value="private">Private</option>
199      </select>
200    </div>
201    <div class="form-group">
202      <label>Loan Balance ($)</label>
203      <input type="number" id="loanBalance" placeholder="35000" value="35000">
204    </div>
205    <div class="form-group">
206      <label>Interest Rate (%)</label>
207      <input type="number" id="loanRate" step="0.01" placeholder="5.5" value="5.5">
208    </div>
209    <div class="form-group">
210      <label>Monthly Payment ($)</label>
211      <input type="number" id="loanPayment" placeholder="Auto-calculate minimum">
212    </div>
213    <div class="form-group">
214      <label>Loan Term (years)</label>
215      <input type="number" id="loanTerm" placeholder="10" value="10">
216    </div>
217  </div>
218  <div class="btn-row">
219    <button class="btn btn-primary" onclick="addLoan()">Add Loan</button>
220    <button class="btn btn-outline" onclick="addSampleLoans()">Load Sample Loans</button>
221  </div>
222</div>
223
224<div id="loanListContainer" style="display:none">
225  <div class="card">
226    <h2>Your Loans</h2>
227    <div id="loanList" class="loan-list"></div>
228    <div style="display:flex;justify-content:space-between;align-items:center;margin-top:8px">
229      <span id="totalDebt" style="font-size:15px;color:var(--text2)"></span>
230      <button class="btn btn-primary" onclick="calculate()">Calculate Payoff Plan</button>
231    </div>
232  </div>
233</div>
234
235<div id="payoffResults" class="results" style="display:none">
236  <div class="card">
237    <h2>Your Payoff Summary</h2>
238    <div id="summaryGrid" class="result-grid"></div>
239
240    <div class="progress-visual">
241      <h3>Debt Freedom Progress</h3>
242      <div class="progress-track">
243        <div id="progressFill" class="progress-fill" style="width:0%">0%</div>
244      </div>
245      <div class="progress-labels">
246        <span>Today</span>
247        <span id="payoffDateLabel">Payoff Date</span>
248      </div>
249    </div>
250
251    <div class="slider-group">
252      <label>Extra Monthly Payment: <span id="extraLabel">$0</span></label>
253      <input type="range" id="extraSlider" min="0" max="1000" step="25" value="0" oninput="updateExtra()">
254    </div>
255    <div id="extraResults" class="result-grid" style="display:none"></div>
256  </div>
257
258  <div id="strategyCard" class="card" style="display:none">
259    <h2>Snowball vs Avalanche Comparison</h2>
260    <p style="color:var(--text3);font-size:13px;margin-bottom:12px">With multiple loans, compare payoff strategies to find the best approach.</p>
261    <table class="comparison-table">
262      <thead><tr><th>Strategy</th><th>Total Interest</th><th>Payoff Date</th><th>Time Saved</th></tr></thead>
263      <tbody id="strategyBody"></tbody>
264    </table>
265  </div>
266
267  <div class="card">
268    <h2>Payment Timeline</h2>
269    <p style="color:var(--text3);font-size:13px;margin-bottom:12px">See how your payments split between principal and interest over time.</p>
270    <div id="timelineChart" class="bar-chart"></div>
271    <div class="bar-legend">
272      <span><span class="dot" style="background:var(--accent)"></span> Principal</span>
273      <span><span class="dot" style="background:var(--orange)"></span> Interest</span>
274    </div>
275  </div>
276
277  <div class="affiliate-box">
278    <h3>Could You Save by Refinancing?</h3>
279    <p>Borrowers who refinance save an average of $16,176 over the life of their loan. Check your rate in 2 minutes with no impact to your credit score.</p>
280    <a class="btn-cta" href="https://www.sofi.com/refinance-student-loan/" target="_blank" rel="noopener sponsored">Check Your Refinance Rate &rarr;</a>
281    <div class="affiliate-links">
282      <a href="https://www.earnest.com/refinance-student-loans" target="_blank" rel="noopener sponsored">Earnest</a>
283      <a href="https://www.credible.com/refinance-student-loans" target="_blank" rel="noopener sponsored">Credible</a>
284      <a href="https://www.commonbond.co/refinance-student-loans" target="_blank" rel="noopener sponsored">CommonBond</a>
285    </div>
286  </div>
287</div>
288</div>
289
290<!-- REFINANCE COMPARISON -->
291<div id="panel-refinance" class="panel">
292<div class="card">
293  <h2>Refinance Comparison</h2>
294  <p style="color:var(--text3);font-size:13px;margin-bottom:16px">See how much you could save by refinancing your student loans at a lower rate.</p>
295  <div class="form-grid">
296    <div class="form-group">
297      <label>Current Loan Balance ($)</label>
298      <input type="number" id="refiBalance" placeholder="35000" value="35000">
299    </div>
300    <div class="form-group">
301      <label>Current Interest Rate (%)</label>
302      <input type="number" id="refiCurrentRate" step="0.01" placeholder="6.5" value="6.5">
303    </div>
304    <div class="form-group">
305      <label>Remaining Term (years)</label>
306      <input type="number" id="refiCurrentTerm" placeholder="10" value="10">
307    </div>
308    <div class="form-group">
309      <label>New Interest Rate (%)</label>
310      <input type="number" id="refiNewRate" step="0.01" placeholder="4.0" value="4.0">
311    </div>
312    <div class="form-group">
313      <label>New Term (years)</label>
314      <input type="number" id="refiNewTerm" placeholder="10" value="10">
315    </div>
316    <div class="form-group">
317      <label>Refinance Fees ($)</label>
318      <input type="number" id="refiFees" placeholder="0" value="
3180">
319    </div>
320  </div>
321  <div class="btn-row">
322    <button class="btn btn-primary" onclick="calcRefinance()">Compare</button>
323  </div>
324</div>
325
326<div id="refiResults" style="display:none">
327  <div class="card">
328    <h2>Side-by-Side Comparison</h2>
329    <div class="refi-side">
330      <div class="refi-col" id="refiCurrent">
331        <h4>Current Loan</h4>
332      </div>
333      <div class="refi-col savings" id="refiNew">
334        <h4>Refinanced Loan</h4>
335      </div>
336    </div>
337    <div id="refiSavings" class="result-grid"></div>
338  </div>
339
340  <div class="affiliate-box">
341    <h3>Ready to Refinance?</h3>
342    <p>Compare rates from top lenders in under 2 minutes. Checking your rate won't affect your credit score.</p>
343    <a class="btn-cta" href="https://www.sofi.com/refinance-student-loan/" target="_blank" rel="noopener sponsored">Check Your Rate with SoFi &rarr;</a>
344    <div class="affiliate-links">
345      <a href="https://www.earnest.com/refinance-student-loans" target="_blank" rel="noopener sponsored">Earnest</a>
346      <a href="https://www.credible.com/refinance-student-loans" target="_blank" rel="noopener sponsored">Credible</a>
347      <a href="https://www.commonbond.co/refinance-student-loans" target="_blank" rel="noopener sponsored">CommonBond</a>
348    </div>
349  </div>
350</div>
351</div>
352
353<!-- INCOME-DRIVEN PLANS -->
354<div id="panel-idr" class="panel">
355<div class="card">
356  <h2>Income-Driven Repayment Estimator</h2>
357  <p style="color:var(--text3);font-size:13px;margin-bottom:16px">Estimate your monthly payment under federal income-driven repayment plans.</p>
358  <div class="form-grid">
359    <div class="form-group">
360      <label>Total Federal Loan Balance ($)</label>
361      <input type="number" id="idrBalance" placeholder="35000" value="35000">
362    </div>
363    <div class="form-group">
364      <label>Weighted Average Interest Rate (%)</label>
365      <input type="number" id="idrRate" step="0.01" placeholder="5.5" value="5.5">
366    </div>
367    <div class="form-group">
368      <label>Annual Gross Income ($)</label>
369      <input type="number" id="idrIncome" placeholder="55000" value="55000">
370    </div>
371    <div class="form-group">
372      <label>Family Size</label>
373      <input type="number" id="idrFamily" placeholder="1" value="1" min="1">
374    </div>
375    <div class="form-group">
376      <label>Filing Status</label>
377      <select id="idrFiling">
378        <option value="single">Single</option>
379        <option value="married">Married Filing Jointly</option>
380        <option value="separate">Married Filing Separately</option>
381      </select>
382    </div>
383    <div class="form-group">
384      <label>Loan Type</label>
385      <select id="idrLoanType">
386        <option value="undergrad">Undergraduate</option>
387        <option value="grad">Graduate</option>
388      </select>
389    </div>
390  </div>
391  <div class="btn-row">
392    <button class="btn btn-primary" onclick="calcIDR()">Estimate Plans</button>
393  </div>
394</div>
395
396<div id="idrResults" style="display:none">
397  <div class="card">
398    <h2>Income-Driven Plan Comparison</h2>
399    <div id="idrGrid" class="idr-grid"></div>
400    <p style="color:var(--text3);font-size:12px;margin-top:12px">* Estimates based on 2026 federal poverty guidelines. Actual payments may vary. Payments recalculated annually based on income and family size.</p>
401  </div>
402
403  <div class="affiliate-box">
404    <h3>Consider Refinancing Instead?</h3>
405    <p>If you have a stable income, refinancing may save you more than income-driven plans. Note: refinancing federal loans makes them private (you lose federal protections).</p>
406    <a class="btn-cta" href="https://www.sofi.com/refinance-student-loan/" target="_blank" rel="noopener sponsored">See If Refinancing Saves More &rarr;</a>
407  </div>
408</div>
409</div>
410
411<!-- Ad slot -->
412<div class="ad-slot">
413  <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8768030543576045" data-ad-slot="auto" data-ad-format="auto" data-full-width-responsive="true"></ins>
414</div>
415
416<!-- Cross promote -->
417<div class="cross-promo">
418  <a href="https://aihowtoinvest.com/debt-payoff/" target="_blank">
419    <div class="cp-title">Debt Payoff Calculator</div>
420    <div class="cp-desc">Plan your complete debt payoff strategy across all types of debt</div>
421  </a>
422  <a href="https://aihowtoinvest.com/freelance-rate/" target="_blank">
423    <div class="cp-title">Freelance Rate Calculator</div>
424    <div class="cp-desc">Calculate your ideal hourly/project rate to earn more and pay off debt faster</div>
425  </a>
426</div>
427
428<article class="seo-content">
429
430<h2>How to Use This Student Loan Calculator</h2>
431<p>This calculator helps you understand exactly how long it will take to pay off your student loans and how much interest you will pay along the way. Start by entering your loan details in the Payoff Calculator tab. You will need three key pieces of information for each loan: your current loan balance (the total amount you still owe), your interest rate (the annual percentage rate charged on your debt), and your monthly payment amount (or leave it blank to auto-calculate the standard 10-year repayment minimum).</p>
432<p>To find your exact loan details, log in to <a href="https://studentaid.gov" target="_blank" rel="noopener">studentaid.gov</a> for federal loans. Your Federal Student Aid dashboard shows every federal loan you have ever taken, including balances, interest rates, and servicer information. For private loans, check your lender's website or your most recent billing statement. You can also pull your credit report at annualcreditreport.com to see all outstanding student loan accounts.</p>
433<p>Once you enter your loans and click "Calculate Payoff Plan," the tool shows your total debt, combined monthly payment, total interest you will pay over the life of the loans, and your projected payoff date. Use the extra payment slider to see how additional monthly payments accelerate your timeline. If you have multiple loans, the calculator automatically compares snowball and avalanche strategies so you can choose the approach that saves the most money.</p>
434
435<h2>Understanding Student Loan Interest</h2>
436<p>Student loan interest is not calculated once a year or once a month. It accrues daily using a simple daily interest formula. Your loan servicer takes your annual interest rate, divides it by 365.25 to get the daily rate, and multiplies that by your outstanding principal balance each day. On a $35,000 loan at 5.50 percent, that works out to about $5.27 in interest accruing every single day. Over 30 days, roughly $158 of your monthly payment goes toward interest before a single dollar reduces your principal.</p>
437<p>The distinction between subsidized and unsubsidized federal loans matters enormously. Subsidized loans, available only to undergraduate students who demonstrate financial need, do not accrue interest while you are enrolled at least half-time, during your six-month grace peri
437od after graduation, or during authorized deferment periods. The government covers the interest for you during these times. Unsubsidized loans, by contrast, begin accruing interest from the day the funds are disbursed, even while you are still in school. A $20,000 unsubsidized loan at 5.50 percent will accumulate roughly $4,400 in interest over four years of college before you make your first payment.</p>
438<p>This is where capitalized interest becomes a critical concept. When unpaid interest is capitalized, it gets added to your principal balance. Your loan servicer then charges interest on the new, larger balance, meaning you are effectively paying interest on interest. Capitalization typically occurs when you enter repayment after a grace period, when a deferment or forbearance ends, or when you switch between income-driven repayment plans. On that $20,000 unsubsidized loan example, capitalization would increase your principal to $24,400, and all future interest calculations would be based on this higher amount.</p>
439<p>For the 2025-2026 academic year, federal student loan interest rates are set annually based on the 10-year Treasury note yield. Direct Subsidized and Unsubsidized Loans for undergraduates carry a rate of 6.53 percent. Direct Unsubsidized Loans for graduate and professional students are set at 8.08 percent. Direct PLUS Loans for parents and graduate students carry the highest rate at 9.08 percent. These rates are fixed for the life of each loan, meaning they will not change after disbursement regardless of market conditions. Private loan rates vary widely by lender and borrower creditworthiness, typically ranging from 4.00 percent to 14.00 percent.</p>
440
441<div style="margin:20px 0;min-height:90px;text-align:center">
442<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8768030543576045" data-ad-slot="auto" data-ad-format="auto" data-full-width-responsive="true"></ins>
443<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
443
444</div>
445
446<h2>Student Loan Repayment Strategies Compared</h2>
447<p>Choosing the right repayment strategy can save you thousands of dollars and years of payments. Here is how each major approach works and who benefits most from it.</p>
448
449<h3>Standard Repayment (10-Year Fixed)</h3>
450<p>The default repayment plan for federal student loans sets fixed monthly payments over 10 years (120 payments). This plan results in the lowest total interest cost among all federal repayment options because the term is short and payments never decrease. On a $35,000 loan at 5.50 percent, the standard payment is approximately $380 per month, and you will pay about $10,558 in total interest. This plan works best for borrowers who can comfortably afford the monthly payment and want to minimize long-term costs.</p>
451
452<h3>Graduated Repayment</h3>
453<p>Graduated repayment also runs for 10 years, but payments start low and increase every two years, typically doubling over the life of the loan. Initial payments may cover only the interest, with later payments heavily weighted toward principal. This plan suits borrowers who expect their income to rise significantly over time, such as medical residents or early-career professionals. The downside is that you pay more total interest than the standard plan because your balance decreases more slowly in the early years when payments are smallest.</p>
454
455<h3>Income-Driven Repayment Plans (SAVE, PAYE, IBR, ICR)</h3>
456<p>Income-driven repayment plans calculate your monthly payment based on your discretionary income and family size rather than your loan balance. The SAVE plan (Saving on a Valuable Education) sets payments at 5 percent of discretionary income for undergraduate loans and 10 percent for graduate loans. PAYE (Pay As You Earn) caps payments at 10 percent of discretionary income with a 20-year forgiveness timeline. IBR (Income-Based Repayment) sets payments at 10 percent for new borrowers or 15 percent for older loans, with forgiveness after 20 or 25 years. ICR (Income-Contingent Repayment) caps payments at 20 percent of discretionary income or the amount you would pay on a 12-year fixed plan, whichever is less, with forgiveness after 25 years. To qualify for SAVE, PAYE, and new-borrower IBR, you generally must have borrowed after October 1, 2007, and demonstrate a partial financial hardship. ICR is available to all borrowers with eligible federal loans.</p>
457
458<h3>Avalanche Method (Highest Interest First)</h3>
459<p>The avalanche method directs all extra payment dollars toward the loan with the highest interest rate while making minimum payments on everything else. Once the highest-rate loan is eliminated, you roll its payment into the next highest-rate loan. This approach mathematically minimizes total interest paid. If you have a $15,000 loan at 4.99 percent, a $12,000 loan at 5.50 percent, and a $10,000 private loan at 7.25 percent, the avalanche method tackles the 7.25 percent loan first, saving you the most money over time.</p>
460
461<h3>Snowball Method (Smallest Balance First)</h3>
462<p>The snowball method targets the loan with the smallest balance first, regardless of interest rate. The advantage is psychological: eliminating entire loans quickly creates a sense of accomplishment that keeps you motivated. Research published in the Journal of Consumer Research found that borrowers using the snowball method were more likely to stay committed to their repayment plan. While you may pay slightly more in total interest compared to the avalanche method, the difference is often small, typically a few hundred dollars on moderate loan balances.</p>
463
464<h3>Which Strategy Saves the Most Money?</h3>
465<p>The avalanche method always wins on pure math. However, the best strategy is the one you will actually follow consistently. If you struggle with motivation, the snowball method's quick wins may keep you on track. If you are disciplined and focused on minimizing cost, the avalanche method is optimal. Use the calculator above to compare both strategies with your actual loan data and see the exact dollar difference.</p>
466
467<h2>Worked Example: Paying Off $35,000 in Student Loans</h2>
468<p>
468Let us walk through a realistic scenario. Sarah graduated with three federal loans totaling $35,000: a $15,000 subsidized loan at 4.99 percent, a $12,000 unsubsidized loan at 5.50 percent, and an $8,000 unsubsidized loan at 6.53 percent. Her combined minimum monthly payment under the standard plan is approximately $380.</p>
469<p>Under the standard 10-year plan paying only the minimums, Sarah will pay a total of $45,558 by the time her loans are fully repaid. That means $10,558 goes purely to interest, money that does not reduce her debt at all. Her final payment arrives in April 2036, a full decade after graduation.</p>
470<p>Now consider what happens if Sarah adds just $200 per month to her payments, bringing her total to $580 per month. Using the avalanche method (targeting the 6.53 percent loan first), she pays off all her loans in approximately 5 years and 10 months, saving $4,712 in interest. Her total cost drops to $40,846, and she is debt-free by February 2032, more than four years ahead of schedule.</p>
471<p>If Sarah can manage $400 extra per month ($780 total), the results are even more dramatic. She eliminates all debt in approximately 4 years and 2 months, paying only $3,987 in total interest. That saves her $6,571 compared to the standard plan and gets her debt-free by June 2030.</p>
472<p>The takeaway is clear: even modest extra payments create outsized savings. That first extra $200 per month saves $4,712 in interest. The next extra $200 saves an additional $1,859. Every dollar above the minimum goes directly to principal, permanently reducing the base on which interest is calculated. Use the extra payment slider in the calculator above to model your own scenario and find the sweet spot between aggressive repayment and maintaining a comfortable budget.</p>
473
474<div style="margin:20px 0;min-height:90px;text-align:center">
475<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8768030543576045" data-ad-slot="auto" data-ad-format="auto" data-full-width-responsive="true"></ins>
476<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
476
477</div>
478
479<h2>Student Loan Forgiveness Programs</h2>
480<p>Several federal programs offer partial or complete student loan forgiveness, but each has specific eligibility requirements and timelines you must understand before counting on them.</p>
481
482<h3>Public Service Loan Forgiveness (PSLF)</h3>
483<p>PSLF forgives the remaining balance on your Direct Loans after you make 120 qualifying monthly payments (10 years) while working full-time for a qualifying employer. Qualifying employers include federal, state, and local government agencies, 501(c)(3) nonprofit organizations, and certain other nonprofits that provide qualifying public services. You must be enrolled in an income-driven repayment plan, and each payment must be made on time and for the full amount due. The forgiven amount under PSLF is not treated as taxable income. As of 2025, over 1 million borrowers have received PSLF forgiveness totaling more than $69 billion. Submit an Employment Certification Form annually to track your progress.</p>
484
485<h3>Income-Driven Repayment Forgiveness</h3>
486<p>All income-driven repayment plans offer forgiveness of any remaining loan balance after 20 to 25 years of qualifying payments, depending on the plan and loan type. Under SAVE and PAYE, undergraduate loans are forgiven after 20 years. Graduate loans and IBR loans for pre-2014 borrowers require 25 years of payments. Unlike PSLF, the forgiven amount under IDR plans may be treated as taxable income, though a temporary provision has made IDR forgiveness tax-free through the end of 2025. Check current IRS guidance for the tax treatment in your forgiveness year.</p>
487
488<h3>Teacher Loan Forgiveness</h3>
489<p>Teachers who work full-time for five consecutive years in a low-income school or educational service agency may qualify for forgiveness of up to $17,500 on Direct Subsidized and Unsubsidized Loans. Mathematics, science, and special education teachers at the secondary level can receive the full $17,500. Other qualifying teachers receive up to $5,000. You cannot count the same teaching service period toward both Teacher Loan Forgiveness and PSLF, but you can use Teacher Loan Forgiveness for your first five years and then begin counting PSLF payments afterward.</p>
490
491<h3>State-Specific Programs</h3>
492<p>Many states offer their own loan forgiveness or repayment assistance programs, particularly for healthcare workers, lawyers serving underserved populations, and STEM professionals. For example, the National Health Service Corps offers up to $50,000 in loan repayment for healthcare providers working in Health Professional Shortage Areas. The Department of Justice offers up to $60,000 for qualifying attorneys. Check your state's higher education agency website for programs specific to your profession and location.</p>
493
494<h2>Should You Refinance Your Student Loans?</h2>
495<p>Refinancing replaces one or more existing loans with a single new loan at a different interest rate and term. It can be a powerful money-saving tool in the right circumstances, but it comes with significant trade-offs for federal loan holders.</p>
496<p>Refinancing makes sense when you have private student loans with high interest rates, your credit score has improved substantially since you originally borrowed (a score above 720 typically qualifies for the best rates), you have a stable income and emergency fund, and you do not need access to federal repayment protections. Borrowers with excellent credit may qualify for refinanced rates as low as 4.00 to 5.50 percent for fixed-rate loans, or 3.50 to 5.00 percent for variable-rate loans.</p>
497<p>Refinancing does not make sense when you are pursuing PSLF or income-driven repayment forgiveness, since refinancing federal loans into a private loan permanently eliminates access to these programs. You also lose access to federal forbearance and deferment options, income-driven repayment plans, and the death and disability discharge provisions that come with federal loans. If you work in public service or have unstable income, these protections are often worth more than the interest savings from refinancing.</p>
498<p>If you decide to refinance, compare offers from at least three to five lenders. Most lenders offer rate checks with a soft credit pull that does not affect your credit score. Pay attention to whether you are cho
498osing a fixed rate (predictable payments that never change) or a variable rate (lower initial rate that can increase over time based on market conditions). Variable rates are riskier, especially on longer loan terms, because rate increases of 2 to 4 percentage points are possible over a 10-year period. Fixed rates provide certainty and are generally the safer choice for repayment terms longer than five years.</p>
499
500<h2>Methodology and Data Sources</h2>
501<p>This calculator uses the standard amortization formula to compute monthly payments and generate repayment schedules. The monthly payment is calculated as: P = L[r(1+r)^n] / [(1+r)^n - 1], where L is the loan balance, r is the monthly interest rate (annual rate divided by 12), and n is the total number of monthly payments. Interest accrual is computed monthly for simplicity, though actual servicers calculate interest daily.</p>
502<p>Federal student loan interest rates referenced in this tool are sourced from the U.S. Department of Education at <a href="https://studentaid.gov/understand-aid/types/loans/interest-rates" target="_blank" rel="noopener">studentaid.gov</a>. Income-driven repayment estimates use 2026 federal poverty guidelines published by the Department of Health and Human Services. Calculations assume consistent monthly payments with no deferment, forbearance, or missed payments. Actual repayment timelines may vary based on payment timing, servicer processing, and changes to income or repayment plan.</p>
503
504<h2>Frequently Asked Questions</h2>
505
506<h3>How long will it take to pay off my student loans?</h3>
507<p>Under the standard federal repayment plan, student loans are designed to be repaid in 10 years (120 monthly payments). However, if you enroll in an income-driven repayment plan, the timeline extends to 20 or 25 years. The actual time depends on your loan balance, interest rate, and monthly payment amount. Enter your specific loan details in the calculator above to get a personalized payoff date. Making extra payments of even $50 to $100 per month can cut years off your repayment timeline.</p>
508
509<h3>Should I pay off student loans or invest?</h3>
510<p>This depends on your loan interest rate versus expected investment returns. Start by contributing enough to your 401(k) to capture any employer match, as that is an immediate 50 to 100 percent return on your money. After that, compare your loan rate to historical stock market returns of approximately 7 to 10 percent annually. If your student loan rate is above 6 to 7 percent, prioritizing loan repayment provides a guaranteed return equal to your interest rate. If your rate is below 4 to 5 percent, investing the difference may build more wealth over time, though it involves market risk. Many financial advisors recommend a split approach: make minimum loan payments while investing extra funds if your rate is moderate (4 to 6 percent range).</p>
511
512<h3>What happens if I can't make my student loan payments?</h3>
513<p>If you have federal loans, contact your servicer immediately to discuss options. You may qualify for deferment (temporary pause with no interest on subsidized loans) or forbearance (temporary pause, but interest accrues on all loan types). You can also switch to an income-driven repayment plan that may lower your payment to as little as $0 per month if your income is low enough. Missing payments on federal loans leads to delinquency after one day, and default occurs after 270 days of non-payment. Default triggers serious consequences including wage garnishment, tax refund seizure, credit score damage, and loss of eligibility for future federal student aid. For private loans, contact your lender to ask about hardship options, as these vary by lender.</p>
514
515<h3>Can I deduct student loan interest on my taxes?</h3>
516<p>Yes. You can deduct up to $2,500 per year in student loan interest paid on qualified education loans. This is an above-the-line deduction, meaning you can claim it even if you do not itemize deductions. The deduction phases out for single filers with a modified adjusted gross income (MAGI) between $80,000 and $95,000, and for married couples filing jointly with a MAGI between $165,000 and $195,000 (2025 thresholds, adju
516sted annually for inflation). Your loan servicer will send you a Form 1098-E by January 31 each year showing the total interest you paid during the previous tax year.</p>
517
518<h3>What is the average student loan debt in 2026?</h3>
519<p>The average student loan borrower in the United States carries approximately $37,574 in federal student loan debt, according to Federal Student Aid data. Including private loans, the average total education debt is closer to $40,000. However, this figure varies dramatically by degree level. The average bachelor's degree holder carries about $30,000, while professional degree holders (law, medicine, MBA) often owe $100,000 to $250,000 or more. Total outstanding student loan debt in the United States exceeds $1.77 trillion, spread across approximately 45 million borrowers.</p>
520
521<h3>How does student loan debt affect my credit score?</h3>
522<p>Student loans affect your credit score in multiple ways. Payment history is the single largest factor (35 percent of your FICO score), so making every payment on time is critical. Student loans also contribute to your credit mix (10 percent of your score), and having installment loans alongside revolving credit like credit cards can actually improve your score. However, high student loan balances increase your debt-to-income ratio, which lenders consider when evaluating you for mortgages, auto loans, and credit cards. Late payments are reported to credit bureaus after 30 days of delinquency and remain on your credit report for seven years. Default is reported after 270 days and causes severe score drops of 100 points or more. On the positive side, consistently paying your student loans on time builds a strong payment history that benefits your credit profile for years.</p>
523
524</article>
525
526<footer>
527  <p>Student Loan Payoff Calculator - Free tools to help you become debt-free.</p>
528  <p style="margin-top:6px">Affiliate disclosure: We may earn a commission when you check your rate through our partner links. This does not affect your rate or our recommendations.</p>
529  <p style="margin-top:8px"><a href="https://aihowtoinvest.com/debt-payoff/?utm_source=student-loan-calc">Debt Payoff Calculator</a> &middot; <a href="https://aihowtoinvest.com/freelance-rate/?utm_source=student-loan-calc">Freelance Rate Calculator</a> &middot; <a href="https://aihowtoinvest.com/?utm_source=student-loan-calc">All Free Tools</a></p>
530</footer>
531</div>
532
533<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8768030543576045" crossorigin="anonymous"></script>
vendor: 1 bytes, line 533
533
534<script>
535const loans = [];
536let extraPayment = 0;
537
538function fmt(n) { return n.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }); }
539function fmtD(n) { return n.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }); }
540function pmt(rate, nper, pv) {
541  if (rate === 0) return pv / nper;
542  const r = rate / 12;
543  return pv * (r * Math.pow(1 + r, nper)) / (Math.pow(1 + r, nper) - 1);
544}
545
546function switchTab(tab) {
547  document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
548  document.querySelectorAll('.panel').forEach(p => p.classList.remove('active'));
549  event.target.classList.add('active');
550  document.getElementById('panel-' + tab).classList.add('active');
551}
552
553function addLoan() {
554  const name = document.getElementById('loanName').value || 'Loan ' + (loans.length + 1);
555  const type = document.getElementById('loanType').value;
556  const balance = parseFloat(document.getElementById('loanBalance').value);
557  const rate = parseFloat(document.getElementById('loanRate').value);
558  const term = parseFloat(document.getElementById('loanTerm').value) || 10;
559  let payment = parseFloat(document.getElementById('loanPayment').value);
560
561  if (!balance || !rate) { alert('Please enter balance and interest rate.'); return; }
562  if (!payment || payment <= 0) {
563    payment = Math.ceil(pmt(rate / 100, term * 12, balance));
564  }
565
566  loans.push({ name, type, balance, rate, payment, term });
567  renderLoans();
568  document.getElementById('loanName').value = 'Loan ' + (loans.length + 1);
569  document.getElementById('loanBalance').value = '';
570  document.getElementById('loanRate').value = '';
571  document.getElementById('loanPayment').value = '';
572}
573
574function addSampleLoans() {
575  loans.length = 0;
576  loans.push(
577    { name: 'Federal Subsidized', type: 'fed-sub', balance: 15000, rate: 4.99, payment: 0, term: 10 },
578    { name: 'Federal Unsubsidized', type: 'fed-unsub', balance: 12000, rate: 5.50, payment: 0, term: 10 },
579    { name: 'Private Loan', type: 'private', balance: 10000, rate: 7.25, payment: 0, term: 10 }
580  );
581  loans.forEach(l => { if (!l.payment) l.payment = Math.ceil(pmt(l.rate / 100, l.term * 12, l.balance)); });
582  renderLoans();
583  calculate();
584}
585
586function removeLoan(i) {
587  loans.splice(i, 1);
588  renderLoans();
589  if (loans.length === 0) {
590    document.getElementById('payoffResults').style.display = 'none';
591    document.getElementById('loanListContainer').style.display = 'none';
592  }
593}
594
595function renderLoans() {
596  const c = document.getElementById('loanListContainer');
597  const el = document.getElementById('loanList');
598  if (loans.length === 0) { c.style.display = 'none'; return; }
599  c.style.display = 'block';
600  const typeLabels = { 'fed-sub': 'Fed Sub', 'fed-unsub': 'Fed Unsub', 'plus': 'PLUS', 'private': 'Private' };
601  el.innerHTML = loans.map((l, i) =>
602    '<div class="loan-item"><div class="li-info">' +
603    '<span><strong>' + l.name + '</strong></span>' +
604    '<span>Type: <strong>' + typeLabels[l.type] + '</strong></span>' +
605    '<span>Balance: <strong>' + fmt(l.balance) + '</strong></span>' +
606    '<span>Rate: <strong>' + l.rate + '%</strong></span>' +
607    '<span>Payment: <strong>' + fmt(l.payment) + '/mo</strong></span>' +
608    '</div><button class="li-remove" onclick="removeLoan(' + i + ')">&times;</button></div>'
609  ).join('');
610  const total = loans.reduce((s, l) => s + l.balance, 0);
611  document.getElementById('totalDebt').textContent = 'Total Debt: ' + fmt(total);
612}
613
614function amortize(balance, rate, payment, maxMonths) {
615  const monthly = rate / 100 / 12;
616  let b = balance;
617  let totalInterest = 0;
618  const schedule = [];
619  const max = maxMonths || 600;
620  for (let m = 1; m <= max && b > 0.01; m++) {
621    const interest = b * monthly;
622    const principal = Math.min(payment - interest, b);
623    if (payment <= interest) { return { months: Infinity, totalInterest: Infinity, schedule }; }
624    b -= principal;
625    totalInterest += interest;
626    schedule.push({ month: m, principal, interest, balance: Math.max(0, b) });
627  }
628  return { months: schedule.length, totalInterest, schedule };
629}
630
631function calculate() {
632  if (loans.length === 0) return;
633
634  const totalBalance = loans.reduce((s, l) => s + l.balance, 0);
635  const totalPayment = loans.reduce((s, l) => s + l.payment, 0);
636  const weightedRate = loans.reduce((s, l) => s + l.rate * l.balance, 0) / totalBalance;
637
638  // Combined amortization
639  const combined = amortize(totalBalance, weightedRate, totalPayment, 
639600);
640
641  const now = new Date();
642  const payoffDate = new Date(now.getFullYear(), now.getMonth() + combined.months);
643  const payoffStr = payoffDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });
644  const years = Math.floor(combined.months / 12);
645  const mos = combined.months % 12;
646
647  document.getElementById('summaryGrid').innerHTML =
648    '<div class="result-box"><div class="rb-label">Total Debt</div><div class="rb-value">' + fmt(totalBalance) + '</div></div>' +
649    '<div class="result-box"><div class="rb-label">Monthly Payment</div><div class="rb-value">' + fmt(totalPayment) + '</div></div>' +
650    '<div class="result-box"><div class="rb-label">Total Interest</div><div class="rb-value warn">' + fmt(combined.totalInterest) + '</div></div>' +
651    '<div class="result-box"><div class="rb-label">Payoff Date</div><div class="rb-value">' + payoffStr + '</div><div class="rb-sub">' + years + ' yr' + (mos ? ' ' + mos + ' mo' : '') + '</div></div>' +
652    '<div class="result-box"><div class="rb-label">Total Cost</div><div class="rb-value">' + fmt(totalBalance + combined.totalInterest) + '</div></div>' +
653    '<div class="result-box"><div class="rb-label">Avg. Interest Rate</div><div class="rb-value">' + weightedRate.toFixed(2) + '%</div></div>';
654
655  document.getElementById('payoffDateLabel').textContent = payoffStr;
656
657  // Timeline chart
658  renderTimeline(combined.schedule, totalPayment);
659
660  // Snowball vs Avalanche
661  if (loans.length > 1) {
662    document.getElementById('strategyCard').style.display = 'block';
663    const avalanche = simulateStrategy('avalanche', totalPayment);
664    const snowball = simulateStrategy('snowball', totalPayment);
665    const standard = { months: combined.months, totalInterest: combined.totalInterest };
666
667    const best = avalanche.totalInterest <= snowball.totalInterest ? 'avalanche' : 'snowball';
668    const tbody = document.getElementById('strategyBody');
669    tbody.innerHTML = [
670      { name: 'Standard (Equal)', data: standard, key: 'standard' },
671      { name: 'Avalanche (Highest Rate First)', data: avalanche, key: 'avalanche' },
672      { name: 'Snowball (Lowest Balance First)', data: snowball, key: 'snowball' }
673    ].map(s => {
674      const d = new Date(now.getFullYear(), now.getMonth() + s.data.months);
675      const saved = standard.months - s.data.months;
676      return '<tr><td class="strategy-label">' + s.name + (s.key === best ? ' <span style="color:var(--green);font-size:11px">BEST</span>' : '') + '</td>' +
677        '<td class="' + (s.key === best ? 'best' : '') + '">' + fmt(s.data.totalInterest) + '</td>' +
678        '<td>' + d.toLocaleDateString('en-US', { month: 'short', year: 'numeric' }) + '</td>' +
679        '<td>' + (saved > 0 ? saved + ' months faster' : '-') + '</td></tr>';
680    }).join('');
681  } else {
682    document.getElementById('strategyCard').style.display = 'none';
683  }
684
685  document.getElementById('payoffResults').style.display = 'block';
686  document.getElementById('extraSlider').value = 0;
687  document.getElementById('extraLabel').textContent = '$0';
688  document.getElementById('extraResults').style.display = 'none';
689
690  // Animate progress
691  setTimeout(() => { document.getElementById('progressFill').style.width = '3%'; document.getElementById('progressFill').textContent = 'Start'; }, 100);
692}
693
694function simulateStrategy(strategy, totalMonthlyPayment) {
695  let loansCopy = loans.map(l => ({ ...l, remaining: l.balance }));
696  if (strategy === 'avalanche') loansCopy.sort((a, b) => b.rate - a.rate);
697  else loansCopy.sort((a, b) => a.balance - b.balance);
698
699  let totalInterest = 0;
700  let months = 0;
701  const maxMonths = 600;
702
703  while (loansCopy.some(l => l.remaining > 0.01) && months < maxMonths) {
704    months++;
705    let extraPool = 0;
706
707    // Pay minimums first
708    for (const l of loansCopy) {
709      if (l.remaining <= 0.01) continue;
710      const interest = l.remaining * l.rate / 100 / 12;
711      totalInterest += interest;
712      const minPay = Math.min(l.payment, l.remaining + interest);
713      l.remaining -= (minPay - interest);
714      if (l.remaining <= 0.01) {
715        extraPool += l.payment - minPay;
716        l.remaining = 0;
717      }
718    }
719
720    // Apply freed-up payments to target
721    for (const l of loansCopy) {
722      if (l.remaining <= 0.01 || extraPool <= 0) continue;
723      const apply = Math.min(extraPool, l.remaining);
724      l.remaining -= apply;
725      extraPool -= apply;
726    }
727  }
728  return { months, totalInterest };
729}
730
731function updateExtra() {
732  const extra = parseInt(document.getElementById('extraSlider').value);
733  document.getElementById('extraLabel').textContent = fmt(extra);
734
735  if (extra === 0) { document.getElementById('extraResults').style.display = 'none'; return; }
736
737  const totalBalance = loans.reduce((s, l) => s + l.balance, 0);
738  const totalPayment = loans.reduce((s, l) => s + l.payment, 0);
739  const weightedRate = loans.reduce((s, l) => s + l.rate * l.balance, 0) / totalBalance;
740
741  const normal = amortize(totalBalance, weightedRate, totalPayment, 
741600);
742  const boosted = amortize(totalBalance, weightedRate, totalPayment + extra, 600);
743
744  const savedInterest = normal.totalInterest - boosted.totalInterest;
745  const savedMonths = normal.months - boosted.months;
746  const savedYears = Math.floor(savedMonths / 12);
747  const savedMos = savedMonths % 12;
748
749  const newDate = new Date();
750  newDate.setMonth(newDate.getMonth() + boosted.months);
751
752  document.getElementById('extraResults').style.display = 'grid';
753  document.getElementById('extraResults').innerHTML =
754    '<div class="result-box highlight"><div class="rb-label">Interest Saved</div><div class="rb-value">' + fmt(savedInterest) + '</div></div>' +
755    '<div class="result-box highlight"><div class="rb-label">Time Saved</div><div class="rb-value">' + (savedYears ? savedYears + ' yr ' : '') + savedMos + ' mo</div></div>' +
756    '<div class="result-box"><div class="rb-label">New Payment</div><div class="rb-value">' + fmt(totalPayment + extra) + '/mo</div></div>' +
757    '<div class="result-box"><div class="rb-label">New Payoff Date</div><div class="rb-value">' + newDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' }) + '</div></div>';
758
759  // Update progress bar
760  const pct = Math.min(95, Math.round((savedMonths / normal.months) * 100));
761  document.getElementById('progressFill').style.width = Math.max(5, pct) + '%';
762  document.getElementById('progressFill').textContent = pct + '% faster';
763}
764
765function renderTimeline(schedule, monthlyPayment) {
766  const chart = document.getElementById('timelineChart');
767  // Show ~20 data points
768  const step = Math.max(1, Math.floor(schedule.length / 20));
769  const points = [];
770  for (let i = 0; i < schedule.length; i += step) {
771    points.push(schedule[i]);
772  }
773  if (points[points.length - 1] !== schedule[schedule.length - 1]) {
774    points.push(schedule[schedule.length - 1]);
775  }
776
777  chart.innerHTML = points.map(p => {
778    const total = p.principal + p.interest;
779    const pPct = (p.principal / total * 100).toFixed(1);
780    const iPct = (p.interest / total * 100).toFixed(1);
781    const yr = Math.ceil(p.month / 12);
782    return '<div class="bar-row">' +
783      '<div class="bar-label">Yr ' + yr + '</div>' +
784      '<div class="bar-track">' +
785      '<div class="bar-principal" style="width:' + pPct + '%"></div>' +
786      '<div class="bar-interest" style="width:' + iPct + '%"></div>' +
787      '</div></div>';
788  }).join('');
789}
790
791// REFINANCE
792function calcRefinance() {
793  const balance = parseFloat(document.getElementById('refiBalance').value);
794  const curRate = parseFloat(document.getElementById('refiCurrentRate').value);
795  const curTerm = parseFloat(document.getElementById('refiCurrentTerm').value);
796  const newRate = parseFloat(document.getElementById('refiNewRate').value);
797  const newTerm = parseFloat(document.getElementById('refiNewTerm').value);
798  const fees = parseFloat(document.getElementById('refiFees').value) || 0;
799
800  if (!balance || !curRate || !curTerm || !newRate || !newTerm) { alert('Please fill in all fields.'); return; }
801
802  const curPayment = pmt(curRate / 100, curTerm * 12, balance);
803  const newPayment = pmt(newRate / 100, newTerm * 12, balance);
804
805  const curTotal = curPayment * curTerm * 12;
806  const newTotal = newPayment * newTerm * 12 + fees;
807
808  const curInterest = curTotal - balance;
809  const newInterest = newTotal - balance - fees;
810
811  const monthlySavings = curPayment - newPayment;
812  const totalSavings = curTotal - newTotal;
813
814  // Break-even
815  const breakEvenMonths = monthlySavings > 0 ? Math.ceil(fees / monthlySavings) : 0;
816
817  const now = new Date();
818  const curPayoff = new Date(now.getFullYear(), now.getMonth() + curTerm * 12);
819  const newPayoff = new Date(now.getFullYear(), now.getMonth() + newTerm * 12);
820
821  function renderCol(id, rows) {
822    document.getElementById(id).innerHTML = '<h4>' + (id === 'refiCurrent' ? 'Current Loan' : 'Refinanced Loan') + '</h4>' +
823      rows.map(r => '<div class="rc-row"><span class="rc-label">' + r[0] + '</span><span class="rc-val">' + r[1] + '</span></div>').join('');
824  }
825
826  renderCol('refiCurrent', [
827    ['Interest Rate', curRate + '%'],
828    ['Monthly Payment', fmtD(curPayment)],
829    ['Total Interest', fmt(curInterest)],
830    ['Total Cost', fmt(curTotal)],
831    ['Payoff Date', curPayoff.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })]
832  ]);
833
834  renderCol('refiNew', [
835    ['Interest Rate', newRate + '%'],
836    ['Monthly Payment', fmtD(newPayment)],
837    ['Total Interest', fmt(newInterest)],
838    ['Total Cost', fmt(newTotal)],
839    ['Payoff Date', newPayoff.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })]
840  ]);
841
842  document.getElementById('refiSavings').innerHTML =
843    '<div class="result-box ' + (monthlySavings > 0 ? 'highlight' : '') + '"><div class="rb-label">Monthly Savings</div><div class="rb-value">' + fmtD(monthlySavings) + '</div></div>' +
844    '<div class="result-box ' + (totalSavings > 0 ? 'highlight' : '') + '"><div class="rb-label">Total Savings</div><div class="rb-value">' + fmt(totalSavings) + '</div></div>' +
845    (fees > 0 ? '<div class="result-box"><div class="rb-label">Break-Even Point</div><div class="rb-value">' + breakEvenMonths + ' months</div><div class="rb-sub">After this, you start saving</div></div>' : '') +
846    '<div class="result-box"><div class="rb-label">Interest Saved</div><div class="rb-value">' + fmt(curInterest - newInterest) + '</div></div>';
847
848  document.getElementById('refiResults').style.display = 'block';
849}
850
851// IDR PLANS
852function calcIDR() {
853  const balance = parseFloat(document.getElementById('idrBalance').value);
854  const rate = parseFloat(document.getElementById('idrRate').value);
855  const income = parseFloat(document.getElementById('idrIncome').value);
856  const family = parseInt(document.getElementById('idrFamily').value) || 1;
857  const filing = document.getElementById('idrFiling').value;
858  const loanType = document.getElementById('idrLoanType').value;
859
860  if (!balance || !rate || !income) { alert('Please fill in all fields.'); return; }
861
862  // 2026 Federal Poverty Guidelines (continental US)
863  const povertyBase = 16020;
864  const povertyPerPerson = 5720;
865  const povertyLevel = povertyBase + (family - 1) * povertyPerPerson;
866
867  const discretionary = Math.max(0, income - povertyLevel * 1.5);
868  const discretionary225 = Math.max(0, income - povertyLevel * 2.25);
869
870  // Standard 10-year payment
871  const standardPayment = pmt(rate / 100, 120, balance);
872
873  // SAVE Plan (Saving on a Valuable Education)
874  const saveRate = loanType === 'undergrad' ? 0.05 : 0.10;
875  const savePayment = Math.min(discretionary225 * saveRate / 12, standardPayment);
876  const saveForgiveness = loanType === 'undergrad' ? 20 : 25;
877
878  // IBR (Income-Based Repayment)
879  const ibrRate = 0.15; // new borrowers after 2014: 10%, older: 15%
880  const ibrPayment = Math.min(discretionary * ibrRate / 12, standardPayment);
881  const ibrForgiveness = 25;
882
883  // PAYE (Pay As You Earn)
884  const payePayment = Math.min(discretionary * 0.10 / 12, standardPayment);
885  const payeForgiveness = 20;
886
887  // ICR (Income-Contingent Repayment)
888  const icrPayment = Math.min(income * 0.20 / 12, pmt(rate / 100, 144, balance));
889  const icrForgiveness = 25;
890
891  const plans = [
892    { name: 'SAVE', fullName: 'Saving on a Valuable Education', payment: savePayment, forgiveness: saveForgiveness },
893    { name: 'IBR', fullName: 'Income-Based Repayment', payment: ibrPayment, forgiveness: ibrForgiveness },
894    { name: 'PAYE', fullName: 'Pay As You Earn', payment: payePayment, forgiveness: payeForgiveness },
895    { name: 'ICR', fullName: 'Income-Contingent Repayment', payment: icrPayment, forgiveness: icrForgiveness }
896  ];
897
898  // Calculate total paid under each plan (simplified - assumes constant income)
899  plans.forEach(p => {
900    const totalMonths = p.forgiveness * 12;
901    let rem = balance;
902    let totalPaid = 0;
903    const monthlyRate = rate / 100 / 12;
904    for (let m = 0; m < totalMonths && rem > 0.01; m++) {
905      const interest = rem * monthlyRate;
906      const pay = Math.max(0, Math.min(p.payment, rem + interest));
907      rem = rem + interest - pay;
908      totalPaid += pay;
909    }
910    p.totalPaid = totalPaid;
911    p.forgiven = Math.max(0, rem);
912  });
913
914  const bestPlan = plans.reduce((best, p) => p.totalPaid < best.totalPaid ? p : best);
915
916  document.getElementById('idrGrid').innerHTML = plans.map(p =>
917    '<div class="idr-card' + (p === bestPlan ? ' best-plan' : '') + '">' +
918    '<h4>' + p.name + (p === bestPlan ? ' (Lowest Cost)' : '') + '</h4>' +
919    '<div style="font-size:11px;color:var(--text3);margin-bottom:8px">' + p.fullName + '</div>' +
920    '<div class="idr-row"><span>Monthly Payment</span><span class="idr-val">' + fmtD(p.payment) + '</span></div>' +
921    '<div class="idr-row"><span>Total Paid</span><span class="idr-val">' + fmt(p.totalPaid) + '</span></div>' +
922    '<div class="idr-row"><span>Amount Forgiven</span><span class="idr-val" style="color:var(--green)">' + fmt(p.forgiven) + '</span></div>' +
923    '<div class="idr-row"><span>Forgiveness After</span><span class="idr-val">' + p.forgiveness + ' years</span></div>' +
924    '<div class="idr-row"><span>vs Standard (' + fmtD(standardPayment) + '/mo)</span><span class="idr-val">' +
925      (p.payment < standardPayment ? 'Save ' + fmtD(standardPayment - p.payment) + '/mo' : 'Same') + '</span></div>' +
926    '</div>'
927  ).join('') +
928  '<div class="idr-card" style="border-left-color:var(--text3)">' +
929  '<h4>Standard Repayment</h4>' +
930  '<div style="font-size:11px;color:var(--text3);margin-bottom:8px">10-Year Fixed</div>' +
931  '<div class="idr-row"><span>Monthly Payment</span><span class="idr-val">' + fmtD(standardPayment) + '</span></div>' +
932  '<div class="idr-row"><span>Total Paid</span><span class="idr-val">' + fmt(standardPayment * 120) + '</span></div>' +
933  '<div class="idr-row"><span>Amount Forgiven</span><span class="idr-val">$0</span></div>' +
934  '<div class="idr-row"><span>Payoff Time</span><span class="idr-val">10 years</span></div>' +
935  '<div class="idr-row"><span>Total Interest</span><span class="idr-val">' + fmt(standardPayment * 120 - balance) + '</span></div>' +
936  '</div>';
937
938  document.getElementById('idrResults').style.display = 'block';
939}
940
941// Auto-populate refinance tab from loan data
942function syncRefiFromLoans() {
943  if (loans.length > 0) {
944    const total = loans.reduce((s, l) => s + l.balance, 0);
945    const wRate = loans.reduce((s, l) => s + l.rate * l.balance, 0) / total;
946    document.getElementById('refiBalance').value = Math.round(total);
947    document.getElementById('refiCurrentRate').value = wRate.toFixed(2);
948    document.getElementById('idrBalance').value = Math.round(total);
949    document.getElementById('idrRate').value = wRate.toFixed(2);
950  }
951}
952
953// Try AdSense push
954try { (adsbygoogle = window.adsbygoogle || []).push({}); } catch(e) {}
955</script>
955
956
957<div style="margin:24px 0;padding:24px;background:linear-gradient(135deg,#1e3a5f,#2d5a87);border-radius:12px;color:white;text-align:center"><h3 style="margin:0 0 8px;font-size:20px">Want a Professional Report?</h3><p style="margin:0 0 16px;font-size:15px;opacity:0.9">Download a detailed PDF report of your results -- perfect for advisors, attorneys, or your records.</p><a href="https://aihowtoinvest.com/premium" style="display:inline-block;padding:12px 32px;background:#f59e0b;color:#1a1a2e;text-decoration:none;border-radius:8px;font-weight:700;font-size:16px">Get Premium Reports &rarr;</a><p style="margin:12px 0 0;font-size:12px;opacity:0.7">Starting at $4.99 &bull; Instant Download &bull; 30-Day Guarantee</p></div>
958
959<script src=https://dubai-commercial.zivtools.workers.dev/embed.js async></script>
959</body>
960</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.