Parent PLUS Loan Repayment Calculator (U.S. Federal)

This calculator provides estimates for U.S. Federal Parent PLUS Loans. Interest rates and origination fees for new Parent PLUS loans are fixed and set by the U.S. Department of Education, typically updated annually. Input the specific rate and fee applicable to your loan. This tool is for informational purposes only and is not financial advice. For official information, visit StudentAid.gov.

Loan Details:

In-School Deferment & Interest Capitalization:

Note: Parent PLUS loans accrue interest from disbursement. If not paid, it's typically capitalized (added to principal) when repayment begins.

Total Repaid During Repayment Term: ${formatCurrency(totalAmountRepaidDuringTerm)}

Total Interest Paid During Repayment Term: ${formatCurrency(totalInterestPaidDuringTerm)}


Overall Total Interest Paid (incl. any deferment interest paid): ${formatCurrency(overallTotalInterestPaid)}

Overall Out-of-Pocket Cost (Principal Repaid + All Interest + Fees): ${formatCurrency(principalAtRepayment + totalInterestPaidDuringTerm + interestPaidDuringDefermentTotal + originationFeeAmount )}

`; // Generate and Display Amortization Schedule generateAmortizationSchedule(principalAtRepayment, monthlyPayment, monthlyInterestRate, termYears); resultsSectionEl.style.display = 'block'; } function generateAmortizationSchedule(principal, monthlyPayment, monthlyRate, termYears) { amortizationTableBodyEl.innerHTML = ''; // Clear previous schedule calculatorDataStore.amortization = []; // For PDF let currentBalance = principal; let totalInterestPaidThisYear = 0; let totalPrincipalPaidThisYear = 0; let totalPaymentsThisYear = 0; for (let year = 1; year <= termYears; year++) { const yearStartingBalance = currentBalance; totalInterestPaidThisYear = 0; totalPrincipalPaidThisYear = 0; totalPaymentsThisYear = 0; for (let month = 1; month <= 12; month++) { if (currentBalance <= 0.01) break; // Loan paid off const interestForMonth = currentBalance * monthlyRate; let principalForMonth = monthlyPayment - interestForMonth; let actualPayment = monthlyPayment; if (currentBalance < monthlyPayment) { // Final payment adjustment principalForMonth = currentBalance; actualPayment = currentBalance + interestForMonth; } currentBalance -= principalForMonth; if(currentBalance < 0) currentBalance = 0; // Ensure balance doesn't go negative due to float precision totalInterestPaidThisYear += interestForMonth; totalPrincipalPaidThisYear += principalForMonth; totalPaymentsThisYear += actualPayment; } const row = amortizationTableBodyEl.insertRow(); row.insertCell().textContent = year; row.insertCell().textContent = formatCurrency(yearStartingBalance); row.insertCell().textContent = formatCurrency(totalPaymentsThisYear); row.insertCell().textContent = formatCurrency(totalInterestPaidThisYear); row.insertCell().textContent = formatCurrency(totalPrincipalPaidThisYear); row.insertCell().textContent = formatCurrency(currentBalance); calculatorDataStore.amortization.push({ year, startingBalance: yearStartingBalance, totalPayments: totalPaymentsThisYear, interestPaid: totalInterestPaidThisYear, principalPaid: totalPrincipalPaidThisYear, endingBalance: currentBalance }); } } function downloadPDF() { if (!calculatorDataStore.results) { displayError("Please calculate the repayment first."); return; } clearError(); if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined') { displayError('PDF generation library (jsPDF core) is not loaded.'); return; } const JSPDFConstructor = window.jspdf.jsPDF; const doc = new JSPDFConstructor('p', 'pt', 'a4'); if (typeof doc.autoTable !== 'function') { displayError('PDF table plugin (jsPDF-AutoTable) is not functional.'); return; } const inputs = calculatorDataStore.inputs; const results = calculatorDataStore.results; let finalY = 40; doc.setFontSize(16); doc.text("Parent PLUS Loan Repayment Estimate (U.S. Federal)", doc.internal.pageSize.getWidth() / 2, finalY, { align: 'center' }); finalY += 25; doc.setFontSize(10); const inputData = [ ["Loan Amount Requested:", formatCurrency(inputs.loanAmountRequested)], ["Annual Interest Rate:", `${inputs.annualRate.toFixed(3)}%`], ["Origination Fee:", `${inputs.originationFeePercent.toFixed(3)}% (${formatCurrency(results.originationFeeAmount)})`], ["Net Amount Disbursed:", formatCurrency(results.netAmountDisbursed)], ["Loan Repayment Term:", `${inputs.termYears} years (${inputs.loanTermYearsText})`], ["Deferment Period:", `${inputs.defermentYears} years`], ["Pay Interest During Deferment:", inputs.payInterestDuringDefermentText], ["Interest Paid During Deferment:", formatCurrency(results.interestPaidDuringDefermentTotal)], ["Principal Balance at Repayment Start:", formatCurrency(results.principalAtRepayment)] ]; doc.autoTable({ startY: finalY, head: [['Loan Input Summary', 'Value']], body: inputData, theme: 'striped', headStyles: {fillColor: [0,115,170], fontSize:10}, styles: {fontSize: 9}, columnStyles: {0: {fontStyle:'bold', cellWidth: 200}} }); finalY = doc.lastAutoTable.finalY + 20; doc.setFontSize(10); const resultData = [ ["Estimated Monthly Payment:", formatCurrency(results.monthlyPayment)], ["Number of Payments:", results.numberOfPayments.toString()], ["Total Repaid (During Term):", formatCurrency(results.totalAmountRepaidDuringTerm)], ["Total Interest Paid (During Term):", formatCurrency(results.totalInterestPaidDuringTerm)], ["Overall Total Interest Paid:", formatCurrency(results.overallTotalInterestPaid)], ["Overall Out-of-Pocket Cost:", formatCurrency(results.principalAtRepayment + results.totalInterestPaidDuringTerm + results.interestPaidDuringDefermentTotal + results.originationFeeAmount)] ]; doc.autoTable({ startY: finalY, head: [['Repayment Estimate Summary', 'Value']], body: resultData, theme: 'striped', headStyles: {fillColor: [0,115,170], fontSize:10}, styles: {fontSize: 9}, columnStyles: {0: {fontStyle:'bold', cellWidth: 200}, 1: {fontStyle:'bold'}}, didParseCell: function (data) { if(data.row.index >= 0 && data.column.index === 1) { data.cell.styles.fontStyle = 'bold'; } } }); finalY = doc.lastAutoTable.finalY + 20; if (finalY > doc.internal.pageSize.getHeight() - 150) { doc.addPage(); finalY = 40;} doc.setFontSize(11); doc.text("Year-by-Year Amortization Summary:", 14, finalY); finalY += 5; const amortHeaders = [["Year", "Starting Balance", "Total Payments", "Interest Paid", "Principal Paid", "Ending Balance"]]; const amortBody = calculatorDataStore.amortization.map(row => [ row.year, formatCurrency(row.startingBalance), formatCurrency(row.totalPayments), formatCurrency(row.interestPaid), formatCurrency(row.principalPaid), formatCurrency(row.endingBalance) ]); doc.autoTable({ startY: finalY, head: amortHeaders, body: amortBody, theme: 'grid', headStyles: {fillColor: [0,115,170], fontSize:9}, styles: {fontSize: 8, cellPadding:3}, columnStyles: {0: {halign:'center'}, 1:{halign:'right'}, 2:{halign:'right'}, 3:{halign:'right'}, 4:{halign:'right'}, 5:{halign:'right'}} }); finalY = doc.lastAutoTable.finalY + 15; doc.setFontSize(8); doc.setTextColor(150); const disclaimerPdf = "This is an estimate. Actual payments may vary. This calculator assumes interest capitalizes once at the end of deferment if not paid. Consult official sources for precise terms."; const splitDisclaimer = doc.splitTextToSize(disclaimerPdf, doc.internal.pageSize.getWidth() - 28); if (finalY > doc.internal.pageSize.getHeight() - 30) { doc.addPage(); finalY = 40; } doc.text(splitDisclaimer, 14, finalY); doc.save("Parent_PLUS_Loan_Repayment_Estimate.pdf"); } // Event Listeners if (calculateButton) calculateButton.addEventListener('click', calculateRepayment); if (downloadPdfButton) downloadPdfButton.addEventListener('click', downloadPDF); // Initialize // (No specific initialization needed beyond HTML defaults) });
Scroll to Top