finance-business · personal-finance · insurance-protection

HSA Savings and Tax Benefit Calculator

Prices a health savings account on both of its sides: the tax a year's contribution avoids, split into the three layers that make it up, because federal income tax always applies, state income tax often does not and payroll tax is saved only where the money goes in through an employer's payroll plan and only below the Social Security wage base; and the balance the account reaches over the years you keep it, under either way of paying for care. Use it to see what a contribution is actually worth to you, whether an employer's money has pushed you over the shared limit, and what keeping the receipts rather than spending from the account is worth over a long horizon.

Last updated

Calculator overview

Inputs and outputs

This summary comes from the calculator's published input and output contract.

Inputs

Salary (required)
About this input

What you earn in a year. It is used for one purpose only, to decide how much payroll tax your contribution actually avoids: below the Social Security wage base the whole employee share is saved, and above it only the Medicare part is, because Social Security stops being charged there. It does not affect the limit, the growth or the balance.

Unit $/year Default 87460 Range 0 to 2000000
Pay From HSA (required)
About this input

Whether the care you spend on each year comes out of the account or out of your pocket. Paying from the account is simpler and the money is never taxed; paying from pocket and keeping the receipts leaves the balance invested and lets it be reimbursed at any time in the future, with no deadline. The difference over a long horizon is the spending compounded at your return, and it is the single largest choice on this sheet after the contribution itself. The account can only ever pay what it holds, so a year it cannot cover in full is reported and the rest of that year comes out of pocket anyway.

Default No Allowed No, Yes
Marginal Rate (required)
About this input

The federal income tax rate on your next dollar of income, which is the rate the contribution is taken off at. It is the rate for the bracket your taxable income lands in, not the average rate you pay across all your income, and the two are usually several points apart. It is also the rate charged on money taken out early for something other than care, on top of the additional tax.

Unit fraction Default 0.22 Range 0 to 0.37
Years (required)
About this input

How many years to project, counting from now. It is also the grid's downward axis, so the surface at the foot shows the balance at five horizons either side of it. A long horizon is not by itself a plan: contributions have to stop when you enrol in Medicare, and the status line says so when the horizon runs past that age.

Unit years Default 20 Range 1 to 50
Through Payroll (required)
About this input

Whether the money goes in through your employer's payroll plan or is paid in directly and claimed back on your return. This is the entry that decides whether there is a payroll tax saving at all: through payroll the contribution is not treated as wages, so the employee payroll tax is avoided as well as income tax, while a direct contribution saves income tax only. It is worth several hundred dollars a year on a full contribution.

Default Yes Allowed Yes, No
State Rate
When omitted Blank
About this input

Optional. Your state income tax rate. Leave it blank if your state charges no income tax, which nine do not, and that is why the default is nothing rather than an average. Two states do not follow the federal treatment of these accounts at all: there a contribution is not deductible and the growth is taxed in the year it is earned, so leave this blank and read the growth as a figure before state tax.

Unit fraction Default Not set Range 0 to 0.133
Employer Contribution
When omitted Blank
About this input

Optional. What your employer puts into the account each year, including anything from a wellness scheme. Leave it blank if your employer puts in nothing, which is the case for about one worker in seven. It matters more than most people expect, because it counts against the SAME limit you do: every dollar your employer contributes is a dollar you may not.

Unit $/year Default Not set Range 0 to 8750
Annual Return (required)
About this input

The return you assume the balance earns each year, after any fund charges. It is an assumption you are making rather than a forecast anybody can offer, which is why the grid at the foot prices five returns either side of it. Note that most of these accounts are not invested at all: only about one in ten holds any invested money, and one left in cash earns close to nothing.

Unit fraction Default 0.07 Range 0 to 0.12
Annual Medical Spend
When omitted Blank
About this input

Optional. What you expect to spend each year on care the account may be used for. Leave it blank if you are not spending from the account. Entering it changes nothing on its own: it only leaves the balance if you also say that care is paid from the account, and the pairing of the two is the comparison this calculator is built around. The same amount is assumed every year; it does not rise.

Unit $/year Default Not set Range 0 to 25000
Annual Contribution (required)
About this input

