<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jesse-py</title>
    <description>The latest articles on DEV Community by Jesse-py (@jessepy).</description>
    <link>https://dev.to/jessepy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4234451%2Fb41625cd-153f-4ab0-870a-23514b53be9e.png</url>
      <title>DEV Community: Jesse-py</title>
      <link>https://dev.to/jessepy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jessepy"/>
    <language>en</language>
    <item>
      <title>How quarterly estimated tax actually works for freelance developers (with the math in JS)</title>
      <dc:creator>Jesse-py</dc:creator>
      <pubDate>Tue, 10 Nov 2026 01:23:06 +0000</pubDate>
      <link>https://dev.to/jessepy/how-quarterly-estimated-tax-actually-works-for-freelance-developers-with-the-math-in-js-2m3f</link>
      <guid>https://dev.to/jessepy/how-quarterly-estimated-tax-actually-works-for-freelance-developers-with-the-math-in-js-2m3f</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I wrote this with help from an AI assistant. Every number below was computed by the code in this post and checked against the IRS worksheet. It's US federal only, for tax year 2026, and it isn't tax advice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first year you freelance, nobody withholds tax from your invoices. The IRS still expects the money during the year, not in April, and it charges a penalty if you wait. The rules behind that are spread across Form 1040-ES, Schedule SE, and Pub 505. Here's how they fit together, with code you can run.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Who has to pay
&lt;/h2&gt;

&lt;p&gt;You have to make estimated payments if both of these are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you expect to owe at least &lt;strong&gt;$1,000&lt;/strong&gt; for the year after withholding and credits, and&lt;/li&gt;
&lt;li&gt;your withholding and credits will cover less than the smaller of &lt;strong&gt;90% of this year's tax&lt;/strong&gt; or &lt;strong&gt;100% of last year's tax&lt;/strong&gt; (110% if last year's AGI was over $150,000, or $75,000 married filing separately).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have a W-2 job too, its withholding counts. More on that below, because it's the most useful trick in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The "quarters" aren't quarters
&lt;/h2&gt;

&lt;p&gt;The four payment periods for 2026 are uneven:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Income earned&lt;/th&gt;
&lt;th&gt;Payment due&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jan 1 to Mar 31 (3 months)&lt;/td&gt;
&lt;td&gt;Apr 15, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apr 1 to May 31 (2 months)&lt;/td&gt;
&lt;td&gt;Jun 15, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jun 1 to Aug 31 (3 months)&lt;/td&gt;
&lt;td&gt;Sep 15, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sep 1 to Dec 31 (4 months)&lt;/td&gt;
&lt;td&gt;Jan 15, 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can skip the January payment if you file your 2026 return by February 1, 2027 and pay the whole balance with it. If your income is lumpy (one big contract in the fall, say), the &lt;strong&gt;annualized income installment method&lt;/strong&gt; (Form 2210, Schedule AI) lets you pay less in the early periods. Otherwise the IRS assumes you owed a quarter of the year's amount at each date.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What you're actually paying: two taxes
&lt;/h2&gt;

&lt;p&gt;Freelancers pay &lt;strong&gt;self-employment (SE) tax&lt;/strong&gt; on top of income tax. SE tax is the employer and employee halves of Social Security and Medicare that a W-2 employer would split with you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SE earnings = profit × 92.35%&lt;/li&gt;
&lt;li&gt;Social Security: 12.4% of SE earnings, up to the 2026 wage base of $184,500&lt;/li&gt;
&lt;li&gt;Medicare: 2.9% of all SE earnings (plus 0.9% Additional Medicare Tax above $200,000 single)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, for income tax, three things come off your profit before the brackets apply: half of your SE tax, the standard deduction ($16,100 single in 2026), and the &lt;strong&gt;qualified business income (QBI) deduction&lt;/strong&gt;, which is 20% of your business income, capped at 20% of your taxable income.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The whole calculation in JavaScript
&lt;/h2&gt;

&lt;p&gt;This covers the common case: single filer, freelance profit only, under about $200k. It matches the full engine (linked at the end) to the cent on every profit from $0 to $195,000 in $7 steps, 27,858 cases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 2026, single filer, Schedule C profit only, no W-2 wages.&lt;/span&gt;
&lt;span class="c1"&gt;// Valid while profit is under ~$200k (no Additional Medicare Tax, below the QBI phase-in).&lt;/span&gt;
&lt;span class="c1"&gt;// Sources: Rev. Proc. 2025-32 (brackets, standard deduction), Form 1040-ES 2026 (SE tax, wage base).&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="no"&gt;BRACKETS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.22&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;105700&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.24&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;201775&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;256225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;640600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.37&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// [start, rate]&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="no"&gt;STANDARD_DEDUCTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="no"&gt;SS_WAGE_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;184500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;incomeTax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taxable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="no"&gt;BRACKETS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;BRACKETS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="no"&gt;BRACKETS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;Infinity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taxable&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;tax&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taxable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;estimate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;seEarnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;profit&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.9235&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                       &lt;span class="c1"&gt;// Schedule SE line 4a&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;seTax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seEarnings&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                        &lt;span class="c1"&gt;// no SE tax under $400&lt;/span&gt;
              &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seEarnings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;SS_WAGE_BASE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.124&lt;/span&gt;  &lt;span class="c1"&gt;// Social Security part, capped&lt;/span&gt;
              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;seEarnings&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.029&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                         &lt;span class="c1"&gt;// Medicare part, uncapped&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;agi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;profit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;seTax&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                           &lt;span class="c1"&gt;// half of SE tax is deductible&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;beforeQbi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agi&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;STANDARD_DEDUCTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="n"&gt;qbi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;agi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;beforeQbi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;           &lt;span class="c1"&gt;// 20% of QBI (here QBI = AGI), capped at 20% of taxable income&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agi&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;qbi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                &lt;span class="c1"&gt;// new for 2026: $400 minimum&lt;/span&gt;
  &lt;span class="n"&gt;qbi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beforeQbi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;taxable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;beforeQbi&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;qbi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seTax&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;incomeTax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taxable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;seTax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taxable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quarterly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Worked example: $90,000 of freelance profit
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;estimate(90000)&lt;/code&gt; and you get:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SE earnings (90,000 × 92.35%)&lt;/td&gt;
&lt;td&gt;$83,115.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SE tax (12.4% + 2.9% of that)&lt;/td&gt;
&lt;td&gt;$12,716.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AGI (profit minus half the SE tax)&lt;/td&gt;
&lt;td&gt;$83,641.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minus standard deduction&lt;/td&gt;
&lt;td&gt;$67,541.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QBI deduction (20% of $67,541.70, the smaller cap)&lt;/td&gt;
&lt;td&gt;$13,508.34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taxable income&lt;/td&gt;
&lt;td&gt;$54,033.36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Income tax (10% / 12% / 22% brackets)&lt;/td&gt;
&lt;td&gt;$6,599.34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total federal tax&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$19,315.93&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's about 21.5% of profit. Note that SE tax is almost twice the income tax here. People who only plan for "my tax bracket" underestimate badly.&lt;/p&gt;

&lt;p&gt;Paying 90% of this year's tax means &lt;strong&gt;$4,346.09 each quarter&lt;/strong&gt;. But you don't have to guess this year's number. That's the next part.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The safe harbor: pay last year's number and stop worrying
&lt;/h2&gt;

&lt;p&gt;You avoid the underpayment penalty if your payments add up to the &lt;em&gt;smaller&lt;/em&gt; of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;90% of this year's tax, or&lt;/li&gt;
&lt;li&gt;100% of last year's total tax (the "total tax" line of last year's Form 1040), or 110% if last year's AGI was over $150,000.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Say last year you owed $14,000 in total, with AGI under $150k. Pay $3,500 a quarter and you're safe from the penalty, even though this year's tax is $19,316. You'll owe the other $5,316 in April, with no penalty. If last year's AGI had been $160,000, the target is 110%: $15,400, or $3,850 a quarter.&lt;/p&gt;

