Calculate federal tax liability for non-business income
Single
Married Filing Jointly
Head of Household
Marginal Federal Bracket:–
Estimated Federal Tax on Hobby:$0.00
Estimated State Tax on Hobby:$0.00
Total Tax Impact:$0.00
Net Take-Home from Hobby:$0.00
How Hobby Income is Taxed
Under current IRS guidelines (Tax Cuts and Jobs Act of 2017), hobby income is considered "Other Income" and is reported on Schedule 1 of Form 1040. Unlike a business, you cannot deduct hobby expenses from your hobby income. This means you are taxed on the gross amount you receive.
Hobby vs. Business: The Key Differences
The IRS uses a 9-factor test to determine if your activity is a hobby or a business. Generally, if you haven't made a profit in 3 of the last 5 years, the IRS may classify your activity as a hobby. The primary distinction is the "profit motive." If you operate with the primary intent of making a profit and act in a business-like manner (keeping separate books, marketing, etc.), you may qualify as a business, allowing you to deduct expenses.
2024 Tax Example
Suppose you are a Single filer earning a salary of $60,000. You have a side hobby selling pottery that brought in $5,000 this year.
Your $60,000 salary puts you in the 22% federal marginal bracket.
The $5,000 hobby income is taxed at that 22% rate.
Federal Tax: $1,100
If your state tax is 5%, you owe another $250.
Total Tax: $1,350. Your net take-home is $3,650.
Reporting Your Income
Even if you don't receive a Form 1099-K or 1099-NEC, you are legally required to report all hobby income. Ensure you keep accurate records of all payments received throughout the year to simplify your filing process during tax season.
Disclaimer: This calculator provides estimates based on 2024 federal tax brackets and does not account for the standard deduction, credits, or specific local tax laws. Please consult with a qualified CPA or tax professional for actual filing advice.
function calculateHobbyTax() {
var hobbyInc = parseFloat(document.getElementById('hobbyIncome').value) || 0;
var otherInc = parseFloat(document.getElementById('otherIncome').value) || 0;
var status = document.getElementById('filingStatus').value;
var stateRate = parseFloat(document.getElementById('stateRate').value) || 0;
if (hobbyInc <= 0 && otherInc <= 0) {
alert("Please enter your income amounts.");
return;
}
var totalIncome = otherInc + hobbyInc;
var bracket = 0;
// 2024 Federal Marginal Brackets (Simplified)
if (status === "single") {
if (totalIncome <= 11600) bracket = 10;
else if (totalIncome <= 47150) bracket = 12;
else if (totalIncome <= 100525) bracket = 22;
else if (totalIncome <= 191950) bracket = 24;
else if (totalIncome <= 243725) bracket = 32;
else if (totalIncome <= 609350) bracket = 35;
else bracket = 37;
} else if (status === "married") {
if (totalIncome <= 23200) bracket = 10;
else if (totalIncome <= 94300) bracket = 12;
else if (totalIncome <= 201050) bracket = 22;
else if (totalIncome <= 383900) bracket = 24;
else if (totalIncome <= 487450) bracket = 32;
else if (totalIncome <= 731200) bracket = 35;
else bracket = 37;
} else { // Head of Household
if (totalIncome <= 16550) bracket = 10;
else if (totalIncome <= 63100) bracket = 12;
else if (totalIncome <= 100500) bracket = 22;
else if (totalIncome <= 191950) bracket = 24;
else if (totalIncome <= 243700) bracket = 32;
else if (totalIncome <= 609350) bracket = 35;
else bracket = 37;
}
var fedTaxAmount = hobbyInc * (bracket / 100);
var stateTaxAmount = hobbyInc * (stateRate / 100);
var totalTax = fedTaxAmount + stateTaxAmount;
var netIncome = hobbyInc – totalTax;
document.getElementById('resBracket').innerText = bracket + "%";
document.getElementById('resFedTax').innerText = "$" + fedTaxAmount.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resStateTax').innerText = "$" + stateTaxAmount.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resTotalTax').innerText = "$" + totalTax.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resNet').innerText = "$" + netIncome.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('result-area').style.display = 'block';
}