<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Car Finance Calculator South Africa 2026 — Monthly Instalment + Balloon Payment | Calcunomics</title>
<meta name="description" content="Calculate your exact monthly car finance instalment including balloon payment impact, NCA fees, and true total cost. Uses current SA prime rate of 10.25%. Free, no sign-up.">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://www.calcunomics.com/calculators/car-finance/">
<meta property="og:title" content="Car Finance Calculator South Africa 2026 — With Balloon Payment">
<meta property="og:description" content="Monthly instalment, balloon payment impact, true total cost, and rate sensitivity for South African vehicle finance. Free and accurate.">
<meta property="og:url" content="https://www.calcunomics.com/calculators/car-finance/">
<meta property="og:type" content="website">

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"@type":"ListItem","position":1,"name":"Home","item":"https://www.calcunomics.com/"},
    {"@type":"ListItem","position":2,"name":"Calculators","item":"https://www.calcunomics.com/calculators/"},
    {"@type":"ListItem","position":3,"name":"Car Finance Calculator","item":"https://www.calcunomics.com/calculators/car-finance/"}
  ]
}
</script>

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebApplication",
  "name": "South Africa Car Finance Calculator 2026",
  "url": "https://www.calcunomics.com/calculators/car-finance/",
  "description": "Calculate monthly car finance instalments with balloon payment modelling, NCA fees, and true total cost using the current SA prime rate.",
  "applicationCategory": "FinanceApplication",
  "operatingSystem": "Any",
  "offers": {"@type":"Offer","price":"0","priceCurrency":"ZAR"}
}
</script>

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the typical car finance interest rate in South Africa in 2026?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "South African vehicle finance is priced at the prime lending rate plus a spread based on your credit profile. With prime at 10.25% (May 2026), typical rates are: prime minus 0.5% to prime plus 1% for top-tier borrowers buying new vehicles with 20%+ deposit; prime plus 2% (12.25%) for the average buyer with a 10% deposit on a new car; prime plus 2.5% to prime plus 3.5% for used vehicles or weaker credit profiles; and prime plus 4% or higher for sub-prime applicants."
      }
    },
    {
      "@type": "Question",
      "name": "What is a balloon payment on a car loan in South Africa?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A balloon payment (also called a residual) is a lump sum — typically 20–30% of the vehicle price — that is deferred to the end of your finance term. It lowers your monthly instalment during the loan, but you still pay interest on the balloon balance every month, and you owe the full lump sum at the end of the term. Most South African buyers cannot pay it in cash and either refinance (adding more interest) or trade in the car, often at a loss. WesBank advises avoiding balloon payments where possible."
      }
    },
    {
      "@type": "Question",
      "name": "How long should a car loan be in South Africa?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The standard South African car finance term is 60 months (5 years). Terms of 72 months reduce monthly payments but significantly increase total interest paid and extend the period you remain in negative equity — where the car is worth less than what you owe. Terms beyond 72 months are available but generally inadvisable: a car financed over 84 months will often be worthless before the loan is repaid."
      }
    },
    {
      "@type": "Question",
      "name": "What NCA fees apply to car finance in South Africa?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "South African vehicle finance agreements are governed by the National Credit Act. The NCA caps the once-off initiation fee at R1,050 excluding VAT (R1,207.50 including VAT) for any credit agreement above R10,000. A monthly service fee is also charged, capped at R69 excluding VAT (R79.35 including VAT). These fees are in addition to your monthly instalment and apply across all major SA lenders including WesBank, MFC, ABSA, and Standard Bank VAF."
      }
    },
    {
      "@type": "Question",
      "name": "How much should I spend on a car in South Africa?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A conservative rule is that your total monthly transport costs — instalment, insurance, fuel, maintenance, and tolls — should not exceed 20% of your gross monthly income. On a R30,000 gross salary, total transport costs should stay below R6,000 per month. If your instalment alone exceeds this, you are likely over-financed. South African banks apply the National Credit Act affordability rules: total monthly debt repayments (including the car instalment) cannot exceed 36% of gross income."
      }
    }
  ]
}
</script>

<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
  --ink: #111827;
  --ink-2: #374151;
  --ink-3: #6B7280;
  --ink-4: #9CA3AF;
  --surface: #FFFFFF;
  --bg: #F9FAFB;
  --border: #E5E7EB;
  --charcoal: #1F2937;
  --charcoal-mid: #374151;
  --charcoal-light: #F3F4F6;
  --green: #059669;
  --green-light: #D1FAE5;
  --green-bg: #ECFDF5;
  --red: #DC2626;
  --red-light: #FEE2E2;
  --amber: #D97706;
  --amber-light: #FEF3C7;
  --orange: #EA580C;
  --orange-light: #FFF7ED;
  --orange-border: #FED7AA;
  --blue: #2563EB;
  --radius: 10px;
  --radius-lg: 16px;
  --shadow-md: 0 4px 20px rgba(0,0,0,0.08);
}
html { scroll-behavior: smooth; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; font-size: 16px; line-height: 1.7; color: var(--ink); background: var(--bg); }
.page-wrap { max-width: 820px; margin: 0 auto; padding: 0 20px 64px; }

.breadcrumb { font-size: 13px; color: var(--ink-4); padding: 20px 0 0; margin-bottom: 24px; }
.breadcrumb a { color: var(--ink-3); text-decoration: none; }
.breadcrumb a:hover { color: var(--charcoal); }
.breadcrumb span { margin: 0 6px; }

