0
0%
$0
$0
$0
$0
$0
- ⓘ
-
-
Monte Carlo Experiment 🎲
The same plan run 12 times in Synthetic mode: three random seeds at each of four path counts. Watch the sampled Equity range jump around at 5 paths and settle as the count climbs to 100. Each row is exactly what "My Plan Only" reports for that seed and path count, so nothing here is a special demo number.
Synthetic mode draws returns from two numbers: μ (Growth) mirrors your Assumptions Growth % and is the average yearly return the model aims for; σ (Volatility) is how much a typical year swings around it. Set them in the boxes below.
| Paths | Seed | Equity range | Inflation range |
|---|
Play further: change any assumption in the sidebar (Growth %, spending, ages) and click Experiment again, or edit Seed and Paths below and use "My Plan Only" to run a single case. Try setting Volatility (σ) higher (say 20) or lower and re-running to watch the Equity range widen or narrow. The Input Distributions panel below is drawn from the last run (100 paths). Note that Synthetic inflation does not yet vary between paths, so its range stays fixed.
For more information about Monte Carlo, its strengths and weaknesses, please see the Monte Carlo and Chance of Success section of the README.
▸ Input Distributions
Per-year distribution of sampled returns and inflation across all paths. Band = p10–p90 · solid = median · dashed = min/max.
Saved Scenarios
Change Log
The most recent releases are summarized here (up to five). Full write-ups of every release live in optimizer_changelog.md. For what the tool does and how to use it, consult the README.md.
- 11.173b
Money you convert now grows for the rest of the year it was converted.
- Every plan that converts will show a higher ending Roth, and most will show higher End Wealth. A converted amount used to be added to the Roth only after the year's growth had already been applied, so it earned nothing at all in the year you converted it. Surplus you banked to Cash or Brokerage instead did earn that growth, so the same dollar grew or did not purely because of where it landed. It now grows from the point it is converted, for the remainder of the year.
- Conversions were being undervalued, so anything that weighs them shifts: Break Even arrives sooner, the Marginal Heirs Tax Rate needed to justify a conversion falls, and Optimize Conversions will suggest larger amounts than it used to.
- Your End Wealth will change, and no other number will. The figure always subtracted the tax owed on whatever is left in the IRA, but it used the marginal rate of the plan's very last year. A single year is a poor guide: a year with a large brokerage harvest and a year with a large conversion land in very different brackets, and on one test plan two otherwise-similar plans were priced 7.3 points apart for that reason alone. It now uses the average rate across the plan's final years with the same filing status, so a plan ending in widowhood is priced at the widow's rate rather than at a blend that includes married years. Spending, taxes and withdrawals are untouched.
- A saved plan or a shared link will report a different End Wealth than it did before this release. Where Optimize for ranks plans by wealth, the order can change with it.
- Proportional Withdraw, Ordered and Guyton-Klinger never read the IRA Goal, so no value you type there changes their result. The field now greys out and says so when one of those is selected, and your number is kept for when you switch back. Reduce IRA in N Years uses it as a drawdown target; Fill Fed/IRMAA Bracket and IRA Draw use it as a floor, which only bites once the balance is near it.
- The total on the balances chart and in the Annual Details table read TotalWealth, which sounds like a plain sum of your accounts. It is not one: that figure already subtracts the tax that would be owed on the IRA, and the capital-gains tax on brokerage growth above its basis. It now reads TotalNetWealth in both places. No number changes.
- 11.171f
The required distribution on an inherited IRA is calculated again.
- For the first year after a spouse's death, no RMD was taken on the IRA the survivor took over. This broke in 11.168c and is fixed, so a plan with a death inside it distributes and taxes that year correctly. Spending does not move.
- Under Optimize for → Earliest Break Even, two plans that break even in the same year are now ordered by the ending Roth balance, and by End Wealth only when that ties as well. Break-even years are whole years and several strategies often cross in the same one, so the row at the top of that goal can differ, and the ⏱ Earliest Break Even marker in the Best table moves with it. No plan's own numbers change.
- The table under that goal now shows Final Roth, the balance that separates two plans tied on the year, and Final IRA, the pre-tax balance the conversions were drawn from. Both follow the Current $ / Future $ switch.
- 11.1703
Proportional and Guyton-Klinger plans were withdrawing, and converting, money they did not need.
- Proportional and Guyton-Klinger strategies contained an error that has been corrected. The error was small, but meaningful: spending is unchanged to the dollar, while ending wealth moves, in most plans upward and in some down. See the Details for more information.
- Cash Reserve now defaults to 0 - no cash buffer, every dollar of surplus reinvested in your Brokerage - instead of Off, which left all surplus in Cash. Measured across families and account mixes, 0 is never worse than Off and usually better, and every dollar of buffer costs a little. Type Off to keep the original all-cash routing; a positive amount still keeps that much in Cash. A shared link made before this release that did not carry a Cash Reserve now loads as 0.
- Annual Details shows where Cash and Brokerage money comes from and goes. CashReserve, under Balances and Cash Δ, is the part of each year's Cash that is the reserve, so you can see the buffer held, topped up, or broken into; it stays hidden when there is no reserve. Under Brokerage Δ, DRIP is the dividends reinvested that year, SurplusBrok is the surplus the Cash Reserve rule routed into Brokerage, and SumBrokIn is the running total of the two: what was put in rather than earned. BrokerageG is the market return plus the reinvested dividends, and its tooltip now says so. Last year's Brokerage, minus Brokerage-, plus BrokerageG, plus SurplusBrok is this year's balance.
- The Balances chart has a Scale control: linear, log10 or log2. A log scale spreads out the small balances that sit in the looks-like-zero band under a large one; log10 puts gridlines at 1k, 10k, 100k, log2 at every doubling. A zero balance has no point on a log axis and shows as a gap in that line.
- 11.16fb
Annual Details now accounts for every dollar that leaves Cash.
- When a Roth conversion's tax is paid from Cash, that money left the account with no column to find it in, so the Cash balance could fall with nothing on screen to account for it. Cash WD does not show it, because that column is the draw that funded spending. Two new columns fix it. ttlCashWD, beside Cash WD in the Withdrawals band and in Cash Δ, is every dollar that left Cash in the year: last year's Cash minus ttlCashWD, plus interest and growth, is this year's Cash. ConvTaxCash, in Cash Δ and Opp. Cost, breaks out the conversion-tax part. Both stay at zero unless Fund conversion taxes from cash is on.
- In Annual Details a balance column disappeared when that account sat at zero for the whole plan, so a plan holding no Cash showed no Cash column under Balances. A zero balance is a fact about the plan, and a missing column reads as though the tool does not track the account. Cash, Brokerage, Cost Basis, Total IRA, Roth, Total Wealth and Spendable now keep their columns whatever the balance. Columns carrying a flow or a rate, such as a tax that is never paid, still hide when every year is zero. The per-person splits stay as they were, because an all-zero Roth 2 means there is no second person rather than an empty account.
- This release also carries internal structure changes that do not affect any number your plan produces.
- 11.16d7
A chosen limit is now filled even after Social Security starts.
- Behavior change - saved plans and shared links will not reproduce their earlier numbers. Once Social Security began, a plan on a Fill Fed Bracket or IRMAA Tier limit stopped 15% of the yearly benefit short of the limit it was told to fill, and stayed short every year after; on one $2.8M plan at the 22% limit that was $168,500 of room left unused across 17 years. Only the taxable part of a benefit counts toward these limits, at most 85% of it. These plans now withdraw and convert more in those years, and which way that lands on End Wealth still depends on the limit, so re-run the Optimizer before treating a new figure as settled. ACA Cliff plans are unchanged, because an ACA cap counts the whole benefit either way.
- Optimizer row ranking is improved, especially when Optimize for resulted in a small number of matching strategies, as is common in Roth Conversion Effectiveness. Those unmatched were treated as ties and the ranks assigned were meaningless. That meaninglessness led to rank instability. Now all non-matching rows are sorted by secondary criteria.
- The Optimize for goal now travels with your plan. A shared link or a saved scenario kept every input but not the goal the table was ranked by, so it reopened on Tax Flexibility and showed a different best plan than the one you sent. Links made before this release are unchanged.
- 11.16d0
The column a note points at is now one click away.
- Where a note names a column in Annual Details, that name is now a link. Clicking it opens Annual Details, turns on the category the column belongs to, scrolls to the column and highlights it for a moment. The columns you already had stay exactly as you left them, and nothing about your plan is recalculated or reloaded. If the column is all zeros, Show Zero is turned on so it is still there to read. The same links are in the How To, on the columns and tabs it sends you to.
- ACA Cliff plans get a new acaBreach column, marked Yes in each year the cap could not be held alongside the Spend Goal. It is blank on plans not using an ACA cap, and hidden when it is blank throughout. The note under an ACA cap named this column before it existed.
- The Documentation tab read Documentation ❌ tests failed on every load, over one failed test about the Limit menu's 24% entry. No calculation was affected, and nothing in the menu was wrong.
- 11.16b0
Fill Fed Bracket now fills the bracket.
- Behavior change - saved plans and shared links will not reproduce their earlier numbers. Picking "22%" stopped short of the top of the 22% bracket by that year's whole deduction, about $32,000 in 2026 for a married couple and more each year after. A chosen bracket is now filled to its top, so these plans withdraw and convert more. Which way that lands depends on the bracket: across 71 plans funding the same spending either way, terminal net worth rose in 18 and fell in 49 - a 12% limit typically gains about $158,000, a 22% limit typically loses about $200,000. So a plan on a 22% or 24% limit will usually show a lower End Wealth than before for the same inputs. Nothing about your plan got worse - the tool was under-filling the bracket you asked for, and the shortfall it left behind happened to be worth keeping. If End Wealth is why you chose that limit, re-run the Optimizer or try a lower limit alongside it before treating the new figure as settled. IRMAA tiers and the ACA cap are unchanged.
- A limit broken by required distributions no longer tells you to spend less. The note under a limit now says which of two causes put the plan over it, because they take opposite advice: spending you can lower, against required distributions and Social Security you cannot. Where required income alone exceeds the limit, the note says lowering the Spend Goal will not change it, names the distribution doing it, and points at converting earlier, a QCD, or a higher limit instead.
- The Limit menu now says where each limit sits on the other ladder. A federal bracket limits income after your deduction and an IRMAA tier limits it before, so the two dollar amounts were never comparable. Entries now read 22% Fed - $211k (IRMAA Tier 1) and IRMAA Tier 1 - $274k (24% Fed), with a sentence underneath and a Show me picture of both ladders on one income axis. The amounts were also about 2.8% too high and are now correct - the top of the 22% bracket reads $211,400 again, which is what your plan was using all along.
- The plan now tells you when your limit could not be kept. If your Spend Goal cannot be funded underneath the limit you picked, the plan pays for the spending and draws above the ceiling anyway - and said nothing about it. A note under the limit now names how many years could not stay inside it and by how much at worst. The note under Extra Annual Roth Conversion also said "the federal bracket ceiling" whatever you had picked; it now names the ceiling you chose.
- A saved plan or shared link naming a withdrawal strategy that is no longer in the Strategy menu used to come up with nothing selected and compute as all zeros. It now loads as Proportional Withdraw +% at its default setting, so you get a working plan you can change rather than a blank one.
- 11.16a9
The Stress Test could report on the wrong plan, and Roth conversions now count toward IRMAA.
- The Stress Test's first result could be computed against the plan you had before the one you loaded, if that plan finished loading while the pass was still running. On one shared link it read "runs out of money in 8 of the 36 worst historical periods" where the plan actually survives all 40. If you have read a Stress Test result on a freshly loaded plan, re-check it. The chart and survival table below it now also raise the "Out of date" banner in that situation instead of appearing current.
- Behavior change - saved plans and shared links will not reproduce their earlier numbers. A Roth conversion was always taxed correctly, but it never counted toward the income Medicare reads two years later to set your surcharge, so a plan could convert year after year and never be billed for it. Plans using Extra Annual Roth Conversion will now show higher IRMAA. This reaches every strategy, not only those targeting a bracket or tier.
- Two places now warn when a conversion goes past a limit you set: a note under Extra Annual Roth Conversion saying how many years it puts you over, and an upward arrow on any Optimizer row whose conversion lands above its own ceiling.
- Behavior change: the ACA income-cap notice no longer appears for non-ACA choices, and no longer names a year already past. That year also decides whether ACA rows appear in the Optimizer, so if you are past the Retirement Start Age you typed, ACA rows may now be correctly withheld.
- Hovering over an income bar on Income & Expenses now shows the actual income with the approximate tax attributed to it, instead of the scaled bar height.
- The Assets at Retirement Age heading now names the year it means, e.g. "Assets at Retirement Age (2035)". This tool has no accumulation phase - it never grows your balances between today and a later retirement year, so if your Retirement Start Age is still ahead of you, forecasting the balances to that year is yours to do. No calculation changed.
- 11.1691
Current $ view now converts running totals correctly.
In Annual Details, the running-total columns (SumTaxes, SumAdvisorFees, and Spendable, renamed SumSpendable) incorrectly discounted the whole column when viewing in Current $. These rows are now correct. The Monte Carlo tab did not change all displayed fields based on current/future, and it now does. In the Summary the
All RMDs
figure (and its QCD note), the Advisor Fees per-year average, the Optimizer's Conv Tax column, and the dollar amounts in the Break Even explanation follow the switch too; they always showed future dollars. The Break Even suggestion also follows current/future. While we determine where the decrease in performance occured, The Monte Carlo now runs 400 paths rather than 500. Details - 11.168e
An advisor fee you can model, and required distributions figured the way the tax rules define them.
- A yearly advisor or fund fee. One field takes either a percentage or a flat CPI-indexed dollar amount and tells you which way it read what you typed. Choose which accounts are billed and which pay. Starts at None, so nothing is charged until you pick accounts; switch back to None to compare a plan with and without it. Money taken from an IRA to pay it is not a taxable distribution.
- Required minimum distributions now come off your December 31 balance, so they are no longer inflated by part of the current year's growth and no longer shift with the month a withdrawal leaves.
- 11.1671
Your Monte Carlo and Stress Test results may now differ from before, because the model behind them is more accurate.
The main projection uses the fixed growth and inflation figures you supply, so the first two changes below show up only in the Monte Carlo, the Stress Test and a Replay, where every path carries its own returns and inflation. That is to say, those runs now account for real-world behavior of Social Security, tax brackets, pensions and the rest.
- When reviewing Monte Carlo paths, you can change the inputs and watch the result. Test whether a change prevents ruin (a Guyton-Klinger strategy often does, though not always gracefully). Exit replay keeps every edit you made. The forward and back arrows run as one loop through every path the run kept, the ten captured Monte Carlo paths and all the stress scenarios, about 46 in total. Those kept paths are also drawn on the survival chart, though picking one out there can be fiddly where several run together; the ▶️ Replay list beside the headline names them.
- Social Security and a pension no longer shrink during deflation. The two recover differently: Social Security measures each increase from the last one it paid, per 42 U.S.C. §415(i), so it picks up where it left off; a capped pension keeps what it was paid and starts again from there.
- The Market Return chart gains a real-return line, the market change after inflation. This one shows on every projection, not only a replay, and it sits flat on a plan with fixed assumptions.
- 11.1657 Walk one Monte Carlo path through your plan. Every Monte Carlo run now captures ten of its paths, from the worst outcome to the best, and the Stress Test keeps every scenario. A ▶️ Replay picker beside the survival headline lets you choose any captured path, and each Stress Test row has its own ▶️. The chosen sequence plays through Charts and Annual Details: your own plan and settings, but that path's market returns and inflation applied year by year. The balance chart overlays a dashed "Plan (steady assumptions)" line so you can see where the path pulls away from the plan's expected trajectory, and a new Market chart view shows the year-by-year returns and inflation behind it, with what day-one $10,000 still buys. A banner names what is playing and steps to the previous or next path with ◀ ▶. Exit with the banner's button; editing any input or leaving Charts and Annual Details also returns you to your plan's own projection. Note: taxes and Social Security are not yet adjusted for variable inflation - tax brackets, IRMAA tiers, and the Social Security COLA all still index at the fixed CPI input, so a high-inflation path overstates tax and understates Social Security income. Details
- 11.1642 Roth can fill a spending shortfall, Ordered offers three more draw orders, and Monte Carlo always runs yours. A new switch, Roth before Brokerage, sits under Cycle Brokerage. Off by default, which is what the tool has always done: a year needing more than your strategy withdraws fills the gap from Cash, then Brokerage, then Roth. On, Roth is taken ahead of the brokerage account, with Cash still first either way. That avoids realizing capital gains but spends the account that grows tax-free, and it cuts both ways: across 60 test plans it gained as much as $471,000 and lost as much as $634,000, and it was negative in 26 of them. Your numbers do not move until you turn it on, and the Ordered strategy greys it out because it draws in the sequence you chose. The Optimizer sweeps both, so every strategy except Ordered appears a second time in the table marked 🅡, whenever you hold Roth. The Ordered strategy adds three draw sequences - Cash→Brok→Roth→IRA, Cash→IRA→Brok→Roth and Brok→Cash→IRA→Roth - and lists the six with the ones that most often came out ahead in testing first; Cash→Brok→Roth→IRA was the best sequence in more test plans than any of the three previously on offer, and in one plan it was worth $858,000 more than the best of them. Monte Carlo now always runs your own plan and marks it: Compare every strategy could leave it out of the run and emphasize a different one in the chart, which affected the Ordered sequences, Guyton-Klinger, and any plan set to an IRMAA tier or an ACA cliff. Your plan is now always in the table, pinned to the top and drawn in the chart, even when the sweep does not cover that strategy, and clicking a row loads what the row says. Separately, the Optimizer now tries five Reduce IRA lengths (3, 7, 11, 17 and 23 years) instead of sixteen and five IRA Draw percentages (5, 7, 9, 11 and 13%) instead of eight, which makes a run about a third shorter and the table easier to read; your own setting is still scored whichever you pick. Details
Every earlier release is written up in optimizer_changelog.md, newest first.
How to Use
- Withdrawal Strategy: The Withdrawal Strategy box (top of sidebar) controls how the simulation draws from your accounts each year. Set the After-Tax Spend goal (annual after-tax income needed) and Spend Delta (yearly change - default −1% per historical data). The IRA Goal field (just below the strategy box) sets a floor in today's dollars, inflation-adjusted (CPI) to each year so it tracks the inflation-indexed brackets, IRMAA tiers, and ACA cliffs it is meant to manage: most strategies draw from the IRA only until it reaches this (inflating) balance, then shift to other sources. For Reduce IRA in N Years it is the amortization target; for all other strategies it is the minimum balance the optimizer will not draw below.
Detailed Strategy Discussion…
Common to all strategies: QCDs (if configured) are applied first - they satisfy the RMD requirement dollar-for-dollar without adding to taxable income. Any remaining RMD obligation after QCDs is then taken as a taxable IRA withdrawal. Both happen before strategy logic runs.
Proportional Withdraw +% - draws IRA, Brokerage, and Cash proportionally (relative to their balances) to cover the spend goal. An optional IRA-only boost adds boost% × spend goal on top of that; the after-tax surplus flows to Roth conversion. At 0% boost this is the pure proportional baseline. Gap fill if still short: Brokerage + Cash (60/40), then Roth, then back to the IRA as a last resort.
Reduce IRA in N Years - calculates the annual IRA draw needed to amortize the IRA down to the IRA Goal (today's dollars, inflation-adjusted to each year) over the remaining simulation years (similar to a mortgage payment). RMDs count toward that target; the strategy draws any remaining amount beyond RMDs. Gap fill if the IRA draw alone doesn't cover spending: Cash → Brokerage → Roth, then back to the IRA as a last resort.
Fill Federal Tax Bracket / IRMAA Tier (soft ceiling) - draws IRA up to a chosen ceiling (top of a federal bracket or an IRMAA tier threshold), then fills any remaining spending from non-taxable sources in order: Cash → Brokerage → Roth. The ceiling is soft: if spending still can’t be met after those are exhausted and the IRA has funds, the simulation draws extra IRA above the ceiling to fund mandatory spending - because spending is a hard requirement and the alternative (an unfunded shortfall while a large IRA sits idle) is worse. The amount drawn above the ceiling appears in the
ForcedIRAcolumn with that year’sBracketOverage; the consequence is extra tax (or, for IRMAA, a Medicare surcharge). The ceiling also defines the room available for Roth conversions.ACA Cliff (strict ceiling) - draws IRA only up to a chosen multiple of the Federal Poverty Level, then fills spending from Cash → Brokerage → Roth. Unlike the bracket/IRMAA ceilings, the ACA cap is strict: it is never breached, because exceeding it forfeits the entire ACA premium subsidy (a cliff, not a gradual cost). If spending can’t be met within the cap, the plan is genuinely untenable at that spend level - the shortfall is shown (red rows) and the strategy is flagged ⚠️ in the Optimizer, rather than silently overspending the cap. Note that on a large pre-tax IRA, required minimum distributions alone can push income above a low FPL multiple, making ACA targeting infeasible regardless of withdrawals. The cap ends at Medicare. ACA premium subsidies stop when Medicare eligibility begins, so from the year every living person in the plan is old enough for Medicare there is no subsidy left to protect and the cap is dropped - the strategy runs as Proportional 0% from that year onward. Until then the cap is measured against household income, so if one spouse is already on Medicare their RMDs and Social Security still count against the other spouse’s limit.
IRA Draw % - withdraws a fixed percentage of the current IRA balance each year regardless of the spend goal (RMDs count toward the target). Gap fill if the after-tax IRA draw falls short of spending: Cash → Brokerage → Roth, then above the stated percentage as a last resort. Useful for a mechanical, balance-proportional drawdown pace.
Ordered - draws from accounts in a strict sequence; unlike other strategies, all spending is handled in this ordered pass (nothing is pre-withdrawn). Because the sequence is the one you chose, Ordered is the only strategy that will not draw extra IRA outside it, so it can leave a small residual shortfall while an account later in the sequence still holds money. That is the strategy answering your question, not a failure to find the money. The fill follows the same order: any year the plan runs a surplus (income beyond spending), that surplus is banked in the first account your sequence would draw that can actually receive a deposit, Cash or Brokerage (Roth and the IRA are contribution-limited). That keeps it first in line to be spent again next year instead of stranded in a last-drawn account. A Cash-first sequence is unchanged from the older cash-only behavior; a Brokerage-first one banks surplus in Brokerage. Six of the 24 possible sequences are offered, listed with the ones that most often came out ahead in testing at the top.
- CBRI (Cash → Brokerage → Roth → IRA): spends taxable money first and leaves the IRA for last, taking Roth ahead of it. Best of the six most often in testing, and the one to try first if the IRA is large enough that a late, forced drawdown is the risk.
- CBIR (Cash → Brokerage → IRA → Roth): depletes taxable accounts first, letting tax-advantaged balances compound longest. The conventional "textbook" depletion order, and the default.
- CIBR (Cash → IRA → Brokerage → Roth): spends Cash, then draws the IRA before touching the brokerage account. Useful when brokerage gains are large enough that realizing them is the expensive move, or when filling low tax brackets early matters more.
- BCIR (Brokerage → Cash → IRA → Roth): sells brokerage before spending Cash, keeping the cash buffer intact longest.
- RIBC (Roth → IRA → Brokerage → Cash): burns tax-free Roth first; useful for stress-testing Roth-heavy portfolios or modeling an intentional Roth-first drawdown.
- BIRC (Brokerage → IRA → Roth → Cash): clears brokerage before tax-deferred, and spends Cash last.
Cycle Brokerage - a toggle that layers on top of any strategy. When enabled, the simulation alternates between IRA draw years and brokerage harvest years. The cycle length N is recomputed each year as round(IRA ÷ Brokerage), so the ratio self-corrects as balances evolve. In a harvest year, spending is funded from brokerage capital gains instead of IRA withdrawals, realizing gains at the preferential LTCG rate (often 0% for many retirees) rather than as ordinary income. Advantages: (1) steps up the cost basis each cycle, reducing future LTCG tax; (2) frees the full IRA bracket headroom for Roth conversions in harvest years; (3) lower MAGI in IRA years can keep IRMAA tiers lower. DRIP (dividend reinvestment) is automatically forced on so dividends reinvest into brokerage rather than leaking to Cash as ordinary income. Two orderings are available: IRA-first (🗘 red) runs N IRA years then harvests - better when the brokerage has high unrealized gains (delay harvest to let IRA deplete first); Brokerage-first (🔄) harvests immediately at the start of each cycle - better when brokerage basis is high (low gains) so the tax cost of harvesting is small. The Optimizer and Monte Carlo always evaluate all three variants. Caveats: harvest years raise MAGI, triggering IRMAA surcharges 2 years later and potentially causing ACA cliff loss; with a very high-gains brokerage the strategy can become less effective as effective LTCG rate rises over time.
Strategy panel controls - these sit with your strategy in the sidebar and affect every tab:
- Maximize Conversions - gets as much into Roth as the plan allows, two ways at once. First, any IRA withdrawal surplus beyond the spend goal is converted to Roth rather than left in Cash. That is a same-dollar move: the money was already withdrawn and taxed on its way out, so this only changes where it lands, and nothing is lost to tax by doing it. Second, it uses available Cash to cover conversion taxes rather than letting those taxes come out of the conversion itself - the standard advice for Roth conversions, and what makes an Extra Annual Roth Conversion $ of $20,000 actually deliver $20,000 to the Roth instead of roughly $13,700 (see the field below). It only ever uses Cash you have: when Cash is short it covers what it can, and at $0 Cash it changes nothing. The two switches beneath it, Convert Excess to Roth and Use Cash, split it into its halves so you can run either alone. On by default in the Optimizer (see note below); toggle it on in single-scenario mode to match.
- Extra Annual Roth Conversion $ - a fixed dollar amount converted from IRA to Roth every year, on top of whatever your strategy and Maximize Conversions already do. Two things to know. (1) The amount you enter is the gross withdrawal from the IRA, and a conversion owes tax on it. Without Use Cash, that tax comes out of the conversion, so less arrives in Roth than you typed - $20,000 entered lands about $13,700 at a 31% marginal rate. With Use Cash on, Cash covers the tax and the full $20,000 lands. Either way, the Roth Conv column in Annual Details shows what actually arrived; the extraConv column (Opp. Cost category) shows the gross. (2) It is capped only by your remaining IRA balance each year - it does not stop at your IRA Goal, because a conversion moves money IRA-to-Roth rather than out of the household, and drawing the IRA down is usually the point. This is the same amount the Optimizer's Optimize Conversions search solves for, and loading a ⇌ row fills it in for you.
- Cycle Brokerage - layers cyclic IRA/brokerage alternation on top of any strategy (see Cycle Brokerage above).
Optimizer search options - these two live at the top of the Optimizer tab rather than the sidebar, because they change only what the Optimizer searches for and have no effect on your single-scenario plan, the charts, or Monte Carlo:
- Optimize Spend - after the Optimizer finds successful strategies, it binary-searches each one for the highest sustainable spend goal that still ends with at least two years of funded wealth. Those rows are marked ✦.
- Optimize Conversions - for the top five Optimizer strategies, sweeps additional fixed annual conversion amounts ($25k steps) to find the best Extra Annual Roth Conversion $ for each, and adds a ⇌ row per winner. Click one to load that whole plan, including the conversion amount, back into the sidebar. Slower (5–15 sec for large IRAs).
Charitable Giving (QCDs) - the Charitable Giving (QCD) block at the bottom of the Annual Income & QCDs section lets you enter a combined household annual QCD maximum. A Qualified Charitable Distribution is a direct transfer from a traditional IRA to a qualifying charity. It satisfies the RMD requirement for that year without adding to your taxable income, which can reduce or eliminate IRMAA Medicare surcharges. Rules: age 70½+ per person (the simulation uses birth month for precision); the IRS limit is $111,000/person/year in 2026, CPI-indexed annually. QCDs are sourced first from the larger eligible IRA, then the smaller. Two modes: Always (switch right, green) donates the full amount every eligible year regardless of tax situation - useful for regular charitable giving goals. As Needed (switch left) applies only as much as needed to drop two IRMAA tiers from your projected MAGI, or to escape the surcharge entirely - whichever requires fewer dollars. Use this when your primary goal is IRMAA avoidance rather than a fixed giving commitment. In either mode your entered amount is the ceiling - the simulation never exceeds it.
Optimizer note: Every Optimizer row converts surplus after spending to Roth, regardless of your sidebar setting - enable Maximize Conversions in the strategy panel to match that assumption in single-scenario mode. Cash-funded conversion taxes work differently: normally Optimizer rows just follow your sidebar setting, so toggling Maximize Conversions changes what the table reports. Under nerdknob the Optimizer instead sweeps it as its own dimension, listing each strategy both with cash-funded taxes (💵) and without, so you can see what that choice is worth rather than assuming it. Those extra rows only appear when you actually have Cash, since the feature does nothing without it.
- What is “Break Even”? When your plan does Roth conversions, the tool quietly runs your entire plan a second time with the conversions removed: the money stays in the traditional IRA, no conversion tax is paid, and that bigger IRA later forces bigger Required Minimum Distributions, taxed in whatever bracket you are actually in those years (including the higher Single rates a surviving spouse pays, and any Medicare IRMAA surcharges the RMDs trigger). Each year the two plans are compared on equal footing, and the earliest year the converting plan pulls ahead and stays ahead for the rest of the plan is marked as Break Even. A year where the converting plan is only briefly ahead before falling behind again does not count. It only appears if conversions actually happen, and shows “—” if the lead never becomes permanent. When it does show “—”, a ⓘ appears next to it; click that to pinpoint exactly which conversion year is the one that erases the lead for good, and how far the plan got before that.
Both plans are compared by after-tax portfolio value: taxable (IRA) assets are reduced by the tax that will eventually be owed on them, and non-taxable (Roth) assets count at face value. The net figure is shown as Total Wealth on the main chart. The IRA discount rate is either each plan's own current tax rate, or the Marginal Heirs Tax if you entered one (see 4. Assumptions). Conversions pay tax early, so the no-conversion plan usually leads at first; the crossover often lands when RMDs ramp up, or when one spouse passes away and the survivor’s tax rate jumps when filing Single, aka “the widow penalty”.
The year-by-year numbers are in Annual Details → Opp. Cost (the convOC column; excessOC is the same comparison for surplus IRA withdrawals banked to Cash, using the same permanent-crossover definition of Break Even). One caveat: with Guyton-Klinger guardrails the no-conversion plan may adjust spending on different years, since the guardrails react to that plan's own portfolio. That is the honest comparison, not an error.
- What does “Optimize for” do? The Optimizer always tests the same set of strategies. What changes is how they are ranked. The Optimize for selector at the top of the Optimizer tab picks the goal used to sort the table, so the best plan for that goal appears first, the ⚓ baseline moves to the best no-conversion plan under the same goal, and the Rank column renumbers to match. It also decides which columns the table shows: each goal keeps the handful of columns that answer its own question and puts the rest away, so you read ten columns instead of twenty-one. It never changes the underlying numbers, only which plan the tool puts in front of you and which figures it shows about that plan. Nothing is discarded - the Show all columns link beside the selector puts every column back on screen at once, and the goal still sets the row order. Clicking any visible column header sorts by that column instead; changing the goal, or switching the columns back, returns the table to goal order. Hover over any row for its spend goal and how many years it funded. The choices:
- Tax Flexibility (the default) favors plans that finish with your money spread evenly across the three tax treatments: pre-tax (IRA), Roth, and taxable (brokerage and cash). An even spread means that in any future year you can draw from whichever account is cheapest at the time, rather than being forced into whatever one account you have left. Because a plan that simply runs out of money would technically be perfectly “even” at zero, this only compares plans that also finish among the wealthiest, then picks the most evenly divided of those.
- Maximum Net Wealth ranks by after-tax wealth remaining at the end of the plan, with the tax still owed on the IRA subtracted first. This is the estate or legacy view.
- Avoiding Widow & RMD Tax ranks by how much forced, higher-rate taxation the plan leaves behind. It adds the tax paid on Required Minimum Distributions during the plan to the tax still owed on whatever is left in the IRA at the end. Both problems come from the same place, a large surviving pre-tax balance, which drives bigger RMDs and is taxed at the higher Single rates once one spouse has passed.
- Minimum Lifetime Taxes ranks by total tax paid over the whole plan, in today's dollars. Note this counts only tax actually paid during the plan, so it can favor leaving a large untaxed IRA behind. Compare it against Avoiding Widow & RMD Tax.
- Maximum Spending ranks by the total you actually get to spend, in today's dollars. Most useful with dynamic strategies such as Guyton-Klinger, where spending varies.
- Maximum Roth ranks by the Roth balance at the end of the plan.
- Balanced (Wealth + Spend) is the older default: after-tax ending wealth plus what you spend, with spending weighted slightly higher on the view that a dollar enjoyed beats a dollar bequeathed.
- Roth Conversion Effectiveness and Earliest Break Even rank by the conversion columns, so they are only meaningful when Optimize Conversions has produced ⇆ rows. Plans without them sort to the bottom.
- 1. Profile & Ages: Enter the birth year and month of each person and estimated life expectancy. The current age, RMD start age, and projected first-year RMD amount are shown below each person's birth fields and update live. Use the Include Spouse checkbox to model a single taxpayer - unchecking it hides all spouse fields and excludes the spouse from the simulation. Retirement Start Age is the age at which you stop earning income; the simulation inflates tax brackets, SS COLA, and spending forward to that year automatically.
- 2. Assets at Retirement Age: Enter the balances you expect to hold in the year the plan starts - the heading names that year. This tool has no accumulation phase: it never grows your accounts between today and a later retirement year, so if that year is in the future, forecasting the balances to it is yours to do. Amounts are in that year's dollars. Brokerage Basis is used to calculate capital gains vs. principal. Total all after-tax investment assets into Brokerage, and all cash-like holdings into Cash. The Reinvest Brokerage Dividends checkbox keeps dividends inside the brokerage account (growing both balance and basis); when unchecked, dividends flow to Cash. Should one spouse predecease the other, all IRA assets are inherited by the remaining spouse. Enter Roth balances separately - Your Roth IRA and Spouse Roth IRA are tracked independently throughout the simulation. The collapsible Account Composition subsection records Equity/Bond ratios - informational only in single-scenario mode, but used by Monte Carlo Bootstrap and Stress modes to apply per-account return sequences.
- 3. Annual Income & QCDs: Input annual Social Security and pension amounts. Set the start ages to see the impact of delaying benefits - the Pension Start Age lets you model a deferred pension that begins after retirement (leave 0 to start at retirement). SS amounts are adjusted annually by the CPI/COLA rate. Survivorship is the percentage of the pension that continues after You pass away. Enable Pension has COLA only if your pension includes a cost-of-living adjustment - most pensions are fixed-dollar. The Charitable Giving (QCD) block at the bottom of this section handles Qualified Charitable Distributions.
- 4. Assumptions: Dividend Rate and State Taxation are the most-changed inputs - set these first. Social Security Fail models the projected trust fund shortfall year and reduced payout.
Growth rate - nominal, not real. Enter the nominal (before-inflation) annual return for IRA, Roth, and Brokerage. The tool deducts inflation internally - do not pre-subtract inflation yourself. The real (purchasing-power) growth rate is approximatelynominal − inflation(Fisher equation:(1+g)/(1+i)−1precisely). For reference: the S&P 500 has returned roughly 10% nominal (≈7% real) since 1928; a diversified 60/40 portfolio averages 7–9% nominal; a conservative bond-heavy allocation 4–6%. Note that the dividend rate is additive - 5% growth + 1.5% dividends = 6.5% total. Asset balances and RMDs grow at the nominal rate, which is why nominal is the correct input even though real growth is what you feel in purchasing power.
Seeing real (inflation-adjusted) values. All dollar amounts in Annual Details are shown in future nominal dollars by default. Use the Future $ / Current $ toggle in the tab bar (left of Annual Details / Charts / Optimizer / Monte Carlo) to restate every balance and income figure in today's purchasing power - this is the clearest way to judge whether your plan preserves your standard of living over time.
Cash Interest is for HYSA and money-market holdings. Inflation drives spending-goal escalation; CPI/COLA drives bracket indexing and SS cost-of-living adjustments (they often differ). Medicare/IRMAA dollar amounts grow at CPI + Inflation combined. - After Changes... Changes to any input - balances, rates, ages, strategy switches, or any other value - trigger an immediate recalculation. On the Annual Details table, rows are highlighted yellow when filing status changes to Single; pink/red means the portfolio cannot cover the required draw (a real shortfall - for the strict ACA Cliff strategy this means the plan is untenable at that spend, and for Ordered a small residual can remain because the strategy will not step outside your chosen sequence). The
ForcedIRAcolumn shows where spending was funded by drawing extra IRA after Cash, Brokerage and Roth ran out; for the soft Fill Bracket / IRMAA strategies that draw goes above the ceiling andBracketOverageshows by how much. The Balances chart has a Both / Mine / Spouse toggle. The Optimizer sweeps all strategy variations and highlights the best result per column. The Monte Carlo tab runs all variations against stochastic return sequences and reports survival rates. Both tabs skip a full rebuild if inputs are unchanged. Use Import/Export to save, load, or delete named scenarios.
For limitations and features not currently modeled, see the README.md.
Where is the Code
You can run this locally (download the *.html and *.js and *.css files from GitHub): github.com/nightskyguy/retirement_assets. Charts require loading remotely: cdn.jsdelivr.net/npm/chart.js.
You can directly run the code from GitHub: tools.netcitizen.us/retirement_optimizer.html
Page loads are tracked anonymously using Google Analytics and Cloudflare Web Analytics. No personally identifiable information is collected; no account data you enter is ever sent anywhere - it stays entirely in your browser.