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.