What you intend to put in yourself each year, before the limit is applied. If it is more than the limit leaves you, the excess is reported separately and is not added to the account, because money above the limit is not a contribution: it is an excess that has to be taken back out or it is taxed every year it stays in.

Unit $/year Default 4400 Range 0 to 9750
Current Balance
When omitted Blank
About this input

Optional. What the account already holds. Leave it blank to see what a new account reaches on its own. It is compounded at the same return as everything else, so on a long horizon an existing balance can be worth more than several years of new contributions, and it is also the first thing the account draws on when care is paid from it.

Unit $ Default Not set Range 0 to 250000
Current Age (required)
About this input

Your age now, in whole years. Two things hinge on it. From the catch-up age an extra amount may go in each year, and it is a flat statutory figure that has not been raised for inflation. And eligibility ends when you enrol in Medicare, which is why a projection running past that age is flagged rather than quietly extended.

Unit years Default 45 Range 18 to 80
Coverage (required)
About this input

Whether the plan covers you alone or a family. It is the single most important entry here, because it decides the limit: for 2026 the family limit is almost exactly twice the self-only one, and a family plan covering two people who each have their own account is a different arrangement again, since a catch-up belongs to a person rather than to a plan.

Default Self-only Allowed Self-only, Family

Outputs

Table1 Balance Column Input
About this output

Machinery, and NOT an input. The same for the column axis: Excel substitutes into it while filling the grid, and the rest of the time it mirrors Annual_Return.

Unit fraction
Table1 Balance Corner
About this output

Machinery. Excel requires the quantity being tabulated to sit in the grid's top-left corner, where it means nothing to a reader, so it is formatted away. It holds Balance_After_Years.

Unit currency
Table1 Balance Column Axis
About this output

The values across the top of the grid: the return, in steps of one point either side of yours and never below nothing. Read a column to hold the return fixed and vary the horizon. The middle entry is your own return, and a low return makes the floor repeat near the left of this axis, which is the grid running out of room rather than an error.

No unit declared
Saving Rate
About this output

The first year's saving as a share of what you put in. It is the clearest single measure of what these accounts are worth: it is the sum of your marginal rate, your state rate and whichever payroll rate applies, so it moves when any one of those three does and it is the number to quote when comparing this with another kind of account.

Unit fraction
State Saving
About this output

What the first year's contribution saves in state income tax, at the rate you entered. It is nothing in the nine states with no income tax, and it should be left at nothing in the two states that do not follow the federal treatment at all, where the contribution is not deductible.

Unit $/year
Table1 Balance Row Axis
About this output

The values down the left of the grid: the number of years, in steps of two either side of yours and never shorter than one. Read a row to hold the horizon fixed and vary the return. The middle entry is your own horizon.

No unit declared
Total Contributed
About this output

Everything you and your employer put in across the horizon, with no growth in it. The gap between this and the balance is the growth, and how that gap widens is what the first chart is drawn to show.

Unit $
Total Spent From HSA
About this output

Everything the account actually paid for care across the horizon. It is nothing unless you said that care is paid from the account, and it can be less than the care you entered multiplied by the years, because in a year the balance does not stretch to the whole bill the account pays what it holds and you pay the rest. The status line says so when that happens.

Unit $
Tax Saved Over Years
About this output

The first year's saving repeated for every year of the horizon. It assumes the same contribution at the same rates throughout, so treat it as a scale rather than a projection: a rate change, a coverage change or the catch-up starting all move it.

Unit $
Table1 Balance Row Input
About this output

Machinery, and NOT an input. Excel substitutes each value from the row axis into this cell while it fills the grid; the rest of the time it mirrors Years. Change Years above, never this: the axis is derived from it, so editing the mirror moves the axis while the grid walks and the grid comes out meaningless.

Unit years
Table1 Balance Values
About this output

The body of the grid: the balance at the end of the horizon, worked out again for every combination of the two axes, with everything else exactly as entered. One hundred and twenty-one cells, each one the whole calculation run again. It is a component of the grid rather than a result on its own.

Unit currency
Penalty If Withdrawn Before 65
About this output

