Units for target profit calculator
The units for target profit calculator turns a profit goal into a concrete sales quantity.
Run — free
Enter the fixed costs for the period, the selling price of one unit, the variable cost of producing or delivering that unit, and the profit you want after every cost is covered. The calculator finds the contribution made by each sale, divides the combined fixed-cost and profit requirement by that contribution, and rounds up to a whole unit. It also shows projected revenue, variable cost, and profit at the required quantity so you can check the plan before using it in a budget, forecast, or sales target.
Turn a profit objective into a sales target
A desired profit is useful only when a team can connect it to an operating target. This calculator does that by combining the profit goal with fixed costs, then asking how many unit contributions are needed to cover the total. Fixed costs are expenses that remain broadly unchanged across the relevant sales range, such as rent, salaried administration, insurance, or a campaign fee. Price per unit is the amount received from one sale, while variable cost per unit is the cost that rises with that sale, such as materials, fulfillment, transaction fees, or sales commission. Enter all four values for the same period and in the same currency. The result called exact units required shows the mathematical quotient. The units to sell result rounds that quotient upward because most products, subscriptions, seats, or jobs cannot be sold as a fraction. That whole-number result is the practical minimum for reaching or exceeding the stated target under the assumptions supplied.
Understand the contribution margin formula
The calculation begins with contribution margin per unit: selling price minus variable cost per unit. Every unit sold contributes that amount toward fixed costs and, after fixed costs have been recovered, toward profit. The required quantity is calculated as fixed cost plus target profit, divided by contribution margin per unit. For example, a higher target profit increases the numerator and therefore the necessary sales quantity. A higher price or a lower variable cost increases contribution margin and reduces the quantity needed, assuming all other values remain constant. The calculator rejects a price that is equal to or below variable cost because each additional unit would contribute nothing, or would deepen the loss, so no finite positive sales quantity could cover fixed costs and reach a nonnegative target profit. The projected totals use the rounded-up whole-unit quantity. This means projected profit can be slightly above the requested target, which is expected and is the necessary consequence of selling indivisible units.
Use the result as a scenario, not a guarantee
The answer is a planning scenario based on constant price, constant variable cost, and fixed costs that remain fixed throughout the relevant range. Before adopting the result as a quota, check whether those assumptions hold at the proposed volume. Supplier discounts may lower variable cost, overtime may raise it, a larger facility may add a step-fixed cost, and discounts may reduce the average realized selling price. Returns, spoilage, taxes, financing costs, and product mix can also require separate treatment. Run several scenarios to see how sensitive the target is to price and cost changes: a conservative case can use a lower realized price and higher unit cost, while an expected case can use current averages. For a business selling several products, calculate each product separately only if fixed costs can be allocated sensibly; otherwise use a weighted-average contribution margin in a broader analysis. The API costs $0.002 per request, and the browser version can be used for quick manual comparisons before automating a forecast.
What you can do with it
Set a monthly sales quota
Convert monthly overhead and a desired operating profit into the minimum whole products, subscriptions, or service packages to sell.
Evaluate a price change
Compare required sales volume at different prices while holding fixed costs, unit cost, and the profit objective constant.
Prepare a launch forecast
Estimate the quantity a new offer must sell to recover launch costs and deliver the planned profit for its first period.
FAQ
What formula does the calculator use?
Required units equal fixed cost plus target profit, divided by price per unit minus variable cost per unit.
Why are required units rounded up?
Selling fewer than the mathematical requirement would miss the target, and an indivisible unit cannot normally be sold as a fraction.
Can the target profit be zero?
Yes. With a zero target, the result is the whole-unit break-even quantity under the values entered.
What happens if variable cost is greater than the selling price?
The input is rejected because the contribution margin is not positive, so selling more units cannot cover fixed costs and reach the target.
Does this calculator include taxes or returns?
Only if you incorporate their expected per-unit effect into variable cost or their period total into fixed cost. Model uncertain items separately when needed.
What does the API cost?
Each API request costs $0.002. The calculator on this page can also be run directly in the browser.
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/units-for-target-profit \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"fixed_cost":12000,"price_per_unit":50,"variable_cost_per_unit":30,"target_profit":8000}'const res = await fetch("https://api.kit.forhosting.com/finance/units-for-target-profit", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"fixed_cost": 12000,
"price_per_unit": 50,
"variable_cost_per_unit": 30,
"target_profit": 8000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/units-for-target-profit",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"fixed_cost": 12000,
"price_per_unit": 50,
"variable_cost_per_unit": 30,
"target_profit": 8000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/units-for-target-profit", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"fixed_cost":12000,"price_per_unit":50,"variable_cost_per_unit":30,"target_profit":8000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"fixed_cost":12000,"price_per_unit":50,"variable_cost_per_unit":30,"target_profit":8000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/units-for-target-profit", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"fixed_cost": 12000,
"price_per_unit": 50,
"variable_cost_per_unit": 30,
"target_profit": 8000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.units_for_target_profit",
"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. |