CredOasis — Header
Spread the love
Amortization Calculator — 9 Tools in 1 (Loans, ARMs, Biweekly, Tax & Retirement) | AmortSuite { "@context": "https://schema.org", "@graph": [ { "@type": "Organization", "@id": "https://credoasis.com/#org", "name": "CredOasis", "url": "https://credoasis.com", "logo": { "@type": "ImageObject", "url": "https://credoasis.com/assets/credoasis-logo.png", "width": 512, "height": 512 }, "sameAs": [ "https://twitter.com/credoasis", "https://www.linkedin.com/company/credoasis" ], "description": "CredOasis gives you plain-English information about debt and credit recovery. Free, forever." }, { "@type": "WebSite", "@id": "https://credoasis.com/#website", "url": "https://credoasis.com", "name": "CredOasis", "publisher": {"@id": "https://credoasis.com/#org"} }, { "@type": "BreadcrumbList", "@id": "https://credoasis.com/amortization-calculator#breadcrumb", "itemListElement": [ {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://credoasis.com/"}, {"@type": "ListItem", "position": 2, "name": "Tools", "item": "https://credoasis.com/tool-directory/"}, {"@type": "ListItem", "position": 3, "name": "Amortization Calculator", "item": "https://credoasis.com/amortization-calculator"} ] }, { "@type": "SoftwareApplication", "@id": "https://credoasis.com/amortization-calculator#app", "name": "AmortSuite — Amortization Calculator", "url": "https://credoasis.com/amortization-calculator", "description": "The most advanced free amortization calculator: 9 tools in 1 covering standard loans, ARMs, biweekly payments, land contracts, §197 tax amortization, auto loans, and retirement drawdown.", "applicationCategory": "FinanceApplication", "operatingSystem": "Any (Web)", "browserRequirements": "Requires JavaScript", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}, "featureList": [ "Standard fixed-rate amortization", "360 vs 365 day count comparison", "ARM reset modeling with initial, periodic, lifetime caps", "Extra payments (monthly, yearly, one-time)", "Biweekly and weekly accelerated payments", "Land contract / contract-for-deed balloon modeling", "IRS §197 tax amortization schedule", "Auto loan amortization with Rule of 78", "Retirement drawdown and depletion date", "CSV export of full amortization schedule" ], "creator": {"@id": "https://credoasis.com/#org"}, "isAccessibleForFree": true, "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.8", "ratingCount": "312", "bestRating": "5", "worstRating": "1" } }, { "@type": "Article", "@id": "https://credoasis.com/amortization-calculator#article", "headline": "Amortization Calculator — 9 Tools in 1 (Loans, ARMs, Biweekly, Tax & Retirement)", "description": "The best amortization calculator online. Model standard loans, ARMs, extra payments, biweekly plans, land contracts, §197 tax amortization, auto loans, and retirement drawdowns — all free.", "url": "https://credoasis.com/amortization-calculator", "image": { "@type": "ImageObject", "url": "https://credoasis.com/assets/amortization-calculator-og.jpg", "width": 1200, "height": 630 }, "author": { "@type": "Organization", "name": "CredOasis Editorial Team", "url": "https://credoasis.com/about-us/" }, "publisher": {"@id": "https://credoasis.com/#org"}, "datePublished": "2026-10-18", "dateModified": "2026-10-18", "inLanguage": "en-US", "mainEntityOfPage": {"@type": "WebPage", "@id": "https://credoasis.com/amortization-calculator"}, "about": [ {"@type": "Thing", "name": "Amortization"}, {"@type": "Thing", "name": "Mortgage amortization"}, {"@type": "Thing", "name": "ARM mortgage"}, {"@type": "Thing", "name": "Biweekly mortgage payments"}, {"@type": "Thing", "name": "Land contract"}, {"@type": "Thing", "name": "Section 197 tax amortization"}, {"@type": "Thing", "name": "Retirement drawdown"} ] }, { "@type": "HowTo", "@id": "https://credoasis.com/amortization-calculator#howto", "name": "How to use the Amortization Calculator", "description": "Model any loan — mortgage, auto, land contract, tax, or retirement — with full amortization schedules, extra payments, and ARM resets.", "totalTime": "PT2M", "estimatedCost": {"@type": "MonetaryAmount", "currency": "USD", "value": "0"}, "step": [ {"@type": "HowToStep", "position": 1, "name": "Choose your calculation mode", "text": "Select Standard Loan, Tax Amortization (§197), or Retirement Drawdown."}, {"@type": "HowToStep", "position": 2, "name": "Enter loan basics", "text": "Enter principal, rate, term, start date, frequency, and day-count convention."}, {"@type": "HowToStep", "position": 3, "name": "Add advanced features", "text": "Optional: extra payments, ARM reset with caps, balloon payment, or interest-only period."}, {"@type": "HowToStep", "position": 4, "name": "Calculate", "text": "Click Calculate to see payment, total interest, payoff date, and the full amortization schedule."} ] }, { "@type": "FAQPage", "@id": "https://credoasis.com/amortization-calculator#faq", "mainEntity": [ { "@type": "Question", "name": "What is amortization?", "acceptedAnswer": {"@type": "Answer", "text": "Amortization is paying off a loan with regular payments over time. Part of each payment is interest on the outstanding balance; the rest reduces principal."} }, { "@type": "Question", "name": "How is a monthly payment calculated?", "acceptedAnswer": {"@type": "Answer", "text": "M = P × [r(1+r)^n] / [(1+r)^n − 1], where P is principal, r is the monthly rate (APR ÷ 12), and n is the total number of monthly payments."} }, { "@type": "Question", "name": "How do biweekly payments work?", "acceptedAnswer": {"@type": "Answer", "text": "You pay half your monthly payment every two weeks — 26 half-payments equal 13 full payments a year, one extra payment annually."} }, { "@type": "Question", "name": "Do biweekly payments really cut a 30-year mortgage by 10+ years?", "acceptedAnswer": {"@type": "Answer", "text": "No — that's a viral myth. Our engine shows 5–6 years saved on typical rates, not 10+."} }, { "@type": "Question", "name": "What is an ARM reset?", "acceptedAnswer": {"@type": "Answer", "text": "An ARM has a fixed rate for an initial period (5, 7, or 10 years), then resets annually. The new rate is bounded by initial, periodic, and lifetime caps — commonly a 2/1/5 structure."} }, { "@type": "Question", "name": "What is 360 vs 365 day count?", "acceptedAnswer": {"@type": "Answer", "text": "Actual/360 (bank method) divides the rate by 360 and multiplies by actual elapsed days, costing ~1.39% more per year than nominal. Actual/365 uses 365 as the divisor. Most U.S. residential mortgages use nominal monthly accrual instead."} }, { "@type": "Question", "name": "What is §197 tax amortization?", "acceptedAnswer": {"@type": "Answer", "text": "IRS Section 197 intangibles (goodwill, customer lists, trademarks) amortize straight-line over 15 years (180 months) using the full-month convention from the month of acquisition. A mid-year purchase spans 16 tax years."} }, { "@type": "Question", "name": "How does retirement drawdown work?", "acceptedAnswer": {"@type": "Answer", "text": "Retirement drawdown is the annuity formula reversed — your portfolio pays you. A $1M portfolio at 5% over 30 years supports a $5,368/month withdrawal."} }, { "@type": "Question", "name": "Do extra payments always save interest?", "acceptedAnswer": {"@type": "Answer", "text": "Yes — every dollar of extra principal eliminates all future interest on that dollar. Use the calculator to see exactly how much each extra dollar saves."} }, { "@type": "Question", "name": "Can I export the amortization schedule?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Every calculation in AmortSuite can be downloaded as a CSV for offline use."} } ] } ] } :root{ --canvas:#f6f6f0;--paper:#fdfdfa;--card:#ffffff;--cream:#fafaf3; --ink:#2f3520;--ink-strong:#1f2410;--ink-soft:#5c6248; --mute:#818870;--mute-light:#a5ab8e; --olive:#4a5518;--olive-deep:#2a3010;--olive-soft:#3f4a15; --lime:#dce97a;--lime-soft:#e9f0a8;--lime-pale:#f3f7d4; --border:#e8eadb;--border-soft:#eff1e2; --font:'Inter Tight','Inter',-apple-system,Arial,sans-serif; --mono:'JetBrains Mono','SF Mono',Menlo,monospace; --ease:cubic-bezier(.22,1,.36,1); --pad:clamp(20px,5vw,64px);--maxw:1320px; } html{scroll-behavior:smooth;scroll-padding-top:110px} *,*::before,*::after{box-sizing:border-box;margin:0} html,body{overflow-x:clip} body{font-family:var(--font);background:var(--canvas);color:var(--ink); -webkit-font-smoothing:antialiased;letter-spacing:-.01em} h1,h2,h3,h4{font-weight:600;letter-spacing:-.04em;line-height:1.15;color:var(--ink-strong)} a{color:inherit;text-decoration:none} button{font-family:inherit;cursor:pointer} img{max-width:100%;display:block} .prog{position:fixed;left:0;top:0;height:3px;background:var(--lime);width:0;z-index:99} .wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--pad)} .wrap-n{max-width:880px;margin:0 auto;padding:0 var(--pad)} .btn{display:inline-flex;align-items:center;gap:8px;padding:13px 22px;border-radius:99px; font:500 14px var(--font);border:1px solid transparent;cursor:pointer; transition:transform .3s var(--ease),background .3s var(--ease),color .3s var(--ease),box-shadow .3s var(--ease); font-family:var(--font)} .btn:hover{transform:translateY(-2px) scale(1.02)} .btn.lime{background:var(--lime);color:var(--olive-deep);box-shadow:0 10px 24px -12px rgba(185,199,88,.7)} .btn.dark{background:var(--olive-deep);color:#fff} .btn.ghost.d{border-color:var(--border);color:var(--olive);background:#fff} .btn.ghost.d:hover{background:var(--lime-pale);border-color:var(--lime)} /* SIDEBAR */ .toc-fab{position:fixed;top:50%;left:20px;transform:translateY(-50%);z-index:900; width:52px;height:52px;border-radius:50%;background:var(--olive-deep);color:var(--lime); border:0;display:grid;place-items:center;box-shadow:0 18px 34px -18px rgba(45,51,0,.55); opacity:0;pointer-events:none;transition:all .35s var(--ease)} .toc-fab.show{opacity:1;pointer-events:auto} .toc-fab:hover{transform:translateY(-50%) scale(1.08)} .toc-fab svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round} .toc-panel{position:fixed;top:50%;left:20px;transform:translateY(-50%) translateX(-20px) scale(.96); z-index:901;width:360px;max-height:min(680px,calc(100vh - 60px)); border-radius:24px;background:var(--card);border:1px solid var(--border-soft); box-shadow:0 50px 90px -40px rgba(74,85,24,.3),0 20px 50px -30px rgba(74,85,24,.15); display:flex;flex-direction:column;overflow:hidden;opacity:0;pointer-events:none; transition:opacity .35s var(--ease),transform .4s var(--ease)} .toc-panel.open{opacity:1;pointer-events:auto;transform:translateY(-50%) translateX(0) scale(1)} .toc-head{display:flex;align-items:center;gap:14px;padding:18px 20px;border-bottom:1px solid var(--border-soft);flex:none} .toc-head-icon{width:40px;height:40px;border-radius:12px;flex:none;background:linear-gradient(140deg,var(--lime),#bfce5e);display:grid;place-items:center} .toc-head-icon svg{width:20px;height:20px;stroke:var(--olive-deep);fill:none;stroke-width:2.2;stroke-linecap:round} .toc-head-text{flex:1;min-width:0} .toc-head-text b{display:block;font-size:14.5px;font-weight:600;color:var(--ink-strong);margin-bottom:3px} .toc-head-text span{display:block;font-size:11.5px;color:var(--mute-light)} .toc-close{width:34px;height:34px;border-radius:50%;flex:none;background:var(--cream);border:0;color:var(--mute);display:grid;place-items:center;transition:all .25s var(--ease)} .toc-close:hover{background:var(--lime-pale);color:var(--olive-deep)} .toc-close svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round} .toc-progress{padding:14px 20px 16px;border-bottom:1px solid var(--border-soft);flex:none} .toc-progress-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:10px} .toc-progress-top b{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute-light);font-weight:700} .toc-progress-top span{font-size:12.5px;color:var(--olive-deep);font-weight:600;font-variant-numeric:tabular-nums} .toc-progress-bar{height:5px;border-radius:99px;background:var(--border-soft);overflow:hidden} .toc-progress-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,#b9c758,var(--lime));border-radius:99px;transition:width .15s linear} .toc-body{flex:1;overflow-y:auto;padding:12px 0;scrollbar-width:thin;scrollbar-color:var(--border) transparent} .toc-body::-webkit-scrollbar{width:4px} .toc-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:99px} .toc-group{padding:12px 18px 6px} .toc-group-h{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--olive);font-weight:700;margin-bottom:12px;display:flex;align-items:center;gap:10px} .toc-group-h::after{content:'';flex:1;height:1px;background:var(--border-soft)} .toc-link{display:grid;grid-template-columns:34px 1fr;gap:12px;align-items:center;padding:11px 14px;border-radius:12px;cursor:pointer;color:var(--ink);transition:background .25s var(--ease),padding .25s var(--ease)} .toc-link:hover{background:var(--lime-pale);padding-left:18px} .toc-link.on{background:var(--lime-pale)} .toc-link.on .toc-link-num{background:var(--olive-deep);color:var(--lime);border-color:var(--olive-deep)} .toc-link.on .toc-link-label{color:var(--olive-deep);font-weight:600} .toc-link-num{width:34px;height:34px;border-radius:10px;flex:none;background:#fff;border:1px solid var(--border-soft);display:grid;place-items:center;font-size:11.5px;font-weight:700;color:var(--mute);font-variant-numeric:tabular-nums;transition:all .3s var(--ease)} .toc-link-label{font-size:13.5px;letter-spacing:-.015em;line-height:1.35;color:var(--ink-soft);font-weight:500} .toc-foot{padding:14px 18px;border-top:1px solid var(--border-soft);background:var(--cream);flex:none} .toc-foot a{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-radius:12px;background:var(--olive-deep);color:var(--lime);font-size:13.5px;font-weight:500;transition:transform .25s var(--ease)} .toc-foot a:hover{transform:translateY(-2px)} .toc-overlay{position:fixed;inset:0;z-index:850;background:rgba(45,51,0,.3);opacity:0;pointer-events:none;transition:opacity .3s var(--ease);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)} .toc-overlay.show{opacity:1;pointer-events:auto} /* HERO */ .ahero{position:relative;overflow:hidden;background:var(--paper);padding:clamp(90px,11vw,140px) 0 clamp(50px,7vw,80px)} .ahero::before{content:'';position:absolute;inset:0;pointer-events:none; background:radial-gradient(ellipse 60% 55% at 88% 10%,rgba(220,233,122,.35),transparent 62%), radial-gradient(ellipse 45% 45% at 4% 90%,rgba(223,231,192,.5),transparent 68%)} .ahero-in{position:relative;z-index:2;display:grid;grid-template-columns:1.15fr .85fr;gap:clamp(40px,5vw,80px);align-items:center} .ahero-cat{display:inline-flex;align-items:center;gap:9px;font-size:11.5px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;padding:8px 14px;border-radius:99px;background:var(--olive-deep);color:var(--lime);margin-bottom:22px} .ahero-cat::before{content:'';width:6px;height:6px;border-radius:50%;background:var(--lime);box-shadow:0 0 0 3px rgba(220,233,122,.3)} .ahero h1{font-size:clamp(38px,6vw,76px);letter-spacing:-.05em;line-height:1.02;margin-bottom:22px;max-width:760px} .ahero h1 em{font-style:normal;background:var(--lime);padding:2px 14px;border-radius:14px;display:inline-block;color:var(--olive-deep)} .ahero p.lead{font-size:clamp(15.5px,1.6vw,19px);line-height:1.65;color:var(--ink-soft);max-width:600px;margin-bottom:28px} .ahero-cta{display:flex;gap:10px;flex-wrap:wrap} /* BYLINE — new for E-E-A-T */ .byline{display:flex;flex-wrap:wrap;gap:18px;align-items:center;padding:16px 0;border-top:1px solid var(--border);border-bottom:1px solid var(--border);margin-bottom:22px;max-width:640px} .byline-av{width:38px;height:38px;border-radius:50%;flex:none;background:linear-gradient(140deg,var(--lime),#bfce5e);display:grid;place-items:center;color:var(--olive-deep);font-weight:700;font-size:14px} .byline-item{display:flex;align-items:center;gap:10px;font-size:12.5px;color:var(--mute);letter-spacing:-.01em} .byline-item b{font-weight:600;color:var(--ink-strong)} .byline-sep{color:var(--mute-light);padding:0 4px} .trust{display:flex;flex-wrap:wrap;gap:10px 22px;margin-top:22px;font-size:13px;color:var(--mute)} .trust span{display:inline-flex;align-items:center;gap:8px} .trust i{width:16px;height:16px;border-radius:50%;background:var(--lime-pale);color:var(--olive);display:grid;place-items:center;font-size:9px;font-style:normal;flex:none;font-weight:700} /* HERO VISUAL */ .ahero-vis{position:relative;width:100%;max-width:460px;margin-left:auto} .hv-card{background:var(--card);border:1px solid var(--border-soft);border-radius:22px;padding:0;overflow:hidden;box-shadow:0 40px 80px -40px rgba(74,85,24,.28),0 16px 40px -24px rgba(74,85,24,.15)} .hv-card-top{display:flex;align-items:center;justify-content:space-between;padding:18px 22px 14px;border-bottom:1px solid var(--border-soft)} .hv-card-title{display:flex;align-items:center;gap:10px;font-size:13.5px;font-weight:600;color:var(--ink-strong)} .hv-card-title::before{content:'';width:10px;height:10px;border-radius:50%;background:var(--lime);flex:none} .hv-badge{font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;padding:6px 12px;border-radius:99px;background:var(--olive-deep);color:var(--lime)} .hv-rows{display:flex;flex-direction:column} .hv-row{display:grid;grid-template-columns:14px 1fr auto auto;gap:14px;align-items:center;padding:16px 22px;border-bottom:1px solid var(--border-soft);font-size:14px} .hv-row:last-child{border-bottom:0} .hv-row-dot{width:8px;height:8px;border-radius:50%;background:var(--lime);justify-self:center} .hv-row-dot.muted{background:#d5d9c0} .hv-row-label{color:var(--ink-strong);font-weight:500} .hv-row-meta{color:var(--mute-light);font-size:12.5px;white-space:nowrap} .hv-row-time{color:var(--ink-soft);font-size:12.5px;font-weight:500;font-variant-numeric:tabular-nums;min-width:34px;text-align:right} .hv-row-time.now{color:var(--olive);font-weight:600} .hv-metrics{display:grid;grid-template-columns:repeat(3,1fr);background:var(--cream);border-top:1px solid var(--border-soft)} .hv-metric{padding:22px 14px;text-align:center;border-right:1px solid var(--border-soft)} .hv-metric:last-child{border-right:0} .hv-metric span{display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute-light);font-weight:700;margin-bottom:8px} .hv-metric b{display:block;font-size:clamp(22px,2.6vw,30px);font-weight:600;letter-spacing:-.04em;color:var(--ink-strong);line-height:1;font-variant-numeric:tabular-nums} /* CALCULATOR */ .calc-sec{background:var(--canvas);padding:clamp(60px,8vw,100px) 0} .calc-head{max-width:820px;margin:0 auto clamp(36px,4vw,52px);padding:0 var(--pad);text-align:center} .calc-head h2{font-size:clamp(28px,4vw,50px);line-height:1.08;margin:0 auto;max-width:760px} .calc-head p{margin:16px auto 0;font-size:15.5px;line-height:1.6;color:var(--mute);max-width:600px} .calc-wrap{max-width:1080px;margin:0 auto;padding:0 var(--pad)} .calc-toolbar{display:flex;justify-content:center;gap:8px;margin-bottom:24px;flex-wrap:wrap} .calc-mode-btn{padding:10px 18px;border-radius:99px;border:1px solid var(--border);background:#fff;color:var(--ink-soft);font-size:13.5px;font-weight:500;cursor:pointer;transition:all .3s var(--ease)} .calc-mode-btn:hover{background:var(--lime-pale);border-color:var(--lime)} .calc-mode-btn.on{background:var(--olive-deep);color:var(--lime);border-color:var(--olive-deep)} .calc-panel{padding:clamp(26px,3.4vw,44px);border-radius:26px;background:var(--card);border:1px solid var(--border-soft);box-shadow:0 40px 80px -50px rgba(74,85,24,.22),0 16px 40px -28px rgba(74,85,24,.12);margin-bottom:24px} .cip-group{padding:clamp(20px,2.4vw,26px) 0;border-bottom:1px solid var(--border-soft)} .cip-group:first-child{padding-top:0} .cip-group:last-of-type{border-bottom:0;padding-bottom:0} .cip-head{display:flex;align-items:center;gap:12px;margin-bottom:20px} .cip-head .ciph-n{width:32px;height:32px;border-radius:10px;flex:none;background:var(--lime-pale);color:var(--olive);display:grid;place-items:center;font-size:12.5px;font-weight:700} .cip-head b{font-size:15px;font-weight:600;color:var(--ink-strong)} .cip-head span{font-size:12.5px;color:var(--mute-light);margin-left:auto;font-weight:500} .cip-fields{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px 24px} .calc-field{display:grid;gap:7px} .calc-field label{font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--mute-light);font-weight:700} .calc-field input,.calc-field select{-webkit-appearance:none;appearance:none;font-family:var(--font);width:100%;padding:11px 14px;font-size:15.5px;color:var(--ink-strong);background:var(--cream);border:1px solid var(--border);border-radius:11px;outline:none;font-weight:500;transition:all .25s var(--ease)} .calc-field input:focus,.calc-field select:focus{border-color:#bfce5e;background:#fff;box-shadow:0 0 0 4px rgba(220,233,122,.35)} .calc-field select{background-image:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:right 14px center;padding-right:38px;cursor:pointer} .toggle-row{display:flex;gap:14px;align-items:flex-start;padding:16px 18px;border-radius:14px;background:var(--cream);border:1px solid var(--border-soft);transition:all .25s var(--ease)} .toggle-row:hover{background:var(--lime-pale);border-color:var(--lime)} .toggle{position:relative;width:44px;height:26px;flex:none;border-radius:99px;background:var(--border);transition:background .3s var(--ease);cursor:pointer;margin-top:1px} .toggle::after{content:'';position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 2px 4px rgba(74,85,24,.15);transition:transform .3s var(--ease)} .toggle.on{background:var(--olive-deep)} .toggle.on::after{transform:translateX(18px)} .toggle-text{flex:1} .toggle-text b{display:block;font-size:13.5px;font-weight:600;margin-bottom:4px;color:var(--ink-strong)} .toggle-text span{font-size:12.5px;color:var(--mute);line-height:1.5} .cip-submit{margin-top:28px;padding-top:26px;border-top:1px solid var(--border-soft);display:flex;justify-content:space-between;align-items:center;gap:20px;flex-wrap:wrap} .cip-submit .cips-note{font-size:12.5px;color:var(--mute);display:flex;align-items:center;gap:10px} .cip-submit .cips-note b{width:24px;height:24px;border-radius:8px;flex:none;background:var(--lime-pale);color:var(--olive);display:grid;place-items:center;font-size:11px;font-weight:700} .cip-submit .btn{font-size:14.5px;padding:15px 28px} .calc-results{background:var(--card);border:1px solid var(--border-soft);border-radius:22px;overflow:hidden;margin-top:24px;box-shadow:0 30px 70px -40px rgba(74,85,24,.25),0 12px 30px -20px rgba(74,85,24,.12)} .crp-task-top{display:flex;align-items:center;justify-content:space-between;padding:18px 22px 14px;border-bottom:1px solid var(--border-soft)} .crp-task-title{display:flex;align-items:center;gap:10px;font-size:13.5px;font-weight:600;color:var(--ink-strong)} .crp-task-title::before{content:'';width:10px;height:10px;border-radius:50%;background:var(--lime);flex:none} .crp-hero-row{padding:28px 22px 24px;display:grid;grid-template-columns:1.4fr 1fr;gap:24px;align-items:center;border-bottom:1px solid var(--border-soft)} .crp-hero-row h3{font-size:clamp(26px,3.2vw,38px);letter-spacing:-.05em;line-height:1.05;color:var(--ink-strong);margin-bottom:10px} .crp-hero-row p{font-size:14px;line-height:1.6;color:var(--ink-soft);max-width:480px} .crp-break-even{text-align:center;padding:20px 14px;border-radius:18px;background:var(--lime-pale);border:1px solid var(--lime)} .crp-break-even span{display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--olive);font-weight:700;margin-bottom:10px} .crp-break-even b{display:block;font-size:clamp(34px,4.4vw,52px);font-weight:600;letter-spacing:-.05em;line-height:1;color:var(--olive-deep);font-variant-numeric:tabular-nums} .crp-break-even b span{font-size:14px;color:var(--olive);display:inline;margin:0;text-transform:none;vertical-align:top;margin-left:6px} .crp-metrics{display:grid;grid-template-columns:repeat(4,1fr);background:var(--cream)} .crp-metric{padding:22px 18px;text-align:center;border-right:1px solid var(--border-soft)} .crp-metric:last-child{border-right:0} .crp-metric span{display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute-light);font-weight:700;margin-bottom:10px} .crp-metric b{display:block;font-size:clamp(20px,2.4vw,28px);font-weight:600;letter-spacing:-.04em;color:var(--ink-strong);line-height:1;font-variant-numeric:tabular-nums} .crp-metric.pos b{color:#5b7a1a} .crp-metric.neg b{color:#a3610a} .crp-metric.hl b{color:var(--olive-deep)} .crp-charts{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:22px} .crp-chart{padding:24px;border-radius:20px;background:var(--canvas);border:1px solid var(--border-soft)} .crp-chart-h{font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute-light);font-weight:700;margin-bottom:18px;display:flex;justify-content:space-between;align-items:center} .chart-svg{width:100%;height:auto;display:block} .chart-svg .bar-old{fill:var(--border)} .chart-svg .bar-new{fill:#bfce5e} .chart-svg .label{fill:var(--mute-light);font-size:10px;font-weight:700} .chart-svg .val{fill:var(--ink-strong);font-size:12.5px;font-weight:600} .chart-svg .axis{stroke:var(--border-soft);stroke-width:1} /* ARTICLE */ .article-sec{background:var(--cream);padding:clamp(80px,10vw,140px) 0;position:relative;overflow:hidden;border-top:1px solid var(--border-soft)} .article{position:relative;z-index:2;font-size:clamp(16px,1.55vw,17.5px);line-height:1.75;color:var(--ink);letter-spacing:-.008em} .article > * + *{margin-top:22px} .article h2{font-size:clamp(26px,3.2vw,38px);letter-spacing:-.045em;line-height:1.15;color:var(--ink-strong);margin-top:clamp(52px,6vw,72px);margin-bottom:22px;padding-top:8px;scroll-margin-top:120px} .article h2 .h2-num{display:inline-flex;align-items:center;gap:10px;font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--olive);font-weight:700;margin-bottom:14px;padding:5px 11px;border-radius:99px;background:var(--lime-pale);border:1px solid var(--lime)} .article h2 em{font-style:normal;background:var(--lime);padding:2px 12px;border-radius:12px;display:inline-block;color:var(--olive-deep)} .article h3{font-size:clamp(18px,2vw,22px);letter-spacing:-.035em;line-height:1.3;color:var(--ink-strong);margin-top:38px;margin-bottom:14px} .article p.lede{font-size:clamp(17px,1.9vw,21px);line-height:1.65;color:var(--olive-deep);font-weight:500;letter-spacing:-.018em} .article strong{font-weight:600;color:var(--ink-strong)} .article a:not(.btn){color:var(--olive-deep);font-weight:500;border-bottom:1px solid #c9d684;padding-bottom:1px;transition:border-color .25s var(--ease)} .article a:not(.btn):hover{border-color:var(--olive-deep)} .article ul:not([class]),.article ol:not([class]){padding-left:0;list-style:none;display:grid;gap:14px;margin:22px 0} .article ul:not([class]) li{position:relative;padding-left:30px;line-height:1.7} .article ul:not([class]) li::before{content:'';position:absolute;left:0;top:11px;width:8px;height:8px;border-radius:50%;background:#bfce5e;box-shadow:0 0 0 4px rgba(220,233,122,.35)} .article ol:not([class]){counter-reset:item} .article ol:not([class]) li{counter-increment:item;position:relative;padding-left:34px;line-height:1.7} .article ol:not([class]) li::before{content:counter(item,decimal-leading-zero);position:absolute;left:0;top:0;font-size:12px;font-weight:700;color:var(--olive);line-height:1.85} /* Checklists */ .checklist{background:var(--card);border:1px solid var(--border-soft);border-radius:20px;padding:6px 0;margin:28px 0;overflow:hidden} .checklist-h{display:flex;align-items:center;justify-content:space-between;padding:18px 22px 14px;border-bottom:1px solid var(--border-soft)} .checklist-h b{display:flex;align-items:center;gap:10px;font-size:13px;font-weight:600;color:var(--ink-strong)} .checklist-h b::before{content:'';width:10px;height:10px;border-radius:50%;background:var(--lime);flex:none} .checklist-h span{font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute-light);font-weight:700} .checklist-item{display:grid;grid-template-columns:34px 1fr auto;gap:16px;align-items:center;padding:15px 22px;border-bottom:1px solid var(--border-soft);font-size:14.5px} .checklist-item:last-child{border-bottom:0} .checklist-item:hover{background:var(--cream)} .checklist-box{width:22px;height:22px;border-radius:7px;flex:none;background:var(--lime);display:grid;place-items:center;justify-self:center;box-shadow:inset 0 -1px 2px rgba(74,85,24,.15)} .checklist-box.off{background:var(--cream);border:1.5px solid var(--border)} .checklist-box svg{width:12px;height:12px;stroke:var(--olive-deep);fill:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round} .checklist-box.off svg{display:none} .checklist-label{color:var(--ink-strong);font-weight:500;line-height:1.45} .checklist-meta{color:var(--mute-light);font-size:12.5px;white-space:nowrap} /* Tables */ .table-wrap{background:var(--card);border:1px solid var(--border-soft);border-radius:18px;padding:22px 24px;margin:28px 0;overflow-x:auto} .table-h{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--olive);font-weight:700;padding-bottom:14px;border-bottom:1.5px solid var(--olive-deep);margin-bottom:8px;display:flex;align-items:center;gap:12px} .table-h::after{content:'';flex:1;height:1px;background:var(--border-soft)} table{width:100%;border-collapse:collapse;font-size:13.5px;margin-top:8px;min-width:520px} th{text-align:left;padding:12px 12px 12px 0;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--mute-light);font-weight:700;border-bottom:1px solid var(--border)} td{padding:13px 12px 13px 0;border-bottom:1px solid var(--border-soft);color:var(--ink);font-weight:500;font-variant-numeric:tabular-nums} td:last-child,th:last-child{text-align:right;padding-right:0} tr:last-child td{border-bottom:0;font-weight:600;color:var(--olive-deep)} td.num{font-weight:600;color:var(--olive-deep)} td.neg{color:#a3610a;font-weight:600} td.pos{color:#5b7a1a;font-weight:600} /* Callouts */ .callout{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:flex-start;padding:22px 24px;border-radius:18px;background:var(--lime-pale);border:1px solid var(--lime);margin:28px 0} .callout.warn{background:#fdf6e4;border-color:#f0e1b8} .callout.danger{background:#fdf0f0;border-color:#f6dede} .callout.note{background:#eef2f7;border-color:#d9e2ec} .callout b.icon{width:38px;height:38px;border-radius:12px;flex:none;background:var(--olive-deep);color:var(--lime);display:grid;place-items:center;font-size:15px;font-weight:700;font-style:normal} .callout.warn b.icon{background:#a3610a;color:#fff} .callout.danger b.icon{background:#a34a4a;color:#fff} .callout.note b.icon{background:#2c5282;color:#fff} .callout-body{font-size:14.5px;line-height:1.65;color:var(--olive-deep);padding-top:3px} .callout-body strong{font-weight:600} /* Blockquotes */ .article blockquote{position:relative;margin:32px 0;padding:26px 28px 26px 44px;border-left:3px solid var(--lime);background:var(--card);border-radius:0 18px 18px 0} .article blockquote p{font-size:clamp(17px,2vw,21px);line-height:1.5;letter-spacing:-.025em;color:var(--olive-deep);font-weight:500;font-style:italic;margin:0} .article blockquote cite{display:block;margin-top:14px;font-style:normal;font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute-light);font-weight:700} /* Formulas */ .formula{background:var(--card);border:1px solid var(--border-soft);border-radius:18px;padding:26px 28px;margin:28px 0} .formula-h{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px;border-bottom:1.5px solid var(--olive-deep);margin-bottom:18px} .formula-h b{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--olive-deep);font-weight:700} .formula-h span{font-size:10px;padding:5px 10px;border-radius:99px;background:var(--lime);color:var(--olive-deep);font-weight:700;letter-spacing:.08em;text-transform:uppercase} .formula-body{font-family:var(--mono);font-size:13px;line-height:1.85;color:var(--ink-strong);background:var(--cream);padding:16px 18px;border-radius:12px;overflow-x:auto;letter-spacing:0;white-space:pre;border:1px solid var(--border-soft)} .formula-note{margin-top:14px;font-size:13px;line-height:1.6;color:var(--mute)} /* Examples */ .ex{background:var(--card);border:1px solid var(--border-soft);border-radius:20px;padding:24px 26px;margin:20px 0;transition:all .3s var(--ease)} .ex:hover{border-color:var(--lime);box-shadow:0 20px 40px -28px rgba(74,85,24,.22)} .ex-h{display:flex;justify-content:space-between;align-items:baseline;gap:14px;padding-bottom:14px;margin-bottom:18px;border-bottom:1px solid var(--border-soft)} .ex-h b{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--olive);font-weight:700} .ex-h span{font-size:13px;color:var(--ink-strong);font-weight:600;text-align:right} .ex-body{display:grid;grid-template-columns:1fr 1fr 1fr;gap:18px} .ex-cell{display:grid;gap:6px} .ex-cell span{font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute-light);font-weight:700} .ex-cell b{font-size:15.5px;font-weight:600;letter-spacing:-.03em;color:var(--ink-strong);font-variant-numeric:tabular-nums} .ex-cell.neg b{color:#a3610a} .ex-cell.pos b{color:#5b7a1a} .ex-cell.hl b{color:var(--olive-deep)} .ex-note{margin-top:18px;padding-top:16px;border-top:1px solid var(--border-soft);font-size:13.5px;line-height:1.65;color:var(--mute)} /* AUTHOR / METHODOLOGY / SOURCES */ .trust-block{background:var(--paper);padding:clamp(60px,8vw,100px) 0;border-top:1px solid var(--border)} .trust-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px} .trust-card{padding:28px 30px;border-radius:20px;background:var(--card);border:1px solid var(--border-soft);box-shadow:0 20px 40px -34px rgba(74,85,24,.2)} .trust-card h3{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--olive);font-weight:700;margin-bottom:20px;display:flex;align-items:center;gap:12px} .trust-card h3::after{content:'';flex:1;height:1px;background:var(--border-soft)} .author-row{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:flex-start;margin-bottom:16px} .author-av{width:64px;height:64px;border-radius:50%;flex:none;background:linear-gradient(140deg,var(--lime),#bfce5e);display:grid;place-items:center;color:var(--olive-deep);font-weight:700;font-size:20px} .author-body h4{font-size:17px;font-weight:600;color:var(--olive);margin-bottom:4px} .author-body .role{font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--olive);font-weight:700;margin-bottom:10px} .author-body p{font-size:13.5px;line-height:1.6;color:var(--mute)} .author-links{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px} .author-links a{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:500;color:var(--olive);padding:6px 12px;border-radius:99px;background:var(--cream);border:1px solid var(--border-soft);transition:all .25s var(--ease)} .author-links a:hover{background:var(--lime-pale);border-color:var(--lime)} .method-list{display:grid;gap:12px;list-style:none;padding:0;margin:0} .method-list li{position:relative;padding-left:26px;font-size:13px;line-height:1.6;color:var(--mute)} .method-list li::before{content:'';position:absolute;left:0;top:9px;width:7px;height:7px;border-radius:50%;background:#bfce5e;box-shadow:0 0 0 3px rgba(220,233,122,.35)} .source-list{counter-reset:s;padding:0;margin:0;display:grid;gap:10px;list-style:none} .source-list li{counter-increment:s;position:relative;padding-left:32px;font-size:12.5px;line-height:1.55;color:var(--mute)} .source-list li::before{content:'['counter(s)']';position:absolute;left:0;top:0;font-size:11.5px;font-weight:700;color:var(--olive);font-variant-numeric:tabular-nums} .source-list li a{color:var(--olive-deep);font-weight:500;border-bottom:1px solid #c9d684;padding-bottom:1px} .source-list li a:hover{border-color:var(--olive-deep)} /* DISCLAIMER */ .disclaimer{background:var(--olive-deep);color:#fff;margin:0 14px;border-radius:36px;padding:clamp(60px,7vw,90px) 0;overflow:hidden;position:relative} .disclaimer::before{content:'';position:absolute;width:80vw;height:80vw;left:-20vw;top:-30vw;border-radius:50%;pointer-events:none;background:radial-gradient(circle,rgba(140,160,50,.22),transparent 68%);filter:blur(30px)} .disclaimer-in{position:relative;z-index:2;max-width:820px;margin:0 auto;padding:0 var(--pad)} .disclaimer h3{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--lime);font-weight:700;margin-bottom:20px} .disclaimer p{font-size:13.5px;line-height:1.75;color:rgba(255,255,255,.65);margin-bottom:16px} .disclaimer p:last-child{margin-bottom:0} .disclaimer b{color:rgba(255,255,255,.9);font-weight:600} /* FAQ */ .faq-sec{background:var(--paper);padding:clamp(70px,9vw,120px) 0} .faq-list{max-width:880px;margin:0 auto;background:var(--card);border:1px solid var(--border-soft);border-radius:22px;overflow:hidden;box-shadow:0 30px 60px -40px rgba(74,85,24,.2)} .faq-item{border-bottom:1px solid var(--border-soft)} .faq-item:last-child{border-bottom:0} .faq-item button{all:unset;box-sizing:border-box;width:100%;display:flex;justify-content:space-between;align-items:center;gap:20px;padding:22px 26px;font-size:15.5px;color:var(--ink-strong);font-family:var(--font);font-weight:500;cursor:pointer;transition:background .25s var(--ease)} .faq-item button:hover{background:var(--cream)} .faq-item.open button{background:var(--cream)} .faq-toggle{width:32px;height:32px;border-radius:50%;flex:none;background:var(--cream);display:grid;place-items:center;transition:all .3s var(--ease)} .faq-item.open .faq-toggle{background:var(--olive-deep);color:var(--lime)} .faq-toggle svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;transition:transform .35s var(--ease)} .faq-item.open .faq-toggle svg{transform:rotate(45deg)} .faq-answer{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s var(--ease)} .faq-item.open .faq-answer{grid-template-rows:1fr} .faq-answer-inner{overflow:hidden;padding:0 26px;font-size:14.5px;line-height:1.7;color:var(--ink-soft)} .faq-item.open .faq-answer-inner{padding:0 26px 24px} /* END */ .end{background:linear-gradient(180deg,var(--paper) 0%,var(--cream) 40%,var(--lime) 100%);padding:clamp(100px,13vw,180px) 0 clamp(110px,15vw,200px);text-align:center;position:relative;overflow:hidden;margin-top:60px} .end::before{content:'';position:absolute;width:70vw;height:70vw;left:15vw;top:-20vw;pointer-events:none;background:radial-gradient(circle,rgba(220,233,122,.5),transparent 68%);filter:blur(30px)} .end-in{position:relative;z-index:2} .end h2{font-size:clamp(34px,6vw,88px);margin:0 auto;max-width:920px;line-height:1.02;letter-spacing:-.05em} .end p{margin:20px auto 34px;text-align:center;max-width:600px;font-size:clamp(15px,1.6vw,19px);color:var(--mute)} .end .btns{display:flex;gap:12px;justify-content:center;flex-wrap:wrap} @media(max-width:1000px){ .ahero-in{grid-template-columns:1fr;gap:44px} .ahero-vis{max-width:480px;margin:0 auto} .cip-fields{grid-template-columns:1fr 1fr} .crp-hero-row{grid-template-columns:1fr;gap:20px} .crp-metrics{grid-template-columns:1fr 1fr} .crp-charts{grid-template-columns:1fr} .ex-body{grid-template-columns:1fr 1fr} .trust-grid{grid-template-columns:1fr} } @media(max-width:900px){ .toc-fab{top:auto;bottom:20px;left:auto;right:20px;transform:none} .toc-fab:hover{transform:scale(1.08)} .toc-panel{top:auto;bottom:84px;left:16px;right:16px;width:auto;max-height:min(560px,calc(100vh - 120px));transform:translateY(20px) scale(.96)} .toc-panel.open{transform:none} } @media(max-width:640px){ .ahero h1{font-size:clamp(32px,9vw,50px)} .cip-fields{grid-template-columns:1fr} .crp-metrics{grid-template-columns:1fr} .crp-metric{padding:18px 14px} .ex-body{grid-template-columns:1fr} .article h2{font-size:clamp(24px,6.5vw,32px)} .formula{padding:22px 20px} .formula-body{font-size:12px;padding:14px} .checklist-item{padding:14px 16px;grid-template-columns:28px 1fr} .checklist-meta{display:none} .faq-item button{padding:18px 20px;font-size:14.5px} .faq-answer-inner{padding:0 20px} .faq-item.open .faq-answer-inner{padding:0 20px 20px} } @media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
Free amortization calculator

The best amortization calculator online — 9 tools in 1.

Model standard loans, 360/365 day counts, ARM resets, extra payments, biweekly plans, land contracts, §197 tax amortization, auto loans, and retirement drawdowns — all in one free, no-sign-up tool with full amortization schedules.

✓ 9 tools in 1 ✓ Free forever ✓ No sign-up ✓ CSV export
Amortization check
Live
Standard 30-yr fixed$2,398/moNow
Biweekly savings70 months+1/12
360 vs 365 cost+1.4%—
ARM reset cap11% max5/1
Payment$2,398
Interest$463k
Saved$88k

Run any loan calculation in one place

Select your calculation mode, enter your numbers, and see the full amortization schedule instantly. No sign-up, no email, no catch.

1Loan basicsAmount, rate, term
MonthlyBiweeklyWeekly
Nominal (monthly)Actual/365Actual/360
2Extra paymentsOptional
MonthlyYearlyOne time
3Advanced featuresARM, balloon, IO
Adjustable-rate (ARM)Model 5/1, 7/1, 10/1 resets with initial, periodic, lifetime caps.
Balloon paymentModel a large final payment (common in land contracts).
Interest-only periodInitial period where you only pay interest.
✓Nothing is saved. Everything runs in your browser.

Amortization is the math behind every loan you will ever take. It's how a bank turns a big balance into a predictable payment — and how a borrower turns a single extra dollar into thousands saved in interest. This guide covers every calculation type in one place.

Section 01 What a best amortization calculator actually does.

A best-in-class amortization calculator does four things well. It computes the standard payment formula correctly. It shows the full amortization schedule — not just the totals. It exposes the inputs that actually move the numbers (extra payments, day count, ARM resets, balloon dates). And it lets you compare scenarios side by side, because the real decision is almost never "loan or no loan" — it's "which loan, at what cost, with what escape hatch."

Most calculators on the internet give you one output: a monthly payment. That's not enough to answer the real questions. A borrower trying to decide between a 30-year and a 15-year term needs the total interest, the payoff date, and the monthly cash-flow difference. A borrower trying to model an ARM needs to see what happens at reset. A borrower considering biweekly payments needs to see exactly how many months early the loan actually pays off — and that's the number every viral Reddit thread gets wrong.

AmortSuite is built around those real questions, not just the payment formula.

i
Who this is for: Homebuyers comparing loan terms. Borrowers weighing an ARM against a fixed rate. Homeowners deciding whether biweekly is worth the hassle. Land contract buyers modeling a balloon. Accountants amortizing §197 intangibles. Retirees testing whether their savings will last. All in one tool.

Section 02 The payment formula — worked out longhand.

Every standard loan payment in this suite uses the same annuity formula. It's the same formula used by Fannie Mae, Freddie Mac, the FHA, the VA, and every commercial bank in the United States.

Monthly paymentFixed-rate amortized
M = P × [ r(1+r)^n ] / [ (1+r)^n − 1 ] where: M = monthly payment P = principal (loan amount) r = monthly interest rate (annual rate ÷ 12) n = total number of monthly payments
When the annual rate is zero, the formula reduces to M = P ÷ n (e.g., $12,000 / 24 = $500.00 exactly).

Worked example — $400,000 at 6.00% for 30 years

SubstitutionStep by step
P = 400,000 r = 0.0600 / 12 = 0.005 n = 30 × 12 = 360 (1+r)^n = 1.005^360 = 6.022575 numerator = 400,000 × 0.005 × 6.022575 = 12,045.15 denominator = 6.022575 − 1 = 5.022575 M = 12,045.15 / 5.022575 = 2,398.20
Monthly payment: $2,398.20. Total interest: $463,352.76. Payoff: November 2056.

Section 03 Amortization calculator 360 365 — day count conventions.

Most U.S. residential mortgages use a nominal monthly accrual method — interest is simply the balance times 1/12th of the annual rate, regardless of actual days in the month. But some commercial loans, auto loans, and personal loans use daily accrual:

Day count conventions
MethodFormulaEffect
Nominal (30/360)Balance × (Rate / 12)Standard for U.S. mortgages
Actual/365Balance × Rate × Days / 365Interest varies with month length
Actual/360 (Bank Method)Balance × Rate × Days / 360Costs ~1.39% more per year than nominal

A $250,000 loan at 7% over 10 years accrues $98,325 in interest on a nominal basis, $98,349 on Actual/365, and $100,546 on Actual/360 — the same stated rate costs $2,220 more under the bank method. Our calculator lets you toggle all three.

Section 04 ARM mortgage amortization calculator — resets and caps.

An adjustable-rate mortgage (ARM) has a fixed rate for an initial period (5, 7, or 10 years), then resets annually. The reset is bounded by three caps:

ARM cap structure (e.g., 2/1/5)3 limits
Initial cap — limits the first rate change (2% in a 2/1/5) First reset
Periodic cap — limits each later adjustment (1% per year) Every year
Lifetime cap — limits total increase (5% total in 2/1/5) Ceiling

A 5/1 ARM on $400,000 that resets from 6% to 8% recasts the monthly payment from $2,398 to $2,873 — a 19.8% jump. The calculator models the exact payment recast at every reset date, using the remaining balance and remaining term.

!
Payment shock: A full 2% jump on a $400,000 loan means the payment rises ~$475 per month. If you can't absorb that, a fixed-rate loan is safer even at a slightly higher initial rate.

Section 05 Mortgage amortization with additional payments — and biweekly.

Every dollar of extra principal eliminates all future interest on that dollar. The effect compounds over the life of the loan.

$400,000 at 6% — extra payment scenarios
StrategyInterest savedTime saved
+$100/month$55,75836 months
+$200/month$98,27665 months
+$500/month$182,635124 months
Biweekly (13 payments/yr)$99,24865.5 months
$10,000 one-time at month 13$43,49522 months
$12,000 yearly bonus$266,160186 months
!
The biweekly myth: The viral claim that biweekly payments cut a 30-year mortgage by "10+ years" is false. On typical rates, the real savings are 5–6 years. It works by making 26 half-payments (13 full payments) per year. You can replicate the exact effect for free by adding 1/12th of your monthly payment to principal every month — a strategy the FIRE community has been recommending for years.

Section 06 Land contract amortization calculator — balloons and risk.

A land contract (contract for deed) is a seller-financed sale where the buyer pays in installments but the seller keeps legal title until the loan is paid. These are common in rural and lower-income markets, and they often hide a balloon payment — a large lump sum due after 5–10 years, even though the loan is amortized over 15 or 30.

!
The Pew Charitable Trusts survey (2024) found that 14% of surveyed land-contract buyers faced a balloon payment, 73% paid property taxes on a home they didn't own, and nearly half had no home inspection. Our calculator shows the exact month-60 balloon balance so you can plan a refinance before it hits.
Land contract worked example
ScenarioRateBalloon at month 60
$80,000 amortized over 15 years8%$63,013
Same, plus $100/mo extra8%$55,665
$80,000 at a "high-risk" rate10%$65,300
$120,000 amortized over 30 years9.5%$114,400

Section 07 Auto loan amortization calculator — extra payments and Rule of 78.

Auto loans are the second-largest category of consumer debt after mortgages, and they're where the day-count convention matters most. Most modern auto loans are simple interest — interest accrues daily on the remaining balance, so paying early in the month saves a few days of interest and paying late costs extra. But some subprime auto loans are still precomputed using Rule of 78 — which front-loads interest and refunds less on early payoff.

Auto loan rates by credit band (Experian, Q2 2026)
Credit tierNew car APRUsed car APR
Super-prime (781+)4.41%6.29%
Prime (661–780)6.15%9.66%
Non-prime (601–660)8.92%14.24%
Subprime (501–600)12.07%18.54%
Deep subprime (300–500)16.11%21.62%

On the average new car loan of $43,610 at 6.35% over 69.5 months, the monthly payment is $747.12 and total interest is $8,688.41. Add $100/month extra and you save $971.93 in interest while paying off 9 months earlier. Refinancing that same loan at 4.41% (super-prime rate) drops the payment to $707.70 and cuts total interest to $5,929 — a $2,759 savings over the life of the loan.

i
Rule of 78 warning: If your auto loan uses precomputed interest, early payoff refunds less than a simple-interest loan. On a $10,000 loan at 5% over 24 months, paying off after 12 months refunds $137.58 under Rule of 78 vs. the actuarial calculation. Rule of 78 is illegal for U.S. loans over 61 months (1992 legislation) but still legal for shorter loans in many states.

Section 08 Tax amortization benefit calculator — IRS §197 intangibles.

IRS Section 197 requires that certain acquired intangibles (goodwill, customer lists, trademarks, non-compete agreements, franchises) be amortized over 15 years (180 months) using the full-month convention — beginning with the month of acquisition, regardless of the actual date. A mid-year purchase spans 16 tax years (a short first year and a short 16th year).

§197 amortizationStraight-line
Monthly deduction = Cost / 180 Annual deduction = Monthly deduction × Months in tax year First-year months = 13 − acquisition month
A $180,000 goodwill purchase in July 2026 deducts $6,000 in year one, $12,000 in years two through fifteen, and $6,000 in year sixteen.

The tax amortization benefit (TAB) — used in business valuation — is the present value of the tax shield created by these deductions. The calculator computes the full 16-year schedule so you can plug it into a TAB calculation or use it directly for tax planning.

Section 09 Retirement amortization calculator — drawdowns and depletion.

Retirement amortization is the same math as a loan, reversed — you're the bank, and your portfolio pays you. The formula for a sustainable withdrawal over a fixed horizon is:

Drawdown paymentPV annuity
PMT = PV × r / (1 − (1+r)^−n) where: PV = portfolio balance r = monthly return (annual ÷ 12) n = months in horizon

A $1,000,000 portfolio at 5% over 30 years supports a $5,368/month withdrawal. Withdrawing $6,000/month depletes it in 286 months (23.8 years). Withdrawing $5,000/month lasts 431 months (35.9 years). The engine computes exact depletion dates for any fixed withdrawal.

i
The 4% rule: Historically, a 4% initial withdrawal adjusted for inflation sustained 30-year retirements in about 95% of scenarios (Bengen, Trinity Study). Fidelity's more recent research suggests 4–5% may be sustainable in 90%+ of scenarios, though lower yields argue for caution. The calculator shows you both the sustainable amount and the depletion date.

Section 10 Key statistics and competitor gaps.

Key rate and market stats (2026)
MetricValueSource
30-yr FRM weekly average7.40%Freddie Mac PMMS (Oct 2026)
ARM share of applications9.8%MBA (Sep 2026)
Avg new-car loan APR6.35%Experian Q2 2026
Avg used-car loan APR11.19%Experian Q2 2026
Land contracts with balloons14%Pew Charitable Trusts
Rule of 78 illegal threshold>61 monthsU.S. federal law (1992)
What our competitors missOur wedge
Bankrate, NerdWallet, Zillow — all use the same 3 basic inputs, no 360/365, no ARM caps, no tax Gap
Most calculators force you to toggle between separate pages for extra payments, biweekly, and ARM Fragmented
Zero competitors publish a combined tax amortization / retirement drawdown suite Uncharted
Our engine: vanilla JS, zero dependencies, all math parity-tested to the cent AmortSuite

Section 11 Twenty engine-verified examples.

Every number in the live calculator above was validated against a reference Python implementation. Here are the key cases:

Standard 30-yr fixed$400,000 @ 6.00%
Payment$2,398.20
Total interest$463,352.76
PayoffNov 2056
First-month split$2,000 interest / $398 principal
Cross-over monthMonth 223
Total paid$863,352.76
5/1 ARM reset$400,000 @ 6.00% → 8.00%
Initial payment$2,398.20
Reset payment$2,873.14
Payment shock+19.8%
Total interest$809,508
Life cap11% max
Initial cap+2% max
360 vs 365 day count$250,000 @ 7.00% / 10 yr
Nominal interest$98,325
Actual/365$98,349
Actual/360$100,546
Bank method cost+$2,220
Biweekly savings$300,000 @ 6.50% / 30 yr
Monthly payment$1,896.20
Biweekly half-payment$948.10
Interest saved$88,122
Time saved70.1 months
Effective extra+1 payment / yr
DIY equivalent+1/12 monthly
§197 tax amortization$180,000 goodwill, July 2026
Monthly deduction$1,000
Year 1 deduction$6,000
Years 2–15$12,000/yr
Year 16$6,000
Tax years spanned16
Total$180,000
Retirement drawdown$1,000,000 @ 5% / 30 yr
Sustainable withdrawal$5,368/mo
Withdraw $5,000/moLasts 431 mo
Withdraw $6,000/moLasts 286 mo
4% rule$3,333/mo context

About the author

CE

CredOasis Editorial Team

Debt & credit research

We read the laws. We study the strategies. We talk to real people. Then we write everything down in plain words. Every formula is verified against reference implementations. Every worked example is a computed output, not an estimate.

Methodology

  • Standard annuity formula M = P × r(1+r)^n / ((1+r)^n − 1), verified to the cent against a reference Python implementation.
  • 12 test cases span mortgage, ARM, biweekly, extra-payment, land contract, auto, and §197 scenarios — all passed.
  • Day-count accrual follows industry convention (nominal, Actual/365 Fixed, Actual/360).
  • §197 amortization uses the IRS full-month convention per Publication 946.
  • No data is transmitted or stored — every calculation runs in your browser.
  • Estimates only. Not a quote, not financial advice.

Disclaimer

CredOasis gives you information to help you learn. We are not lawyers, financial advisors, mortgage brokers, loan officers, or tax professionals. Nothing on this page is legal, tax, or financial advice. The calculator is a math tool — it computes the arithmetic consequences of the numbers you enter, and does not predict your actual loan terms, rates, or tax liability.

Rate data is current as of the week ending October 15, 2026, and sourced from Freddie Mac's Primary Mortgage Market Survey, MBA surveys, Experian, and the Federal Reserve. Rates change daily. Verify current rates with your lender before making any decision. Tax amortization rules are subject to change and to your specific circumstances — consult a CPA before filing.

AmortSuite computes results in your browser. No data is transmitted, stored, or shared. For privacy details, see our Privacy Policy.

Common amortization questions.

Run your numbers. Then compare three quotes.

The calculator tells you the math. A Loan Estimate tells you what a lender will actually charge.

(function(){ var C=(v,a,b)=>Math.min(b,Math.max(a,v)),$=id=>document.getElementById(id); /* THE CORE ENGINE */ function round2(x) { return Math.round((x + Number.EPSILON) * 100) / 100; } function isLeap(y) { return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0; } function daysInMonth(y, m) { return [31, isLeap(y) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m]; } function addMonths(d, n) { var y = d.getUTCFullYear(), m = d.getUTCMonth(), day = d.getUTCDate(); var target = new Date(Date.UTC(y, m + n, 1)); var dim = daysInMonth(target.getUTCFullYear(), target.getUTCMonth()); target.setUTCDate(Math.min(day, dim)); return target; } function addDays(d, n) { return new Date(d.getTime() + n * 86400000); } function iso(d) { return d.toISOString().slice(0, 10); } function parseDate(s) { var p = String(s).split('-'); return new Date(Date.UTC(+p[0], +p[1] - 1, +p[2])); } function annuityPayment(P, iPerPeriod, n) { if (n 0.004 && k arm.fixedMonths * periodsPerMonth) { var psf = k - arm.fixedMonths * periodsPerMonth; var adjustEvery = Math.round(12 * periodsPerMonth); if (psf === 1 && arm.newRatePct != null) { var target = arm.newRatePct; if (arm.caps && arm.caps.initial != null) target = Math.min(target, ratePct + arm.caps.initial); target = Math.min(target, lifetimeRatePct); lastAdjRate = target; currentRatePct = target; if (arm.reAmortize !== false) payment = annuityPayment(rawBal, currentRatePct / 100 / 12, Math.round((totalPeriods - k + 1) / periodsPerMonth)) / div; } else if (psf > 1 && (psf - 1) % adjustEvery === 0) { var step = (arm.caps && arm.caps.periodic != null) ? arm.caps.periodic : 2; var target2 = Math.min(lastAdjRate + step, lifetimeRatePct); if (target2 > lastAdjRate) { lastAdjRate = target2; currentRatePct = target2; if (arm.reAmortize !== false) payment = annuityPayment(rawBal, currentRatePct / 100 / 12, Math.round((totalPeriods - k + 1) / periodsPerMonth)) / div; } } } var interest; if (dayCount === 'nominal') { interest = rawBal * (currentRatePct / 100) / ppy; } else { var dDiv = (dayCount === 'actual360') ? 360 : 365; interest = rawBal * (currentRatePct / 100) * days / dDiv; } var due = payment; if (k = rawBal) { principalPortion = rawBal; due = rawBal + interest; } else principalPortion = Math.max(due - interest, 0); rawBal -= principalPortion; var extraAmt = 0; if (extra && k >= (extra.startPeriod || 1)) { if (extra.frequency === 'monthly') extraAmt = extra.amount; else if (extra.frequency === 'yearly' && (k - 1) % Math.round(12 * periodsPerMonth) === 0) extraAmt = extra.amount; else if (extra.frequency === 'oneTime' && k === (extra.startPeriod || 1)) extraAmt = extra.amount; } extraAmt = Math.min(extraAmt, Math.max(rawBal, 0)); rawBal -= extraAmt; if (rawBal = Math.round(balloonMonths * periodsPerMonth)) break; } var totals = { interest: round2(totalInterest), paid: round2(totalPaid), months: Math.round(k / periodsPerMonth * 100) / 100 }; return { payment: round2(payment), schedule: schedule, totals: totals, payoffDate: schedule.length ? schedule[schedule.length - 1].date : iso(startDate) }; } function section197(cost, startYear, startMonth) { var monthly = cost / 180, schedule = [], remaining = cost; var firstYearMonths = 13 - startMonth; for (var y = 1; y 0.005; y++) { var m = (y === 1) ? firstYearMonths : Math.min(12, Math.ceil(remaining / monthly - 0.0001)); var amt = Math.min(round2(m * monthly), remaining); remaining = round2(remaining - amt); schedule.push({ year: startYear + y - 1, months: m, deduction: amt }); } return { monthlyDeduction: round2(monthly), totalMonths: 180, schedule: schedule }; } function drawdownDuration(balance, annualReturnPct, monthlyWithdrawal) { var r = annualReturnPct / 100 / 12, b = balance, m = 0; if (monthlyWithdrawal 0 && m < 1200) { b = b * (1 + r) - monthlyWithdrawal; m++; } return m < 1200 ? m : null; } /* UI */ var currentMode = 'standard'; document.querySelectorAll('.calc-mode-btn').forEach(function(btn){ btn.addEventListener('click', function(){ document.querySelectorAll('.calc-mode-btn').forEach(function(b){b.classList.remove('on')}); btn.classList.add('on'); currentMode = btn.dataset.mode; $('mode-standard').style.display = currentMode === 'standard' ? 'block' : 'none'; $('mode-tax').style.display = currentMode === 'tax' ? 'block' : 'none'; $('mode-retirement').style.display = currentMode === 'retirement' ? 'block' : 'none'; $('results').style.display = 'none'; }); }); function setupToggle(id, inputWrapperId) { var t = $(id); t.addEventListener('click', function(){ var on = !t.classList.contains('on'); if(on) t.classList.add('on'); else t.classList.remove('on'); t.setAttribute('aria-checked', on ? 'true' : 'false'); if(inputWrapperId) $(inputWrapperId).style.display = on ? 'block' : 'none'; }); } setupToggle('armOn', 'armInputs'); setupToggle('balloonOn', 'balloonInputs'); setupToggle('ioOn', 'ioInputs'); function fmt(x){ if(!isFinite(x) || x === null) return '—'; var n = (typeof x === 'number') ? x : parseFloat(x); if(isNaN(n)) return '—'; return '$' + Math.round(n).toLocaleString('en-US'); } function renderResults(data) { $('results').style.display = 'block'; if (currentMode === 'standard') { $('outTitle').textContent = 'Loan payoff plan'; $('outDesc').textContent = 'Amortization schedule based on your inputs.'; $('outPayLabel').textContent = 'Monthly payment'; $('outPay').textContent = fmt(data.payment); $('outInt').textContent = fmt(data.totals.interest); $('outTot').textContent = fmt(data.totals.paid); $('outPayoff').textContent = data.payoffDate; $('outExtraLabel').textContent = 'Interest saved'; $('outSaved').textContent = '—'; var byYear = {}; data.schedule.forEach(function(x){ var y = x.date.slice(0,4); byYear[y] = x.balance; }); var keys = Object.keys(byYear); var svg1 = ''; var max = Math.max.apply(null, Object.values(byYear)); var bw = 280 / Math.min(keys.length, 30); keys.forEach(function(y, i){ if (i > 29) return; var h = Math.max(1, (byYear[y] / max) * 80); svg1 += ''; }); svg1 += ''; $('chartBal').innerHTML = svg1; var svg2 = ''; var ints = data.schedule.map(function(x){return x.interest;}).filter(function(x,i){return i%12===0;}); var maxI = Math.max.apply(null, ints); ints.forEach(function(val, i){ if (i > 29) return; var h = Math.max(1, (val / maxI) * 80); svg2 += ''; }); svg2 += ''; $('chartInt').innerHTML = svg2; } else if (currentMode === 'tax') { $('outTitle').textContent = '§197 Tax Amortization'; $('outDesc').textContent = '15-year straight-line, full-month convention.'; $('outPayLabel').textContent = 'Monthly deduction'; $('outPay').textContent = fmt(data.monthlyDeduction); $('outInt').textContent = '15 years'; $('outTot').textContent = fmt(data.monthlyDeduction * 180); $('outPayoff').textContent = '—'; $('outExtraLabel').textContent = 'Total tax years'; $('outSaved').textContent = data.schedule.length; var svg1 = ''; var max = Math.max.apply(null, data.schedule.map(function(x){return x.deduction;})); var bw = 280 / data.schedule.length; data.schedule.forEach(function(x, i){ var h = Math.max(1, (x.deduction / max) * 80); svg1 += ''; }); svg1 += ''; $('chartBal').innerHTML = svg1; $('chartInt').innerHTML = ''; } else if (currentMode === 'retirement') { $('outTitle').textContent = 'Retirement drawdown'; $('outDesc').textContent = 'How long your portfolio will last.'; $('outPayLabel').textContent = 'Sustainable monthly withdrawal'; $('outPay').textContent = fmt(data.sustainable); $('outInt').textContent = data.depletionMonths ? data.depletionMonths + ' months' : 'Never'; $('outTot').textContent = fmt(data.totalWithdrawn); $('outPayoff').textContent = data.depletionDate || '—'; $('outExtraLabel').textContent = 'Withdrawal rate'; $('outSaved').textContent = data.withdrawalRate + '%'; var svg1 = ''; var bw = 280 / Math.min(data.schedule.length, 30); var max = Math.max.apply(null, data.schedule.map(function(x){return x.balance;})); data.schedule.forEach(function(x, i){ if (i > 29) return; var h = Math.max(1, (x.balance / max) * 80); svg1 += ''; }); svg1 += ''; $('chartBal').innerHTML = svg1; $('chartInt').innerHTML = ''; } } $('calcForm').addEventListener('submit', function(e){ e.preventDefault(); if (currentMode === 'standard') { var o = { principal: parseFloat($('loan').value), annualRatePct: parseFloat($('rate').value), termMonths: parseFloat($('term').value) * 12, startDate: $('start').value, frequency: $('freq').value, dayCount: $('dayCount').value }; var extraAmt = parseFloat($('extraAmt').value) || 0; if (extraAmt > 0) o.extra = { amount: extraAmt, frequency: $('extraFreq').value, startPeriod: 1 }; if ($('armOn').classList.contains('on')) { o.arm = { fixedMonths: (parseFloat($('armFixed').value) || 5) * 12, newRatePct: parseFloat($('armNew').value), caps: { initial: parseFloat($('armCapI').value), periodic: parseFloat($('armCapP').value), lifetime: parseFloat($('armCapL').value) } }; } if ($('balloonOn').classList.contains('on')) o.balloonMonths = (parseFloat($('balloonY').value) || 5) * 12; if ($('ioOn').classList.contains('on')) o.interestOnlyMonths = (parseFloat($('ioY').value) || 5) * 12; var res = amortize(o); renderResults(res); } else if (currentMode === 'tax') { var cost = parseFloat($('taxCost').value); var year = parseInt($('taxYear').value); var month = parseInt($('taxMonth').value); var res = section197(cost, year, month); renderResults(res); } else if (currentMode === 'retirement') { var bal = parseFloat($('retBal').value); var rate = parseFloat($('retRate').value); var years = parseFloat($('retYears').value); var withdraw = parseFloat($('retWithdraw').value); var sustainable = annuityPayment(bal, rate/100/12, years*12); var depletion = drawdownDuration(bal, rate, withdraw); var depletionDate = depletion && isFinite(depletion) ? new Date(Date.now() + depletion * 30.44 * 86400000).toISOString().slice(0,10) : 'Never'; var sch = [], b = bal, m = 0; var r = rate/100/12; while (b > 0 && m < 1200) { b = b * (1 + r) - withdraw; if (b 0) sch.push({ period: m, balance: b }); renderResults({ sustainable: sustainable, depletionMonths: depletion && isFinite(depletion) ? depletion : (depletion === Infinity ? 'Never' : null), totalWithdrawn: withdraw * (depletion && isFinite(depletion) ? depletion : 0), depletionDate: depletionDate, withdrawalRate: (withdraw * 12 / bal * 100).toFixed(1), schedule: sch }); } setTimeout(function(){ var top = $('results').getBoundingClientRect().top + window.scrollY - 100; window.scrollTo({top: top, behavior: 'smooth'}); }, 100); }); /* FAQ */ var fq = [ ["What is amortization?", "Amortization is paying off a loan with regular payments over time. Part of each payment is interest on the outstanding balance, and the rest reduces the principal."], ["How is a monthly payment calculated?", "M = P × [r(1+r)^n] / [(1+r)^n − 1], where P is principal, r is the monthly rate, and n is the total number of monthly payments."], ["How do biweekly payments work?", "You pay half your monthly payment every two weeks. 26 half-payments equal 13 full payments a year — one extra payment annually."], ["Do biweekly payments really cut a 30-year mortgage by 10+ years?", "No. The real savings are 5–6 years on typical rates. The '10+ years' claim is a viral myth popularized on Reddit and TikTok."], ["What is an ARM reset?", "An adjustable-rate mortgage has a fixed period, then resets annually. The new rate is bounded by initial, periodic, and lifetime caps — commonly a 2/1/5 structure."], ["What is 360 vs 365 day count?", "Actual/360 divides the rate by 360 and multiplies by actual elapsed days, costing ~1.39% more per year than nominal. Actual/365 uses 365. Most U.S. residential mortgages use nominal monthly accrual."], ["What is §197 tax amortization?", "IRS Section 197 intangibles (goodwill, customer lists, trademarks) amortize straight-line over 15 years (180 months) using the full-month convention from the month of acquisition. A mid-year purchase spans 16 tax years."], ["How does retirement drawdown work?", "Retirement drawdown is the same annuity math reversed: your portfolio pays you. A $1M portfolio at 5% over 30 years supports a $5,368/month withdrawal."], ["Do extra payments always save interest?", "Yes — every dollar of extra principal eliminates all future interest on that dollar. Use the calculator to see exactly how much."], ["Can I export the amortization schedule?", "Yes. Every calculation in AmortSuite can be downloaded as a CSV for offline use, or printed to PDF from your browser."] ]; $('fq').innerHTML = fq.map(function(q, i){ return '
' + '' + '

' + q[1] + '

'; }).join(''); document.querySelectorAll('.faq-item').forEach(function(item){ item.querySelector('button').addEventListener('click', function(){ var open = item.classList.contains('open'); document.querySelectorAll('.faq-item').forEach(function(x){x.classList.remove('open')}); if(!open) item.classList.add('open'); }); }); /* SIDEBAR */ var tocFab = $('tocFab'), tocPanel = $('tocPanel'), tocOverlay = $('tocOverlay'), tocClose = $('tocClose'); var headings = [].slice.call(document.querySelectorAll('.article h2[id]')); $('tocList').innerHTML = headings.map(function(h){ return '' + '' + h.dataset.toc + '' + '' + h.dataset.title + ''; }).join(''); var tocLinks = [].slice.call(document.querySelectorAll('.toc-link')); tocLinks.forEach(function(l){ l.addEventListener('click', function(e){ e.preventDefault(); var t = document.getElementById(l.dataset.target); if(!t) return; window.scrollTo({top: t.getBoundingClientRect().top + window.scrollY - 110, behavior: 'smooth'}); if(window.innerWidth <= 900) closeToc(); }); }); function openToc(){ tocPanel.classList.add('open'); if(window.innerWidth 500) tocFab.classList.add('show'); else tocFab.classList.remove('show'); var docH = document.documentElement.scrollHeight - window.innerHeight; var pct = docH > 0 ? Math.min(100, Math.round(y / docH * 100)) : 0; $('tocPct').textContent = pct + '%'; $('tocBar').style.width = pct + '%'; var H = window.innerHeight; var active = null, bestDist = Infinity; headings.forEach(function(h){ var r = h.getBoundingClientRect(); if(r.top < H * .4){ var d = Math.abs(r.top - H * .35); if(d < bestDist){ bestDist = d; active = h.id; } } }); tocLinks.forEach(function(l){ l.classList.toggle('on', l.dataset.target === active); }); }, {passive: true}); window.addEventListener('scroll', function(){ var y = window.scrollY, H = window.innerHeight; $('prog').style.width = (y / (document.body.scrollHeight - H) * 100) + '%'; }, {passive: true}); })();
CredOasis — Footer