Skip to content
GPLWP Guides

How to split WooCommerce carts into shipping packages

WooCommerce Time About 30–60 minutes 6 steps Updated 11 Oct 2026

WOOCOMMERCE
The short answer

WooCommerce uses one shipping package by default. You can split the cart manually with the woocommerce_cart_shipping_packages filter, but conditional rules, separate rates and clear checkout output are usually easier with a shipping-package plugin.

The route
  1. 01Define your package rules
  2. 02Configure your shipping zones
  3. 03Use the manual filter route
  4. 04Check package output at checkout
  5. 05Install a package rules plugin
  6. 06Test the failure cases

What you need

  • A WooCommerce store with shipping zones configured
  • Administrator access to WordPress
  • A clear rule for which products belong in each package
  • A staging site or recent backup for code changes

Define your package rules

Decide what creates a separate package. Common rules include product category, shipping class, warehouse, supplier, temperature requirement or a specific product list. Also decide whether each package should show its own shipping methods and whether every package must have a rate.

Do not confuse packages with multiple shipping addresses. Packages normally use the same customer destination but receive separate shipping calculations. Shipping labels can also be split after an order is placed, which is a fulfilment task rather than a checkout package rule.

Configure your shipping zones

Go to WooCommerce → Settings → Shipping and check the zones, destinations and methods that should apply to each package. Configure the rates before splitting the cart, because WooCommerce calculates shipping separately for every package passed to the shipping system.

Test the destination you actually sell to. A package can show no rate if its destination does not match a shipping zone, if a method excludes its contents, or if a carrier integration rejects the package data.

Use the manual filter route

WooCommerce passes the cart to shipping as one package by default, but developers can split it with the woocommerce_cart_shipping_packages filter. The callback must return an array of package arrays, with each package containing the matching cart items and the destination data used for the original cart. WooCommerce then calculates rates for each returned package.

Put the callback in a small custom plugin or a child theme rather than editing WooCommerce files. Preserve the original package structure, move each cart item into exactly one package, and keep values such as destination and contents_cost accurate. This route is fine for a fixed rule, but it becomes difficult when rules depend on several conditions, quantities, product variations or carrier-specific packaging.

Check package output at checkout

Add products from two different package groups and open the cart and checkout pages. Confirm that every item appears once, that each package has the intended contents, and that a shipping choice is shown for each package. Change the postcode, country and quantity to force WooCommerce to recalculate the rates.

If you use the Cart or Checkout block, check the visual labels as well as the prices. WooCommerce supports the package filter in block-based checkout, but there have been cases where separate rates appeared without a clear visual indication of which package they belonged to. A shortcode checkout can provide clearer package separation, depending on the rest of your setup.

Install a package rules plugin

For the fast route, install WooCommerce Advanced Shipping Package, activate it, and open its shipping-package settings. Create one rule for each group of products, give the package a useful customer-facing name, and choose the conditions that decide which items enter it.

Configure the shipping methods or carrier rates for each package, then enable a fallback package for items that match no rule if the plugin provides that option. The documented WooCommerce package workflow supports separate package contents, names and rates, with conditional rules controlling when packages are created.

Test the failure cases

Test a cart containing only package A, only package B, both packages, duplicate quantities, a virtual product and an item that matches no rule. Check the cart, checkout, order details, emails and fulfilment process.

The common Friday problem is a rule that splits the display but leaves one package without a valid rate. Also check that no item is silently dropped or placed in two packages, and that your payment, tax, carrier and order-management extensions understand multiple shipping rates.

The fast route

Let WooCommerce Advanced Shipping Package do it

Separates cart items into packages with distinct rates; choose it when one order needs multiple shipping calculations.

Get WooCommerce Advanced Shipping Package

Sources

  1. woocommerce.com /document/woocommerce-shipping/?utm_source=openai
  2. woocommerce.github.io /code-reference/files/woocommerce-includes-class-wc-cart.htm…
  3. github.com /woocommerce/woocommerce/blob/trunk/docs/block-development/r…
  4. woocommerce.com /document/multiple-shipping-packages/?utm_source=openai
  5. woocommerce.com /document/split-orders/?utm_source=openai
  6. woocommerce.com /document/multiple-ship-to-addresses/?utm_source=openai
  7. github.com /woocommerce/woocommerce-blocks/issues/6437?utm_source=opena…

Questions

Does WooCommerce split carts into packages by default?
No. WooCommerce passes the cart as one shipping package by default. A developer can change that with the woocommerce_cart_shipping_packages filter, or an extension can create packages using conditions and display separate shipping choices for them. Shipping classes and shipping zones help calculate rates, but they do not automatically create separate checkout packages on their own.
Can I split packages without creating separate orders?
Yes. Shipping packages are normally separate rate calculations inside one checkout and do not automatically create separate orders. If you need separate order records for fulfilment, use an order-splitting workflow instead. WooCommerce documents order splitting as a separate action that creates another order from selected line items.
Can each WooCommerce shipping package have a different rate?
Yes. WooCommerce calculates shipping for each package returned to the shipping system, so each package can receive its own available methods and selected rate. Your shipping methods and carrier integration must support the package contents, destination, weight and dimensions. If one package has no matching method, checkout can show no shipping option for that package.
What is the difference between split packages and shipping to multiple addresses?
Split packages normally send groups of items to the same customer destination while calculating shipping separately. Shipping to multiple addresses assigns different cart items or quantities to different destinations and requires a separate multi-address workflow. Use the latter when one customer wants parts of an order delivered to different addresses.
Why do my package rates appear twice or without labels?
Duplicate-looking rates usually mean checkout is displaying one set of methods for each package, while the package headings are unclear or missing. This can be more noticeable in block-based checkout, where package rates may appear without strong visual separation. Check the returned package contents, add clear package names where supported, and test the shortcode checkout if your theme or extension allows it.