Help
RSS
API
Feed
Maltego
Contact
Domain > afrcalculator.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-09-20
104.21.65.64
(
ClassC
)
2026-01-09
172.67.158.202
(
ClassC
)
Port 443
HTTP/1.1 200 OKDate: Fri, 09 Jan 2026 23:26:52 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveAccess-Control-Allow-Origin: *Cache-Control: public, max-age0, must-revalidatereferrer-policy: strict-origin-when-cross-originx-content-type-options: nosniffVary: accept-encodingReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?spSxfCtZUnmqeLCcf48Yx%2FXrPP2n6gHs%2BGPHtq5RmuwpoD60Eha6pDjLs9LHbbrM%2Fr%2F%2Bw9fxxWOtxmcEGvaZ0%2BhqhHcA7Fnvt4Kr6%2BC46vA%3D%3D}}Nel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflarecf-cache-status: DYNAMICCF-RAY: 9bb7b3b9ce74f7ed-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langen>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>AFR Calculator December 2025 - IRS Applicable Federal Rates | Updated Monthly/title> meta namedescription contentCalculate monthly loan payments using December 2025 IRS Applicable Federal Rates (AFR). Updated monthly with current official rates. Free AFR calculator for family loans and private lending.> meta namekeywords contentAFR calculator, IRS applicable federal rates, loan calculator, monthly payment calculator, AFR rates December 2025, December 2025 AFR rates, family loan calculator, private loan rates, AFR calculator December 2025> meta nameauthor contentAFR Loan Calculator> meta namerobots contentindex, follow> !-- Open Graph / Facebook --> meta propertyog:type contentwebsite> meta propertyog:url contenthttps://afrcalculator.com/> meta propertyog:title contentAFR Loan Calculator - IRS Applicable Federal Rates> meta propertyog:description contentCalculate monthly loan payments using current IRS Applicable Federal Rates (AFR). Free calculator with official December 2025 rates for private loans.> meta propertyog:image contenthttps://afrcalculator.com/android-chrome-512x512.png> !-- Twitter --> meta propertytwitter:card contentsummary_large_image> meta propertytwitter:url contenthttps://afrcalculator.com/> meta propertytwitter:title contentAFR Loan Calculator - IRS Applicable Federal Rates> meta propertytwitter:description contentCalculate monthly loan payments using current IRS Applicable Federal Rates (AFR). Free calculator with official December 2025 rates.> meta propertytwitter:image contenthttps://afrcalculator.com/android-chrome-512x512.png> !-- Canonical URL --> link relcanonical hrefhttps://afrcalculator.com/> !-- Chart.js --> script srchttps://cdn.jsdelivr.net/npm/chart.js>/script> !-- Monthly AFR Data --> script srcmonthly-data.js>/script> !-- Dynamic Meta Tags --> script> // Update page title and meta tags dynamically document.addEventListener(DOMContentLoaded, function() { // Update meta tags document.title MONTHLY_DATA.getMetaTitle(); document.querySelector(metanamedescription).setAttribute(content, MONTHLY_DATA.getMetaDescription()); document.querySelector(metanamekeywords).setAttribute(content, MONTHLY_DATA.getMetaKeywords()); document.querySelector(metapropertyog:description).setAttribute(content, MONTHLY_DATA.getMetaDescription()); document.querySelector(metapropertytwitter:description).setAttribute(content, MONTHLY_DATA.getMetaDescription()); // Update JSON-LD structured data const jsonLdScript document.querySelector(scripttypeapplication/ld+json); if (jsonLdScript) { const jsonData JSON.parse(jsonLdScript.textContent); // Update FAQ question text if (jsonData.mainEntity && jsonData.mainEntity1 && jsonData.mainEntity1.acceptedAnswer) { jsonData.mainEntity1.acceptedAnswer.text MONTHLY_DATA.getFAQText(); } // Update mentions section if (jsonData.mentions) { jsonData.mentions.name `IRS Applicable Federal Rates ${MONTHLY_DATA.getMonthYear()}`; jsonData.mentions.description `Current minimum interest rates set by the IRS for private loans to avoid tax implications - ${MONTHLY_DATA.getMonthYear()} rates from Revenue Ruling ${MONTHLY_DATA.revenueRuling}`; } jsonLdScript.textContent JSON.stringify(jsonData); } // Update content text document.getElementById(update-notice-full).innerHTML MONTHLY_DATA.getFullUpdateNotice(); document.getElementById(afr-heading).textContent MONTHLY_DATA.getPageHeading(); document.getElementById(categories-heading).textContent MONTHLY_DATA.getCategoriesHeading(); document.getElementById(faq-text).textContent MONTHLY_DATA.getFAQText(); // Update header and main titles document.getElementById(main-title).textContent MONTHLY_DATA.getMainTitle(); document.getElementById(main-subtitle).textContent MONTHLY_DATA.getMainSubtitle(); document.getElementById(calculator-title).textContent MONTHLY_DATA.getCalculatorTitle(); document.getElementById(faq-title).textContent MONTHLY_DATA.getFAQTitle(); document.getElementById(benefits-title).textContent MONTHLY_DATA.getBenefitsTitle(); document.getElementById(benefits-text).textContent MONTHLY_DATA.getBenefitsText(); document.getElementById(summary-title).textContent MONTHLY_DATA.getSummaryTitle(); document.getElementById(summary-text-1).textContent MONTHLY_DATA.getSummaryText1(); document.getElementById(summary-text-2).textContent MONTHLY_DATA.getSummaryText2(); // Update rate displays document.getElementById(short-rate-display).textContent MONTHLY_DATA.getRateRange(shortTerm); document.getElementById(mid-rate-display).textContent MONTHLY_DATA.getRateRange(midTerm); document.getElementById(long-rate-display).textContent MONTHLY_DATA.getRateRange(longTerm); // Update detailed rates const rates MONTHLY_DATA.afrRates; // Short-term rates document.getElementById(short-monthly).textContent rates.shortTerm.monthly + %; document.getElementById(short-quarterly).textContent rates.shortTerm.quarterly + %; document.getElementById(short-semiannual).textContent rates.shortTerm.semiannual + %; document.getElementById(short-annual).textContent rates.shortTerm.annual + %; // Mid-term rates document.getElementById(mid-monthly).textContent rates.midTerm.monthly + %; document.getElementById(mid-quarterly).textContent rates.midTerm.quarterly + %; document.getElementById(mid-semiannual).textContent rates.midTerm.semiannual + %; document.getElementById(mid-annual).textContent rates.midTerm.annual + %; // Long-term rates document.getElementById(long-monthly).textContent rates.longTerm.monthly + %; document.getElementById(long-quarterly).textContent rates.longTerm.quarterly + %; document.getElementById(long-semiannual).textContent rates.longTerm.semiannual + %; document.getElementById(long-annual).textContent rates.longTerm.annual + %; }); /script> !-- jsPDF for PDF export --> script srchttps://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js>/script> script srchttps://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.31/jspdf.plugin.autotable.min.js>/script> !-- Favicon --> link relicon typeimage/x-icon href/favicon.ico> link relicon typeimage/png sizes32x32 href/favicon-32x32.png> link relicon typeimage/png sizes16x16 href/favicon-16x16.png> link relapple-touch-icon sizes180x180 href/apple-touch-icon.png> link relmanifest href/site.webmanifest> !-- Microsoft Clarity --> script typetext/javascript> (function(c,l,a,r,i,t,y){ caca||function(){(ca.qca.q||).push(arguments)}; tl.createElement(r);t.async1;t.srchttps://www.clarity.ms/tag/+i; yl.getElementsByTagName(r)0;y.parentNode.insertBefore(t,y); })(window, document, clarity, script, s23q79msmb); /script> !-- Google tag (gtag.js) --> script async srchttps://www.googletagmanager.com/gtag/js?idG-GZF1LSHTYJ>/script> script> window.dataLayer window.dataLayer || ; function gtag(){dataLayer.push(arguments);} gtag(js, new Date()); gtag(config, G-GZF1LSHTYJ); /script> !-- Structured Data --> script typeapplication/ld+json> { @context: https://schema.org, @type: WebApplication, name: AFR Loan Calculator December 2025, description: Calculate monthly loan payments using December 2025 IRS Applicable Federal Rates (AFR). Updated monthly with current official rates., url: https://afrcalculator.com/, applicationCategory: FinanceApplication, operatingSystem: Web Browser, dateModified: 2025-06-28, offers: { @type: Offer, price: 0, priceCurrency: USD }, publisher: { @type: Organization, name: AFR Loan Calculator, logo: { @type: ImageObject, url: https://afrcalculator.com/android-chrome-512x512.png, width: 512, height: 512 } }, about: { @type: Thing, name: IRS Applicable Federal Rates December 2025, description: Current minimum interest rates set by the IRS for private loans to avoid tax implications - December 2025 rates from Revenue Ruling 2025-24 } } /script> !-- Calculator Tool Schema --> script typeapplication/ld+json> { @context: https://schema.org, @type: SoftwareApplication, name: AFR Loan Payment Calculator, description: Free online calculator for IRS Applicable Federal Rate (AFR) loan payments. Calculate monthly, quarterly, semiannual, or annual payments using current December 2025 AFR rates., url: https://afrcalculator.com/, applicationCategory: FinanceApplication, applicationSubCategory: LoanCalculator, operatingSystem: Web Browser, browserRequirements: HTML5, JavaScript, memoryRequirements: Minimal, storageRequirements: None, permissions: None, isAccessibleForFree: true, offers: { @type: Offer, price: 0, priceCurrency: USD }, featureList: Calculate AFR loan payments, Multiple compounding periods, Payment schedule generation, PDF export functionality, Bank rate comparison, Interactive charts, Current December 2025 AFR rates , keywords: AFR calculator, IRS applicable federal rates, loan calculator, family loan calculator, AFR rates December 2025, private loan calculator , creator: { @type: Organization, name: AFR Loan Calculator }, dateCreated: 2025-01-01, dateModified: 2025-06-28, version: 2025.7 } /script> !-- How-To Schema for Using Calculator --> script typeapplication/ld+json> { @context: https://schema.org, @type: HowTo, name: How to Calculate AFR Loan Payments, description: Step-by-step guide to calculate loan payments using IRS Applicable Federal Rates (AFR), image: https://afrcalculator.com/android-chrome-512x512.png, totalTime: PT2M, estimatedCost: { @type: MonetaryAmount, currency: USD, value: 0 }, supply: { @type: HowToSupply, name: Loan amount }, { @type: HowToSupply, name: Loan term in years }, { @type: HowToSupply, name: Preferred compounding period } , step: { @type: HowToStep, name: Enter loan amount, text: Input the total loan amount in dollars (e.g., $100,000), url: https://afrcalculator.com/#loanAmount }, { @type: HowToStep, name: Set loan term, text: Enter the loan term in years. The calculator will automatically select the appropriate AFR category (short-term â¤3 years, mid-term 3-9 years, long-term >9 years), url: https://afrcalculator.com/#loanTerm }, { @type: HowToStep, name: Choose compounding period, text: Select monthly, quarterly, semiannual, or annual compounding. Monthly gives the lowest effective rate., url: https://afrcalculator.com/#compounding }, { @type: HowToStep, name: Calculate payment, text: Click Calculate Payment to see your payment amount, schedule, and comparison with bank rates, url: https://afrcalculator.com/#calculate } } /script> !-- FAQ Schema --> script typeapplication/ld+json> { @context: https://schema.org, @type: FAQPage, mainEntity: { @type: Question, name: When do I need to use AFR rates?, acceptedAnswer: { @type: Answer, text: AFR rates must be used for private loans between family members, business partners, or any non-commercial lending arrangement to avoid gift tax implications. The IRS requires loans to charge at least the AFR rate to be considered legitimate debt rather than a gift. } }, { @type: Question, name: How often do AFR rates change?, acceptedAnswer: { @type: Answer, text: The IRS publishes new AFR rates monthly, typically in the last week of each month for the following month. Our calculator is updated with the December 2025 rates from IRS Revenue Ruling 2025-24. } }, { @type: Question, name: Can I use a rate lower than the AFR?, acceptedAnswer: { @type: Answer, text: No, using a rate below the AFR can result in the loan being treated as a gift by the IRS. This could trigger gift tax consequences for the lender and imputed income for the borrower. } }, { @type: Question, name: Whats the difference between AFR categories?, acceptedAnswer: { @type: Answer, text: AFR rates are categorized by loan term: short-term (3 years or less), mid-term (over 3 to 9 years), and long-term (over 9 years). Longer-term loans typically have higher AFR rates to account for increased risk over time. } } } /script> style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, system-ui, sans-serif; background: #f8fafc; color: #334155; line-height: 1.6; min-height: 100vh; } /* Navigation Styles */ .main-nav { background: white; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); position: sticky; top: 0; z-index: 1000; } .nav-container { max-width: 1200px; margin: 0 auto; padding: 0 1rem; display: flex; justify-content: space-between; align-items: center; height: 60px; } .nav-brand a { font-size: 1.25rem; font-weight: 700; color: #1e293b; text-decoration: none; transition: color 0.2s; } .nav-brand a:hover { color: #3b82f6; } .nav-menu { display: flex; gap: 2rem; align-items: center; } .nav-link { color: #64748b; text-decoration: none; font-weight: 500; transition: color 0.2s; position: relative; } .nav-link:hover { color: #3b82f6; } .nav-link.active { color: #3b82f6; } .nav-link.active::after { content: ; position: absolute; bottom: -20px; left: 0; right: 0; height: 3px; background: #3b82f6; } .nav-toggle { display: none; flex-direction: column; background: none; border: none; cursor: pointer; padding: 0.25rem; gap: 4px; } .nav-toggle span { width: 24px; height: 3px; background: #334155; transition: all 0.3s; border-radius: 2px; } .nav-toggle.active span:nth-child(1) { transform: rotate(45deg) translate(6px, 6px); } .nav-toggle.active span:nth-child(2) { opacity: 0; } .nav-toggle.active span:nth-child(3) { transform: rotate(-45deg) translate(6px, -6px); } .container { max-width: 900px; margin: 0 auto; background: white; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); min-height: 100vh; } .header { background: linear-gradient(135deg, #1e40af 0%, #3b82f6 100%); color: white; padding: 3rem 2rem; border-bottom: 1px solid #e2e8f0; } .header h1 { font-size: 2.5rem; font-weight: 800; margin-bottom: 0.5rem; letter-spacing: -0.025em; } .header p { font-size: 1.125rem; opacity: 0.9; font-weight: 400; } .content { padding: 2.5rem 2rem; } .mobile-jump-btn { display: none; background: #1e40af; color: white; border: none; padding: 0.875rem 1.5rem; border-radius: 0.5rem; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; width: 100%; margin-bottom: 1.5rem; text-align: center; } .mobile-jump-btn:hover { background: #1d4ed8; transform: translateY(-1px); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); } .mobile-jump-btn:active { transform: translateY(0); } .update-notice { background: #dbeafe; border: 1px solid #93c5fd; color: #1e40af; padding: 1rem 1.25rem; border-radius: 0.5rem; margin-bottom: 2rem; font-size: 0.95rem; } .update-notice strong { font-weight: 600; } .info-section { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.75rem; padding: 2rem; margin-bottom: 2.5rem; border-left: 4px solid #3b82f6; } .info-section h2 { color: #1e293b; margin-bottom: 1rem; font-size: 1.5rem; font-weight: 700; } .info-section h3 { color: #1e293b; margin-bottom: 1rem; font-size: 1.25rem; font-weight: 700; } .calculator-section h2 { color: #1e293b; margin-bottom: 1.5rem; font-size: 1.5rem; font-weight: 700; } .info-section p { color: #475569; line-height: 1.7; margin-bottom: 1.5rem; } .rate-terms { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-top: 1.5rem; } .rate-term { background: white; border: 1px solid #e2e8f0; padding: 1.25rem; border-radius: 0.5rem; text-align: center; transition: all 0.2s ease; cursor: pointer; } .rate-term:hover { border-color: #3b82f6; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); transform: translateY(-1px); } .rate-details { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid #e2e8f0; text-align: left; animation: slideDown 0.3s ease; } @keyframes slideDown { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .rate-breakdown { display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem; margin-bottom: 1rem; font-size: 0.9rem; } .rate-breakdown div { color: #475569; } .rate-details p { color: #475569; font-size: 0.9rem; margin: 0; font-style: italic; } .rate-term strong { color: #1e40af; display: block; margin-bottom: 0.5rem; font-weight: 600; font-size: 1rem; } .rate-term small { color: #64748b; font-size: 0.875rem; display: block; margin-bottom: 0.5rem; } .rate-display { color: #1e40af; font-weight: 700; font-size: 1.125rem; margin-top: 0.5rem; padding: 0.5rem; background: #dbeafe; border-radius: 0.375rem; border: 1px solid #93c5fd; } .rate-explanation { font-size: 0.95rem; color: #475569; margin-bottom: 1rem; } .info-toggle { color: #3b82f6; cursor: pointer; text-decoration: underline; font-weight: 500; } .info-toggle:hover { color: #1e40af; } .compounding-info { background: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 0.5rem; padding: 1rem; margin-bottom: 1.5rem; font-size: 0.9rem; } .compounding-info ul { margin: 0.5rem 0; padding-left: 1.5rem; } .compounding-info li { margin-bottom: 0.25rem; color: #475569; } .compounding-info em { color: #64748b; font-size: 0.85rem; } .faq-section, .benefits-section, .summary-section { background: white; border: 1px solid #e2e8f0; border-radius: 0.75rem; padding: 2.5rem; margin-top: 2.5rem; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); } .faq-section h2, .benefits-section h2, .summary-section h2 { color: #1e293b; margin-bottom: 2rem; font-size: 1.5rem; font-weight: 700; } .faq-item { margin-bottom: 2rem; padding-bottom: 1.5rem; border-bottom: 1px solid #f1f5f9; } .faq-item:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; } .faq-item h3 { color: #1e40af; margin-bottom: 0.75rem; font-size: 1.125rem; font-weight: 600; } .faq-item p { color: #475569; line-height: 1.7; } .benefits-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; } .benefit-item { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.5rem; padding: 1.5rem; text-align: center; } .benefit-item h3 { color: #1e293b; margin-bottom: 0.75rem; font-size: 1.125rem; font-weight: 600; } .benefit-item p { color: #475569; line-height: 1.6; font-size: 0.95rem; } .summary-section p { color: #475569; line-height: 1.7; margin-bottom: 1rem; } .summary-section p:last-child { margin-bottom: 0; } .calculator-section { background: white; border: 1px solid #e2e8f0; border-radius: 0.75rem; padding: 2.5rem; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); } .form-intro { background: #f0f9ff; border: 1px solid #0ea5e9; border-radius: 0.5rem; padding: 1rem; margin-bottom: 2rem; text-align: center; } .form-intro p { color: #0c4a6e; margin: 0; font-size: 0.95rem; } .form-group { margin-bottom: 1.5rem; } .form-help { font-size: 0.875rem; color: #64748b; margin-top: 0.25rem; font-style: italic; } .dynamic-info { font-size: 0.875rem; color: #059669; margin-top: 0.5rem; font-weight: 500; background: #ecfdf5; padding: 0.5rem; border-radius: 0.25rem; border-left: 3px solid #10b981; display: none; } .dynamic-info.show { display: block; animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .form-group label { display: block; margin-bottom: 0.5rem; font-weight: 600; color: #374151; font-size: 0.95rem; } .form-group input, .form-group select { width: 100%; padding: 0.75rem 1rem; border: 1px solid #d1d5db; border-radius: 0.5rem; font-size: 1rem; transition: all 0.2s ease; background: white; color: #374151; } /* Enhanced select dropdown styling */ .form-group select { padding-right: 3rem; background-image: url(data:image/svg+xml,%3csvg xmlnshttp://www.w3.org/2000/svg fillnone viewBox0 0 20 20%3e%3cpath stroke%236b7280 stroke-linecapround stroke-linejoinround stroke-width2 dm6 8 4 4 4-4/%3e%3c/svg%3e); background-position: right 0.75rem center; background-repeat: no-repeat; background-size: 1.5rem 1.5rem; -webkit-appearance: none; -moz-appearance: none; appearance: none; cursor: pointer; } .form-group select:hover { border-color: #9ca3af; background-image: url(data:image/svg+xml,%3csvg xmlnshttp://www.w3.org/2000/svg fillnone viewBox0 0 20 20%3e%3cpath stroke%23374151 stroke-linecapround stroke-linejoinround stroke-width2 dm6 8 4 4 4-4/%3e%3c/svg%3e); } .form-group select:focus { background-image: url(data:image/svg+xml,%3csvg xmlnshttp://www.w3.org/2000/svg fillnone viewBox0 0 20 20%3e%3cpath stroke%233b82f6 stroke-linecapround stroke-linejoinround stroke-width2 dm6 8 4 4 4-4/%3e%3c/svg%3e); } /* Enhanced number input styling with custom steppers */ .number-input-wrapper { position: relative; display: flex; align-items: center; } .number-input-wrapper inputtypenumber { padding-right: 3rem; -webkit-appearance: textfield; -moz-appearance: textfield; appearance: textfield; } .number-input-wrapper inputtypenumber::-webkit-outer-spin-button, .number-input-wrapper inputtypenumber::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .number-steppers { position: absolute; right: 0.5rem; display: flex; flex-direction: column; gap: 2px; } .stepper-btn { width: 2rem; height: 1.25rem; border: 1px solid #d1d5db; background: #f9fafb; color: #6b7280; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 0.75rem; font-weight: bold; transition: all 0.2s ease; user-select: none; } .stepper-btn:first-child { border-radius: 0.25rem 0.25rem 0 0; } .stepper-btn:last-child { border-radius: 0 0 0.25rem 0.25rem; } .stepper-btn:hover { background: #e5e7eb; color: #374151; border-color: #9ca3af; } .stepper-btn:active { background: #d1d5db; transform: scale(0.95); } .currency-input-wrapper { position: relative; display: flex; align-items: center; } .currency-input-wrapper::before { content: $; position: absolute; left: 1rem; color: #6b7280; font-weight: 500; z-index: 1; pointer-events: none; } .currency-input { padding-left: 2rem !important; } .form-group input:focus, .form-group select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .form-group.error input, .form-group.error select { border-color: #ef4444; box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1); } .error-message { color: #ef4444; font-size: 0.875rem; margin-top: 0.5rem; display: none; } .form-group.error .error-message { display: block; } .calculate-btn { background: #1e40af; color: white; border: none; padding: 0.875rem 2rem; border-radius: 0.5rem; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; width: 100%; margin-top: 1rem; } .calculate-btn:hover { background: #1d4ed8; transform: translateY(-1px); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); } .calculate-btn:active { transform: translateY(0); } .results { margin-top: 2rem; background: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 0.75rem; overflow: hidden; display: none; } .results.show { display: block; animation: slideIn 0.3s ease; } @keyframes slideIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .results-header { background: #1e40af; color: white; padding: 1rem 1.5rem; font-weight: 600; font-size: 1.1rem; } .results-body { padding: 1.5rem; } .result-item { display: flex; justify-content: space-between; align-items: center; padding: 0.875rem 0; border-bottom: 1px solid #e2e8f0; } .result-item:last-child { border-bottom: none; background: #dbeafe; margin: 1rem -1.5rem -1.5rem; padding: 1.25rem 1.5rem; font-weight: 700; color: #1e40af; } .result-label { font-weight: 500; color: #475569; } .result-value { font-weight: 600; color: #1e293b; } .result-item:last-child .result-label, .result-item:last-child .result-value { color: #1e40af; font-size: 1.125rem; } .charts-section { margin-top: 2rem; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.75rem; padding: 2rem; display: none; } .charts-section.show { display: block !important; animation: slideIn 0.3s ease; } .charts-header { text-align: center; margin-bottom: 2rem; } .charts-header h3 { color: #1e293b; font-size: 1.5rem; font-weight: 700; margin-bottom: 0.5rem; } .charts-header p { color: #64748b; font-size: 1rem; } .bank-rate-info { background: #e0f2fe; border: 1px solid #0284c7; border-radius: 0.5rem; padding: 1rem; margin-top: 1rem; font-size: 0.95rem; } .bank-rate-info p { color: #0c4a6e; margin: 0; } .rate-customizer { display: inline-flex; align-items: center; gap: 0.5rem; margin-left: 0.5rem; } .rate-customizer label { font-weight: 500; color: #0c4a6e; } #customBankRate { width: 80px; padding: 0.25rem 0.5rem; border: 1px solid #0284c7; border-radius: 0.25rem; font-size: 0.9rem; } .recalculate-btn { background: #0284c7; color: white; border: none; padding: 0.25rem 0.75rem; border-radius: 0.25rem; font-size: 0.85rem; font-weight: 500; cursor: pointer; transition: background-color 0.2s; } .recalculate-btn:hover { background: #0369a1; } .charts-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; margin-bottom: 2rem; } .chart-container { background: white; border: 1px solid #e2e8f0; border-radius: 0.5rem; padding: 1.5rem; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); } .chart-container h4 { color: #1e293b; font-size: 1.125rem; font-weight: 600; margin-bottom: 1rem; text-align: center; } .savings-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; background: white; border: 1px solid #e2e8f0; border-radius: 0.5rem; padding: 1.5rem; } .savings-item { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem; background: #f8fafc; border-radius: 0.375rem; } .savings-label { font-weight: 500; color: #475569; } .savings-value { font-weight: 700; color: #059669; font-size: 1.125rem; } .chart-insights { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.5rem; padding: 1.5rem; margin-top: 2rem; } .chart-insights h4 { color: #1e293b; font-size: 1.125rem; font-weight: 600; margin-bottom: 1rem; } .insight-bullets { list-style: none; padding: 0; margin: 0; } .insight-bullets li { color: #475569; margin-bottom: 0.75rem; padding-left: 1.5rem; position: relative; line-height: 1.6; } .insight-bullets li:before { content: đĄ; position: absolute; left: 0; font-size: 1rem; } .insight-bullets li:last-child { margin-bottom: 0; } .rate-calc-btn { background: #1e40af; color: white; border: none; padding: 0.5rem 1rem; border-radius: 0.375rem; font-size: 0.875rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; margin-top: 1rem; width: 100%; text-align: center; } .rate-calc-btn:hover { background: #1d4ed8; transform: translateY(-1px); } .rate-calc-btn:active { transform: translateY(0); } .schedule-section { margin-top: 2rem; background: white; border: 1px solid #e2e8f0; border-radius: 0.75rem; padding: 2rem; display: none; } .schedule-section.show { display: block !important; animation: slideIn 0.3s ease; } .schedule-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; flex-wrap: wrap; gap: 1rem; } .schedule-header h3 { color: #1e293b; font-size: 1.5rem; font-weight: 700; } .schedule-controls { display: flex; gap: 0.75rem; } .export-btn, .toggle-btn { background: #1e40af; color: white; border: none; padding: 0.5rem 1rem; border-radius: 0.5rem; font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: background-color 0.2s; } .export-btn:hover, .toggle-btn:hover { background: #1d4ed8; } .toggle-btn { background: #64748b; } .toggle-btn:hover { background: #475569; } .schedule-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-bottom: 2rem; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.5rem; padding: 1.5rem; } .summary-item { display: flex; justify-content: space-between; align-items: center; } .summary-label { font-weight: 500; color: #475569; } .summary-value { font-weight: 700; color: #1e293b; font-size: 1.125rem; } .table-container { overflow-x: auto; border: 1px solid #e2e8f0; border-radius: 0.5rem; } .schedule-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; } .schedule-table th { background: #f1f5f9; color: #1e293b; font-weight: 600; padding: 0.75rem; text-align: left; border-bottom: 2px solid #e2e8f0; } .schedule-table td { padding: 0.75rem; border-bottom: 1px solid #f1f5f9; color: #374151; } .schedule-table tbody tr:hover { background: #f8fafc; } .schedule-table tbody tr:nth-child(even) { background: #f9fafb; } .schedule-table tbody tr:nth-child(even):hover { background: #f1f5f9; } .table-collapsed { max-height: 300px; overflow-y: auto; } /* Templates Section */ .templates-section { background: white; border: 1px solid #e2e8f0; border-radius: 0.75rem; padding: 2.5rem; margin: 2rem 0; } .templates-section h2 { text-align: center; color: #1e293b; font-size: 1.75rem; font-weight: 700; margin-bottom: 0.75rem; } .templates-section > p { text-align: center; color: #64748b; font-size: 1rem; margin-bottom: 2rem; } .templates-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; margin-bottom: 2rem; } .template-card { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.5rem; overflow: hidden; transition: all 0.2s ease; } .template-card:hover { transform: translateY(-2px); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); border-color: #3b82f6; } .template-preview { height: 200px; background: #e2e8f0; overflow: hidden; } .template-preview img { width: 100%; height: 100%; object-fit: cover; object-position: top; } .template-content { padding: 1.5rem; } .template-content h3 { color: #1e293b; font-size: 1.25rem; font-weight: 600; margin-bottom: 0.75rem; } .template-content p { color: #64748b; font-size: 0.9rem; margin-bottom: 1rem; line-height: 1.6; } .template-features { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-bottom: 1rem; } .template-feature { font-size: 0.8rem; color: #059669; font-weight: 500; padding: 0.25rem 0.5rem; background: #ecfdf5; border-radius: 0.25rem; } .template-button { display: inline-block; background: #1e40af; color: white; padding: 0.625rem 1.25rem; border-radius: 0.375rem; font-size: 0.9rem; font-weight: 500; text-decoration: none; transition: all 0.2s ease; } .template-button:hover { background: #1d4ed8; transform: translateY(-1px); } .templates-cta { text-align: center; padding-top: 1.5rem; border-top: 1px solid #e2e8f0; } .templates-cta p { color: #64748b; font-size: 1rem; margin-bottom: 1rem; } .secondary-cta { display: inline-block; background: transparent; color: #1e40af; padding: 0.75rem 1.5rem; border: 2px solid #1e40af; border-radius: 0.375rem; font-weight: 600; text-decoration: none; transition: all 0.2s ease; } .secondary-cta:hover { background: #1e40af; color: white; transform: translateY(-1px); } @media (max-width: 768px) { /* Mobile Navigation */ .nav-toggle { display: flex; } .nav-menu { position: fixed; top: 60px; left: 0; right: 0; background: white; flex-direction: column; padding: 1rem; gap: 1rem; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transform: translateY(-100%); opacity: 0; transition: all 0.3s ease; pointer-events: none; } .nav-menu.active { transform: translateY(0); opacity: 1; pointer-events: all; } .nav-link { display: block; padding: 0.75rem 1rem; border-radius: 0.375rem; transition: background 0.2s; } .nav-link:hover { background: #f1f5f9; } .nav-link.active::after { display: none; } .nav-link.active { background: #e0f2fe; color: #3b82f6; } .header { padding: 2rem 1.5rem; } .header h1 { font-size: 2rem; } .content { padding: 2rem 1.5rem; } .info-section, .calculator-section { padding: 1.5rem; } .charts-grid { grid-template-columns: 1fr; gap: 1.5rem; } .chart-container { padding: 1rem; min-width: 0; } .savings-summary { grid-template-columns: 1fr; gap: 0.75rem; padding: 1rem; } .savings-item { padding: 0.5rem; flex-direction: column; align-items: flex-start; gap: 0.25rem; } .savings-value { font-size: 1rem; } .charts-section { padding: 1.5rem; } .schedule-section { padding: 1.5rem; } .schedule-summary { grid-template-columns: 1fr; gap: 0.75rem; padding: 1rem; } .mobile-jump-btn { display: block; } .templates-section { padding: 1.5rem; } .templates-grid { grid-template-columns: 1fr; } .template-preview { height: 150px; } } /* Floating Feedback Button */ .feedback-btn { position: fixed; bottom: 20px; right: 20px; background: #4f46e5; color: white; padding: 0.5rem 0.75rem; border-radius: 20px; text-decoration: none; font-size: 0.8rem; font-weight: 500; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); z-index: 1000; transition: all 0.2s ease; } .feedback-btn:hover { background: #4338ca; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); color: white; text-decoration: none; } .feedback-btn:active { transform: translateY(0); } @media (max-width: 768px) { .feedback-btn { bottom: 10px; right: 10px; padding: 0.4rem 0.6rem; font-size: 0.75rem; } } /style>/head>body> !-- Floating Feedback Button --> a hrefhttps://docs.google.com/forms/d/e/1FAIpQLSewGyv3iXFs4Ug1dem0hfITKwkgijVOcbaDnM0iIJFL96AC4A/viewform?uspdialog target_blank relnoopener noreferrer classfeedback-btn titleSend Feedback> đŦ Feedback /a> nav classmain-nav> div classnav-container> div classnav-brand> a href/>AFR Calculator/a> /div> button classnav-toggle idnavToggle aria-labelToggle navigation> span>/span> span>/span> span>/span> /button> div classnav-menu idnavMenu> a href/ classnav-link active>AFR Calculator/a> a href/loan-calculator.html classnav-link>Basic Loan Calculator/a> a href/historical-applicable-federal-rates.html classnav-link>Historical AFR Rates/a> a href/blog.html classnav-link>Blog & Resources/a> /div> /div> /nav> div classcontainer> header classheader> h1 idmain-title>AFR Loan Calculator - December 2025/h1> p idmain-subtitle>Calculate monthly payments using current December 2025 IRS Applicable Federal Rates/p> /header> main classcontent> button classmobile-jump-btn onclickjumpToCalculator()> Go To Calculator /button> div classupdate-notice idupdate-notice-full> strong>â Updated for December 2025:/strong> Current AFR rates loaded (Last updated: December 1, 2025). a href/historical-applicable-federal-rates.html target_blank stylecolor: #856404; text-decoration: underline;>View all AFR rates/a> /div> section classinfo-section> h2 idafr-heading>What are Applicable Federal Rates (AFR) for December 2025?/h2> p>AFR rates are minimum interest rates set by the IRS for private loans to avoid tax implications. These rates are published monthly and vary by loan term. Family loans, intra-family loans, and private lending arrangements must use at least the AFR rate to avoid gift tax consequences. a hrefhttps://www.irs.gov/applicable-federal-rates target_blank stylecolor: #4facfe; font-size: 0.9em;>Learn more about AFR/a>/p> h3 idcategories-heading>AFR Rate Categories for December 2025/h3> p classrate-explanation> Rate ranges reflect different compounding periods (monthly to annual). span classinfo-toggle onclicktoggleInfo()>âšī¸ Why different rates?/span> /p> div idcompounding-info classcompounding-info styledisplay: none;> strong>Compounding Frequency Guide:/strong> ul> li>strong>Monthly (lowest rate):/strong> Best for borrowers, payments spread evenly/li> li>strong>Quarterly:/strong> Good compromise between simplicity and cost/li> li>strong>Semiannual:/strong> Less frequent payments, slightly higher rate/li> li>strong>Annual (highest rate):/strong> Simplest structure, one payment per year/li> /ul> em>Choose based on cash flow needs and administrative preference./em> /div> div classrate-terms> div classrate-term onclicktoggleRateDetails(short)> strong>Short-term AFR/strong> small>3 years or less/small> div classrate-display idshort-rate-display>3.60% - 3.66%/div> div classrate-details idshort-details styledisplay: none;> div classrate-breakdown> div>strong>Monthly:/strong> span idshort-monthly>3.60%/span>/div> div>strong>Quarterly:/strong> span idshort-quarterly>3.61%/span>/div> div>strong>Semiannual:/strong> span idshort-semiannual>3.63%/span>/div> div>strong>Annual:/strong> span idshort-annual>3.66%/span>/div> /div> p>strong>Best for:/strong> Short-term family loans, bridge financing, emergency loans/p> button classrate-calc-btn onclickjumpToCalculator()>Go to Calculator â/button> /div> /div> div classrate-term onclicktoggleRateDetails(mid)> strong>Mid-term AFR/strong> small>Over 3 to 9 years/small> div classrate-display idmid-rate-display>3.72% - 3.79%/div> div classrate-details idmid-details styledisplay: none;> div classrate-breakdown> div>strong>Monthly:/strong> span idmid-monthly>3.72%/span>/div> div>strong>Quarterly:/strong> span idmid-quarterly>3.73%/span>/div> div>strong>Semiannual:/strong> span idmid-semiannual>3.75%/span>/div> div>strong>Annual:/strong> span idmid-annual>3.79%/span>/div> /div> p>strong>Best for:/strong> Business loans, equipment financing, home purchases/p> button classrate-calc-btn onclickjumpToCalculator()>Go to Calculator â/button> /div> /div> div classrate-term onclicktoggleRateDetails(long)> strong>Long-term AFR/strong> small>Over 9 years/small> div classrate-display idlong-rate-display>4.46% - 4.55%/div> div classrate-details idlong-details styledisplay: none;> div classrate-breakdown> div>strong>Monthly:/strong> span idlong-monthly>4.46%/span>/div> div>strong>Quarterly:/strong> span idlong-quarterly>4.47%/span>/div> div>strong>Semiannual:/strong> span idlong-semiannual>4.50%/span>/div> div>strong>Annual:/strong> span idlong-annual>4.55%/span>/div> /div> p>strong>Best for:/strong> Real estate loans, long-term business financing, estate planning/p> button classrate-calc-btn onclickjumpToCalculator()>Go to Calculator â/button> /div> /div> /div> /section> section classcalculator-section> h2 idcalculator-title>December 2025 AFR Loan Payment Calculator/h2> div classform-intro> p>đĄ strong>Ready to calculate!/strong> Default values are loaded - click Calculate Payment to see results, or adjust the amounts below./p> p>đ Need to use a custom interest rate? Use our a href/loan-calculator.html>Basic Loan Calculator/a> instead./p> /div> form idloanForm> div classform-group idloanAmountGroup> label forloanAmount>Loan Amount/label> div classcurrency-input-wrapper> input typetext idloanAmount classcurrency-input value100,000 min1000 step1000 required> /div> div classform-help idamountHelp>Common amounts: $50K (family loan), $250K (home purchase), $500K+ (business loan)/div> div classerror-message>Please enter a valid loan amount/div> /div> div classform-group idloanTermGroup> label forloanTerm>Loan Term (years)/label> div classnumber-input-wrapper> input typenumber idloanTerm value5 min1 max30 step1 required> div classnumber-steppers> div classstepper-btn onclickincrementYear()>â˛/div> div classstepper-btn onclickdecrementYear()>âŧ/div> /div> /div> div classform-help idtermHelp>Enter loan term in years - well automatically select the right AFR category/div> div classdynamic-info idtermDynamicInfo>/div> div classerror-message>Please enter a valid loan term (1-30 years)/div> /div> div classform-group idcompoundingGroup> label forcompounding>Compounding Period/label> select idcompounding required> option valuemonthly selected>Monthly (lowest rate, most common)/option> option valuequarterly>Quarterly (moderate rate)/option> option valuesemiannual>Semiannual (higher rate)/option> option valueannual>Annual (highest rate, simplest)/option> /select> div classform-help idcompoundingHelp>Monthly compounding gives the lowest effective rate and most frequent payments/div> div classdynamic-info idcompoundingDynamicInfo>/div> div classerror-message>Please select a compounding period/div> /div> button typesubmit classcalculate-btn>Calculate Payment/button> /form> div idresults classresults> div classresults-header> Calculation Results /div> div classresults-body> div classresult-item> span classresult-label>Loan Amount:/span> span classresult-value iddisplayAmount>/span> /div> div classresult-item> span classresult-label>Loan Term:/span> span classresult-value iddisplayTerm>/span> /div> div classresult-item> span classresult-label>AFR Category:/span> span classresult-value iddisplayCategory>/span> /div> div classresult-item> span classresult-label>Applied AFR Rate:/span> span classresult-value iddisplayRate>/span> /div> div classresult-item> span classresult-label>Monthly Payment:/span> span classresult-value iddisplayPayment>/span> /div> /div> /div> div idcharts-section classcharts-section styledisplay: none;> div classcharts-header> h3>Savings Comparison vs. Bank Loans/h3> p>See how much you could save with AFR rates compared to typical bank loan rates/p> div classbank-rate-info> p>Bank rate comparison: input typenumber idcustomBankRate step0.01 min0.01 max30 placeholder7.00 value7.00>% button idrecalculateBtn classrecalculate-btn>Update/button> /p> /div> /div> div classcharts-grid> div classchart-container> h4 idpaymentChartTitle>Payment Comparison/h4> canvas idpaymentChart>/canvas> /div> div classchart-container> h4>Total Interest Savings/h4> canvas idsavingsChart>/canvas> /div> /div> div classsavings-summary> div classsavings-item> span classsavings-label>Monthly Savings:/span> span classsavings-value idmonthlySavings>/span> /div> div classsavings-item> span classsavings-label>Total Interest Savings:/span> span classsavings-value idtotalSavings>/span> /div> div classsavings-item> span classsavings-label>Percentage Saved:/span> span classsavings-value idpercentSaved>/span> /div> /div> div classchart-insights> h4>Understanding Your Results/h4> ul classinsight-bullets> li>strong>Payment Comparison Chart/strong> - Shows how much youll pay per period with AFR rates vs. typical bank loan rates/li> li>strong>Interest Breakdown Chart/strong> - Visualizes how much of your total cost is principal vs. interest vs. bank loan markup/li> li>strong>Savings Summary/strong> - Calculates exactly how much money you save by using AFR rates instead of bank financing/li> /ul> /div> /div> div idschedule-section classschedule-section styledisplay: none;> div classschedule-header> h3>Payment Schedule/h3> div classschedule-controls> button idexportPdfBtn classexport-btn>đ Export to PDF/button> button idtoggleScheduleBtn classtoggle-btn>Show Full Schedule/button> /div> /div> div classschedule-summary> div classsummary-item> span classsummary-label>Total Payments:/span> span classsummary-value idtotalPayments>/span> /div> div classsummary-item> span classsummary-label>Total Interest:/span> span classsummary-value idtotalInterestPaid>/span> /div> div classsummary-item> span classsummary-label>Total Amount:/span> span classsummary-value idtotalAmountPaid>/span> /div> /div> div classtable-container> table idpaymentScheduleTable classschedule-table> thead> tr> th>Payment #/th> th>Payment Date/th> th>Payment Amount/th> th>Principal/th> th>Interest/th> th>Remaining Balance/th> /tr> /thead> tbody idscheduleTableBody> !-- Payment schedule rows will be inserted here --> /tbody> /table> /div> /div> /section> !-- Free Templates Section --> section classtemplates-section> h2>Free Loan Document Templates/h2> p>Professional templates for loan agreements and payment tracking - no signup required!/p> div classtemplates-grid> div classtemplate-card> div classtemplate-preview> img srcloanagreementpreview.png altLoan Agreement Template Preview> /div> div classtemplate-content> h3>Personal Loan Agreement/h3> p>Professional loan agreement with AFR compliance provisions and legal protections./p> div classtemplate-features> span classtemplate-feature>â AFR Compliant/span> span classtemplate-feature>â Fill-in-the-blank/span> span classtemplate-feature>â Print Ready/span> /div> a hrefhttps://app.afrcalculator.com/templates/contract-agreement classtemplate-button target_blank> Get Free Template â /a> /div> /div> div classtemplate-card> div classtemplate-preview> img srcpaymentschedulepreview.png altPayment Tracking Template Preview> /div> div classtemplate-content> h3>Payment Tracking Sheet/h3> p>Track loan payments with this comprehensive spreadsheet template for record keeping./p> div classtemplate-features> span classtemplate-feature>â Payment History/span> span classtemplate-feature>â Balance Tracking/span> span classtemplate-feature>â Tax Ready/span> /div> a hrefhttps://app.afrcalculator.com/templates/payment-tracking classtemplate-button target_blank> Get Free Template â /a> /div> /div> /div> div classtemplates-cta> p>Need more than templates? Our app automates everything!/p> a hrefhttps://app.afrcalculator.com/auth/sign-up classsecondary-cta target_blank> Try the Full App Free â /a> /div> /section> section classfaq-section> h2 idfaq-title>Frequently Asked Questions - December 2025 AFR Rates/h2> div classfaq-item> h3>When do I need to use AFR rates?/h3> p>AFR rates must be used for private loans between family members, business partners, or any non-commercial lending arrangement to avoid gift tax implications. The IRS requires loans to charge at least the AFR rate to be considered legitimate debt rather than a gift./p> /div> div classfaq-item> h3>How often do AFR rates change?/h3> p idfaq-text>The IRS publishes new AFR rates monthly, typically in the last week of each month for the following month. Our calculator is updated with the December 2025 rates from IRS Revenue Ruling 2025-24. Rates are based on average market yields of outstanding marketable obligations of the United States with varying periods to maturity./p> /div> div classfaq-item> h3>Can I use a rate lower than the AFR?/h3> p>No, using a rate below the AFR can result in the loan being treated as a gift by the IRS. This could trigger gift tax consequences for the lender and imputed income for the borrower. Always use at least the minimum AFR rate for your loan term./p> /div> div classfaq-item> h3>Whats the difference between AFR categories?/h3> p>AFR rates are categorized by loan term: short-term (3 years or less), mid-term (over 3 to 9 years), and long-term (over 9 years). Longer-term loans typically have higher AFR rates to account for increased risk over time./p> /div> /section> section classbenefits-section> h2 idbenefits-title>Benefits of Using Our December 2025 AFR Calculator/h2> div classbenefits-grid> div classbenefit-item> h3>đ¯ Accurate Calculations/h3> p idbenefits-text>Always updated with the latest IRS-published AFR rates - currently featuring December 2025 rates for precise loan payment calculations./p> /div> div classbenefit-item> h3>đ Multiple Compounding Options/h3> p>Calculate payments for monthly, quarterly, semiannual, or annual compounding periods./p> /div> div classbenefit-item> h3>⥠Instant Results/h3> p>Get immediate calculations for family loans, business loans, and private lending arrangements./p> /div> div classbenefit-item> h3>đą Mobile Friendly/h3> p>Access the calculator from any device - desktop, tablet, or smartphone./p> /div> /div> /section> section classsummary-section> h2 idsummary-title>December 2025 AFR Loan Calculator Summary/h2> p idsummary-text-1>Our December 2025 AFR loan calculator helps you determine monthly payments for private loans using the latest IRS Applicable Federal Rates for December 2025. Whether youre setting up a family loan, intra-family mortgage, or business loan arrangement, this tool ensures compliance with IRS requirements while providing accurate payment schedules based on the most current rates./p> p>The calculator automatically selects the appropriate AFR category based on your loan term and applies the correct rate for your chosen compounding frequency. This eliminates guesswork and ensures your loan meets federal tax requirements./p> p idsummary-text-2>strong>Key Features:/strong> Current December 2025 AFR rates, automatic rate selection, multiple compounding options, instant calculations, and mobile-responsive design. Perfect for estate planning, family financial arrangements, and business lending scenarios./p> /section> /main> footer stylebackground-color: #f3f4f6; padding: 2rem 0; margin-top: 4rem; border-top: 1px solid #e5e7eb;> div styletext-align: center;> p stylecolor: #6b7280; margin: 0; font-size: 0.9rem;> Have questions or feedback about the AFR Calculator? /p> p stylemargin: 0.5rem 0 0 0;> a href/cdn-cgi/l/email-protection#ed9e8e829999ad8c8b9f8e8c818e98818c99829fc38e8280 stylecolor: #3b82f6; text-decoration: none; font-weight: 500;> span class__cf_email__ data-cfemail7704141803033716110514161b14021b160318055914181a>email protected/span> /a> /p> /div> /footer> /div> script data-cfasyncfalse src/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js>/script>script> // AFR rates loaded from monthly-data.js const afrRates MONTHLY_DATA.afrRates; function getAFRCategory(years) { if (years 3) return shortTerm; if (years 9) return midTerm; return longTerm; } function getCategoryDisplayName(category) { const names { shortTerm: Short-term (â¤3 years), midTerm: Mid-term (3-9 years), longTerm: Long-term (>9 years) }; return namescategory; } function calculatePayment(principal, annualRate, years, compounding) { let periodsPerYear, totalPayments, periodRate; switch(compounding) { case monthly: periodsPerYear 12; break; case quarterly: periodsPerYear 4; break; case semiannual: periodsPerYear 2; break; case annual: periodsPerYear 1; break; default: periodsPerYear 12; } periodRate annualRate / 100 / periodsPerYear; totalPayments years * periodsPerYear; if (periodRate 0) { return principal / totalPayments; } const payment principal * (periodRate * Math.pow(1 + periodRate, totalPayments)) / (Math.pow(1 + periodRate, totalPayments) - 1); return payment; } function getPaymentFrequencyLabel(compounding) { const labels { monthly: Monthly Payment:, quarterly: Quarterly Payment:, semiannual: Semiannual Payment:, annual: Annual Payment: }; return labelscompounding || Monthly Payment:; } function formatCurrency(amount) { return new Intl.NumberFormat(en-US, { style: currency, currency: USD }).format(amount); } // Bank loan rates for comparison (typical market rates) function getBankRate(years, customRate null) { if (customRate && customRate > 0) { return customRate; } if (years 3) return 7.50; // Short-term personal loans if (years 9) return 6.50; // Mid-term loans return 7.00; // Long-term loans } function getBankRateDescription(years) { if (years 3) return 7.50% (typical short-term loan rate); if (years 9) return 6.50% (typical mid-term loan rate); return 7.00% (typical long-term loan rate); } function calculateTotalInterest(principal, rate, years) { const monthlyRate rate / 100 / 12; const totalPayments years * 12; if (monthlyRate 0) { return 0; } const monthlyPayment principal * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) - 1); return (monthlyPayment * totalPayments) - principal; } function calculateTotalInterestWithCompounding(principal, rate, years, compounding) { let periodsPerYear; switch(compounding) { case monthly: periodsPerYear 12; break; case quarterly: periodsPerYear 4; break; case semiannual: periodsPerYear 2; break; case annual: periodsPerYear 1; break; default: periodsPerYear 12; } const periodRate rate / 100 / periodsPerYear; const totalPayments years * periodsPerYear; if (periodRate 0) { return 0; } const payment principal * (periodRate * Math.pow(1 + periodRate, totalPayments)) / (Math.pow(1 + periodRate, totalPayments) - 1); return (payment * totalPayments) - principal; } let paymentChart null; let savingsChart null; function createPaymentChart(afrPayment, bankPayment, compounding) { const ctx document.getElementById(paymentChart).getContext(2d); if (paymentChart) { paymentChart.destroy(); } // Get proper payment frequency label const frequencyLabels { monthly: Monthly Payment, quarterly: Quarterly Payment, semiannual: Semiannual Payment, annual: Annual Payment }; const paymentLabel frequencyLabelscompounding || Payment; paymentChart new Chart(ctx, { type: bar, data: { labels: AFR Loan, Bank Loan, datasets: { label: paymentLabel, data: afrPayment, bankPayment, backgroundColor: #3b82f6, #ef4444, borderColor: #1e40af, #dc2626, borderWidth: 1 } }, options: { responsive: true, plugins: { legend: { display: false } }, scales: { y: { beginAtZero: true, ticks: { callback: function(value) { return $ + value.toLocaleString(); } } } } } }); } function createSavingsChart(afrInterest, bankInterest, principal) { const ctx document.getElementById(savingsChart).getContext(2d); if (savingsChart) { savingsChart.destroy(); } savingsChart new Chart(ctx, { type: doughnut, data: { labels: Principal, AFR Interest, Additional Bank Interest, datasets: { data: principal, afrInterest, bankInterest - afrInterest, backgroundColor: #10b981, #3b82f6, #ef4444, borderColor: #059669, #1e40af, #dc2626, borderWidth: 2 } }, options: { responsive: true, plugins: { legend: { position: bottom } } } }); } let currentLoanData {}; // Store current calculation datafunction showSavingsAnalysis(loanAmount, loanTerm, afrRate, afrPayment, compounding) { currentLoanData { loanAmount, loanTerm, afrRate, afrPayment, compounding }; const customRate parseFloat(document.getElementById(customBankRate).value); const bankRate getBankRate(loanTerm, customRate); // Calculate payments using the users selected compounding frequency const afrSelectedPayment calculatePayment(loanAmount, afrRate, loanTerm, compounding); const bankSelectedPayment calculatePayment(loanAmount, bankRate, loanTerm, compounding); // Calculate total interest using the same frequency const afrTotalInterest calculateTotalInterestWithCompounding(loanAmount, afrRate, loanTerm, compounding); const bankTotalInterest calculateTotalInterestWithCompounding(loanAmount, bankRate, loanTerm, compounding); const paymentSavings bankSelectedPayment - afrSelectedPayment; const totalSavings bankTotalInterest - afrTotalInterest; const percentSaved ((totalSavings / bankTotalInterest) * 100); // Update savings summary labels based on compounding frequency const frequencyLabels { monthly: Monthly, quarterly: Quarterly, semiannual: Semiannual, annual: Annual }; const frequencyLabel frequencyLabelscompounding || Payment; // Update summary values and labels document.querySelector(.savings-item:first-child .savings-label).textContent `${frequencyLabel} Savings:`; document.getElementById(monthlySavings).textContent formatCurrency(paymentSavings); document.getElementById(totalSavings).textContent formatCurrency(totalSavings); document.getElementById(percentSaved).textContent percentSaved.toFixed(1) + %; // Show charts section first const chartsSection document.getElementById(charts-section); chartsSection.style.display block; chartsSection.classList.add(show); // Update chart title document.getElementById(paymentChartTitle).textContent `${frequencyLabel} Payment Comparison`; // Create charts after the section is visible setTimeout(() > { createPaymentChart(afrSelectedPayment, bankSelectedPayment, compounding); createSavingsChart(afrTotalInterest, bankTotalInterest, loanAmount); }, 100); // Generate and show payment schedule using the selected compounding frequency generatePaymentSchedule(loanAmount, loanTerm, afrRate, afrPayment, compounding); } function generatePaymentSchedule(principal, years, annualRate, payment, compounding) { let periodsPerYear; switch(compounding) { case monthly: periodsPerYear 12; break; case quarterly: periodsPerYear 4; break; case semiannual: periodsPerYear 2; break; case annual: periodsPerYear 1; break; default: periodsPerYear 12; } const periodRate annualRate / 100 / periodsPerYear; const totalPayments Math.ceil(years * periodsPerYear); let remainingBalance principal; let totalInterestPaid 0; let totalAmountPaid 0; const schedule ; const today new Date(); for (let i 1; i totalPayments; i++) { const interestPayment remainingBalance * periodRate; let principalPayment payment - interestPayment; let currentPayment payment; // Handle final payment if (remainingBalance principalPayment) { principalPayment remainingBalance; currentPayment principalPayment + interestPayment; } remainingBalance - principalPayment; totalInterestPaid + interestPayment; totalAmountPaid + currentPayment; const paymentDate new Date(today); switch(compounding) { case monthly: paymentDate.setMonth(paymentDate.getMonth() + i); break; case quarterly: paymentDate.setMonth(paymentDate.getMonth() + (i * 3)); break; case semiannual: paymentDate.setMonth(paymentDate.getMonth() + (i * 6)); break; case annual: paymentDate.setFullYear(paymentDate.getFullYear() + i); break; } schedule.push({ paymentNumber: i, paymentDate: paymentDate.toLocaleDateString(en-US, { year: numeric, month: short, day: numeric }), paymentAmount: currentPayment, principalPayment: principalPayment, interestPayment: interestPayment, remainingBalance: Math.max(0, remainingBalance) }); if (remainingBalance 0.01) break; } // Update summary document.getElementById(totalPayments).textContent schedule.length; document.getElementById(totalInterestPaid).textContent formatCurrency(totalInterestPaid); document.getElementById(totalAmountPaid).textContent formatCurrency(totalAmountPaid); // Store schedule for PDF export window.currentSchedule schedule; window.currentLoanDetails { principal: principal, years: years, rate: annualRate, monthlyPayment: payment, totalInterest: totalInterestPaid, totalAmount: totalAmountPaid }; // Populate table (show first 12 payments initially) populateScheduleTable(schedule, 12); // Show schedule section const scheduleSection document.getElementById(schedule-section); scheduleSection.style.display block; scheduleSection.classList.add(show); } function populateScheduleTable(schedule, maxRows null) { const tbody document.getElementById(scheduleTableBody); tbody.innerHTML ; const rowsToShow maxRows ? schedule.slice(0, maxRows) : schedule; const tableContainer document.querySelector(.table-container); if (maxRows && schedule.length > maxRows) { tableContainer.classList.add(table-collapsed); } else { tableContainer.classList.remove(table-collapsed); } rowsToShow.forEach((payment, index) > { const row document.createElement(tr); row.innerHTML ` td>${payment.paymentNumber}/td> td>${payment.paymentDate}/td> td>${formatCurrency(payment.paymentAmount)}/td> td>${formatCurrency(payment.principalPayment)}/td> td>${formatCurrency(payment.interestPayment)}/td> td>${formatCurrency(payment.remainingBalance)}/td> `; tbody.appendChild(row); }); // Update toggle button text const toggleBtn document.getElementById(toggleScheduleBtn); if (maxRows && schedule.length > maxRows) { toggleBtn.textContent `Show All ${schedule.length} Payments`; } else { toggleBtn.textContent Show Summary (12 payments); } } function exportToPDF() { if (!window.currentSchedule || !window.currentLoanDetails) { alert(No payment schedule to export. Please calculate a loan first.); return; } const { jsPDF } window.jspdf; const doc new jsPDF(); // Header doc.setFontSize(20); doc.text(AFR Loan Payment Schedule, 20, 30); // Loan details doc.setFontSize(12); const details window.currentLoanDetails; doc.text(`Loan Amount: ${formatCurrency(details.principal)}`, 20, 50); doc.text(`Loan Term: ${details.years} years`, 20, 60); doc.text(`AFR Rate: ${details.rate}%`, 20, 70); doc.text(`Monthly Payment: ${formatCurrency(details.monthlyPayment)}`, 20, 80); doc.text(`Total Interest: ${formatCurrency(details.totalInterest)}`, 20, 90); doc.text(`Total Amount: ${formatCurrency(details.totalAmount)}`, 20, 100); // Payment schedule table const tableData window.currentSchedule.map(payment > payment.paymentNumber, payment.paymentDate, formatCurrency(payment.paymentAmount), formatCurrency(payment.principalPayment), formatCurrency(payment.interestPayment), formatCurrency(payment.remainingBalance) ); doc.autoTable({ head: Payment #, Date, Payment, Principal, Interest, Balance, body: tableData, startY: 120, styles: { fontSize: 8 }, headStyles: { fillColor: 30, 64, 175 } }); // Footer const pageCount doc.internal.getNumberOfPages(); for (let i 1; i pageCount; i++) { doc.setPage(i); doc.setFontSize(8); doc.text(`Generated by AFR Calculator - Page ${i} of ${pageCount}`, 20, doc.internal.pageSize.height - 10); } // Save the PDF const today new Date().toISOString().split(T)0; doc.save(`AFR_Loan_Schedule_${today}.pdf`); } function clearErrors() { const errorGroups document.querySelectorAll(.form-group.error); errorGroups.forEach(group > group.classList.remove(error)); } function showError(fieldId) { const group document.getElementById(fieldId + Group); group.classList.add(error); } function validateForm() { clearErrors(); let isValid true; const loanAmountStr document.getElementById(loanAmount).value; const loanAmount parseFormattedNumber(loanAmountStr); const loanTerm parseInt(document.getElementById(loanTerm).value); const compounding document.getElementById(compounding).value; if (!loanAmount || loanAmount 0) { showError(loanAmount); isValid false; } if (!loanTerm || loanTerm 0 || loanTerm > 30) { showError(loanTerm); isValid false; } if (!compounding) { showError(compounding); isValid false; } return { isValid, loanAmount, loanTerm, compounding }; } document.getElementById(loanForm).addEventListener(submit, function(e) { e.preventDefault(); const validation validateForm(); if (!validation.isValid) { return; } const { loanAmount, loanTerm, compounding } validation; const category getAFRCategory(loanTerm); const afrRate afrRatescategorycompounding; const payment calculatePayment(loanAmount, afrRate, loanTerm, compounding); // Update payment label based on compounding frequency document.querySelector(.result-item:last-child .result-label).textContent getPaymentFrequencyLabel(compounding); // Display results document.getElementById(displayAmount).textContent formatCurrency(loanAmount); document.getElementById(displayTerm).textContent loanTerm + years; document.getElementById(displayCategory).textContent getCategoryDisplayName(category); document.getElementById(displayRate).textContent afrRate + %; document.getElementById(displayPayment).textContent formatCurrency(payment); const resultsDiv document.getElementById(results); resultsDiv.classList.add(show); resultsDiv.scrollIntoView({ behavior: smooth }); // Show savings analysis with charts showSavingsAnalysis(loanAmount, loanTerm, afrRate, payment, compounding); // Store loan details for PDF export (this will be set in generatePaymentSchedule) }); // Also add click event as backup document.querySelector(.calculate-btn).addEventListener(click, function(e) { e.preventDefault(); document.getElementById(loanForm).dispatchEvent(new Event(submit)); }); // Add dynamic feedback to form fields // Format number with commas function formatNumberWithCommas(num) { return num.toString().replace(/\B(?(\d{3})+(?!\d))/g, ,); } // Remove commas and return number function parseFormattedNumber(str) { return parseFloat(str.replace(/,/g, )) || 0; } document.getElementById(loanAmount).addEventListener(input, function(e) { let value e.target.value; // Remove all non-digits value value.replace(/^\d/g, ); // Dont allow empty or zero if (value || value 0) { e.target.value ; const dynamicInfo document.getElementById(amountDynamicInfo); if (dynamicInfo) { dynamicInfo.classList.remove(show); } return; } // Format with commas const numericValue parseInt(value); e.target.value formatNumberWithCommas(numericValue); // Update dynamic info const dynamicInfo document.getElementById(amountDynamicInfo); if (numericValue && numericValue > 0) { let suggestion ; if (numericValue 25000) { suggestion đĄ Consider: Personal loan or small family loan; } else if (numericValue 100000) { suggestion đĄ Typical: Family loan or small business loan; } else if (numericValue 500000) { suggestion đĄ Common: Home purchase or business financing; } else { suggestion đĄ Large loan: Commercial real estate or major business investment; } if (!dynamicInfo) { const newDiv document.createElement(div); newDiv.id amountDynamicInfo; newDiv.className dynamic-info; this.parentNode.parentNode.appendChild(newDiv); } document.getElementById(amountDynamicInfo).textContent suggestion; document.getElementById(amountDynamicInfo).classList.add(show); } else if (dynamicInfo) { dynamicInfo.classList.remove(show); } }); // Loan term input event document.getElementById(loanTerm).addEventListener(input, function() { const years parseInt(this.value); const dynamicInfo document.getElementById(termDynamicInfo); if (years && years > 0 && years 30) { const category getAFRCategory(years); const categoryName getCategoryDisplayName(category); let rateRange ; switch(category) { case shortTerm: rateRange 4.05% - 4.12%; break; case midTerm: rateRange 4.11% - 4.19%; break; case longTerm: rateRange 4.79% - 4.90%; break; } const suggestion `â ${categoryName} - AFR rates: ${rateRange}`; dynamicInfo.textContent suggestion; dynamicInfo.classList.add(show); } else { dynamicInfo.classList.remove(show); } }); document.getElementById(compounding).addEventListener(change, function() { const compounding this.value; const dynamicInfo document.getElementById(compoundingDynamicInfo); const loanTerm parseFloat(document.getElementById(loanTerm).value); if (compounding && loanTerm) { const category getAFRCategory(loanTerm); const rate afrRatescategorycompounding; let frequency ; switch(compounding) { case monthly: frequency 12 payments per year; break; case quarterly: frequency 4 payments per year; break; case semiannual: frequency 2 payments per year; break; case annual: frequency 1 payment per year; break; } const suggestion `đ Your rate: ${rate}% | ${frequency}`; dynamicInfo.textContent suggestion; dynamicInfo.classList.add(show); } else { dynamicInfo.classList.remove(show); } }); // Toggle compounding info function toggleInfo() { const info document.getElementById(compounding-info); const toggle document.querySelector(.info-toggle); if (info.style.display none || info.style.display ) { info.style.display block; toggle.innerHTML âšī¸ Hide explanation; } else { info.style.display none; toggle.innerHTML âšī¸ Why different rates?; } } // Toggle rate details function toggleRateDetails(rateType) { const details document.getElementById(rateType + -details); const isVisible details.style.display block; // Toggle only the clicked tile if (isVisible) { details.style.display none; } else { details.style.display block; } } // Recalculate with custom bank rate function recalculateWithCustomRate() { if (currentLoanData.loanAmount) { showSavingsAnalysis( currentLoanData.loanAmount, currentLoanData.loanTerm, currentLoanData.afrRate, currentLoanData.afrPayment, currentLoanData.compounding ); } } // Jump to calculator function for mobile users function jumpToCalculator() { const calculatorSection document.querySelector(.calculator-section); calculatorSection.scrollIntoView({ behavior: smooth }); } // Stepper functions for loan term function incrementYear() { const input document.getElementById(loanTerm); let value parseInt(input.value) || 5; if (value 30) { value++; input.value value; input.dispatchEvent(new Event(input)); } } function decrementYear() { const input document.getElementById(loanTerm); let value parseInt(input.value) || 5; if (value > 1) { value--; input.value value; input.dispatchEvent(new Event(input)); } } // Initialize default values and show dynamic info on page load document.addEventListener(DOMContentLoaded, function() { // Mobile Navigation Toggle const navToggle document.getElementById(navToggle); const navMenu document.getElementById(navMenu); navToggle.addEventListener(click, function() { navToggle.classList.toggle(active); navMenu.classList.toggle(active); }); // Close mobile menu when clicking outside document.addEventListener(click, function(event) { if (!event.target.closest(.nav-container)) { navToggle.classList.remove(active); navMenu.classList.remove(active); } }); // Trigger dynamic info for default values const loanAmountInput document.getElementById(loanAmount); const loanTermInput document.getElementById(loanTerm); const compoundingSelect document.getElementById(compounding); // Trigger events to show dynamic feedback for defaults if (loanAmountInput.value) { loanAmountInput.dispatchEvent(new Event(input)); } if (loanTermInput.value) { loanTermInput.dispatchEvent(new Event(input)); } if (compoundingSelect.value) { compoundingSelect.dispatchEvent(new Event(change)); } document.addEventListener(click, function(e) { if (e.target && e.target.id recalculateBtn) { recalculateWithCustomRate(); } if (e.target && e.target.id exportPdfBtn) { exportToPDF(); } if (e.target && e.target.id toggleScheduleBtn) { const isCollapsed document.querySelector(.table-container).classList.contains(table-collapsed); if (isCollapsed) { populateScheduleTable(window.currentSchedule); // Show all } else { populateScheduleTable(window.currentSchedule, 12); // Show summary } } }); }); /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]