1099 Self-Employment Tax, Explained for Freelance Developers
If you freelance in the United States, your tax bill works very differently from a salaried job. Nobody withholds tax from your invoices. Instead, you owe both income tax and self-employment tax, and you are expected to pay them yourself, four times a year. Get the maths wrong and you face an underpayment penalty on top of the bill itself.
Try the numbers yourself with the free 1099 Tax Calculator on freekalc.com — enter your freelance income and see an estimate of your self-employment tax in seconds.
Why freelancers pay a tax employees never see
When you work as an employee, your employer pays half of your Social Security and Medicare taxes, and you pay the other half through payroll withholding. When you are self-employed, you are both the employer and the employee, so you pay both halves. That combined charge is the self-employment tax.
For 2026, the rates are:
- Social Security: 12.4% on net earnings up to the wage base limit ($184,500 for 2026)
- Medicare: 2.9% on all net earnings
- Additional Medicare Tax: 0.9% on net earnings above $200,000 for single filers
That gives a headline rate of 15.3% on most freelance income — before income tax is even considered. The good news is that you do not pay it on your gross revenue. You pay it on your net earnings, after business expenses, and only 92.35% of those net earnings are subject to the tax. That 92.35% factor is the tax code's way of approximating the employer half that a salaried worker never sees as income.
The formula, in plain maths
Here is the whole calculation in four steps:
- Net earnings = gross freelance income − deductible business expenses
- Taxable self-employment income = net earnings × 0.9235
- Social Security tax = 12.4% × min(taxable income, wage base)
- Medicare tax = 2.9% × taxable income (+ 0.9% above the threshold)
Add steps 3 and 4 and you have your self-employment tax. You can also deduct half of it from your income when working out your income tax — a small but valuable adjustment.
The code
const SS_RATE = 0.124;
const MEDICARE_RATE = 0.029;
const ADDITIONAL_MEDICARE_RATE = 0.009;
const SS_WAGE_BASE = 184500;
const ADDITIONAL_MEDICARE_THRESHOLD = 200000; // single filer
function selfEmploymentTax(grossIncome, expenses = 0) {
const netEarnings = grossIncome - expenses;
if (netEarnings <= 0) return { netEarnings, taxable: 0, total: 0 };
const taxable = netEarnings * 0.9235;
const socialSecurity = SS_RATE * Math.min(taxable, SS_WAGE_BASE);
let medicare = MEDICARE_RATE * taxable;
if (taxable > ADDITIONAL_MEDICARE_THRESHOLD) {
medicare += ADDITIONAL_MEDICARE_RATE * (taxable - ADDITIONAL_MEDICARE_THRESHOLD);
}
return {
netEarnings,
taxable: round(taxable),
socialSecurity: round(socialSecurity),
medicare: round(medicare),
total: round(socialSecurity + medicare),
deductibleHalf: round((socialSecurity + medicare) / 2),
};
}
function round(n) {
return Math.round(n * 100) / 100;
}
// Example: $80,000 of freelance income, $8,000 of expenses
console.log(selfEmploymentTax(80000, 8000));
// { netEarnings: 72000, taxable: 66492, socialSecurity: 8245.01,
// medicare: 1928.27, total: 10173.28, deductibleHalf: 5086.64 }
Notice how expenses do double duty: every dollar of legitimate expense cuts both your income tax and your self-employment tax. That is why tracking expenses matters so much for freelancers.
Practical edge cases developers actually hit
Multiple income streams. If you also hold a salaried job, wages you already earned count towards the Social Security wage base first. Only the remaining room is taxed at 12.4% on your freelance earnings. A naive calculator that ignores your W-2 wages will overstate the bill. Pass your W-2 Social Security wages into the function and subtract them from the wage base before applying the cap.
Loss-making years. If expenses exceed income, your net earnings are negative and you owe no self-employment tax for that year. You may still be able to carry the loss forward or offset other income, but that is an income-tax question, not a self-employment-tax one.
Quarterly estimated payments. The IRS expects you to pay in four instalments — roughly 15 April, 15 June, 15 September, and 15 January. A useful rule of thumb is to set aside 25–30% of every invoice as soon as it is paid, then refine the figure each quarter with real numbers. The underpayment penalty is avoidable: paying at least 90% of the current year's tax, or 100% of last year's (110% if your income is above $150,000), keeps you in the safe harbour.
The $400 threshold. You only owe self-employment tax if your net earnings reach $400. Below that, you still report the income, but the self-employment tax itself does not apply.
Retirement contributions. Contributions to a SEP IRA or Solo 401(k) reduce your income tax, but they do not reduce your self-employment tax, because the tax is calculated before those deductions. Do not let a retirement contribution lull you into underestimating the quarterly bill.
Putting it together
A practical freelance tax module therefore needs three inputs — gross income, expenses, and any W-2 wages — plus the current year's wage base and thresholds, which change annually. Keep those constants in one config object so a new tax year is a one-line update, not a hunt through the codebase:
const TAX_YEAR_2026 = {
ssRate: 0.124,
medicareRate: 0.029,
ssWageBase: 184500,
additionalMedicareThreshold: 200000,
};
Build the calculator once, update the constants each January, and your estimates stay honest.
Freelance taxes feel intimidating because the system hides the employer's half of the bill from salaried workers. Once you see the formula — net earnings, the 92.35% factor, the capped Social Security rate, the uncapped Medicare rate — it is a calculation any developer can implement in an afternoon. Run your own figures through the free 1099 Tax Calculator to check them against your quarterly estimates, and set aside that percentage from every invoice before you spend it.
Top comments (0)