How it works

How the readiness score works

A plain-language walk through the simulation engine: what goes in, what the recurrence does each year, how the two return models differ, and exactly how the score, the survival rate and the "Ready at" age are computed.

Published 10 October 2026 · Reflects Bhavitta 2.7 · 9 min read

The question the app answers

Bhavitta answers two questions about a plan: will the money last to the end of the plan, and from what age could you stop working and still have it last. Everything on this page exists to make those two answers honest and reproducible. The engine is a single compiled Swift package that runs on your phone, on iOS natively and on Android through WebAssembly, so the same plan gives the same result on both.

1. Your plan is a timeline, not a form

A plan is a sequence of life stages from your current age to the end of the planning horizon. Each location stage has:

On top of location stages you layer overlays: a home you own (mortgage, property tax, payoff age, sale with appreciation, selling cost and capital-gains rate), a property you rent out, a child's four years of college, a pension or Social Security (indexed guaranteed income from a start age), a recurring cost such as supporting parents, and one-time events such as a wedding, a windfall, or a down payment.

Years you leave uncovered do not break the model. An uncovered span after a location stage keeps that location and its living costs but drops earned income to zero: you still live there, you just no longer work there. Only a gap before your very first stage is filled with a generic mid-cost US baseline.

2. Every year, one cash-flow line

For each year of the plan the engine resolves the active stage and computes net cash flow: earned income minus tax, minus living expense, college, property and recurring costs, plus guaranteed income, rental income, home-sale proceeds and one-time credits. Then it rolls the balance forward:

balance(t+1) = (balance(t) + netCashFlow(t)) × (1 + return(t)) when the sum is positive
balance(t+1) = balance(t) + netCashFlow(t) otherwise

Two deliberate choices sit in that recurrence. A plan that fails is allowed to go negative, so the ledger and chart show how deep the shortfall is instead of clamping at zero. And a deficit neither earns nor compounds; it is carried and can be paid back down by a later inflow such as a home sale or Social Security.

Indexing. Every amount you type is a today's-money figure. Income, living costs, guaranteed income and property tax grow with the active location's inflation rate from the start of the plan. Costs for an Indian city are stored in dollars and grow at India's inflation less the rupee-depreciation rate you set (defaults 6% and 3%, so about 2.9% a year in dollar terms). A separate display deflator converts any nominal balance back to today's money, switching rate the moment the active location changes, which is why a US-to-Bangalore plan reads sensibly in either basis.

3. Two ways to generate returns

Historical replay (the default)

The plan is run through every contiguous window of real market history. The embedded series is nominal annual total return on the S&P 500, price plus dividends, 1928 to 2023, from Aswath Damodaran's public dataset: 96 years, geometric mean about 9.8%, standard deviation about 19.5%. A 30-year plan therefore gets 67 trajectories, one starting in each of 1928, 1929, and so on; a 50-year plan gets 47. Nothing is randomised; it is deterministic, and it is the most faithful picture of what markets have actually done to a plan like yours, including the sequence-of-returns risk of retiring into 1929, 1966, or 2000.

A second source, Shiller real, deflates each year's return by US CPI so the plan runs in constant dollars with living costs held flat. The two are not comparable in dollar magnitude; use one or the other.

Monte Carlo

10,000 trials. Each year of each trial draws a return from a normal distribution with the expected return and volatility you set; the defaults are a deliberately conservative 7% and 12%. Draws are seeded from the plan itself, so the same plan always produces the same fan and the score does not jitter between opens.

Why the two models disagree. Raw history compounds at about 9.8%; the Monte Carlo default assumes 7%. Over forty years that gap is large, and it is the whole difference. Historical is kept raw, with no recentering, because it is the record; if you want the two to agree, raise the Monte Carlo expected return toward 10%, or treat Monte Carlo as your stress case.

4. What comes out

