Calculation methodology
Every financial-independence projection in FulcrumWise follows the conventions on this page. They exist so that the same inputs produce the same answer no matter which calculator you open. If you change one engine, change this document too.
Conventions
Monthly compounding, contributions at the end of the month
Balances grow once per month and the monthly contribution lands after that
month's growth. The annual return you type in is treated as a nominal annual
rate compounded monthly, so the monthly rate is annualRate / 12.
balance_next = balance * (1 + annualRate / 12) + monthlyContribution
A projection reports a fractional number of years. When a balance crosses its target part-way through a month we interpolate linearly inside that month rather than rounding up to the next whole year.
When an input itself is a fractional time horizon (e.g. 10.5 years), it is
rounded to the nearest whole month (Math.round(timeHorizon * 12)) before
simulating, so contributions and growth are always computed over the same
number of months.
Real returns, targets in today's dollars
Long-horizon projections run on the inflation-adjusted ("real") return:
realReturn = (1 + nominalReturn) / (1 + inflation) - 1
Because the growth rate is real, every target and every balance is expressed in today's dollars — the purchasing power you have now, not the larger nominal number you would see on a future statement. This is why results are labelled "in today's dollars", and why we do not also inflate the spending target: doing both would double-count inflation.
Every calculator that projects more than a year ahead takes an inflation input. The default is 2.5%.
Savings measured against take-home income
A savings rate is only meaningful against money you actually receive, so income is taxed before the comparison:
savingsRate = (monthlySavings * 12) / (grossIncome * (1 - effectiveTaxRate))
effectiveTaxRate is your all-in average rate across federal, state, and payroll
tax — not your marginal bracket. The default is 22%.
Withdrawals at the start of the period
In the retirement drawdown simulation the year's spending comes out first, and the remaining balance grows for the rest of the year. Growing a full year before withdrawing would assume you live on nothing for twelve months and flatters the result.
The FI number
fiNumber = annualSpending / safeWithdrawalRate
At the default 4% that is 25x annual spending.
PMI (Mortgage / Home Affordability calculators)
Private mortgage insurance is charged whenever the loan-to-value ratio exceeds 80% (i.e. the down payment is under 20%):
monthlyPmi = ltv > 80% ? loanAmount * (pmiRate / 100) / 12 : 0
The default pmiRate is 0.5%/yr, applied to the original loan amount, not
the current balance — a common lender simplification for an estimate rather
than an amortizing PMI schedule. In the Mortgage calculator, the headline
monthly payment is the initial payment, including PMI and any extra
monthly principal entered (see "Extra principal and equity" below); as the
loan amortizes and the balance crosses back under 80% of the original home
price, PMI drops off and the actual payment falls below the quoted figure. The
calculator surfaces the month this happens (pmiEndsMonth) so the quoted
number isn't mistaken for what you'll pay for the life of the loan. The Home
Affordability calculator includes estimated PMI (and HOA) in the front-end DTI
test, since real underwriting does the same, but does not model PMI dropping
off since it only solves for a single point-in-time affordability figure.
Extra principal and equity (Mortgage calculator)
Extra monthly principal is applied to the principal portion of the level payment, not as an increase to the payment amount itself — the level payment still covers that month's interest first, and the extra goes on top straight to principal. This is why a fixed extra amount pays the loan off sooner rather than changing the size of the regular payment. The headline monthly payment includes the extra (it's money the borrower actually sends every month), so the quoted payment always matches the payoff date shown alongside it.
"Equity %" in the amortization schedule is measured against the original
home price, with no appreciation modelled: (homePrice - endingBalance) / homePrice. This is deliberate, not an oversight — the calculator doesn't
model home-value appreciation, so this figure answers "how much of what you
originally paid have you paid off," the same basis pmiEndsMonth uses for
the 80%-of-original-price PMI threshold. A user's actual market equity
(what a sale would net) is typically higher whenever the home has appreciated,
and this calculator does not estimate that.
Debt minimum-only baseline (Debt Payoff calculator)
The "if you never paid a cent extra" comparison pays each debt's own minimum independently, every month, with no rolling of a cleared debt's freed-up minimum into the others. This is the whole point of the comparison: it's what makes "months saved" and "interest saved" reflect the true benefit of a payoff strategy (avalanche/snowball, with or without extra), rather than understating it against a baseline that quietly already assumes some discipline. A shortcut that pools all original minimums into one payment pool from month one — even at $0 extra — would still redirect a cleared debt's minimum to the others, which is a payoff strategy, not a true baseline.
Tax model (Rent vs. Buy / Buy vs. Stay homeownership benefit)
The mortgage-interest/property-tax tax benefit is itemization-aware, not a flat percentage of interest and property tax. Each year:
deductibleInterest = interest * min(1, $750,000 / loanBalance)
estimatedStateLocalIncomeTax = grossIncome * (stateRate + localRate)
SALT = min($40,400, estimatedStateLocalIncomeTax + propertyTax)
incrementalDeduction = max(0, deductibleInterest + SALT - standardDeduction)
benefit = incrementalDeduction * federalRate
Only the federal marginal rate is applied — state/local rates do not reduce a
federal deduction. Instead, taxState/taxLocal feed estimatedStateLocalIncomeTax,
which shares the capped SALT bucket with property tax (state/local income tax
typically consumes some or all of the cap before property tax counts). The
grossIncome input is what state/local income tax is estimated against; in
Buy vs. Stay this is a flat figure for the whole 30-year projection, since that
calculator doesn't otherwise model income growth.
Constants are the currently-enacted tax-year 2026 figures under the One Big Beautiful Bill Act (OBBBA, Pub. L. 119-21, enacted July 4, 2025), per IRS Rev. Proc. 2025-32:
| Constant | 2026 value | Basis |
|---|---|---|
| Standard deduction (single) | $16,100 | OBBBA §70102, indexed for inflation |
| Standard deduction (married filing jointly) | $32,200 | OBBBA §70102, indexed for inflation |
| SALT deduction cap | $40,400 | OBBBA §70120; $40,000 in 2025, +1%/year through 2029, reverts to $10,000 in 2030 |
| Mortgage-interest debt cap | $750,000 | OBBBA §70108 made the TCJA cap permanent (was scheduled to revert to $1M in 2026) |
Known simplifications:
- The SALT cap's income-based phase-down (MAGI above $505,000 for 2026) is not modeled — the $40,400 cap is applied flat regardless of income, which overstates the benefit for high earners above the phase-down threshold.
- The $750k mortgage-interest cap ratio uses the loan balance at the start of the year, not the average balance IRS Pub. 936 prescribes. Since the balance only declines over the year, this slightly understates the deductible share (a conservative approximation) whenever the loan is near the $750k line.
- Buy vs. Stay's
grossIncomedoes not grow year over year (unlike Rent vs. Buy'sgrossIncome, which grows with theincomeGrowthinput), since that calculator has no income-growth model elsewhere. - All four constants (standard deduction, SALT cap, mortgage-interest debt cap) are frozen at their 2026 values for the entire 30-year projection. Under current law the $40,400 SALT cap reverts to $10,000 in 2030, and the standard deduction is not re-projected for future inflation, while income and property tax keep growing with their own inputs — so later projection years understate how much of the itemized deduction gets crowded out, overstating the homeownership tax benefit in the back half of longer projections.
ACA subsidy constants (annual refresh obligation)
The ACA Health Insurance Subsidy calculator (src/lib/aca-calc.ts) ships two
dated constant tables, both verified against their primary source on
2026-08-12 (ACA_FIGURES_AS_OF in that file):
- Applicable percentage table, IRS Rev. Proc. 2025-25 §3.01 — six income-as-%-of-FPL bands. The first (under 133%) and last (300-400%) bands are flat; the four interior bands are linearly interpolated between each band's starting and ending percentage. The 400%-of-FPL line is a hard cliff for plan year 2026: the enhanced premium tax credits that removed that cap expired 2025-12-31, so income at exactly 400% of FPL still gets a credit and income one dollar past it gets none.
- Federal poverty guidelines, HHS/ASPE, 2026, 48 contiguous states + DC only: $15,960 for one person, rising by a constant $5,680 per additional household member. Alaska and Hawaii publish separate, higher guidelines that this calculator does not implement — it excludes them explicitly in copy rather than silently applying the lower 48-state figures, which would understate their distance from the poverty line and overstate their subsidy.
Both tables are republished annually — the IRS issues a new Rev. Proc. for each plan year and HHS updates the poverty guidelines every January. This is a recurring maintenance commitment, not a one-off build: both constant tables must be re-verified against their primary source and updated for every plan year the calculator remains live, or the site will quietly quote a stale subsidy and a stale cliff line. A multi-year projection to age 65 necessarily holds the current year's figures constant for all future years (next year's numbers do not exist yet), and says so in its copy — that assumption gets weaker the further out the projection runs.
Refinance break-even: never show the naive number alone
The industry-standard refinance break-even — closing costs ÷ monthly payment
saving — is arithmetically correct and materially misleading whenever the new
loan resets the term, which is the common case: refinancing 25 years remaining
into a fresh 30-year loan compares a shorter obligation to a longer one and
calls the difference "savings." The Refinance calculator (src/lib/refinance-calc.ts)
always computes and surfaces three figures together:
- The naive break-even (new loan against its own, possibly longer, term).
- A term-matched break-even — the new rate amortized over the exact months remaining on the current loan, the honest apples-to-apples comparison.
- The lifetime cost effect — total P&I on the new loan over its full term, plus any upfront fees, compared against the interest you'd pay carrying the current loan to the end of its remaining term. This can be positive (refinancing costs more over its life) even when the naive break-even looks favorable, whenever a longer term is doing the work of the "saving."
Closing costs default to paid upfront, not rolled into the new loan's principal — upfront is the case a break-even question is actually asking about (cash recovered). Rolling costs into the loan is offered as a toggle; doing so removes the cash-outlay break-even entirely (there's nothing to recover, so both break-even figures read N/A) without removing the cost, which still shows up in the lifetime effect through the larger principal.
Barista FIRE: state the indefinite-income assumption in the same breath
"Barista FIRE lowers your number" is mostly an artifact of assuming part-time
income continues forever. The popular framing —
(annual spending − part-time income) / safe withdrawal rate — is correct
arithmetic but never says so, and on typical inputs it can overstate the
benefit of Barista FIRE by hundreds of thousands of dollars against a
time-limited version of the same idea. src/lib/barista-calc.ts computes both:
- Framing A (indefinite income): the popular number, shown only alongside an explicit statement that it assumes the part-time income never ends.
- Framing B (time-limited): the portfolio needed today to cover the income gap for a chosen number of years and still reach the full FI number afterwards — an annuity-due present value at the post-retirement real rate. This barely undercuts the full FI number, because the obligation to reach it doesn't disappear, it's only postponed, and a realistic post-retirement real return doesn't discount a decade-plus-out target by much.
Because Framing B barely moves the number, the calculator's primary
output is not a number at all — it's a timeline: how many years earlier you
could drop to part-time work, reusing yearsToTarget (already verified in
src/lib/fi-math.ts) against both the full FI number and the Framing B threshold.
That's the genuine benefit of planning to work part-time: reaching a slightly
lower bar sooner, not a permanently smaller one.
Withholding constants (annual refresh obligation)
The Withholding Catch-Up calculator (src/lib/withholding-calc.ts) ships two
kinds of dated figures, both verified against their primary source on
2026-08-15 (WITHHOLDING_FIGURES_AS_OF in that file):
- TY2026 ordinary income brackets and standard deduction, IRS Rev. Proc. 2025-32 §4.01 (brackets) and §4.14(1) (standard deduction). The Head of Household 24%/32% seam ($201,750) and 32%/35% seam ($256,200) are each $25 below the visually similar Single/MFS figures ($201,775 / $256,225) — two independent secondary sources got the HoH seam wrong during verification by propagating Single's value onto it, so this is the single most likely place for the table to drift if re-copied from a secondary source next year.
- The Social Security wage base feeding
MAX_WITHHOLDABLE_FRACTION(the ceiling on how much of a paycheck can be converted to extra withholding) is not independently re-derived here — the engine uses the flat 7.65% employee-side FICA rate as a conservative floor instead, deliberately understating what's withholdable above the wage base rather than depending on a figure that returned HTTP 403 from SSA during verification.
Both the brackets and the standard deduction are republished annually — the
IRS issues a new Revenue Procedure for each tax year, typically in October.
This is a recurring maintenance commitment: WITHHOLDING_FIGURES_AS_OF
and every constant it dates must be re-verified against the TY2027 Rev. Proc.
(expected ~October 2026) or the calculator will quietly quote a stale bracket
table. The Social Security wage base is announced on a similar ~October
cadence and should be rechecked against https://www.ssa.gov/oact/cola/cbb.html
at the same time, even though it isn't currently load-bearing.
Two further rules are carried forward from TY2025 Form 2210 rather than independently verified for TY2026: the 90%-of-current-year / 100%-or-110%-of- prior-year safe harbors, and the $1,000 de minimis threshold. Both are long-stable statutory rules unlikely to change, but should be rechecked against the TY2026 Form 2210 instructions once published, expected around January 2027.
Defaults and where they come from
| Input | Default | Basis |
|---|---|---|
| Annual return | 7% | Long-run US equity returns, roughly 10% nominal less ~3% inflation, rounded conservatively. Treated as nominal here and deflated by your inflation input. |
| Inflation | 2.5% | The Federal Reserve's 2% target plus a small margin; close to the long-run US CPI average. |
| Safe withdrawal rate | 4% | The Trinity study (Cooley, Hubbard & Walz, 1998) and Bengen's earlier work, which found a 4% initial withdrawal adjusted for inflation survived 30-year retirements across historical US market data. |
| Effective tax rate | 22% | A mid-range all-in average rate for a US household earning around the median-to-upper-middle income. Yours will differ; change it. |
| Post-retirement return | 5% | A more conservative mix than the accumulation portfolio, reflecting a shift toward bonds. |
What these models leave out
These are planning tools, not forecasts. Every calculator on this site except the Safe Withdrawal Rate calculator described below deliberately does not model:
Sequence-of-returns risk. Growth is a constant rate, not a path. A real portfolio that falls 30% in your first retirement year behaves far worse than the average suggests.
The Safe Withdrawal Rate calculator (
src/lib/swr-calc.ts) is the deliberate exception to this line. Its entire purpose is to model exactly the risk the rest of this document says is out of scope: instead of one smooth constant real return, it replays every historical year-by-year path from the shipped return dataset (src/lib/data/historical-returns.json, see that directory'sREADME.mdfor provenance) and asks whether a constant real-dollar withdrawal survived it. This is why a "safe" rate sits below the average historical return — the paths that got there, not just the average, are what determine whether a withdrawal plan survives. Do not read this as an inconsistency to fix; it is the reason this calculator exists, and every other calculator stays on the constant-rate model deliberately because the extra complexity isn't worth it for accumulation-phase projections and shorter, less sequence-sensitive calculations. Seesrc/lib/swr-calc.ts's module doc for the withdrawal mechanics and its honest limits (overlapping windows are not independent observations, and taxes/account types/Social Security/dynamic spending are out of scope there too).Taxes in retirement. Withdrawals are treated as spendable in full. Account type (traditional, Roth, taxable) is not modelled.
Income growth. Salary and contributions stay flat in real terms.
Irregular spending. No college costs, home purchases, medical shocks, or one-off windfalls.
Social Security uncertainty. Where it appears, the benefit you enter is taken at face value in today's dollars.
Fees. Expense ratios and advisory fees are not deducted from the return.
Treat the output as a direction and a rough magnitude, not a date on a calendar.