.rate-tag {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 700;
  background: var(--charcoal-light); color: var(--charcoal);
  border: 1px solid var(--border);
  padding: 4px 12px; border-radius: 20px; margin-bottom: 14px;
}
.rate-tag::before { content: '●'; font-size: 8px; color: var(--charcoal-mid); }
h1 { font-size: clamp(24px, 4vw, 34px); font-weight: 800; color: var(--ink); line-height: 1.15; letter-spacing: -0.025em; margin-bottom: 14px; }
.lead { font-size: 16px; color: var(--ink-2); line-height: 1.75; border-left: 3px solid var(--charcoal); padding-left: 16px; }

/* Calc card */
.calc-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow-md); overflow: hidden; margin: 28px 0; }
.calc-header { background: var(--charcoal); padding: 20px 24px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; }
.calc-title { font-size: 15px; font-weight: 700; color: #fff; }
.calc-sub { font-size: 12px; color: rgba(255,255,255,0.6); margin-top: 2px; }
.header-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.chip { background: rgba(255,255,255,0.12); color: rgba(255,255,255,0.85); font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 20px; white-space: nowrap; }
.calc-body { padding: 24px; }

/* Inputs */
.input-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; }
.input-grid.three { grid-template-columns: 1fr 1fr 1fr; }
@media(max-width:560px) { .input-grid, .input-grid.three { grid-template-columns: 1fr; } }
.field { display: flex; flex-direction: column; gap: 6px; }
label { font-size: 11px; font-weight: 700; color: var(--ink-3); text-transform: uppercase; letter-spacing: 0.06em; }
.hint { font-size: 11px; color: var(--ink-4); margin-top: 2px; }
.input-wrap { position: relative; }
.pfx, .sfx { position: absolute; top: 50%; transform: translateY(-50%); font-size: 13px; font-weight: 500; color: var(--ink-4); pointer-events: none; }
.pfx { left: 11px; } .sfx { right: 11px; }
.field input, .field select {
  width: 100%; font-size: 15px; font-weight: 600; color: var(--ink);
  background: var(--bg); border: 1.5px solid var(--border); border-radius: var(--radius);
  padding: 11px 36px; outline: none; transition: border-color 0.15s; -moz-appearance: textfield;
}
.field input.np { padding-left: 12px; } .field select { padding-left: 10px; cursor: pointer; }
.field input:focus, .field select:focus { border-color: var(--charcoal); }
input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; }

/* Section divider */
.section-label {
  font-size: 11px; font-weight: 700; color: var(--ink-4);
  text-transform: uppercase; letter-spacing: 0.06em;
  display: flex; align-items: center; gap: 10px; margin: 20px 0 14px;
}
.section-label::after { content: ''; flex: 1; height: 1px; background: var(--border); }

