Quarterly estimated tax
With 12,000 of estimated annual tax and nothing withheld, you owe four quarterly payments of 3,000. Enter your annual tax and expected withholding to see what is still due and each quarter's share. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Estimated annual tax
- 12,000
- Expected annual withholding
- 0
- Remaining due
- 12,000
- Quarterly payment
- 3,000
Split remaining estimated tax after withholding into four equal payments. Search intent: quarterly estimated tax. No network calls, random seeds, or server state are required. Failed jobs are not
Spreading the tax you still owe across the year
Estimated tax is the tax you expect to owe for the year that withholding does not already cover. The calculator starts from your estimated annual tax, subtracts the withholding you expect over the year and splits what remains into four equal quarterly payments. With an annual tax of 12,000 and nothing withheld, the full 12,000 remains due and each quarterly payment is 3,000. If withholding is equal to or larger than the annual tax, nothing remains and every payment is zero rather than a negative amount.
Getting the inputs right
Both figures are annual: enter the tax for the whole year and the withholding for the whole year, not a single paycheck or a single quarter. Use your best current estimate and run the calculation again when your income or withholding changes, since the four payments are only as good as the annual figure behind them. Rounding is applied once, to the final amounts, using the number of decimals you choose. The result shows the annual tax, the withholding, the amount still due and the quarterly payment side by side.
FAQ
Other languages?
EN-only delivery; Nitro hydrates the other seven locales.
How is each quarterly payment calculated?
The expected withholding is subtracted from the estimated annual tax, and whatever remains is divided by four. With 12,000 of tax and no withholding, each of the four payments is 3,000.
What if my withholding already covers all my tax?
Then nothing remains due and every quarterly payment is zero. The calculator never shows a negative payment, even when withholding is larger than the estimated annual tax.
Should I enter annual or quarterly figures?
Annual figures for both: the estimated tax for the whole year and the total withholding you expect over the year. The calculator does the split into quarters for you.
Can I round the payments?
Yes. You can choose the number of decimals, and rounding is applied once to the final amounts rather than at each step. The result also shows the amount still due before it is split.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/finance/quarterly-estimated-tax \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"annual_tax":12000}'const res = await fetch("https://api.kit.forhosting.com/finance/quarterly-estimated-tax", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"annual_tax": 12000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/quarterly-estimated-tax",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"annual_tax": 12000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/quarterly-estimated-tax", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"annual_tax":12000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"annual_tax":12000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/quarterly-estimated-tax", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"annual_tax": 12000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.quarterly_estimated_tax",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
How it works
No network calls, random seeds, or server state are required. Failed jobs are not billed. Search intent is matched with precise English keywords. Optional fields document defaults. Split remaining estimated tax after withholding into four equal payments. quarterly = max(0, annual_tax − withheld) / 4. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are
Inputs, limits and rounding
Optional decimals use half-up once. Outputs echo key inputs for logging and automation. No network calls, random seeds, or server state are required. Failed jobs are not billed. Search intent is matched with precise English keywords. Optional fields document defaults. Half-up rounding is Provide required JSON fields as documented in params. Invalid types or ranges raise invalid_input. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input.
When to use it
Use when the search intent matches this calculator. Split remaining estimated tax after withholding into four equal payments. No network calls, random seeds, or server state are required. Failed jobs are not billed. Search intent is matched with precise English keywords. Optional fields document defaults. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input.
Integration use cases
Quick check
Verify a formula in the free browser widget.
Automation
Call the API with the same JSON fields from scripts.
Teaching
Show pinned golden examples without proprietary tools.
Technical questions
Is the browser widget free?
Yes. Tier A runs client-side with the same core as the API.
Does it call the network?
No. Computation is local and deterministic.
What happens on bad input?
The handler throws invalid_input; failed jobs are not billed.
Can I use the API?
Yes. Send the same JSON documented in params.