Marginal Cost vs Average Cost: Is ATC Rising or Falling?
The marginal cost and average total cost relationship gives firms a quick way to interpret the shape of their cost curve at a particular output level.
Run — free
Enter the cost of producing one additional unit and the current average total cost per unit. The calculator compares them and reports whether average total cost is falling, rising, or at its minimum. An optional tolerance also lets you treat very small measurement or rounding differences as equality without changing the underlying economic rule.
Why marginal cost changes average total cost
Marginal cost measures the added total cost associated with producing one more unit, while average total cost divides all fixed and variable costs by the number of units already produced. Their relationship works like adding a new observation to an existing average. If the new unit costs less than the current average, including it pulls the average downward. If the new unit costs more than the current average, including it pushes the average upward. This is why a marginal cost below average total cost indicates that average total cost is falling, and a marginal cost above average total cost indicates that average total cost is rising. The result is directional rather than a forecast of the exact next average. It describes the local tendency of the average cost curve around the stated output level, assuming the supplied figures refer to the same firm, product, accounting definition, currency, and production period. Keeping those definitions aligned is essential because otherwise the numerical comparison may be valid while the economic interpretation is not.
How to identify the minimum average total cost
The average total cost curve reaches its minimum where marginal cost equals average total cost. Before that intersection, marginal cost lies below the average and pulls it down; after the intersection, marginal cost lies above the average and pushes it up. The calculator therefore labels equality as the minimum of average total cost. In real business records, exact equality can be obscured by rounded invoices, estimated allocation of overhead, or cost figures reported to different decimal places. The optional tolerance field handles that practical issue. A tolerance of zero requires exact equality. A positive tolerance treats an absolute difference no larger than that amount as equality and returns a zero comparison difference. Choose a tolerance in the same currency-per-unit scale as the two costs, and disclose it when sharing the result. A wide tolerance may label a point as the minimum even when the underlying unrounded marginal and average costs differ materially, so it should reflect measurement precision rather than a desired conclusion.
Reading and applying the result correctly
Use the reported relation together with the average cost direction. A result of below and falling means the next unit is cheaper than the existing per-unit average, so increasing output is associated with a lower average total cost at that point. A result of above and rising means the added unit is more expensive than the existing average, so average total cost is increasing. Equal and minimum identifies the cost-efficient output point on the conventional average total cost curve. This comparison does not by itself tell a firm whether to produce another unit, maximize profit, set a price, or shut down. Those decisions also require marginal revenue, market demand, avoidable cost, capacity constraints, and the relevant time horizon. It also does not calculate economies of scale across unrelated plants or periods. For a defensible analysis, use costs from the same output quantity, apply a consistent treatment of fixed and variable expenses, record any tolerance, and pair this result with revenue information before making an operating decision.
What you can do with it
Interpret a cost-curve exercise
Check whether a given pair of marginal and average total costs places the firm on the falling side, the minimum, or the rising side of its average cost curve.
Review production cost estimates
Compare an operations team's estimated cost for the next unit with the current per-unit total cost before discussing an output change.
Explain cost behavior consistently
Generate a clear, repeatable statement for reports, lessons, or internal analysis without relying on a visual reading of a graph.
FAQ
What does the comparison cost through the API?
Each API request costs $0.002. The browser version can run the same deterministic calculation locally.
What happens when marginal cost is below average total cost?
Average total cost is falling because the additional unit costs less than the current average.
What happens when marginal cost is above average total cost?
Average total cost is rising because the additional unit costs more than the current average.
Why does equality indicate minimum average total cost?
Marginal cost pulls the average down before the intersection and pushes it up after the intersection, so their intersection marks the minimum on the conventional cost curves.
When should I use the tolerance field?
Use a small nonnegative tolerance when costs are rounded or estimated. It is an absolute amount in the same cost-per-unit scale as the inputs.
Does a falling average cost mean the firm should increase output?
Not necessarily. The comparison describes cost behavior only; an output decision also depends on marginal revenue, demand, constraints, and the relevant time horizon.
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/econ/marginal-cost-average-cost-relation \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"marginal_cost":18,"average_total_cost":24}'const res = await fetch("https://api.kit.forhosting.com/econ/marginal-cost-average-cost-relation", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"marginal_cost": 18,
"average_total_cost": 24
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/econ/marginal-cost-average-cost-relation",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"marginal_cost": 18,
"average_total_cost": 24
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/econ/marginal-cost-average-cost-relation", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"marginal_cost":18,"average_total_cost":24}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"marginal_cost":18,"average_total_cost":24}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/econ/marginal-cost-average-cost-relation", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"marginal_cost": 18,
"average_total_cost": 24
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "econ.marginal_cost_average_cost_relation",
"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. |