---
title: "How Weight-Based Shipping Calculates the Shipping Cost"
description: "The exact order Weight-Based Shipping follows: package weight, weight limit, zero weight, free shipping thresholds, tier match, then handling fee."
url: "https://wpfactory.com/docs/weight-based-shipping-cost-calculation/"
updated: "2026-10-05"
category: How to
---

# How Weight-Based Shipping Calculates the Shipping Cost

[Weight-Based Shipping for WooCommerce](https://wpfactory.com/item/weight-based-shipping-for-woocommerce/) totals the package weight, checks the Maximum Weight Limit, applies Handle Zero Weight, tests both free shipping thresholds, matches the weight to a tier, then adds any handling fee. Every input is set per zone at **WPFactory > Weight-Based Shipping** (also reachable at **WooCommerce > Settings > Shipping**).

## How the shipping cost is calculated

This is what happens each time WooCommerce recalculates the cart.

## The order of operations

### 1. WooCommerce builds the package and picks the zone

WooCommerce works out which zone the customer's address falls into and hands this method a *package*: the cart contents destined for that zone, plus the running cart total. Only methods in the matched zone are asked for a rate at all.

If another plugin has split the cart into several packages, each one goes through everything below independently.

### 2. The package weight is added up

For every line in the package:

- the product's weight is read;
- if the line is a variation with no weight of its own, the parent product's weight is used instead;
- the weight is multiplied by the quantity ordered.

Lines with no weight anywhere contribute nothing: not an error, not a warning, just zero. The sum is the package weight, in your store's weight unit.

### 3. The method decides whether it is available at all

Two gates, in this order:

- **Enabled.** A method whose **Enable/Disable** box is unticked returns nothing.
- **Maximum weight.** If you set a **Maximum Weight Limit** and the package weight is *greater than* it, the method withdraws and adds your **Maximum Weight Exceeded Message** as an error notice on the cart. A package weighing exactly the limit is still allowed through.

A method that withdraws here is gone from checkout. Nothing further is calculated.

### 4. Zero-weight carts are handled

If the package weighs exactly zero because none of its products has a weight entered, the **Handle Zero Weight** setting decides. (Virtual products never reach this point: WooCommerce leaves them out of the shipping package.)

- **Hide shipping method**: no rate is returned and the method does not appear.
- **Use first tier cost** (the default): calculation continues with a weight of zero, which lands in the tier covering zero, or in the first tier's cost if no tier starts at zero. The free shipping thresholds in step 5 still apply.

### 5. The free-shipping thresholds are tested

Both thresholds are checked, and **either one** is enough to make the rate free.

- **Free Shipping Weight Threshold**: fires when the package weight is at or above the number you set. Note the direction: this makes *heavier* carts free, not lighter ones.
- **Free Shipping Cart Total Threshold**: fires when the package contents total is at or above the number you set. That total is the value of the goods before tax and after any coupon discount; shipping and fees are not part of it.

Leave a field empty and that threshold is switched off.

### 6. The tier is matched

If neither threshold fired, the package weight is matched against your tier table. Each tier covers `[min, max)`, minimum inclusive and maximum exclusive, and a blank maximum means unlimited. Tiers are held in ascending order of minimum weight and the first match wins.

If nothing matches, a cart lighter than the first tier gets the first tier's cost, and anything else (a gap in the table, or a weight above a capped top tier) gets the last tier's cost, meaning the tier with the highest minimum weight. The full rules and the traps are in [set up your weight tiers](https://wpfactory.com/docs/weight-based-shipping-tiers/).

If a threshold did fire in step 5, the tier table is skipped and the cost is zero.

### 7. The handling fee is added

Only when the rate is **not** free:

- **Fixed**: the amount is added to the tier cost.
- **Percentage**: that percentage **of the tier cost** is added, not a percentage of the cart total.

A fee amount of zero adds nothing, whatever the type. On a free rate the fee is skipped entirely, so free shipping is genuinely free rather than free-plus-handling.

### 8. The rate is handed back to WooCommerce

The method returns the cost, the title you configured (with `(Free)` appended when a threshold fired) and two pieces of metadata recording the total weight and the weight unit used. WooCommerce then applies tax according to the method's **Tax Status**, formats the amount in the store currency, and displays it next to the other methods the zone offers.

Weight-Based Shipping does no rounding of its own: weights and costs are used as entered and calculated, and WooCommerce formats the final amount to your store's number of decimals.

## A worked example

A store in kilograms with this configuration:

| Setting | Value |
| --- | --- |
| Tiers | 0 to 5 costs 8.00, 5 to 15 costs 14.00, 15 and up costs 30.00 |
| Handling fee | Enabled, percentage, 10 |
| Free shipping by weight | *(empty)* |
| Free shipping by cart total | 150 |
| Maximum weight | 40 |

A customer orders 3 × a 2.5 kg item and 1 × a 1 kg item, goods total 96.00.

1. Weight: `(2.5 × 3) + (1 × 1)` = **8.5 kg**.
2. 8.5 is not above the 40 kg limit, so the method stays available.
3. The cart is not weightless, so zero-weight handling does not apply.
4. The weight threshold is empty. The goods total of 96.00 is below 150, so the cart-total threshold does not fire. The rate is not free.
5. 8.5 falls in `[5, 15)`, so the tier cost is **14.00**.
6. Handling fee: 10% of 14.00 = 1.40, for a total of **15.40**.
7. The customer sees the method title at **15.40**, taxed if the method is taxable.

Now the same customer adds another 60.00 of goods, taking the total to 156.00 and the weight to 12 kg. The cart-total threshold fires, the tier lookup is skipped, the handling fee is skipped, and the customer sees the method title with `(Free)` at **0.00**.

## The decision table

| Condition | Result |
| --- | --- |
| Method disabled | No rate |
| Weight > Maximum Weight Limit | No rate, plus your message as a cart error |
| Weight = 0 and Handle Zero Weight is *Hide* | No rate |
| Weight = 0 and Handle Zero Weight is *Use first tier* | First tier cost, plus fee (unless a free shipping threshold applies) |
| Weight at or above Free Shipping Weight Threshold | 0.00, labeled `(Free)`, no fee |
| Contents total at or above Free Shipping Cart Total Threshold | 0.00, labeled `(Free)`, no fee |
| Anything else | Matching tier cost, plus fee |

## Things that are not part of the calculation

- **Product dimensions.** Never read. There is no volumetric weight.
- **Shipping classes.** Never read.
- **The number of items.** Only their combined weight matters.
- **Coupons that give free shipping.** In WooCommerce, a free shipping coupon unlocks the built-in Free Shipping method. It does not change this method's rate; the thresholds here work independently.
- **Tax on the goods.** The cart-total threshold looks at the pre-tax value of the goods.

## Where to go next

- [Handling fees, free shipping thresholds and weight limits](https://wpfactory.com/docs/weight-based-shipping-fees-and-limits/)
- [Set up your weight tiers](https://wpfactory.com/docs/weight-based-shipping-tiers/)
- [FAQ and troubleshooting](https://wpfactory.com/docs/weight-based-shipping-faq/)
- [Developer reference](https://wpfactory.com/docs/weight-based-shipping-developers/)

### Get Weight-Based Shipping

Every setting covered here is included in [Weight-Based Shipping for WooCommerce](https://wpfactory.com/item/weight-based-shipping-for-woocommerce/), with no locked Pro options. [Get Weight-Based Shipping](https://wpfactory.com/item/weight-based-shipping-for-woocommerce/).

Need a hand? Our team answers every ticket on the [Weight-Based Shipping support forum](https://wpfactory.com/support/).

Related articles

- [How to Offer Economy and Express Weight-Based Shipping Options](https://wpfactory.com/docs/weight-based-shipping-economy-express/)
- [How to Offer Free Shipping Over an Order Amount with Weight-Based Rates](https://wpfactory.com/docs/weight-based-shipping-free-over-amount/)
- [How to Set Different Weight-Based Shipping Rates per Zone or Country](https://wpfactory.com/docs/weight-based-shipping-rates-per-zone/)
- [Weight-Based Shipping Settings Reference](https://wpfactory.com/docs/weight-based-shipping-settings/)
- [Install Weight-Based Shipping and Add It to a Zone](https://wpfactory.com/docs/install-weight-based-shipping/)
