Estimate your income taxes for using current federal and state rules. Enter wages, self-employment income, capital gains, deductions, and tax withholdings to see your total tax, refund or amount owed.

Income & Deductions
Filing Status:
Income Inputs:
Wages:Gross income from paid work
Self-Employment:Self-employed and Schedule K-1 income
Unearned Income:Interest, dividends, rents, pensions
Capital Gains:Long-term gains and qualified dividends
Social Security:Social Security benefits
Deduction Inputs:
Dependents:
Standard Deduction:
Health & Retirement:Health premiums, 401k, IRA
Payments & Credits:
Federal Withholding:W-2 box 2
State Withholding:W-2 box 17
Federal Taxable Income: $0.00
Results
Annual tax results summary
Annual ResultsAmountMarginalAverage
Federal Income Tax$0.000.00%0.00%
Child Tax Credit$0.00--
Capital Gains Tax$0.00-0.00%
Self-Employment Tax$0.0015.30%0.00%
State Tax$0.000.00%0.00%
Social Security Tax$0.006.20%0.00%
Medicare Tax$0.001.45%0.00%
Additional Medicare Tax$0.000.90%0.00%
Total Tax$0.000.00%0.00%
Payments, credits, and final results
Payments & Credits
Tax Owed$0.00
Refund$0.00
You Keep$0.000.00%
Taxable Income:?
State Taxable Income:?

Navigating the complexities of the IRS tax code can be overwhelming. Our Personal Income Tax Calculator is designed to provide accurate estimates for the 2024, 2025, and 2026 tax years. Whether you are curious about how the latest federal tax brackets affect your take-home pay or need to estimate your self-employment tax, this tool offers a comprehensive breakdown.

How it Works: Estimating Your Taxes

  • Step 1: Select your tax year and filing status (Single, Married, etc.).
  • Step 2: Input your Gross Wages and any Self-Employment or Capital Gains income.
  • Step 3: Review your Standard Deduction or enter Itemized Deductions.
  • Step 4: View your results, including federal tax, state tax, and net pay.

Frequently Asked Questions (FAQ)

What is the difference between Marginal and Effective tax rates?

The marginal rate is the tax percentage on your last dollar of income, while the effective rate is the actual percentage of your total income paid to the IRS after all deductions.

How does the Standard Deduction work in 2025 and 2026?

The standard deduction reduces your taxable income by a fixed amount. For 2025 and 2026, these amounts are adjusted for inflation:

Filing Status202420252026 (Est.)
Single$14,600$15,000$15,350
Married (Joint)$29,200$30,000$30,700
Head of Household$21,900$22,500$23,050

What is Self-Employment Tax?

If you work for yourself, you must pay both the employer and employee portions of Social Security and Medicare taxes, totaling 15.3%.

Are Capital Gains taxed differently than ordinary income?

Yes, long-term capital gains usually benefit from lower tax rates (0%, 15%, or 20%) compared to ordinary income brackets.

Which states have no income tax?

States like Florida, Texas, Nevada, and Washington do not levy a state-level personal income tax.

Is my data saved on this website?

No. Our calculator runs entirely in your browser. We do not store or transmit your personal financial data to any servers.