What it would cost to take the whole balance out before the Medicare age for something other than care: income tax at your marginal rate plus an additional tax of twenty percent. Twenty is the figure to remember, because it is twice the ten percent people carry over from retirement accounts. After that age the additional tax disappears and the money is simply ordinary income, which is why these accounts are often described as retirement accounts with an extra advantage.

Unit $
Effective Cost Of Contribution
About this output

What a year's contribution actually costs you once the tax saved is taken off. It is the figure to compare against what else the same money could do, because putting in a dollar does not cost a dollar.

Unit $/year
Federal Saving
About this output

What the first year's contribution saves in federal income tax: your own contribution at your marginal rate.

Unit $/year
Contribution Limit
About this output

The most that may go into the account this year from every source together, which is the published amount for your coverage plus the catch-up if you have reached the age for it. The word together is the part people miss: it is not an employee limit.

Unit $/year
Balance After Years
About this output

What the account holds at the end of the horizon, after every year's growth, every year's contributions and whatever the account was able to pay towards care along the way. It can never be less than nothing, because an account pays only what it holds. It is in today's dollars at a nominal return, so inflation has not been taken off it.

Unit $
Balance By Year
About this output

One row for each year of the horizon: the year, everything put in by the end of it, and what the account holds at the end of it. Years the horizon does not reach are blank rather than zero, because a zero would read as a year in which nothing was held. Fifty years are shown; a longer horizon keeps running in the results this table accompanies.

No unit declared
First Year Tax Saving
About this output

The three layers added together: what one year's contribution is worth to you in tax in the year you make it. Compare it with what you put in rather than with the balance, since it is a saving on this year's tax and not a return on the account.

Unit $/year
Own Contribution
About this output

What you may actually put in yourself, which is the limit less whatever your employer puts in. It is the figure every saving below is computed from, so if it is less than what you entered, the difference is above the limit and is reported on its own line.

Unit $/year
Payroll Saving
About this output

What the first year's contribution saves in payroll tax. This is the layer that is usually left out. It exists only when the money goes in through an employer's payroll plan, where the contribution is not counted as wages; it is the whole employee share below the Social Security wage base, and only the Medicare part above it, because Social Security is not charged there.

Unit $/year
Over Limit
About this output

The part of what you entered that is above the limit once your employer's money is counted. It is not added to the account and no tax saving is claimed on it here. Money actually paid in above the limit is charged an excise tax for every year it stays there, which is not modelled; the remedy is to take it back out before the return is due.

Unit $/year
Investment Growth
About this output

What the account earned: the balance, less what you started with, less everything put in, plus everything it paid for care. Inside one of these accounts it is never taxed at all if it is eventually used for care, which is the part that makes the account unusual; in two states it is taxed each year it is earned, and that is not reflected here.

Unit $
Model Status
About this output

Reads OK, or explains why the entries are not valid or why the answer deserves a second look.

No unit declared
This page is provided by LogicCommons for informational purposes only. Results are model outputs computed from the inputs you supply and are not financial, investment, tax, accounting, or legal advice, and no advisory relationship is created. Verify all inputs and results independently before relying on them in any decision.

LogicCommons is in beta. If a result, label, or reference looks wrong, tell us here; we read every message.

Methodology

Purpose and model boundary

Use this to see what a health savings account is worth over a horizon you choose, with the tax it saves kept separate from the growth it earns. Those are two different things: the tax is taken off in the year money goes in, and the growth is earned by the balance afterwards.

Three layers of tax are counted rather than one. Federal income tax on the contribution, state income tax where your state recognises the account, and payroll tax where the money goes in through an employer's plan. This calculator includes the third, which is worth several hundred dollars a year on a full contribution.

It projects ONE account at one contribution and one return. The amounts spent on care are assumed the same every year and do not rise, no plan or fund fees are taken off beyond the return you enter, and the balance is in the money of today at a nominal return, so inflation has not been taken off it.

To see how the HSA compares with a taxable account across 100 simulated market futures, including tax at contribution, growth and withdrawal, use the HSA and 529 Growth with Tax Treatment Calculator. That comparison asks a different question from this single-account projection.

