Tax Analytics in RetireOdds: A Complete Guide
Selling to fund your spending is a taxable event, and the bucket the money comes from decides the bill. Tax Analytics prices every year of your saved plan so you see the cost before you pay it.
The core idea: a withdrawal is a sale, not a paycheck
In retirement, "income" mostly stops meaning a paycheck and starts meaning a sale. Every dollar you spend has to come from somewhere — a brokerage account, a 401(k)/traditional IRA, or a Roth — and each of those three buckets is taxed completely differently. Sell from a taxable account and only the gain portion of the sale is taxed, usually at lower long-term capital-gains rates. Pull from a tax-deferred account (401(k), traditional IRA) and the whole withdrawal is ordinary income, whether you need it or not once Required Minimum Distributions (RMDs) start. Pull from a Roth and a qualified withdrawal is untaxed. RetireOdds' Tax Analytics page ("Tax Planning" in the app's navigation) exists to answer the question that follows from that: given your plan, which buckets get drawn down, in what order, and what does that cost in tax, year by year?
That's a different question from the one Chance of Success answers. The Monte Carlo simulation asks "will the money last?" across thousands of randomized market paths. Tax Analytics asks a narrower, deterministic question: modeled at your plan's expected return, what will the tax bill look like each year, and how do your withdrawals move you across the Medicare IRMAA and ACA-subsidy cliffs? It runs once, on a single expected-return path — not a range of outcomes — so you can see the shape of a normal year, not the odds of a bad one.
It's also not the same thing as a tax return. RetireOdds' tax model is a planning estimate: progressive federal brackets and the standard deduction, an approximate flat state rate, and the federal Net Investment Income Tax (NIIT) on top. It doesn't model itemized deductions, tax credits, payroll (FICA) tax, or the Alternative Minimum Tax. Use it to understand your bracket, your Medicare and ACA exposure, and the relative cost of drawing from one bucket versus another — not to file.
Setting up your tax inputs, step by step
At the top of the Tax page is a collapsed "Investment income & retirement-account basis" panel. When details are missing, the page labels the projection as a Starting estimate and marks the panel Add to refine; it does not force eleven specialist fields open before showing the plan. Expand the panel when you are ready. Its fields map to real tax-form lines and are shared with the Roth conversion planner, so you only enter them once.
Dividends and interest
- Qualified dividends — 1099-DIV box 1b. Taxed at capital-gains rates, stacked on top of your ordinary income.
- Other dividends — 1099-DIV box 1a minus box 1b (the non-qualified portion). Taxed as ordinary income.
- Taxable interest — 1099-INT box 1. Taxed as ordinary income.
The app treats these as part of your portfolio's total return, not extra growth on top of it — but their tax, MAGI, NIIT, ACA-subsidy, and IRMAA effects flow through every year of the projection. Until you enter them, the model uses zero for the missing fields and visibly labels the result as a starting estimate rather than presenting it as complete.
This year's realized gains
- Realized short-term gains YTD — sales already booked this year, held one year or less. Enter a negative number for a net loss.
- Realized long-term gains YTD — sales already booked this year, held more than one year. Same negative-for-a-loss convention.
- Loss carryforward (short-term / long-term) — unused losses carried from prior tax years.
These feed the current-year tax baseline behind Year-End Moves and the portfolio-insights views, in addition to this projection.
After-tax traditional IRA basis
Enter your IRA basis from the latest Form 8606, line 14 — the running total of after-tax (non-deductible) contributions you've made to traditional IRAs that haven't yet been recovered tax-free. If you file jointly, a separate field appears for your spouse's Form 8606 line 14.
Roth IRA basis and five-year clocks
- Regular contribution basis — the total of your direct Roth contributions not yet withdrawn. Regular contributions can always come out tax- and penalty-free.
- First Roth contribution year — starts the separate five-year test for a qualified (fully tax-free) distribution of earnings.
- Conversion lots — one entry per conversion, with its tax year and the taxable vs. non-taxable split of that conversion. Each lot carries its own five-year recapture clock for the 10% early-withdrawal penalty.
For withdrawals taken before age 59½, the app applies the statutory ordering rule: regular contributions come out first, then conversion lots oldest-first, then earnings last.
Until the investment-income fields above are filled in, the header stats still show the current modeled figures but label them Starting estimate, with captions pointing back to the dividends and interest that would refine tax, MAGI, ACA, and IRMAA.
How the projection works
Tax Analytics prices your saved plan's spending — the annual amount from your profile — not a figure inferred from your portfolio size. Everything on the page is in today's dollars (the "real" frame), and it's modeled at your plan's expected real return: one deterministic path, not a distribution of possible outcomes.
If you haven't retired yet, the projection first grows today's account balances forward to your retirement age at that expected return, adding your planned annual savings along the way, before switching into withdrawal-funding mode for retirement itself. That accumulation phase keeps the numbers honest for a plan that's still years from starting to draw down.
The headline figure, "Taxes through plan horizon," is the modeled federal, state, and (where applicable) coordinated expat tax paid from the current year through the end of your plan. It deliberately excludes two things: baseline tax on your current employment income, and the tax you'd owe if you fully liquidated the portfolio right after the plan horizon ends. Those are outside what a year-by-year retirement withdrawal projection is meant to price.
Reading the tax timeline
The main chart is a stacked-area timeline running from your first retirement year to your plan's end age. The dark area is income-plus-capital-gains tax for that year; the orange area, stacked on top, is Medicare IRMAA. A dashed vertical line labeled "MEDICARE AT 65" marks the first year IRMAA can apply, and if any year's income pushes you over the ACA subsidy cliff, a red dashed overline spans exactly the age range where that happens, labeled with the first and last cliff age.
Click anywhere on the chart to select the nearest year — that populates the detail panel beside it. A "Milestones only" toggle above the chart switches between all plan years and a lighter set: the first year, every fifth year, your last modeled year, the first Medicare year, and the first ACA-cliff year, if any.
The chart-shell controls
- Toggle a series — click a legend name (Income + gains tax, IRMAA) to hide or show it. A hidden series drops out of both the chart and the CSV export.
- Chart / table — switch to a row-by-row table with the same toggle.
- Keyboard navigation — once the chart has focus, the Left/Right arrow keys (and Home/End) step through years one at a time.
- Export CSV — downloads exactly the years and series currently visible, not the full dataset behind a series you've hidden.
The selected-year panel, line by line
Clicking a year opens a detail panel with every figure that went into that year's tax bill, top to bottom:
- MAGI — Modified Adjusted Gross Income for the year, the figure that drives both the IRMAA lookback and the ACA subsidy calculation.
- Lifestyle spending — your saved plan's baseline spending assumption for that year, before healthcare, one-time events, or other obligations.
- Total cash need (shown only when it differs from lifestyle spending) — lifestyle spending plus healthcare, life events, and other obligations for the year.
- Social Security, Timeline income, Deferred compensation, and Alternative-asset cash (each shown only when non-zero) — cash available to cover spending before the portfolio is touched.
- Portfolio funding — the remaining cash need for the year, plus that year's billed IRMAA, i.e. what your accounts actually have to supply.
- Ordinary income — the ordinary-income portion of your withdrawals (tax-deferred draws and any RMD, called out separately when one applies).
- Capital gains — realized long-term gains for the year, from taxable-account sales.
- Investment income — your entered dividends plus taxable interest for the year, shown together.
- NIIT (when non-zero) — the 3.8% Net Investment Income Tax included in that year's total.
- IRA basis recovered (when non-zero) — the tax-free, pro-rata portion of that year's tax-deferred withdrawal, drawn from your entered basis.
- Tax (incl. gains) — the year's total modeled tax, labeled with its effective rate as a percentage of that year's portfolio draw — not a marginal bracket rate. RetireOdds doesn't publish a marginal-rate figure on this page; this percentage is exactly what it says: how much of the money you pulled from your accounts that year went to tax.
Two more sections appear depending on the year's phase:
- Medicare years — the IRMAA surcharge billed that year, its tier if one applies, and a "Room before next IRMAA tier" bar showing MAGI headroom before the surcharge steps up.
- Pre-Medicare years — your ACA subsidy for the year (or "$0 — over cliff" if you've crossed 400% of the federal poverty line), how much less that is than the subsidy at a low reference income, and — if you haven't crossed the cliff — a "Room before ACA cliff" bar showing MAGI headroom left.
Buckets and withdrawal order
Below the detail panel, a "Buckets & withdrawal order" section shows how your current portfolio splits across the three buckets — taxable, tax-deferred, Roth — as both dollars and a percentage bar, with the app's recommended draw order: taxable → tax-deferred → Roth. Draining the taxable bucket first lets tax-deferred and Roth balances keep compounding tax-deferred or tax-free for longer, and it defers RMDs' forced ordinary income as long as possible.
The "Bucket-aware plan" switch at the top of the page is on by default, but it doesn't change what this page shows you — Tax Analytics always projects the bucket-aware model. What it actually controls is whether your Chance of Success Monte Carlo simulation also draws down your accounts in this taxable → tax-deferred → Roth order (with capital-gains treatment on taxable sales) instead of the simpler legacy model.
That legacy comparison is exactly what the "Saved by sequencing" stat measures: the app also runs a parallel model where every portfolio dollar you withdraw is grossed up and taxed as ordinary income — the same Social Security taxation and the same forced RMDs, so the only thing that differs is the tax treatment of the withdrawal source. "Saved by sequencing" is the lifetime tax gap between that flat model and the real bucket-aware one.
When your plan draws meaningfully from the portfolio, the page also surfaces a sequence-of-returns note: holding roughly two years of that first year's portfolio-funded spending in cash, so an early market downturn doesn't force you to sell equities at a loss to cover near-term spending. See Sequence-of-Returns Risk for why that matters most in the first few retirement years.
The two cliffs: ACA and IRMAA
The ACA subsidy cliff
Before Medicare eligibility at 65, RetireOdds models an ACA marketplace premium net of the premium tax credit (subsidy). The enhanced pandemic-era credits expired at the end of 2025, so for 2026 coverage the traditional cliff is back: through 400% of the Federal Poverty Line (FPL, scaled to your household size), the subsidy covers a sliding share of the benchmark plan's cost; above 400% FPL, the subsidy disappears entirely. The "ACA cliff" stat at the top of the page reports the first pre-65 year your projected MAGI crosses that line — the year your withdrawal decisions start costing you the subsidy outright, not just shrinking it.
IRMAA and the statutory two-year lookback
Medicare IRMAA works on a delay: the surcharge billed to you in a given year is set by your MAGI from two years earlier (SSA Handbook §2504), so a large Roth conversion or capital gain at 63 shows up as a higher Medicare premium at 65. The 2026 tables have five surcharge tiers above the no-surcharge tier, and the app's constants are pinned to that tax year and re-verified against the CMS fact sheet on a logged date.
Because of that lookback, the detail panel shows two related but different numbers for a Medicare-phase year: the IRMAA surcharge is the dollar amount actually billed that year, priced off your MAGI from two years earlier. Its tier label, and the "Room before next IRMAA tier" bar beside it, describe the other direction — what tier this year's MAGI is on track to set for your premium two years from now. Reading both together tells you what a past decision is costing you today, and what today's decision is setting up for two years out.
How this connects to the rest of RetireOdds
- Roth Conversions shares this page's investment-income and basis inputs and its bucket engine — a conversion modeled there changes MAGI, and its downstream IRMAA and ACA effects show up back here.
- Healthcare supplies the ACA premium/subsidy and Medicare IRMAA numbers this page displays; adjust your healthcare assumptions there to change what you see here.
- The Ledger's "Why this result?" evidence trail cites these same year-by-year figures — annual tax, Roth conversions, healthcare cost, portfolio funding need, closing bucket balances, and any unfunded amount — and links straight back to this Tax Planning page for the year in question.
- Chance of Success can use this same bucket-aware withdrawal and tax engine when the "Bucket-aware plan" switch is on, instead of a simpler flat-tax approximation.
Honest limitations
Everything below is a disclosed, intentional simplification — not a bug — checked directly against the code that ships:
- This is a planning estimate, not a tax return: no itemized deductions, tax credits, payroll (FICA) tax, or Alternative Minimum Tax.
- State tax is an approximate flat effective rate per state (using each state's own statutory or typical effective rate), not a full state return — some states (Illinois, Pennsylvania, Mississippi) exempt retirement-plan distributions specifically, and that exemption is modeled, but graduated-bracket detail beyond that isn't.
- IRA basis is applied pro rata across your combined tax-deferred bucket rather than per account, understating basis recovery when 401(k) dollars are mixed with IRA dollars that actually carry basis — disclosed above and in the app itself.
- Roth conversion tax is funded from taxable cash only; the app will not tap existing Roth assets to cover it even if taxable cash runs short, and reports the gap as unpaid rather than guessing at a secondary earnings-tax draw.
- Detailed Roth tracking — the five-year clocks and lot-level conversion basis — requires a first-contribution year. Without one, earnings are conservatively treated as non-qualified, and the app visibly warns rather than assuming they're tax-free.
- Federal brackets, the standard deduction, capital-gains breakpoints, NIIT thresholds, IRMAA tiers, and ACA FPL/percentage figures are all pinned to a specific tax year (2026) against primary sources — IRS Revenue Procedures, the CMS Part B/IRMAA fact sheet, and KFF/FPL guidelines — each with a logged verification date in the code, refreshed and re-verified when the year rolls over.
- The standalone Roth ladder assumes both spouses are the same age for age-65 deduction and Medicare-enrollment purposes; Tax Analytics itself uses each spouse's actual entered birth year.
Next steps
Enter your dividends, interest, and basis once and it feeds Tax Analytics, the Roth Conversions planner, and Year-End Moves together. From there, pair this page with the Healthcare guide to understand what's driving your ACA and IRMAA numbers, and with What If to test how a change in spending, retirement age, or withdrawal order moves the tax timeline. If you split time between countries, Expat Taxes covers how coordinated U.S.-and-host-country tax layers on top of everything here.
Key takeaways
- A retirement withdrawal is a sale, and which bucket it comes from — taxable, tax-deferred, or Roth — decides the tax, not just the dollar amount.
- Tax Analytics prices your saved plan's actual spending at its expected return, year by year — a deterministic projection, not a Monte Carlo probability and not a tax return.
- Every investment-income and basis field maps to a real tax form (1099-DIV, 1099-INT, Form 8606); a blank basis is treated as fully taxable, and IRA basis is applied pro rata across your combined tax-deferred bucket, not per account.
- "Saved by sequencing" compares the real bucket-aware draw order against a flat model where every withdrawal is taxed as ordinary income — the gap is what taxable→tax-deferred→Roth sequencing is worth.
- IRMAA is billed on a statutory two-year MAGI lookback and the ACA subsidy disappears above 400% of the federal poverty line — the app tracks both cliffs and shows how much room is left before each one.
- Tax Analytics deliberately reports an effective rate — tax as a percentage of that year's portfolio draw — rather than a marginal bracket rate. (The Roth planner's ladder table does show a marginal rate per conversion year, for a different purpose: pricing the next dollar converted.)