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 →