Skip to article

WooCommerce / The ICT Journal

WooCommerce Shipping Classes: Get Mixed-Cart Costs Right

Set a clear mixed-basket shipping policy, compare per-class and per-order charges, and test quantities, unassigned products and variations before release.

WooCommerce Shipping Classes: Get Mixed-Cart Costs Right
Make time for a good read.
Share ↗

A customer puts a small accessory and a bulky item into one basket. Your store offers delivery, but the charge looks wrong. Before adding another shipping plugin, decide what that combination should cost. A shipping option appearing at checkout is only half the job.

WooCommerce shipping classes group products so a compatible shipping method can apply different charges. This guide focuses on the awkward part: mixed baskets, repeated quantities and products with no class. You will leave with a written pricing rule and a small test sheet you can hand to a developer.

Documentation checked on 17 October 2026. Examples below are invented teaching scenarios, not courier quotations or customer results. Calculations exclude tax and assume one shipping package unless stated otherwise.

The short answer: class, method and zone do different jobs

A class groups products; it does not create a delivery option by itself. Create the class, assign products or variations, and configure its cost within a shipping method. WooCommerce's product shipping classes documentation describes that relationship.

The destination determines which zone applies. WooCommerce selects the first matching zone, so check the customer's actual address before editing a rate. The official zone guide explains the matching order. If no delivery option appears at all, use our separate missing shipping methods investigation.

Write the mixed-basket policy before touching settings

Start with three sample orders: one small item, one bulky item, and both together. Ask the person packing orders whether the small item fits safely into the bulky item's parcel. If it does, a highest-charge policy may be reasonable. If it needs separate packaging, adding charges may better reflect the work. Neither policy is automatically the correct one for every store.

Record what the customer pays separately from what the courier bills you. A merchant can deliberately subsidise delivery, but the subsidy should be a business decision rather than an unnoticed formula error.

A policy worksheet to complete before configuration
Decision Write a concrete answer
Grouping Which products genuinely share the same packing and delivery treatment?
Mixed basket Add class charges, use the highest, or apply a separate combination rule?
Quantity Does a second item change the charge? At what quantity does the policy stop working?
Unassigned product What should happen if a new physical product has no class?
Ownership Who approves changes when packaging or courier costs change?

Keep class names operational: “small-parcel” is easier to maintain than “special-offer-october”. Put the reasoning in the description so the next catalogue editor understands when to use it.

Set up the smallest useful configuration

  1. Open WooCommerce → Settings → Shipping → Classes. Add each required class with a meaningful name and description.
  2. Edit a product and select its class in the Shipping section. For a variable product, review each relevant variation; it can use a different class from its parent.
  3. Open the intended shipping zone and add or edit a core Flat Rate method.
  4. Enter the base Cost, applicable class costs and No shipping class cost. Choose the calculation type and save.

Core WooCommerce allows one class per product or variation. If your policy needs “fragile” and “oversized” simultaneously, define a suitable combined classification or evaluate a rule-based extension. Do not assume you can attach several shipping classes like product tags.

Make these changes on an isolated test copy first. Our WooCommerce staging checklist explains how to prepare one without affecting live orders.

Per class versus per order: calculate the answer first

For core Flat Rate, Per class adds applicable class costs. Per order uses the highest applicable class cost. The base Cost is added in either case. This is documented in WooCommerce's Flat Rate guide.

Consider a fictional USD store with a base cost of $3, Small class cost of $4, Bulky class cost of $13 and No shipping class cost of $6. These are deliberately chosen teaching amounts, not recommended rates.

Worked example with fixed class amounts, one package and no tax
Basket Per class Per order
One Small $3 + $4 = $7 $3 + $4 = $7
Two Small $7 $7
One Small + one Bulky $3 + $4 + $13 = $20 $3 + $13 = $16
One Bulky + one unassigned $3 + $13 + $6 = $22 $3 + $13 = $16
One unassigned $3 + $6 = $9 $3 + $6 = $9

The second row is a useful diagnostic: a fixed class amount is not automatically a charge for every unit. Our arithmetic uses the grouping behaviour visible in the official Flat Rate code reference. Custom filters and extensions can change the outcome, so reproduce these cases on your installation.

For an INR store, build the same worksheet using your approved rupee amounts. Do not convert this example with an exchange rate and call it an Indian delivery tariff. Parcel size, service area and commercial arrangements need their own assessment.

When quantity should change the price

Suppose the Small class should cost $4 for each unit. In its class-cost field, use 4 * [qty] instead of 4. Keep the example base at $3. Two Small units then produce $11 before tax.

The position of a formula matters. In a class-cost field, quantity refers to products in that class; in the base field, it refers to shippable items in the package. The official code reference linked above exposes those separate inputs.

