Calculate shipping dimensional weight and billable weight
Shipping charges do not always follow the number printed by a scale. Carriers can price a large, lightweight parcel by the space it occupies, using dimensional weight instead.
Run — free
This calculator multiplies package length, width, and height, divides that volume by the carrier's dimensional-weight divisor, and compares the result with the package's actual weight. It reports both values and identifies the billable one, giving merchants, fulfillment teams, and shoppers a clear estimate before a label is purchased.
Enter compatible measurements and the carrier divisor
Start with the package's outer length, width, and height, including any bulges, handles, or protective packaging that affect the space used in transit. All three dimensions must be positive numbers. Enter the actual weight measured after the parcel is fully packed, not the combined catalog weight of the products before packing materials are added. Finally, enter the divisor published for the carrier, service, unit system, and account terms you plan to use. Compatibility matters: a divisor intended for cubic inches and pounds cannot be combined with dimensions measured in centimeters or an actual weight measured in kilograms. The calculator deliberately does not label the units because the divisor defines the relationship between the chosen dimension and weight units. It rejects zero, negative, missing, infinite, and nonnumeric values instead of producing a plausible-looking but unusable estimate. Carrier rules and divisors can differ by service level, destination, contract, and date, so confirm the applicable value on the current rate card before relying on the result for a customer quote.
Understand the dimensional and billed weights
The calculation first finds package volume by multiplying length by width by height. It then divides that volume by the supplied divisor to obtain dimensional weight. The result is compared with actual weight, and the greater value becomes billed weight. When both values are exactly equal, the output identifies actual weight as the billing basis because dimensional weight did not exceed it; the billed number is the same either way. Results are returned to six decimal places for stable automation, while the comparison uses the full calculated value before presentation rounding. This capability does not automatically round dimensions or weight upward to a whole billing increment. Many carriers apply their own rules, such as rounding each dimension before multiplication, rounding the final weight upward, imposing minimums, or treating unusually shaped parcels differently. Apply those carrier-specific adjustments before entering values, or apply the published billing increment to the returned billed weight afterward. The output also includes calculated volume, making it easier to audit the formula and catch a measurement or unit mismatch.
Use the comparison in fulfillment decisions
A dimensional-weight comparison is most useful before the shipment reaches the carrier. Run it while selecting cartons to see whether unused space pushes a light order into a higher billing basis. Compare alternative packaging with the same actual weight, or test different eligible services using each service's published divisor. In a checkout or warehouse workflow, save the inputs and returned values with the rate estimate so someone can later reproduce the decision. The API costs $0.002 per request and performs a deterministic calculation without contacting a carrier, so it is suitable for quick batch checks as well as individual parcels. It does not return a shipping price, select a service, validate a carrier contract, or replace the final carrier rating response. Surcharges for oversize packages, zones, handling, fuel, residential delivery, and other rules remain outside this calculation. Treat billed weight as one input to a complete rate calculation. If your carrier changes its divisor or rounding policy, update the inputs and surrounding workflow rather than assuming an old result still represents the current invoice.
What you can do with it
Choose a smaller carton
Compare packaging options before fulfillment and identify when empty space makes dimensional weight exceed the scale weight.
Check a shipping estimate
Reproduce the weight basis used in a rate quote with the package measurements and the service's published divisor.
Audit fulfillment data
Flag orders whose stored billable weight does not match the greater of calculated dimensional weight and actual weight.
FAQ
What is dimensional weight?
Dimensional weight converts the space occupied by a package into a weight value by dividing package volume by a carrier-defined divisor.
Which weight is billed?
The greater of dimensional weight and actual weight is returned as billed weight. If they are equal, the output labels actual weight as the basis.
Which units should I use?
Use the dimension and weight units specified for the carrier divisor. Every input must belong to the same compatible unit system.
Does the calculator round up to a whole pound or kilogram?
No. It returns the mathematical result to six decimal places. Apply the carrier's published dimension and billing-increment rules separately.
What happens when a dimension is zero or negative?
The request fails with an invalid input error. Length, width, and height must each be positive finite numbers.
How much does an API calculation cost?
Each API request costs $0.002. The calculation uses no carrier network connection and returns a deterministic result.
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/ecom/shipping-dimensional-weight \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"length":20,"width":15,"height":10,"divisor":139,"actual_weight":18}'const res = await fetch("https://api.kit.forhosting.com/ecom/shipping-dimensional-weight", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"length": 20,
"width": 15,
"height": 10,
"divisor": 139,
"actual_weight": 18
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/ecom/shipping-dimensional-weight",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"length": 20,
"width": 15,
"height": 10,
"divisor": 139,
"actual_weight": 18
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/ecom/shipping-dimensional-weight", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"length":20,"width":15,"height":10,"divisor":139,"actual_weight":18}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"length":20,"width":15,"height":10,"divisor":139,"actual_weight":18}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/ecom/shipping-dimensional-weight", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"length": 20,
"width": 15,
"height": 10,
"divisor": 139,
"actual_weight": 18
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "ecom.shipping_dimensional_weight",
"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. |