Per-product shipping in WooCommerce: when zones are not enough
WooCommerce shipping zones answer "how much to ship TO this place". They cannot answer "how much for THIS product" - the kayak and the mug in the same cart get the same flat logic. Per-product shipping fills the gap.
When per-product rules beat zones
- Mixed weights - light items with heavy ones: a flat rate either overcharges the light order or eats the heavy one's cost.
- Oversized or fragile items - one product in the catalog needs special handling; the zone cannot express "this one is different".
- Free-shipping exceptions - "free over €50, except the piano" is a per-product rule wearing a zone disguise.
- Local-only or no-ship items - some products should not ship at all.
How per-product cost composes
A workable model: each product carries a shipping price (or rule); the cart totals them. Then decide:
- Combine or override - does the product price ADD to the zone rate or replace it? Both are valid; mixing them is where stores get confused.
- Variations - the large print ships differently than the small one; variation-level rules matter.
- Free-shipping exceptions - a product flagged "never free" keeps its cost even when the cart crosses the free threshold.
- No-ship flags - local-pickup-only items block or require a method.
Common setups
- Furniture + decor: per-product cost on furniture, zone rate on decor - cart shows the sum.
- Print shop: small items by zone, oversized prints carry a fixed per-item charge.
- Free-shipping promo: threshold frees the standard items; flagged heavy items keep their charge.
Per-Product Shipping implements per-product and per-variation costs that compose with WooCommerce zones - exceptions included, total shown before checkout.