Bhavitta's Projections chart for an example plan: the fan of balances with the percentile lines from typical to worst case, a dashed line marking the earliest feasible retirement age of 47, and rows for the stress test and the age-by-age ledger below it.
The fan, in the app. The chart on the Projections tab for the worked-example plan from the Seattle vs Bangalore guide. The bold line is typical markets (P50), the shaded cloud behind it is the spread of outcomes, and the dashed vertical line marks the earliest retirement age the solver found. The stress test and the ledger open from the rows underneath.
Bhavitta's Ledger screen for the Move to Bangalore at 50 plan: one row per age with location, income, expense and closing balance on the bad-markets path, switching from Seattle to Bangalore at 50.
The year-by-year ledger. One row per age on the path you pick: here the bad-markets (P80) line. Income stops and the city changes at 50, and the closing balance carries on from there. Balances are shown in today's money, while income and expenses are the plan's own figures grown with inflation, so Bangalore at 50 reads about $80k against the $59,500 today's-money estimate.

5. The readiness score

The 0 to 100 score combines the survival rate with a cushion test at your planned retirement age:

score = 0.8 × survivalRate + 20 × min(1, cushionYears ÷ 10)
cushionYears = balance at retirement on the benchmark line (P80) ÷ first-year retirement spending

So survival alone can earn at most 80 points; the last 20 come from arriving at retirement with at least ten years of spending on the bad-markets line. A plan that survives on paper but starts retirement thin scores in the 80s, which is the point. The headline next to the gauge comes from a second computation, the earliest-retirement solver: it zeroes your earned income (and its tax) from a candidate age onward, leaving everything else in place, including where you live, your home, college and Social Security, and finds the earliest age at which survival still clears the benchmark. That age is the "Ready at 52" in the headline; if no age clears it, the headline says how far short the plan is at your own planned age. The sentence under it names the income sources that cover spending and the riskiest stretch of years on the bad-markets path.

Bhavitta's readiness card for the example plan: a gauge reading 100, the headline Ready at 47, the Adjust sliders and the what-would-move-this list.
The score, in the app. The readiness card for the same example plan. The gauge is the 0 to 100 score from the formula above, "Ready at 47" is the solver's headline, and "vs bad markets" at the top right is the benchmark line (P80) the cushion test uses. Survival of 100% earns the first 80 points and a cushion of ten or more years of spending earns the other 20.

6. Changing one thing

Three sliders under the score, starting corpus, retirement age and yearly spending, re-run the whole simulation on release and show the before and after. The what-if chips apply a named shock: a job loss (income gap), a market crash (a forced drawdown in a chosen year, applied identically to every trial and window), retiring earlier or later, a move abroad, a big expense. Compare overlays up to three scenarios and, with two selected, writes a one-line verdict such as "Moving to Bangalore at 50 lets you retire 4 years earlier", using retirement age first and survival rate as the tie-break.

Bhavitta's Compare Scenarios sheet with two plans selected, showing both median trajectories and the line that says which plan retires earlier.
Compare, in the app. Two plans on one chart with the one-line verdict under it. The Seattle vs Bangalore guide walks through this example in full.

The stress test is a five-by-five grid: expected return from two points below to two points above your baseline, inflation from one and a half points below to above, 200 trials per cell, coloured by survival. It shows which of the two assumptions your plan is actually sensitive to.

7. Spending shape

By default spending is constant real: flat in today's money, rising only with inflation. The optional Bernicke model eases real spending by 1.5% a year after 56 and levels off at 76, the "go-go, slow-go, no-go" pattern seen in retiree surveys. It usually raises survival; treat it as a view, not a promise.

8. What the model does not do

Defaults, in case you want to compare with your own spreadsheet: expected return 7%, volatility 12%, US inflation 3%, India inflation 6%, rupee depreciation 3%, Monte Carlo 10,000 trials, benchmark P80 at an 80% survival bar. All are editable in Inputs.

Run it with your own numbers

Free on iPhone and Android. No account; your plan never leaves your phone.

Download on the App Store Get it on Google Play