Inputs and units

Input Unit Accepted range What it means
Current Age years 18 through 80 Your age now. Two things hinge on it: from the catch-up age an extra amount may go in each year, and eligibility to contribute ends when you enrol in Medicare, which is why a projection running past that age is flagged rather than quietly extended.
Coverage list Self-only, family Whether the plan covers you alone or a family. It is the single most important entry here, because it decides the limit.
Salary $/year 0 through 2,000,000 What you earn in a year. It is used for ONE purpose: to decide how much payroll tax the contribution actually avoids, because the Social Security share stops being charged above the wage base. It does not affect the limit, the growth or the balance.
Annual Contribution $/year 0 through 9,750 What you intend to put in yourself each year, before the limit is applied. Anything above what the limit leaves you is reported separately and is not added to the account.
Employer Contribution $/year 0 through 8,750 Optional. What your employer puts in each year, including anything from a wellness scheme. It matters more than most people expect, because it counts against the SAME limit you do: every dollar it contributes is a dollar you may not.
Current Balance $ 0 through 250,000 Optional. What the account already holds. On a long horizon it can be worth more than several years of new contributions, and it is the first thing the account draws on when care is paid from it.
Through Payroll list Yes, No Whether the money goes in through your employer's plan or is paid in directly and claimed back on your return. This is the entry that decides whether there is a payroll tax saving at all.
Annual Medical Spend $/year 0 through 25,000 Optional. What you expect to spend each year on care the account may be used for. Entering it changes nothing on its own: it only leaves the balance if you also say that care is paid from the account. The same amount is assumed every year and it does not rise.
Pay From HSA list Yes, No Whether the care comes out of the account or out of your pocket. Paying from the account is simpler; paying from pocket and keeping the receipts leaves the balance invested and lets it be reimbursed later, with no deadline. Over a long horizon the difference is the spending compounded at your return.
Years years 1 through 50 How many years to project. A long horizon is not by itself a plan: contributions have to stop when you enrol in Medicare.
Annual Return % 0% through 12% The return you assume the balance earns each year, after any fund charges. It is an assumption you are making rather than a forecast anybody can offer, which is why the grid at the foot prices five returns either side of it. Most of these accounts are not invested at all, and one left in cash earns close to nothing.
Marginal Rate % 0% through 37% The federal income tax rate on your next dollar of income, which is the rate the contribution is taken off at. It is not the average rate you pay, and the two are usually several points apart.
State Rate % 0% through 13.3% Optional. Your state income tax rate. Leave it blank where your state charges no income tax, and leave it blank in the two states that do not follow the federal treatment at all, reading the growth there as a figure before state tax.

Governing relationships

The limit comes first. The most that may go in from every source together is the published amount for the coverage chosen, plus the catch-up amount once you have reached the age for it. What you may put in yourself is that limit less whatever your employer puts in; anything you entered above that is reported on its own line and is not added to the account.

The tax saved in the first year has three layers. The federal layer is your own contribution at your marginal rate. The state layer is the same contribution at your state rate. The payroll layer exists only where the money goes in through an employer's plan, and it is the whole employee share below the Social Security wage base and only the Medicare part above it. The three added together, divided by what you put in, is the saving rate.

The balance is rolled forward year by year. Each year the account earns the return on the balance at the start, your contribution and your employer's are added, and where you have said care is paid from the account, the year's spending is taken out. An account can only pay what it holds, so a year whose bill is larger than the balance pays what it can and the rest comes out of pocket, which is reported rather than assumed away.

The growth is the balance at the end, less what you started with, less everything put in, plus everything the account paid for care.

Calculation sequence

This is the order in which the reported figures depend on one another. It is not a claim about the order in which the model evaluates itself.

  1. Read the limit for the coverage chosen and add the catch-up amount if the age qualifies.
  2. Take the employer contribution off the limit to get what you may put in yourself, and report anything above that separately.
  3. Work out the federal, state and payroll savings on that contribution and add them, then divide by the contribution for the saving rate.
  4. Take the first year's saving off the contribution to get what a year in the account actually costs you.
  5. Roll the balance forward year by year: earn the return, add both contributions, and take out the year's care where care is paid from the account.
  6. Take the starting balance and every contribution off the final balance, and add back what the account paid for care, to get the growth.
  7. Repeat the first year's saving across the horizon as a scale figure.
  8. Price what taking the whole balance out early for something other than care would cost.
  9. Rerun the projection across a grid of horizons and returns, so the sensitivity to each is visible rather than asserted.

