Methodology

    How our amortization engine works

    Every number in our calculators, models, and reports comes from the same open, deterministic engine. This page explains exactly how it works so you can trust — and verify — the results.

    Compounding

    Monthly, actual/actual

    Interest formula

    Balance × (APR / 12)

    Daily granularity

    Aggregated to monthly rows

    Deterministic

    Same inputs → same output

    1. The core formulas

    Our engine uses the standard fixed-rate amortization formula for scheduled monthly mortgage payments:

    payment = P × (r × (1 + r)^n) / ((1 + r)^n − 1)

    Where:

    • P = remaining principal balance
    • r = APR ÷ 12 (monthly rate)
    • n = remaining term in months

    Each month we compute:

    interest = balance × (APR / 12)
    principal = payment − interest
    new_balance = balance − principal

    HELOC interest uses the same monthly accrual formula but on the outstanding HELOC balance rather than the mortgage balance.

    2. HELOC velocity strategy

    A "velocity" strategy uses a HELOC as a checking account: monthly income is deposited against the HELOC to reduce its average daily balance, then bills are paid from the HELOC as they come due. We model the net effect as:

    monthly_surplus = income − expenses − mortgage_payment
    heloc_paydown = monthly_surplus (when positive)
    heloc_draw   = monthly_shortfall (when negative)

    Each simulated month the HELOC balance changes, and once enough equity is available, a chunk-payment is applied against the primary mortgage principal — replicating the "lump-sum principal reduction" tactic taught in most velocity-banking courses.

    3. Rate changes over time

    Mortgage and HELOC rates can be scheduled to change at specific future dates (introductory periods, ARM resets, forecasted rate cuts, etc). At each rate change the engine re-derives the effective monthly payment from the remaining balance and remaining term — nothing about earlier months is retroactively altered.

    See src/lib/model-amortization.ts for the exact getEffectiveRateroutine.

    4. Confirmed transactions & overrides

    When you confirm a real-world payment or draw, that transaction replaces the projected value for that month. All months prior to the last confirmed transaction are treated as historical fact; months after continue on the projected schedule using the then-current balances.

    Recurring allocations (utilities, interest-only allocations, etc.) are applied on their scheduled dates and always create explicit transaction rows so the audit trail in the Ownership Allocations table is complete.

    5. Interest saved & time saved

    The two headline KPIs shown on every model are computed by running the engine twice:

    • Baseline: your mortgage on the original schedule, no HELOC, no extra principal, no rate changes.
    • Strategy: your mortgage with every strategy element you've enabled — HELOC velocity, rate changes, extra principal, confirmed transactions, allocations.
    interest_saved = baseline.total_interest − strategy.total_interest
    time_saved     = baseline.payoff_month − strategy.payoff_month

    Both schedules use the same amortization function — that's what makes the comparison fair.

    6. What we don't do

    • We don't guess taxes, insurance, or PMI unless you explicitly enter them.
    • We don't assume future rate movements — the scheduled changes are yours to set.
    • We don't hide fees. HELOC annual fees and closing costs appear as explicit lines if you enter them.
    • We never claim guaranteed savings. All figures are illustrative and depend on the inputs you provide.

    7. Reproducibility

    The engine is a pure function: given the same inputs it produces the same amortization schedule, KPIs, and transactions every time. That means the numbers on your dashboard, the numbers in a downloaded PDF, and the numbers in a shared read-only link are always identical.

    The source code lives at src/lib/model-amortization.ts and src/lib/services/calculator-service.ts. Both are covered by unit tests you can inspect in src/test/.

    Questions about the math? We're happy to walk through it.

    Contact our team →