/* Toggle */
.toggle-row { display: flex; align-items: center; gap: 10px; font-size: 14px; font-weight: 500; color: var(--ink-2); margin-bottom: 14px; cursor: pointer; user-select: none; }
.track { width: 40px; height: 22px; border-radius: 11px; background: var(--border); position: relative; transition: background 0.2s; flex-shrink: 0; }
.track.on { background: var(--green); }
.thumb { width: 18px; height: 18px; border-radius: 50%; background: #fff; position: absolute; top: 2px; left: 2px; transition: left 0.2s; box-shadow: 0 1px 3px rgba(0,0,0,0.2); }
.track.on .thumb { left: 20px; }
.toggle-sub { display: none; }
.toggle-sub.visible { display: block; }

/* Rate pills */
.rate-pills { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 16px; }
.rate-pill {
  padding: 6px 14px; border: 1.5px solid var(--border); border-radius: 20px;
  font-size: 13px; font-weight: 600; color: var(--ink-3); cursor: pointer; background: none; transition: all 0.15s;
}
.rate-pill.active { background: var(--charcoal); color: #fff; border-color: var(--charcoal); }
.rate-pill:hover:not(.active) { border-color: var(--charcoal); color: var(--charcoal); }

.calc-btn { width: 100%; padding: 14px; background: var(--charcoal); color: #fff; font-size: 15px; font-weight: 700; border: none; border-radius: var(--radius); cursor: pointer; letter-spacing: 0.01em; transition: background 0.15s, transform 0.1s; margin-top: 4px; }
.calc-btn:hover { background: var(--charcoal-mid); }
.calc-btn:active { transform: scale(0.99); }

/* Results */
.results { display: none; margin-top: 24px; border-top: 1px solid var(--border); padding-top: 24px; }
.results.visible { display: block; }

/* Hero */
.hero-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; margin-bottom: 20px; }
@media(max-width:500px) { .hero-grid { grid-template-columns: 1fr 1fr; } }
.hero-card { border-radius: var(--radius); padding: 18px 14px; text-align: center; }
.hero-card.monthly { background: var(--charcoal); }
.hero-card.total { background: var(--red-light); border: 1px solid #FECACA; }
.hero-card.interest { background: var(--amber-light); border: 1px solid #FDE68A; }
.h-lbl { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px; }
.hero-card.monthly .h-lbl { color: rgba(255,255,255,0.65); }
.hero-card.total .h-lbl { color: var(--red); }
.hero-card.interest .h-lbl { color: var(--amber); }
.h-val { font-size: clamp(18px,3vw,26px); font-weight: 800; line-height: 1; letter-spacing: -0.02em; }
.hero-card.monthly .h-val { color: #fff; }
.hero-card.total .h-val { color: var(--red); }
.hero-card.interest .h-val { color: var(--amber); }
.h-sub { font-size: 11px; margin-top: 5px; }
.hero-card.monthly .h-sub { color: rgba(255,255,255,0.5); }
.hero-card.total .h-sub { color: #F87171; }
.hero-card.interest .h-sub { color: #FCD34D; }

/* Balloon warning */
.balloon-box { background: var(--orange-light); border: 1px solid var(--orange-border); border-radius: var(--radius); padding: 16px 18px; margin-bottom: 20px; display: none; }
.balloon-box.visible { display: block; }
.balloon-header { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 700; color: var(--orange); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 12px; }
.balloon-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }
@media(max-width:480px) { .balloon-grid { grid-template-columns: 1fr 1fr; } }
.b-cell { text-align: center; }
.b-val { font-size: 18px; font-weight: 800; color: var(--orange); }
.b-lbl { font-size: 11px; color: #9A3412; margin-top: 2px; }
.balloon-note { font-size: 12px; color: #9A3412; margin-top: 12px; line-height: 1.6; border-top: 1px solid var(--orange-border); padding-top: 10px; }

/* True cost breakdown */
.true-cost-box { background: var(--charcoal-light); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; margin-bottom: 20px; }
.tc-header { background: var(--charcoal); padding: 10px 16px; font-size: 12px; font-weight: 700; color: rgba(255,255,255,0.8); text-transform: uppercase; letter-spacing: 0.05em; }
.tc-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 16px; border-bottom: 1px solid var(--border); font-size: 14px; }
.tc-row:last-child { border-bottom: none; font-weight: 700; background: var(--surface); }
.tc-label { color: var(--ink-3); }
.tc-value { font-weight: 600; color: var(--ink); }
.tc-value.red { color: var(--red); }
.tc-value.orange { color: var(--orange); }
.tc-value.green { color: var(--green); }

/* Stat row */
.stat-row { display: grid; grid-template-columns: repeat(4,1fr); gap: 10px; margin-bottom: 20px; }
@media(max-width:500px) { .stat-row { grid-template-columns: 1fr 1fr; } }
.stat-cell { background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius); padding: 11px 12px; }
.s-lbl { font-size: 11px; font-weight: 600; color: var(--ink-4); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 3px; }
.s-val { font-size: 14px; font-weight: 700; color: var(--ink); }

/* Balloon comparison */
.compare-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 20px; }
.compare-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.compare-card.winner { border-color: var(--green); }
.cc-header { padding: 10px 14px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; }
.cc-header.no-balloon { background: var(--green-bg); color: var(--green); }
.cc-header.with-balloon { background: var(--orange-light); color: var(--orange); }
.cc-body { padding: 12px 14px; display: flex; flex-direction: column; gap: 8px; }
.cc-row { display: flex; justify-content: space-between; font-size: 13px; }
.cc-key { color: var(--ink-3); }
.cc-val { font-weight: 600; color: var(--ink); }

/* Rate sensitivity */
.rtbl-wrap { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; margin-bottom: 20px; }
.rtbl { width: 100%; border-collapse: collapse; font-size: 13px; }
.rtbl th { background: var(--bg); padding: 8px 12px; text-align: left; font-size: 11px; font-weight: 700; color: var(--ink-4); text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); }
.rtbl td { padding: 9px 12px; border-bottom: 1px solid var(--border); color: var(--ink-2); }
.rtbl tr:last-child td { border-bottom: none; }
.rtbl tr.cur td { background: var(--charcoal-light); font-weight: 700; color: var(--charcoal); }
.rtbl td.up { color: var(--red); font-weight: 600; }
.rtbl td.dn { color: var(--green); font-weight: 600; }

/* Content sections */
.section { margin: 44px 0; }
h2 { font-size: 22px; font-weight: 800; color: var(--ink); margin-bottom: 14px; letter-spacing: -0.02em; }
h3 { font-size: 17px; font-weight: 700; color: var(--ink); margin-bottom: 10px; }
p { color: var(--ink-2); margin-bottom: 14px; line-height: 1.75; }
p:last-child { margin-bottom: 0; }

.warning-box { background: var(--orange-light); border: 1px solid var(--orange-border); border-radius: var(--radius); padding: 16px 18px; font-size: 14px; color: #9A3412; line-height: 1.65; margin: 20px 0; }
.warning-box strong { font-weight: 700; color: var(--orange); }

.rate-ref { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; margin: 14px 0; }
.rr-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--border); font-size: 14px; }
.rr-row:last-child { border-bottom: none; }
.rr-label { color: var(--ink-3); font-size: 13px; }
.rr-value { font-weight: 700; color: var(--ink); font-size: 13px; }
.rr-value.good { color: var(--green); }
.rr-value.warn { color: var(--orange); }
.rr-value.bad { color: var(--red); }

/* FAQ */
.faq { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.faq-item { border-bottom: 1px solid var(--border); }
.faq-item:last-child { border-bottom: none; }
.faq-q { width: 100%; text-align: left; padding: 15px 18px; font-size: 15px; font-weight: 600; color: var(--ink); background: var(--surface); border: none; cursor: pointer; display: flex; justify-content: space-between; align-items: center; gap: 12px; transition: background 0.1s; }
.faq-q:hover { background: var(--bg); }
.faq-icon { font-size: 18px; color: var(--ink-4); flex-shrink: 0; transition: transform 0.2s; }
.faq-a { display: none; padding: 0 18px 15px; font-size: 14px; line-height: 1.7; color: var(--ink-2); background: var(--surface); }
.faq-a a { color: var(--charcoal); }
.faq-item.open .faq-a { display: block; }
.faq-item.open .faq-icon { transform: rotate(45deg); }

/* Related */
.cards-grid { display: grid; grid-template-columns: repeat(auto-fill,minmax(168px,1fr)); gap: 12px; }
.rel-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; text-decoration: none; display: flex; flex-direction: column; gap: 6px; transition: border-color 0.15s; }
.rel-card:hover { border-color: var(--charcoal); }
.rel-card-icon { font-size: 22px; margin-bottom: 2px; }
.rel-card-title { font-size: 14px; font-weight: 700; color: var(--ink); }
.rel-card-desc { font-size: 12px; color: var(--ink-4); line-height: 1.4; }
.guide-links { display: flex; flex-direction: column; gap: 8px; }
.guide-link { display: flex; align-items: center; gap: 10px; padding: 12px 14px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); text-decoration: none; font-size: 14px; font-weight: 600; color: var(--ink); transition: border-color 0.15s; }
.guide-link:hover { border-color: var(--charcoal); }
.guide-link::after { content: '→'; margin-left: auto; color: var(--ink-4); font-weight: 400; }
.disclaimer { background: var(--amber-light); border: 1px solid #FDE68A; border-radius: var(--radius); padding: 14px 16px; font-size: 12px; color: #92400E; line-height: 1.6; margin-top: 40px; }
</style>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4602116331624874"
     crossorigin="anonymous"></script>
</head>
<body>
<div class="page-wrap">

  <nav class="breadcrumb" aria-label="Breadcrumb">
    <a href="homepage.html">Home</a><span>›</span>
    <a href="calculators-hub.html">Calculators</a><span>›</span>
    Car Finance Calculator
  </nav>

  <header style="margin-bottom:0">
    <div class="rate-tag">Prime rate: 10.25% — vehicle finance prime + 1% to + 4%</div>
    <h1>Car Finance Calculator South Africa 2026</h1>
    <p class="lead">Calculate your monthly car finance instalment, total interest, and true cost including NCA fees. Includes balloon payment modelling and a side-by-side comparison showing exactly what a balloon costs you in real terms.</p>
  </header>

  <div class="calc-card" id="calculator">
    <div class="calc-header">
      <div>
        <div class="calc-title">Vehicle Finance Calculator</div>
        <div class="calc-sub">South Africa · Prime 10.25% · NCA-compliant · Updated May 2026</div>
      </div>
      <div class="header-chips">
        <span class="chip">Balloon included</span>
        <span class="chip">NCA fees</span>
      </div>
    </div>

    <div class="calc-body">

      <div class="section-label">Vehicle &amp; deposit</div>
      <div class="input-grid">
        <div class="field">
          <label for="vehicle-price">Vehicle price</label>
          <div class="input-wrap">
            <span class="pfx">R</span>
            <input type="number" id="vehicle-price" value="350000" min="10000" step="5000">
          </div>
          <div class="hint">On-the-road price including VAT</div>
        </div>
        <div class="field">
          <label for="deposit">Deposit</label>
          <div class="input-wrap">
            <span class="pfx">R</span>
            <input type="number" id="deposit" value="35000" min="0" step="5000">
          </div>
          <div class="hint">10% deposit earns a better rate</div>
        </div>
      </div>

      <div class="section-label">Finance terms</div>
      <div class="input-grid three">
        <div class="field">
          <label for="rate">Interest rate</label>
          <div class="input-wrap">
            <input type="number" id="rate" value="12.25" min="1" max="40" step="0.25" class="np" style="padding-left:12px">
            <span class="sfx">% p.a.</span>
          </div>
          <div class="hint">Default: prime + 2% (avg buyer)</div>
        </div>
        <div class="field">
          <label>Rate presets</label>
          <div class="rate-pills">
            <button class="rate-pill" onclick="setRate(10.75)">Prime+0.5%</button>
            <button class="rate-pill" onclick="setRate(11.25)">Prime+1%</button>
            <button class="rate-pill active" onclick="setRate(12.25)">Prime+2%</button>
            <button class="rate-pill" onclick="setRate(13.25)">Prime+3%</button>
          </div>
        </div>
        <div class="field">
          <label for="term">Loan term</label>
          <div class="input-wrap">
            <select id="term">
              <option value="48">48 months (4 years)</option>
              <option value="60" selected>60 months (5 years)</option>
              <option value="72">72 months (6 years)</option>
              <option value="84">84 months (7 years)</option>
            </select>
          </div>
        </div>
      </div>

      <div class="section-label">Balloon payment (optional)</div>
      <label class="toggle-row" onclick="toggleBalloon()">
        <div class="track" id="balloon-track"><div class="thumb"></div></div>
        <span>Include a balloon payment</span>
      </label>
      <div class="toggle-sub" id="balloon-sub">
        <div class="field" style="max-width:300px; margin-bottom:16px">
          <label for="balloon-pct">Balloon percentage</label>
          <div class="input-wrap">
            <input type="number" id="balloon-pct" value="20" min="5" max="50" step="5" class="np" style="padding-left:12px">
            <span class="sfx">% of vehicle price</span>
          </div>
          <div class="hint">Typically 20–30%. Max banks allow: 35%</div>
        </div>
      </div>

      <div class="section-label">NCA fees</div>
      <label class="toggle-row" onclick="toggleFees()">
        <div class="track" id="fees-track"><div class="thumb"></div></div>
        <span>Include NCA initiation &amp; monthly service fee</span>
      </label>

      <button class="calc-btn" onclick="calculate()">Calculate my instalment</button>

      <div class="results" id="results">

        <div class="hero-grid">
          <div class="hero-card monthly">
            <div class="h-lbl">Monthly instalment</div>
            <div class="h-val" id="r-monthly">R0</div>
            <div class="h-sub" id="r-monthly-sub">excl. NCA fees</div>
          </div>
          <div class="hero-card total">
            <div class="h-lbl">Total cost of credit</div>
            <div class="h-val" id="r-total">R0</div>
            <div class="h-sub">all payments + balloon</div>
          </div>
          <div class="hero-card interest">
            <div class="h-lbl">Total interest</div>
            <div class="h-val" id="r-interest">R0</div>
            <div class="h-sub" id="r-int-pct">0% of credit</div>
          </div>
        </div>

        <!-- Balloon warning -->
        <div class="balloon-box" id="balloon-box">
          <div class="balloon-header">⚠️ Balloon payment due at end of term</div>
          <div class="balloon-grid">
            <div class="b-cell">
              <div class="b-val" id="b-amount">R0</div>
              <div class="b-lbl">Balloon lump sum</div>
            </div>
            <div class="b-cell">
              <div class="b-val" id="b-extra-int">R0</div>
              <div class="b-lbl">Extra interest vs no balloon</div>
            </div>
            <div class="b-cell">
              <div class="b-val" id="b-refi">R0</div>
              <div class="b-lbl">Refinanced over 36mo</div>
            </div>
          </div>
          <div class="balloon-note" id="balloon-note">
            Your monthly instalment is lower because <span id="b-pct-label">20%</span> of the vehicle price is deferred. You still pay interest on this amount every month — it is not a discount. At the end of the term, <span id="b-end-amount">R0</span> is due. If you refinance this over 36 months at the same rate, your new payment will be approximately <span id="b-refi-monthly">R0</span>/month.
          </div>
        </div>

        <!-- True cost breakdown -->
        <div class="true-cost-box">
          <div class="tc-header">True monthly cost breakdown</div>
          <div class="tc-row"><span class="tc-label">Monthly finance instalment</span><span class="tc-value" id="tc-instalment">R0</span></div>
          <div class="tc-row" id="tc-fee-row"><span class="tc-label">NCA monthly service fee (incl. VAT)</span><span class="tc-value orange">R79.35</span></div>
          <div class="tc-row"><span class="tc-label">Comprehensive insurance (estimate)</span><span class="tc-value orange" id="tc-insurance">R0</span></div>
          <div class="tc-row"><span class="tc-label">Initiation fee (once-off, month 1)</span><span class="tc-value red" id="tc-init">R0</span></div>
          <div class="tc-row"><span class="tc-label"><strong>True total monthly cost</strong></span><span class="tc-value red" id="tc-total"><strong>R0</strong></span></div>
        </div>

        <!-- Stat row -->
        <div class="stat-row">
          <div class="stat-cell">
            <div class="s-lbl">Amount financed</div>
            <div class="s-val" id="r-financed">R0</div>
          </div>
          <div class="stat-cell">
            <div class="s-lbl">Deposit %</div>
            <div class="s-val" id="r-deposit-pct">0%</div>
          </div>
          <div class="stat-cell">
            <div class="s-lbl">Interest ratio</div>
            <div class="s-val" id="r-int-ratio">0%</div>
          </div>
          <div class="stat-cell">
            <div class="s-lbl">20% income rule</div>
            <div class="s-val" id="r-income-rule">Need R0/mo gross</div>
          </div>
        </div>

        <!-- Balloon comparison -->
        <div id="balloon-compare" style="display:none">
          <div style="font-size:13px;font-weight:700;color:var(--ink-2);text-transform:uppercase;letter-spacing:0.05em;margin-bottom:10px">Balloon vs no balloon — true comparison</div>
          <div class="compare-grid">
            <div class="compare-card winner">
              <div class="cc-header no-balloon">✓ No balloon (recommended)</div>
              <div class="cc-body">
                <div class="cc-row"><span class="cc-key">Monthly instalment</span><span class="cc-val" id="cmp-no-monthly">R0</span></div>
                <div class="cc-row"><span class="cc-key">Total interest paid</span><span class="cc-val" id="cmp-no-interest">R0</span></div>
                <div class="cc-row"><span class="cc-key">Total cost of credit</span><span class="cc-val" id="cmp-no-total">R0</span></div>
                <div class="cc-row"><span class="cc-key">Balloon due</span><span class="cc-val">R0</span></div>
              </div>
            </div>
            <div class="compare-card">
              <div class="cc-header with-balloon">Balloon payment</div>
              <div class="cc-body">
                <div class="cc-row"><span class="cc-key">Monthly instalment</span><span class="cc-val" id="cmp-b-monthly">R0</span></div>
                <div class="cc-row"><span class="cc-key">Total interest paid</span><span class="cc-val" id="cmp-b-interest">R0</span></div>
                <div class="cc-row"><span class="cc-key">Total cost of credit</span><span class="cc-val" id="cmp-b-total">R0</span></div>
                <div class="cc-row"><span class="cc-key">Balloon due at end</span><span class="cc-val" id="cmp-b-balloon">R0</span></div>
              </div>
            </div>
          </div>
          <p style="font-size:12px;color:var(--ink-4);margin-top:6px" id="balloon-diff-note"></p>
        </div>

        <!-- Rate sensitivity -->
        <div style="font-size:13px;font-weight:700;color:var(--ink-2);text-transform:uppercase;letter-spacing:0.05em;margin-bottom:10px">Rate sensitivity</div>
        <div class="rtbl-wrap">
          <table class="rtbl">
            <thead><tr><th>Scenario</th><th>Rate</th><th>Monthly instalment</th><th>vs your rate</th><th>Total interest</th></tr></thead>
            <tbody id="rate-tbody"></tbody>
          </table>
        </div>

      </div>
    </div>
  </div>

  <!-- Balloon explanation -->
  <div class="section">
    <h2>The true cost of a balloon payment</h2>
    <p>A balloon payment feels like a discount. It is not. Here is what actually happens:</p>
    <div class="warning-box">
      <strong>The balloon trap in practice:</strong> A buyer finances a R350,000 vehicle over 60 months with a 20% balloon (R70,000). Their monthly instalment is lower — but they pay interest on the full R350,000 including the R70,000 balloon every month. At month 60, they owe R70,000 in cash. Most South African buyers cannot pay this. They either refinance (adding 24–36 months of fresh interest) or trade the car in — often at negative equity, rolling the shortfall into a new deal. The balloon cycle then restarts.
    </div>
    <p>The only scenario where a balloon makes sense is if you have a genuine plan to save the monthly difference and pay the lump sum in cash at term-end. Use the comparison table in the calculator above to see exactly what the balloon costs you versus no balloon on your specific deal.</p>

    <h3 style="margin-top:24px">Vehicle finance interest rates in South Africa 2026</h3>
    <p>Your rate is determined by your credit profile, the vehicle age, your deposit size, and which lender you use. All rates are expressed as prime plus a spread:</p>
    <div class="rate-ref">
      <div class="rr-row"><span class="rr-label">Prime lending rate (May 2026)</span><span class="rr-value">10.25%</span></div>
      <div class="rr-row"><span class="rr-label">Excellent credit, new car, 20%+ deposit</span><span class="rr-value good">Prime + 0.5% to 1% (10.75–11.25%)</span></div>
      <div class="rr-row"><span class="rr-label">Good credit, new car, 10% deposit</span><span class="rr-value good">Prime + 1.5% to 2% (11.75–12.25%)</span></div>
      <div class="rr-row"><span class="rr-label">Average credit, new or used, no deposit</span><span class="rr-value warn">Prime + 2% to 3% (12.25–13.25%)</span></div>
      <div class="rr-row"><span class="rr-label">Used vehicle, weaker credit profile</span><span class="rr-value warn">Prime + 3% to 4% (13.25–14.25%)</span></div>
      <div class="rr-row"><span class="rr-label">Sub-prime / high-risk applicants</span><span class="rr-value bad">Prime + 4%+ (14.25%+)</span></div>
    </div>
    <p style="font-size:13px;color:var(--ink-4);margin-top:8px;">Source: <a href="https://randtools.co.za/vehicle-finance-calculator" target="_blank" rel="nofollow noopener" style="color:var(--charcoal)">Rand Tools</a> vehicle finance rate guide, May 2026. Always get a formal quote from your lender — use the presets in the calculator above to quickly model different rate scenarios.</p>
  </div>

  <!-- FAQ -->
  <div class="section">
    <h2>Frequently asked questions</h2>
    <div class="faq">

      <div class="faq-item">
        <button class="faq-q" onclick="toggleFAQ(this)">What is the typical car finance interest rate in South Africa in 2026?<span class="faq-icon">+</span></button>
        <div class="faq-a">With prime at 10.25% (May 2026), typical rates range from prime plus 0.5% (10.75%) for excellent-credit buyers with a large deposit on a new vehicle, to prime plus 3% or higher (13.25%+) for used vehicles or weaker credit profiles. The average middle-income buyer with a 10% deposit on a new car typically gets offered around prime plus 2% (12.25%). Always get formal quotes from WesBank, MFC, ABSA VAF, and Standard Bank to compare — rates differ significantly between lenders.</div>
      </div>

      <div class="faq-item">
        <button class="faq-q" onclick="toggleFAQ(this)">What is a balloon payment on a car loan in South Africa?<span class="faq-icon">+</span></button>
        <div class="faq-a">A balloon payment is a lump sum — typically 20–30% of the vehicle price — deferred to the end of your finance term. It lowers your monthly instalment, but you still pay interest on the full loan amount (including the balloon balance) every month. At the end of the term, the balloon is due in full. Most buyers cannot pay this in cash and either refinance (adding more interest) or trade in the car, often at negative equity. Use the balloon comparison table in the calculator above to see the true cost on your specific deal.</div>
      </div>

      <div class="faq-item">
        <button class="faq-q" onclick="toggleFAQ(this)">What NCA fees apply to car finance in South Africa?<span class="faq-icon">+</span></button>
        <div class="faq-a">The National Credit Act caps the once-off initiation fee at R1,050 excluding VAT (R1,207.50 including VAT). A monthly service fee is also charged, capped at R69 excluding VAT (R79.35 including VAT). These are in addition to your monthly instalment and apply across all major SA lenders. Enable the NCA fees toggle in the calculator above to include them in your true monthly cost calculation.</div>
      </div>

      <div class="faq-item">
        <button class="faq-q" onclick="toggleFAQ(this)">How much should I spend on a car in South Africa?<span class="faq-icon">+</span></button>
        <div class="faq-a">A conservative rule is that total monthly transport costs — instalment, insurance, fuel, maintenance, and tolls — should not exceed 20% of gross monthly income. On a R30,000 gross salary, total transport costs should stay below R6,000/month. If your instalment alone is R5,000, you have R1,000 left for fuel, insurance, and maintenance, which is not realistic. The calculator above shows you the gross income required to afford your chosen vehicle under the 20% rule.</div>
      </div>

      <div class="faq-item">
        <button class="faq-q" onclick="toggleFAQ(this)">Should I choose a fixed or variable interest rate for car finance?<span class="faq-icon">+</span></button>
        <div class="faq-a">94% of South African vehicle finance agreements use variable rates linked to prime. A fixed rate gives payment certainty but is typically set 1–2% higher than the current variable rate to compensate the lender for rate risk — making it more expensive in most scenarios. Fixed rates are worth considering only if you believe rates will rise significantly during your loan term and you cannot absorb higher monthly payments. With the SARB's rate-cutting cycle ongoing in 2025–2026, most analysts expect rates to stay flat or fall, making variable more attractive.</div>
      </div>

    </div>
  </div>

  <!-- Related calculators -->
  <div class="section">
    <h2>Related calculators</h2>
    <div class="cards-grid">
      <a href="home-loan-calculator.html" class="rel-card">
        <div class="rel-card-icon">🏠</div>
        <div class="rel-card-title">Home Loan Calculator</div>
        <div class="rel-card-desc">Monthly bond repayment and total interest</div>
      </a>
      <a href="paye-tax-calculator.html" class="rel-card">
        <div class="rel-card-icon">💼</div>
        <div class="rel-card-title">PAYE Tax Calculator</div>
        <div class="rel-card-desc">Your take-home pay before committing</div>
      </a>
      <a href="debt-consolidation-calculator.html" class="rel-card">
        <div class="rel-card-icon">📉</div>
        <div class="rel-card-title">Debt Consolidation</div>
        <div class="rel-card-desc">See if consolidating saves you money</div>
      </a>
      <a href="debt-hub.html" class="rel-card">
        <div class="rel-card-icon">📊</div>
        <div class="rel-card-title">Budget Calculator</div>
        <div class="rel-card-desc">Plan your full monthly income and expenses</div>
      </a>
    </div>
  </div>

  <div class="section">
    <h2>Related guides</h2>
    <div class="guide-links">
      <a href="car-finance-hub.html" class="guide-link">Balloon payment car finance South Africa — explained simply</a>
      <a href="car-finance-hub.html" class="guide-link">Best car finance rates South Africa 2026</a>
      <a href="car-finance-hub.html" class="guide-link">Is it better to buy or finance a car in South Africa?</a>
    </div>
  </div>

  <div class="disclaimer">
    <strong>Disclaimer:</strong> Results are estimates based on the standard amortisation formula with residual (balloon) value and the inputs provided. NCA fee estimates use the statutory caps under the National Credit Act — your lender may charge less. Insurance estimates are indicative only and based on typical comprehensive cover for the stated vehicle value. Actual rates, fees, and instalments will vary based on your credit profile, lender, and specific finance agreement. Calcunomics is not a registered credit provider or financial services provider. Always obtain a formal quotation from a registered lender before committing to a vehicle finance agreement.
  </div>

</div>

<script>
/* === State === */
let balloonEnabled = false;
let feesEnabled = false;

/* === Toggles === */
function toggleBalloon() {
  balloonEnabled = !balloonEnabled;
  document.getElementById('balloon-track').classList.toggle('on', balloonEnabled);
  document.getElementById('balloon-sub').classList.toggle('visible', balloonEnabled);
}
function toggleFees() {
  feesEnabled = !feesEnabled;
  document.getElementById('fees-track').classList.toggle('on', feesEnabled);
  document.getElementById('tc-fee-row').style.opacity = feesEnabled ? '1' : '0.35';
}
function setRate(r) {
  document.getElementById('rate').value = r;
  document.querySelectorAll('.rate-pill').forEach(p => p.classList.remove('active'));
  event.target.classList.add('active');
}

/* === Helpers === */
function fmtR(n) { return 'R' + Math.round(Math.abs(n)).toLocaleString('en-ZA'); }

/* === Finance formula with balloon === */
function calcMonthly(principal, annualRate, termMonths, balloon) {
  const r = (annualRate / 100) / 12;
  const n = termMonths;
  const B = balloon || 0;
  if (r === 0) return (principal - B) / n;
  // M = (P - B*(1+r)^-n) * r*(1+r)^n / ((1+r)^n - 1)
  const factor = Math.pow(1 + r, n);
  return (principal - B / factor) * (r * factor) / (factor - 1);
}

function calcTotal(monthly, termMonths, balloon) {
  return monthly * termMonths + (balloon || 0);
}

/* === Main calculate === */
function calculate() {
  const price = parseFloat(document.getElementById('vehicle-price').value) || 0;
  const deposit = parseFloat(document.getElementById('deposit').value) || 0;
  const rate = parseFloat(document.getElementById('rate').value) || 12.25;
  const term = parseInt(document.getElementById('term').value) || 60;
  const balloonPct = balloonEnabled ? (parseFloat(document.getElementById('balloon-pct').value) || 0) : 0;

  const principal = price - deposit;
  if (principal <= 0) return;
  const balloon = price * (balloonPct / 100);
  const amortPrincipal = principal - balloon; // for comparison only

  const monthly = calcMonthly(principal, rate, term, balloon);
  const totalCost = calcTotal(monthly, term, balloon);
  const totalInterest = totalCost - principal;
  const intRatio = (totalInterest / totalCost) * 100;
  const depositPct = (deposit / price) * 100;
  const grossRequired = monthly / 0.20; // 20% rule

  // NCA fees
  const initFee = feesEnabled ? 1207.50 : 0;
  const monthlyFee = feesEnabled ? 79.35 : 0;

  // Insurance estimate: ~0.8% of vehicle value per year / 12
  const insuranceMonthly = Math.round(price * 0.008 / 12 / 100) * 100;

  // True monthly
  const trueMonthlyCost = monthly + monthlyFee + insuranceMonthly;

  // Hero
  document.getElementById('r-monthly').textContent = fmtR(monthly);
  document.getElementById('r-monthly-sub').textContent = `over ${term} months at ${rate}%`;
  document.getElementById('r-total').textContent = fmtR(totalCost);
  document.getElementById('r-interest').textContent = fmtR(totalInterest);
  document.getElementById('r-int-pct').textContent = Math.round(intRatio) + '% of total cost';
  document.getElementById('r-financed').textContent = fmtR(principal);
  document.getElementById('r-deposit-pct').textContent = depositPct.toFixed(0) + '%';
  document.getElementById('r-int-ratio').textContent = Math.round(intRatio) + '% interest';
  document.getElementById('r-income-rule').textContent = 'R' + Math.round(grossRequired / 1000) + 'k/mo gross';

  // True cost
  document.getElementById('tc-instalment').textContent = fmtR(monthly);
  document.getElementById('tc-insurance').textContent = fmtR(insuranceMonthly) + '/mo est.';
  document.getElementById('tc-init').textContent = feesEnabled ? fmtR(initFee) : 'Not included';
  document.getElementById('tc-total').innerHTML = '<strong>' + fmtR(trueMonthlyCost) + '</strong>';

  // Balloon
  if (balloonEnabled && balloon > 0) {
    // No-balloon for comparison
    const monthlyNoBalloon = calcMonthly(principal, rate, term, 0);
    const totalNoBalloon = monthlyNoBalloon * term;
    const intNoBalloon = totalNoBalloon - principal;
    const extraInterest = totalInterest - intNoBalloon;

    // Refinance balloon over 36 months
    const refiMonthly = calcMonthly(balloon, rate, 36, 0);

    document.getElementById('b-amount').textContent = fmtR(balloon);
    document.getElementById('b-extra-int').textContent = fmtR(Math.abs(extraInterest));
    document.getElementById('b-refi').textContent = fmtR(refiMonthly) + '/mo';
    document.getElementById('b-pct-label').textContent = balloonPct + '%';
    document.getElementById('b-end-amount').textContent = fmtR(balloon);
    document.getElementById('b-refi-monthly').textContent = fmtR(refiMonthly);
    document.getElementById('balloon-box').classList.add('visible');

    // Comparison
    document.getElementById('cmp-no-monthly').textContent = fmtR(monthlyNoBalloon);
    document.getElementById('cmp-no-interest').textContent = fmtR(intNoBalloon);
    document.getElementById('cmp-no-total').textContent = fmtR(totalNoBalloon);
    document.getElementById('cmp-b-monthly').textContent = fmtR(monthly);
    document.getElementById('cmp-b-interest').textContent = fmtR(totalInterest);
    document.getElementById('cmp-b-total').textContent = fmtR(totalCost);
    document.getElementById('cmp-b-balloon').textContent = fmtR(balloon);

    const saving = monthly - monthlyNoBalloon;
    document.getElementById('balloon-diff-note').textContent =
      `The balloon saves you ${fmtR(Math.abs(saving))}/month on your instalment but costs ${fmtR(Math.abs(extraInterest))} more in total interest — plus the ${fmtR(balloon)} lump sum due at the end.`;

    document.getElementById('balloon-compare').style.display = 'block';
  } else {
    document.getElementById('balloon-box').classList.remove('visible');
    document.getElementById('balloon-compare').style.display = 'none';
  }

  // Rate sensitivity
  const scenarios = [
    { label: 'Rate cut 1%', delta: -1 },
    { label: 'Rate cut 0.5%', delta: -0.5 },
    { label: `Your rate (${rate}%)`, delta: 0, cur: true },
    { label: 'Rate hike 0.5%', delta: 0.5 },
    { label: 'Rate hike 1%', delta: 1 },
    { label: 'Rate hike 2%', delta: 2 },
  ];
  document.getElementById('rate-tbody').innerHTML = scenarios.map(s => {
    const r2 = rate + s.delta;
    if (r2 <= 0) return '';
    const m2 = calcMonthly(principal, r2, term, balloon);
    const t2 = calcTotal(m2, term, balloon);
    const i2 = t2 - principal;
    const diff = m2 - monthly;
    const cls = diff > 0 ? 'up' : diff < 0 ? 'dn' : '';
    const diffStr = diff === 0 ? '—' : (diff > 0 ? '+' + fmtR(diff) : '−' + fmtR(Math.abs(diff)));
    return `<tr class="${s.cur ? 'cur' : ''}">
      <td>${s.label}${s.cur ? ' ✓' : ''}</td>
      <td>${r2.toFixed(2)}%</td>
      <td>${fmtR(m2)}</td>
      <td class="${cls}">${diffStr}</td>
      <td>${fmtR(i2)}</td>
    </tr>`;
  }).join('');

  document.getElementById('results').classList.add('visible');
  document.getElementById('results').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}

function toggleFAQ(btn) {
  const item = btn.closest('.faq-item');
  const isOpen = item.classList.contains('open');
  document.querySelectorAll('.faq-item').forEach(el => el.classList.remove('open'));
  if (!isOpen) item.classList.add('open');
}

window.addEventListener('load', () => calculate());
</script>
</body>
</html>