Outputs and interpretation

Output Role Unit What it means
Balance After Years primary $ What the account holds at the end of the horizon. It can never be less than nothing, because an account pays only what it holds. It is in the money of today at a nominal return, so inflation has not been taken off it.
First Year Tax Saving primary $/year The three layers added together: what one year's contribution is worth to you in tax in the year you make it. Set it beside what you put in rather than beside the balance, since it is a saving on this year's tax and not a return on the account.
Saving Rate primary % The first year's saving as a share of what you put in. It is the sum of your marginal rate, your state rate and whichever payroll rate applies, so it moves when any one of the three does.
Contribution Limit detail $/year The most that may go in this year from every source TOGETHER, including the catch-up where the age qualifies. That word together is the part people miss: it is not an employee limit.
Own Contribution detail $/year What you may actually put in yourself, which is the limit less whatever your employer puts in. Every saving below is worked out from it.
Over Limit detail $/year The part of what you entered that is above the limit once your employer's money is counted. It is not added to the account and no saving is claimed on it. Money actually paid in above the limit is charged for every year it stays there, which is not modelled; the remedy is to take it back out before the return is due.
Federal Saving detail $/year What the first year's contribution saves in federal income tax.
State Saving detail $/year What the first year's contribution saves in state income tax, at the rate you entered.
Payroll Saving detail $/year What the first year's contribution saves in payroll tax. It exists only where the money goes in through an employer's plan, and it is the whole employee share below the Social Security wage base and only the Medicare part above it.
Effective Cost Of Contribution detail $/year What a year's contribution actually costs you once the tax saved is taken off. Putting in a dollar does not cost a dollar.
Tax Saved Over Years detail $ The first year's saving repeated for every year of the horizon. It assumes the same contribution at the same rates throughout, so treat it as a scale rather than a projection.
Total Contributed detail $ Everything you and your employer put in across the horizon, with no growth in it.
Investment Growth detail $ What the account earned. Inside one of these accounts it is never taxed at all if it is eventually used for care, which is the part that makes the account unusual.
Total Spent From HSA detail $ Everything the account actually paid for care across the horizon. It can be less than the care you entered multiplied by the years, because a year the balance does not stretch to pays what it holds and you pay the rest.
Penalty If Withdrawn Before 65 detail $ What taking the whole balance out before the Medicare age for something other than care would cost: income tax at your marginal rate plus an additional charge. That additional charge is twice the one people carry over from retirement accounts, and it disappears at the Medicare age, after which the money is simply ordinary income.
Balance By Year detail table One row for each year of the horizon: the year, everything put in by the end of it, and what the account holds at the end of it. Years the horizon does not reach are blank rather than nothing, because nothing would read as a year in which nothing was held.

Model Status reads OK, or explains why the entries are not valid or why the answer deserves a second look before you act on it. It is shown alongside the results rather than in place of them.

The calculator also returns a grid that reruns the projection across a range of horizons and returns at once. Its axes, corner and body arrive as separate values and are the grid's parts rather than results to read on their own; the page assembles them into the table.

Every figure above is returned by the model. The page arranges and formats them; it computes none of them.

Validation and status logic

These are the states the delivery's own recorded runs exercise, so the table records what this calculator has been observed to return rather than every branch it could take.

Condition Returned status
No years have been entered to project NOT VALID: enter at least one year to project; a horizon of no years has no balance to report
An amount, rate, age or year has been entered as a negative number NOT VALID: none of the amounts, rates, ages or years here can be less than nothing; check the figures you entered
What you entered is above what the limit leaves you CHECK: the contribution entered is above the limit for this coverage and age, so only the part that fits is treated as going in and the rest is reported separately
The return entered is above what a long illustration usually assumes CHECK: the return entered is above what a long-run illustration usually assumes, and every balance below moves sharply with it
The horizon runs past the age at which eligibility to contribute ends CHECK: this horizon runs past the age at which enrolling in Medicare ends eligibility to contribute, so the later years assume more going in than the rules allow
A year's care is larger than the balance available to pay it CHECK: the account could not pay the whole medical spend in every year; the rest is paid from pocket
None of the preceding conditions applies OK

