Shipping is where many WooCommerce stores quietly lose money, either by undercharging on heavy orders or by driving customers away with surprising rates. WooCommerce can handle most shipping logic with its built-in tools; the trick is using them in the right order. This guide covers what is possible natively and when a dedicated plugin is worth it.
Start with the built-in building blocks
Shipping zones
A zone is a group of locations (countries, states, postcodes) with its own shipping methods. Customers only see methods from the first zone that matches their address, so order zones from most specific to least specific, and keep a “Rest of the world” zone at the bottom.
Shipping classes
Classes group products that ship differently: “Bulky”, “Fragile”, “Small parcel”. Assign a class to each product, then in the Flat Rate method set a cost per class. This alone covers “charge more for heavy items” without any plugin.
Flat rate cost formulas
The Flat Rate cost field accepts simple formulas: [qty] for quantity and [cost] for cart total. For example 5 + ( 2 * [qty] ) charges a base of 5 plus 2 per item, and [cost] * 0.05 charges 5% of the order value. You can also use [fee percent="10" min_fee="4"].
Free shipping conditions
The Free Shipping method can require a minimum order amount, a coupon, or both. Add it alongside flat rate in the same zone, and consider hiding other methods when free shipping is available (a small snippet or plugin does this) so customers are not confused by paid options.
Common rules and how to build them
| Rule | Native approach |
|---|---|
| Free shipping over $75 | Free Shipping method with minimum order amount |
| Higher rate for bulky items | Shipping class “Bulky” with a class-specific flat rate cost |
| Per-item charge | Flat rate cost using [qty] |
| Different rates by region | Separate zones for regions or postcodes |
| Local pickup for nearby customers | Local Pickup method in a zone restricted to local postcodes |
| Do not ship certain products abroad | Shipping class with no method in international zones plus a product note |
When native rules are not enough
Native tools cannot combine conditions (“if weight over 20kg AND destination is remote THEN add surcharge”), charge by weight tiers, or exclude a method based on cart contents. For these you need a table rate or conditional shipping plugin. Popular options let you write rules based on weight, dimensions, quantity, cart total, shipping class, customer role, destination and more. Choose one that is well maintained and supports WooCommerce’s block checkout.
Live carrier rates
If you ship with UPS, FedEx, USPS, DHL or Royal Mail and want exact rates at checkout, use the carrier’s official WooCommerce extension or a multi-carrier plugin. Carrier rates depend on accurate product weights and dimensions, so fill those in for every product before enabling live rates.
Shipping on a multivendor marketplace
On a Dokan or WCFM marketplace each vendor usually manages their own shipping. Dokan’s vendor shipping module gives each vendor zones and rates, and the customer pays shipping per vendor in the cart. If you need marketplace-wide rules on top (for example free shipping across all vendors above a threshold), that requires careful configuration or custom code, which is worth planning before launch.
Testing before you go live
- Create test orders for each zone with small, large and mixed carts.
- Check that only the intended methods appear and the amounts are right.
- Test the free shipping threshold at exactly the limit and just below it.
- Check the block checkout and the classic checkout if you use both.
- Review the shipping total on the order email and in the admin order.
Further reading
Shipping rules too complex to set up alone?
We configure zones, classes, conditional rules and live carrier rates for WooCommerce stores and Dokan marketplaces, and test every scenario before launch. WooCommerce services or tell us your shipping rules.