&lt;p&gt;For a growing freelance business this is the easiest plan: last year's number is known in advance, so you don't have to forecast. Just set aside the difference for April.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The trick for people with a day job: withholding counts as paid evenly
&lt;/h2&gt;

&lt;p&gt;The penalty is figured per period: each underpayment for the number of days it stays unpaid. A big catch-up payment in December doesn't undo a short payment in April.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Withholding is different.&lt;/strong&gt; Unless you elect otherwise, the IRS treats tax withheld from a paycheck as paid in four equal parts on the four due dates, no matter when it was actually withheld. Pub 505 puts it as "one-fourth of your estimated withholding is considered withheld on the due date of each payment period." So if you have a W-2 job plus side contracts, you can often skip estimated payments entirely: raise your withholding on Form W-4 (Step 4(c), "extra withholding") to cover the side income. That works even if you raise it in October.&lt;/p&gt;

&lt;p&gt;Example: $120,000 salary plus $30,000 of side profit. Total 2026 tax: $27,125.93. If your paycheck withholding is $17,000 and last year's total tax was also $17,000, withholding already meets the 100% safe harbor, so no estimated payments are required. You'll still owe about $10,126 at filing time, so set it aside.&lt;/p&gt;

&lt;p&gt;That example also shows the real cost of side income: the $30k adds about $9,556 of tax, &lt;strong&gt;31.9 cents per dollar&lt;/strong&gt;, because it lands in your top bracket and carries SE tax too.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. How to pay
&lt;/h2&gt;

&lt;p&gt;IRS Direct Pay or your IRS online account (irs.gov/payments) is free. Choose "Estimated Tax" and "1040ES" with the right tax year. Keep the confirmation numbers. You'll enter the total on your return.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it on your own numbers
&lt;/h2&gt;

&lt;p&gt;The code above is a cut-down version of an open-source engine I maintain. It also handles W-2 wages, married filing jointly and the other statuses, Additional Medicare Tax, the QBI phase-out, the safe harbor, and 2027 numbers. It has zero dependencies and is tested against hand-worked IRS worksheet examples. It runs from the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx github:Jesse-py/freelance-tax-estimator --profit 90000 --prior-tax 14000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Repo (MIT): &lt;a href="https://github.com/Jesse-py/freelance-tax-estimator" rel="noopener noreferrer"&gt;freelance-tax-estimator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The same engine as a form, if you'd rather not use a terminal: &lt;a href="https://jesse-py.github.io/simple-money-sheets/quarterly-estimated-tax-calculator/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=quarterly-tax-1" rel="noopener noreferrer"&gt;quarterly estimated tax calculator&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources: &lt;a href="https://www.irs.gov/pub/irs-pdf/f1040es.pdf" rel="noopener noreferrer"&gt;Form 1040-ES (2026)&lt;/a&gt;, &lt;a href="https://www.irs.gov/pub/irs-drop/rp-25-32.pdf" rel="noopener noreferrer"&gt;Rev. Proc. 2025-32&lt;/a&gt;, &lt;a href="https://www.irs.gov/publications/p505" rel="noopener noreferrer"&gt;Pub 505&lt;/a&gt;. State tax is separate and not covered here. If you spot a mistake, open an issue on the repo and I'll fix it.&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>career</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