Assumptions and limitations

  • One contribution, one return and one set of rates for the whole horizon. A rate change, a coverage change or the catch-up beginning all move the answer and none of them is projected.
  • The care spent on is the same amount every year and does not rise. Real medical spending is very unevenly distributed across years.
  • The limit, the catch-up amount and the wage base are those of a single tax year as delivered. They move most years.
  • No account fees, fund charges or transaction costs are taken off beyond whatever the return you enter already allows for.
  • The balance is in the money of today at a nominal return, so inflation has not been taken off it.
  • Contributions are assumed to be allowed for every year of the horizon. Eligibility ends when you enrol in Medicare, and a horizon that runs past that age is flagged rather than corrected.
  • Two states do not follow the federal treatment of these accounts, and the state figure and the growth here do not reflect that.
  • An amount paid in above the limit is charged for every year it stays in the account, which is not modelled.

Restrictions and non-computing states

This calculator enforces the numeric limits recorded above before any figure is worked out, so a value outside them is refused rather than answered.

Two states are answered rather than refused, with the status line explaining them. A contribution above the limit is trimmed to what fits and the excess reported on its own line. And a year whose care costs more than the account holds is paid as far as the balance stretches, with the rest treated as coming out of pocket.

Errors and warnings

NOT VALID means the entries do not describe a question this calculator can answer, and the figures beside it should not be relied on. CHECK is not an error: the arithmetic is sound and the figures stand, but something about the combination is worth knowing first, such as a horizon running past the age at which contributions have to stop. The status is shown with the results rather than in place of them, so a flagged answer is still a readable one.

A value the page itself refuses, because it falls outside the limits above, is rejected before the calculation is requested and no figures are returned at all. That is different again from a transport or service failure, where the page reports that the result could not be fetched rather than showing a stale or partial one.

References

The three properties this calculator prices are stated together by the Internal Revenue Service: you may "claim a tax deduction for contributions you or someone other than your employer make to your HSA even if you don't itemize your deductions"; "The interest or other earnings on the assets in the account are tax free"; and "Distributions may be tax free if you pay qualified medical expenses."

Three limits in the same publication decide what this page can and cannot show. Contributions have to stop when you enrol in Medicare, in its words: "Beginning with the first month you are enrolled in Medicare, your contribution limit is zero." Taking money out for anything other than care carries an extra charge on top of income tax, "an additional 20% tax on the part of your distributions not used for qualified medical expenses", and that charge stops applying at a stated age, since "There is no additional tax on distributions made after the date you are disabled, reach age 65, or die." And the annual contribution limit, the catch-up amount and the deductible and out-of-pocket figures that define the plan an account sits alongside are all published there and adjusted each year. See Publication 969, Health Savings Accounts and Other Tax-Favored Health Plans.

The payroll layer is the one most comparisons leave out, and it is worth knowing why it stops mattering at a high salary. The employee shares are "6.2% for the employee" for Social Security and "1.45% for the employee" for Medicare, the Social Security share stops at a wage base published each year, and "There's no wage base limit for Medicare tax." Above that wage base a contribution routed through payroll saves only the smaller of the two. See Topic no. 751, Social Security and Medicare withholding rates.

Two things on this page have no source and are not claimed to have one: the return you assume the balance earns, and what you expect to spend on care each year. The grid at the foot exists because the first of those is an assumption rather than a forecast.

These sources provide background; they do not supply the calculator's assumptions or certify its result. This calculator is informational and is not financial, investment, or tax advice. Results follow directly from the contribution, the return and the rates you enter, and a balance projected at a nominal return has not had inflation taken off it.

Results are informational and not professional advice. See our Terms of Use. Powered by SpreadsheetWeb · About · Privacy · Terms