Do not copy the same formula into both places unless you intend both charges. With 3 + (2 * [qty]) as the base and 4 * [qty] for Small, two Small units produce a base of $7 plus $8, totalling $15. That could be a valid policy, but it is not the $11 policy described above.

Before release, make someone who did not configure the method calculate the expected amount on paper. If the explanation takes several contradictory sentences, simplify the policy before implementing more rules.

Zero-cost and unassigned items need deliberate decisions

A class named “Free” has no special power. With a zero class cost and the example $3 base, a basket containing only that class still costs $3. A class name is not a replacement for the formula.

Decide whether “free” means no extra charge for that item, or free delivery for the entire basket. For a zero-cost accessory beside a Bulky product, those promises are very different. Put the intended meaning in the product offer and test the mixed basket before advertising it.

Also test a newly created physical product without a class. Treat that case as a catalogue-quality check: identify whether the assignment was intentionally omitted, who should correct it, and what rate the customer sees in the meantime. A memorable test product name helps prevent it being mistaken for real stock.

Know when core classes are no longer enough

Classes are useful when a manageable set of product groups describes your shipping policy. A request such as “charge by total weight, except when two categories appear together” deserves a rule specification before choosing software.

The official Table Rate Shipping extension documentation describes weight, item-count and price conditions. Its Per order mode uses class priority, so do not transfer the core Flat Rate meaning of “highest class cost” into that extension without checking its rules.

If you use Flexible Shipping, its developer explains that putting two classes in one rule can require both classes to be present. See Octolize's combination-rule documentation. An AND condition and an OR condition are different policies even when the same class names appear on screen.

For multi-warehouse or vendor-based stores, ask how the integration splits packages. Core Flat Rate works on a package; a charge that looks right for one package may repeat across several. Include the package split in your specification rather than hiding the difference inside a discount.

When an approved rule cannot be expressed cleanly with the existing setup, custom WooCommerce extension development can be evaluated against a supported off-the-shelf option. Ask for both implementation and future maintenance scope.

Use this acceptance sheet before the change goes live

Choose one approved sample destination for each relevant zone. Record the method name, basket, expected amount, observed amount and pass/fail result. The following is an editorial test plan, not a claim that your store has passed testing.

Shipping-class release tests
Test What it should establish
One item from each class Every intended assignment produces the approved charge.
Two units from one class Fixed versus quantity-based behaviour matches the policy.
Small plus Bulky The mixed-basket rule adds or selects costs as intended.
Unassigned physical item The fallback is known and approved.
Zero-cost class alone and mixed The advertised free-delivery promise matches the basket total.
Two variations of one product The actual selected variation receives the intended treatment.
Second approved destination The relevant zone's own method configuration is correct.
Checkout to saved order The selected method and final charge remain consistent.

Record your tax settings separately from the pre-tax worksheet. Repeat important cases in the checkout experience customers actually use, including mobile. If your store uses an express checkout or carrier integration, include that route explicitly.

Keep the previous configuration and a short rollback instruction with the release note. After deployment, review relevant new orders against the approved worksheet. Investigate a mismatch before changing the public delivery promise.

Frequently asked questions

Can one product have multiple shipping classes?

Not in the core assignment model. A product or variation has one class. Describe the combined business requirement before deciding whether a different classification or extension is needed.

Do shipping classes automatically charge by weight?

No. Naming a class “Heavy” is a grouping choice. For actual weight bands, evaluate a method with documented weight conditions and test the boundaries.

Why does a second item not increase shipping?

Your policy may use a fixed class amount. Compare the quantity test with your written rule before deciding it is a defect.

Why is a zero-cost product still charged delivery?

Check the base cost and other products in the basket. Zero extra cost for one class does not necessarily mean free delivery for the whole order.

Should I choose Per class or Per order?

Choose the behaviour that matches the approved packing and pricing policy. Use the mixed-basket worksheet to make that decision explicit.

Give your developer a rule they can verify

A useful brief contains sample SKUs, class assignments, approved destinations, three representative baskets and the expected amounts. Add the checkout and shipping extensions involved, with versions. That is more actionable than “make shipping work”.

Send Innovative Code Tech your shipping-rule brief if you need help assessing configuration, integration or custom development. Share sample records rather than private customer addresses.

Written by Innovative Code Tech

Perspectives on software development, digital growth and project learning. Explore more guides or get in touch about your own requirements.

← Back to all articles
🚀 Exclusive Community

Land Your Dream Job Faster!

  • ✅ Daily job alerts (Remote + On-site)
  • ✅ Interview questions from real companies
  • ✅ Career growth hacks & insider tips
  • ✅ Networking with professionals

Join 2,500+ professionals accelerating their careers

👉 YES! I WANT JOB UPDATES

🔒 Zero spam • 1-click leave anytime

Scroll to Top