Shipping cost by zone calculator
Turn weight and distance into a zone-based delivery price: 2.5 kg at a local rate of 4 in zone 3, multiplier 1.55, gives a 15.50 zone charge, and 1.50 of handling makes 17.00. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Weight
- 2.5
- Rate per unit
- 4
- Zone
- 3
- Handling
- 1.5
- Min charge
- 0
- Zone name
- super_regional
- Zone multiplier
- 1.55
- Distance min
- 300
Carriers almost never publish one postage number for every destination. They split the map into distance zones, quote a local rate per kilogram or pound, and multiply that base by a zone factor that grows with haul length. This shipping cost by zone calculator applies a generic distance-zone pricing table: it takes package weight, your zone-1 rate per weight unit, and either a destination zone or a distance in kilometres, then returns the zone multiplier, the weight charge, optional handling, and the final shipping cost after any minimum charge. Currency is yours; the tool does not convert foreign exchange or pick a named carrier.
What zone-based shipping is and how the generic table is built
Zone pricing is the workhorse of parcel and LTL rate cards. Instead of quoting a unique price for every origin-destination pair, the network groups destinations that sit in the same distance band from the ship-from hub and assigns each band a multiplier. Local deliveries stay near 1.00 times the published per-unit rate.
Regional and national bands step up as trucks or aircraft spend more time and fuel. Cross-country and international bands sit at the top of the ladder because they consume the most network capacity.
This calculator ships a generic eight-zone table that follows that pattern without locking you to one branded chart: zone 1 local is 0 up to 150 kilometres at multiplier 1.00; zone 2 regional is 150 up to 300 at 1.25; zone 3 super-regional is 300 up to 600 at 1.55; zone 4 national is 600 up to 1000 at 1.90; zone 5 extended is 1000 up to 1400 at 2.30; zone 6 distant is 1400 up to 1800 at 2.75; zone 7 cross-country is 1800 up to 2500 at 3.25; zone 8 international is 2500 kilometres and beyond at 4.00.
Bands are half-open, so a haul of exactly 150 kilometres is regional, not local. The money formula is then mechanical: multiply weight by the zone-1 rate per unit to get a base charge, scale that base by the zone multiplier, add any fixed handling fee, and raise the result to your minimum charge when the floor is higher. That is the same structure operations teams already keep in spreadsheets, except the table and the rounding live in one deterministic module instead of a cell that someone will overwrite next quarter.
What you can do with it
Checkout shipping estimates
Show shoppers a zone-based delivery total from cart weight, your local per-unit rate, and the destination zone before a live carrier quote is available.
Warehouse label checks
After the carton is weighed, compute the zone charge and handling so the slip matches the rate card the finance team already approved.
Invoice and zone audits
Replay order weight and haul distance through the generic table to explain why a shipment landed in a more expensive band than expected.
FAQ
How is shipping cost by zone calculated?
The multiplier comes from a generic eight-band distance-zone table (1.00 local through 4.00 international).
Do I send a zone number or a distance?
Either. zone is an integer 1–8. distance is kilometres and selects the band.
What are the generic zone bands?
Kilometres, half-open bands: 0–150 (local ×1.00), 150–300 (×1.25), 300–600 (×1.55), 600–1000 (×1.90), 1000–1400 (×2.30), 1400–1800 (×2.75), 1800–2500 (×3.25), 2500+ international (×4.00).
Does this replace a live carrier rate quote?
No. It applies a generic distance-zone table so estimates stay explainable.
Is a haul of exactly 150 km local or regional?
Regional. Each band includes its lower edge but not its upper one, so 150 km already falls in zone 2 at 1.25 times the local rate, while anything shorter stays in zone 1 at 1.00.
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/ecom/shipping-cost-by-zone \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"weight":2.5,"rate_per_unit":4,"zone":3}'const res = await fetch("https://api.kit.forhosting.com/ecom/shipping-cost-by-zone", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"weight": 2.5,
"rate_per_unit": 4,
"zone": 3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/ecom/shipping-cost-by-zone",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"weight": 2.5,
"rate_per_unit": 4,
"zone": 3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/ecom/shipping-cost-by-zone", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"weight":2.5,"rate_per_unit":4,"zone":3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"weight":2.5,"rate_per_unit":4,"zone":3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/ecom/shipping-cost-by-zone", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"weight": 2.5,
"rate_per_unit": 4,
"zone": 3
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "ecom.shipping_cost_by_zone",
"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
Input contract, response fields, and validation behaviour
Then send zone as an integer from 1 to 8, or distance as a non-negative kilometre haul, or both. Money fields round to two decimal places for stable currency goldens; weight and an echoed distance keep twelve-decimal stability. Example: weight 2.5, rate 4.00, zone 3, handling 1.50 yields a base of 10.00, a zone charge of 15.50, and a shipping cost of 17.00. Pair the response with your own unit labels. POST a JSON body with two required non-negative numbers plus at least one way to pick a zone. weight is the packed parcel mass and must be strictly positive. rate_per_unit is your local (zone 1) price per the same weight unit; zero is allowed when you only collect handling. If both arrive they must agree with the table: a 400 kilometre haul is zone 3, so pairing it with zone 5 fails as invalid_input and is not billed. handling and min_charge default to zero when omitted. Each numeric field may arrive as a JSON number or as a numeric string; missing required values, empty strings, non-finite figures, negative money, and a zone outside 1 through 8 fail naming the field. On success the body echoes the inputs, names the resolved zone and zone_name (local through international), reports zone_multiplier and the kilometre band as distance_min and, except for open-ended international, distance_max, and returns base_charge, zone_charge, shipping_cost, and min_applied so a checkout can show why a floor fired. This endpoint never converts kilograms to pounds or kilometres to miles, and it never pretends to be a live UPS, FedEx, DHL, or postal quote.
Where a shipping cost by zone calculator earns its keep
Finance analysts replay order weight and destination distance through the table to reconcile invoices that billed a higher zone than the warehouse expected. Failed validation does not consume balance. Ecommerce checkout teams use a shipping cost by zone calculator to estimate delivery before a carrier API is called, so shoppers see a transparent zone-based figure instead of a surprise at the door. Marketplaces and multi-warehouse merchants map each ship-from to destination pair onto the same eight bands and reuse one rate_per_unit per service level, which keeps rate cards explainable to finance. Warehouse management and packing-station software can call the API after the carton is weighed to print a zone charge next to the label without standing up a full rating engine. Document which physical zone chart you approximated with this generic table, store the weight unit next to each SKU, and you get reproducible zone shipping math for quotes, SLAs, and edge workers without licensing a carrier SDK for a four-term product.
Technical questions
What does the shipping cost by zone calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.