Accuracy & Disclaimer: This tool provides an estimate based on standard tax rules for 2024-2026. Always consult a tax professional for official advice.
Last updated: January 14, 2026
`); doc.close();printFrame.onload = () => { printFrame.contentWindow.focus(); printFrame.contentWindow.print(); document.body.removeChild(printFrame); }; }window.addEventListener('beforeprint', () => { if (currentYearData) { calculateTax(); } });function getStateName(code) { const match = STATE_LIST.find((state) => state.code === code); return match ? `${match.name} (${match.code})` : code; }function getStatusLabel(status) { const labels = { single: 'Single', married: 'Married Filing Jointly', marriedSeparate: 'Married Filing Separately', hoh: 'Head of Household', }; return labels[status] || status; }async function loadYearData(year) { try { currentYearData = await fetchTaxData(year); populateStates(currentYearData.state); updateStandardDeduction(); clearStatus(); } catch (error) { currentYearData = null; document.getElementById('state').innerHTML = ''; setStatus(`Unable to load tax data for ${year}. Please make sure the PHP API is available at /api/tax_data.php. (${error.message})`, true); } }async function handleYearChange() { await loadYearData(document.getElementById('year').value); }async function fetchTaxData(year) { if (taxDataCache[year]) { return taxDataCache[year]; }const url = new URL('/api/tax_data.php', window.location.origin); url.searchParams.set('year', year);const response = await fetch(url.toString(), { cache: 'no-store' }); if (!response.ok) { throw new Error(`Unable to load tax data (HTTP ${response.status})`); }const payload = await response.json(); taxDataCache[year] = payload; return payload; }function normalizeStatusKey(rawStatus) { if (rawStatus === 'marriedSeparate') return 'single'; return rawStatus; }function populateStates(stateData) { const select = document.getElementById('state'); const previous = select.value; const availableCodes = new Set([ ...(stateData.zero || []), ...Object.keys(stateData.flat || {}), ...Object.keys(stateData.brackets || {}), ]); select.innerHTML = ''; STATE_LIST.forEach(({ code, name }) => { const option = document.createElement('option'); option.value = code; option.textContent = `${name} (${code})`; select.appendChild(option); }); if (previous && availableCodes.has(previous)) { select.value = previous; } else if (!select.value && STATE_LIST.length) { select.value = STATE_LIST[0].code; } }function getStateRateLabel(code, stateData, availableCodes) { if (!availableCodes.has(code)) return 'Data unavailable'; if ((stateData.zero || []).includes(code)) return 'No State Tax'; if (stateData.flat && typeof stateData.flat[code] === 'number') return `${(stateData.flat[code] * 100).toFixed(2)}% flat`; const brackets = stateData.brackets?.[code] || []; const topRate = brackets.length ? brackets[brackets.length - 1][1] * 100 : 0; return `${topRate.toFixed(2)}% bracket`; }function updateStandardDeduction() { if (!currentYearData) return; const statusKey = normalizeStatusKey(document.getElementById('status').value); const deduction = currentYearData.federal.standardDeduction[statusKey] ?? currentYearData.federal.standardDeduction.single ?? 0; document.getElementById('standardDeduction').value = formatCurrencyValue(deduction); calculateTax(); }function setStatus(message, isError = false) { if (!message) return clearStatus(); statusBanner.textContent = message; statusBanner.style.display = 'block'; statusBanner.style.background = isError ? '#fef2f2' : '#ecfeff'; statusBanner.style.color = isError ? '#991b1b' : '#0f172a'; statusBanner.style.borderColor = isError ? '#fecdd3' : '#bae6fd'; }function clearStatus() { statusBanner.textContent = ''; statusBanner.style.display = 'none'; }function formatCurrency(num) { return '$' + num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }function formatCurrencyValue(num) { return '$' + num.toLocaleString('en-US', { maximumFractionDigits: 0 }); }function sanitizeInput(input) { const format = input.dataset.format || 'currency'; const cleaned = input.value.replace(format === 'number' ? /[^0-9-]/g : /[^0-9.-]/g, ''); if (cleaned === '-' || cleaned === '') { input.value = cleaned; return; } input.value = cleaned; }function clearIfZero(input) { const numeric = parseFloat(input.value.replace(/[^0-9.-]/g, '')) || 0; if (numeric === 0) { input.value = ''; } }function formatOnBlur(input) { const format = input.dataset.format || 'currency'; const value = input.value.replace(/[^0-9.-]/g, ''); if (value === '' || value === '-') { input.value = format === 'number' ? '' : ''; return; } const numeric = parseFloat(value) || 0; if (format === 'number') { input.value = numeric.toLocaleString('en-US', { maximumFractionDigits: 0 }); } else { input.value = formatCurrency(numeric); } }function parseValue(id) { const value = document.getElementById(id).value.replace(/[^0-9.-]/g, ''); return parseFloat(value) || 0; }function adjustValue(id, amount) { const input = document.getElementById(id); let current = parseValue(id); current = Math.max(0, current + amount); input.value = id === 'dependents' ? current : formatCurrency(current); scheduleAutoCalculate(); }function calculateFederalTax(taxableIncome, statusKey) { const brackets = currentYearData.federal.brackets[statusKey] || []; let tax = 0; let remaining = taxableIncome; let marginal = 0; let lowerBound = 0;for (let i = 0; i < brackets.length && remaining > 0; i++) { const [cap, rate] = brackets[i]; const upperBound = cap === null ? Infinity : cap; const bracketSize = upperBound - lowerBound; const taxableInBracket = Math.min(remaining, bracketSize); const taxFromBracket = taxableInBracket * rate; if (taxableInBracket > 0) { marginal = rate * 100; } tax += taxFromBracket; remaining -= taxableInBracket; lowerBound = upperBound; }return { tax, marginalRate: marginal }; }function calculateStateTax(adjustedGrossIncome, statusKey, stateCode) { const stateData = currentYearData.state; const zeroStates = stateData.zero || []; const flatStates = stateData.flat || {}; const bracketStates = stateData.brackets || {}; const deductions = stateData.deductions || {}; const stateDeductionEntry = deductions[stateCode] || {}; const stateDeduction = stateDeductionEntry[statusKey] ?? stateDeductionEntry.single ?? 0; const taxableIncome = Math.max(0, adjustedGrossIncome - stateDeduction);if (zeroStates.includes(stateCode)) { return { tax: 0, marginalRate: 0, taxableIncome }; }if (typeof flatStates[stateCode] === 'number') { const rate = flatStates[stateCode]; return { tax: taxableIncome * rate, marginalRate: rate * 100, taxableIncome }; }const brackets = bracketStates[stateCode] || []; let tax = 0; let lower = 0; let marginalRate = 0;brackets.forEach(([cap, rate]) => { const upper = cap === null ? Infinity : cap; if (taxableIncome > lower) { const taxablePortion = Math.min(taxableIncome, upper) - lower; tax += taxablePortion * rate; marginalRate = rate * 100; } lower = upper; });return { tax, marginalRate, taxableIncome }; }function calculateTax() { if (!currentYearData) return; const year = document.getElementById('year').value; const status = document.getElementById('status').value; const state = document.getElementById('state').value; const statusKey = normalizeStatusKey(status);const wages = parseValue('wages'); const selfEmployment = parseValue('selfEmployment'); const unearnedIncome = parseValue('unearnedIncome'); const capitalGains = parseValue('capitalGains'); const socialSecurity = parseValue('socialSecurity'); const dependents = parseValue('dependents'); const standardDeduction = parseValue('standardDeduction'); const retirement = parseValue('retirement'); const federalWithholding = parseValue('federalWithholding'); const stateWithholding = parseValue('stateWithholding'); const paymentsCredits = parseValue('paymentsCredits');const grossIncome = wages + selfEmployment + unearnedIncome + capitalGains + socialSecurity * 0.85; const selfEmploymentTax = selfEmployment * 0.9235 * 0.153; const selfEmploymentDeduction = selfEmploymentTax / 2; const adjustedGrossIncome = grossIncome - selfEmploymentDeduction - retirement; const taxableIncome = Math.max(0, adjustedGrossIncome - standardDeduction);const { tax: federalTax, marginalRate: federalMarginal } = calculateFederalTax(taxableIncome, statusKey);const { tax: stateTax, marginalRate: stateMarginal, taxableIncome: stateTaxableIncome } = calculateStateTax(adjustedGrossIncome, statusKey, state);const ssWageBase = year === '2026' ? 183900 : year === '2025' ? 176100 : 168600; const ssWages = Math.min(wages + selfEmployment * 0.9235, ssWageBase); const socialSecurityTax = ssWages * 0.062; const medicareTaxBase = wages + selfEmployment * 0.9235; const medicareTax = medicareTaxBase * 0.0145; const threshold = additionalMedicareThresholds[status] ?? 200000; const additionalMedicare = Math.max(0, wages + selfEmployment - threshold) * 0.009; const totalMedicare = medicareTax + additionalMedicare;const childTaxCredit = dependents * childTaxCreditPerChild; const federalAfterCredits = Math.max(0, federalTax - childTaxCredit);const totalTax = federalAfterCredits + stateTax + selfEmploymentTax + socialSecurityTax + totalMedicare; const paymentsTotal = federalWithholding + stateWithholding + paymentsCredits; const netIncome = grossIncome - totalTax + paymentsTotal; const taxOwed = Math.max(0, totalTax - paymentsTotal); const refund = Math.max(0, paymentsTotal - totalTax);const effectiveRate = grossIncome > 0 ? (totalTax / grossIncome) * 100 : 0; const keepRate = grossIncome > 0 ? (netIncome / grossIncome) * 100 : 0; const marginalRate = Math.max(federalMarginal, stateMarginal + 1.45 + 6.2); const allocationBase = taxableIncome > 0 ? taxableIncome : 1; const capitalGainsTax = Math.min(federalAfterCredits, federalAfterCredits * (capitalGains / allocationBase));document.getElementById('resultTaxableIncome').textContent = formatCurrency(taxableIncome); document.getElementById('resultTotalTax').textContent = formatCurrency(totalTax); document.getElementById('resultEffectiveRate').textContent = `${effectiveRate.toFixed(2)}%`; document.getElementById('resultMarginalRate').textContent = `${marginalRate.toFixed(2)}%`;document.getElementById('rowFederal').textContent = formatCurrency(federalAfterCredits); document.getElementById('rowFederalMarginal').textContent = `${federalMarginal.toFixed(2)}%`; document.getElementById('rowFederalAvg').textContent = grossIncome > 0 ? `${((federalAfterCredits / grossIncome) * 100).toFixed(2)}%` : '0.00%';document.getElementById('rowChildCredit').textContent = `-${formatCurrency(childTaxCredit)}`; document.getElementById('rowChildCreditAvg').textContent = childTaxCredit > 0 && grossIncome > 0 ? `-${((childTaxCredit / grossIncome) * 100).toFixed(2)}%` : '-';document.getElementById('rowCapitalTax').textContent = formatCurrency(capitalGainsTax); document.getElementById('rowCapitalMarginal').textContent = capitalGains > 0 ? `${federalMarginal.toFixed(2)}%` : '-'; document.getElementById('rowCapitalAvg').textContent = grossIncome > 0 ? `${((capitalGainsTax / grossIncome) * 100).toFixed(2)}%` : '0.00%';document.getElementById('rowSETax').textContent = formatCurrency(selfEmploymentTax); document.getElementById('rowSETaxAvg').textContent = grossIncome > 0 ? `${((selfEmploymentTax / grossIncome) * 100).toFixed(2)}%` : '0.00%';document.getElementById('rowState').textContent = formatCurrency(stateTax); document.getElementById('rowStateMarginal').textContent = `${stateMarginal.toFixed(2)}%`; document.getElementById('rowStateAvg').textContent = grossIncome > 0 ? `${((stateTax / grossIncome) * 100).toFixed(2)}%` : '0.00%';document.getElementById('rowSSTax').textContent = formatCurrency(socialSecurityTax); document.getElementById('rowSSTaxAvg').textContent = grossIncome > 0 ? `${((socialSecurityTax / grossIncome) * 100).toFixed(2)}%` : '0.00%';document.getElementById('rowMedicare').textContent = formatCurrency(medicareTax); document.getElementById('rowMedicareAvg').textContent = grossIncome > 0 ? `${((medicareTax / grossIncome) * 100).toFixed(2)}%` : '0.00%';document.getElementById('rowAddMedicare').textContent = formatCurrency(additionalMedicare); document.getElementById('rowAddMedicareAvg').textContent = grossIncome > 0 ? `${((additionalMedicare / grossIncome) * 100).toFixed(2)}%` : '0.00%';document.getElementById('resultTaxOwed').textContent = formatCurrency(taxOwed); document.getElementById('resultRefund').textContent = formatCurrency(refund); document.getElementById('resultNetIncome').textContent = formatCurrency(netIncome); document.getElementById('resultKeepRate').textContent = `${keepRate.toFixed(2)}%`;document.getElementById('footerTaxable').value = formatCurrency(taxableIncome); document.getElementById('footerStateTaxable').value = formatCurrency(stateTaxableIncome);document.getElementById('psYear').textContent = year; document.getElementById('psState').textContent = getStateName(state); document.getElementById('psStatus').textContent = getStatusLabel(status); document.getElementById('psGenerated').textContent = new Date().toLocaleString();document.getElementById('psWages').textContent = formatCurrency(wages); document.getElementById('psSelfEmployment').textContent = formatCurrency(selfEmployment); document.getElementById('psUnearnedIncome').textContent = formatCurrency(unearnedIncome); document.getElementById('psCapitalGains').textContent = formatCurrency(capitalGains); document.getElementById('psSocialSecurity').textContent = formatCurrency(socialSecurity); document.getElementById('psGrossIncome').textContent = formatCurrency(grossIncome);document.getElementById('psRetirement').textContent = formatCurrency(retirement); document.getElementById('psSeDeduction').textContent = formatCurrency(selfEmploymentDeduction); document.getElementById('psStandardDeduction').textContent = formatCurrency(standardDeduction); document.getElementById('psAgi').textContent = formatCurrency(adjustedGrossIncome); document.getElementById('psTaxableIncome').textContent = formatCurrency(taxableIncome); document.getElementById('psStateTaxableIncome').textContent = formatCurrency(stateTaxableIncome);document.getElementById('psFederalTax').textContent = formatCurrency(federalAfterCredits); document.getElementById('psChildCredit').textContent = formatCurrency(childTaxCredit); document.getElementById('psCapitalTax').textContent = formatCurrency(capitalGainsTax); document.getElementById('psSeTax').textContent = formatCurrency(selfEmploymentTax); document.getElementById('psStateTax').textContent = formatCurrency(stateTax); document.getElementById('psSsTax').textContent = formatCurrency(socialSecurityTax); document.getElementById('psMedicareTax').textContent = formatCurrency(medicareTax); document.getElementById('psAddMedicare').textContent = formatCurrency(additionalMedicare); document.getElementById('psTotalTax').textContent = formatCurrency(totalTax); document.getElementById('psMarginalRate').textContent = `${marginalRate.toFixed(2)}%`; document.getElementById('psEffectiveRate').textContent = `${effectiveRate.toFixed(2)}%`;document.getElementById('psFederalWithholding').textContent = formatCurrency(federalWithholding); document.getElementById('psStateWithholding').textContent = formatCurrency(stateWithholding); document.getElementById('psOtherPayments').textContent = formatCurrency(paymentsCredits); document.getElementById('psTotalPayments').textContent = formatCurrency(paymentsTotal); const psTaxOwed = document.getElementById('psTaxOwed'); const psRefund = document.getElementById('psRefund'); psTaxOwed.textContent = formatCurrency(taxOwed); psRefund.textContent = formatCurrency(refund); psTaxOwed.classList.toggle('highlight', taxOwed > 0); psRefund.classList.toggle('highlight', refund > 0); document.getElementById('psNetIncome').textContent = formatCurrency(netIncome); document.getElementById('psKeepRate').textContent = `${keepRate.toFixed(2)}%`; }function resetForm() { ['wages', 'selfEmployment', 'unearnedIncome', 'capitalGains', 'socialSecurity', 'federalWithholding', 'stateWithholding', 'retirement'].forEach( (id) => (document.getElementById(id).value = '$0') ); document.getElementById('dependents').value = '0'; document.getElementById('paymentsCredits').value = '$0'; updateStandardDeduction(); calculateTax(); }
Comprehensive Personal & State Income Tax Estimator Guide

Our Personal Income Tax Calculator is a high-precision tool designed for the 2024, 2025, and 2026 tax years. It functions as a full-scale federal tax estimator and a state income tax calculator, providing taxpayers with a clear picture of their financial health.

The Ultimate Personal Income Tax Calculator

Calculating your federal income tax requires a deep understanding of the IRS tax brackets. For the upcoming 2025 and 2026 seasons, the IRS has adjusted income thresholds to account for inflation. Our calculator applies these progressive tax rates (10% to 37%) to your Adjusted Gross Income (AGI), ensuring your estimate is as accurate as possible.

State-Wise Estimator: How Your Location Affects Tax

A true state income tax calculator must handle 50 different sets of rules. Our tool is programmed to distinguish between No-Tax States (like Florida and Texas), Flat-Tax States, and Progressive-Tax States (like California and New York).

Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming

Advanced Estimator Features: 1099 & Capital Gains

Beyond standard wages, our income tax estimator provides specialized logic for Self-Employment Tax. This tool calculates the 15.3% SE tax while applying the 50% SE tax deduction to your federal taxable income. Additionally, we separate Long-Term Capital Gains (0%, 15%, 20%) to ensure your investment returns are taxed at preferential rates.

Why Accuracy Matters in Tax Planning

Using a reliable Personal Income Tax Calculator throughout the year helps prevent a "tax surprise" in April. By estimating your tax refund or tax owed early, you can adjust your W-4 withholdings or make more accurate quarterly estimated payments.