- How the shipping cost is calculated
- The order of operations
- 1. WooCommerce builds the package and picks the zone
- 2. The package weight is added up
- 3. The method decides whether it is available at all
- 4. Zero-weight carts are handled
- 5. The free-shipping thresholds are tested
- 6. The tier is matched
- 7. The handling fee is added
- 8. The rate is handed back to WooCommerce
- A worked example
- The decision table
- Things that are not part of the calculation
- Where to go next
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.
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.
- Weight:
(2.5 × 3) + (1 × 1)= 8.5 kg. - 8.5 is not above the 40 kg limit, so the method stays available.
- The cart is not weightless, so zero-weight handling does not apply.
- 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.
- 8.5 falls in
[5, 15), so the tier cost is 14.00. - Handling fee: 10% of 14.00 = 1.40, for a total of 15.40.
- 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
- Set up your weight tiers
- FAQ and troubleshooting
- Developer reference
Get Weight-Based Shipping #
Every setting covered here is included in Weight-Based Shipping for WooCommerce, with no locked Pro options. Get Weight-Based Shipping.
Need a hand? Our team answers every ticket on the Weight-Based Shipping support forum.