We previously looked at the two different parts of shipping in the context of eCommerce. If you missed that article, I recommend giving it a read. In this post, we are going to dive into the shipping rate side of things. We'll be looking at the options that are available when it comes to presenting shipping rates to customers at checkout.
The article is going to be pretty lengthy, but that is because it's purpose is to expose all of the possible "pieces" you can use when configuring shipping rates in WooCommerce. That way, when you come across a head-scratching complex shipping situation in the future, you'll hopefully know exactly what pieces to put together to solve the problem.
Shipping Zones
Before we dive into the shipping rates themselves, it's important to understand what shipping zones are and how they work. Shipping zones are the foundation and infrastructure that shipping rates/methods are built on top of. Shipping zones alone offer a lot of configuration power and flexibility. Previously this sort of functionality required a premium extension, but WooCommerce 2.6 refactored and added shipping zones into the core extension. Let's take a look at the definition from the official documentation:
A Shipping Zone is a geographical area to which you ship your items. You can get as specific as you need, right down to regions and zip codes, or you can leave it more general – whichever suits you best.
Shipping Zone Examples
I don't want to go into detail on how to set up shipping zones, as the documentation covers that quite well. So I highly recommend giving that a read from the link above. But in summary, you will be creating shipping zones for specific locations (states, countries, etc) and then adding shipping methods to the zones. Shipping zones can really shine in many situations, here are two examples:
Example One: Offer Local Pickup to only nearby customers, Free Shipping to those in your state + neighboring states, a Flat Rate of $5 per item for the rest of the United States, and a Flat Rate of $20 + $7 per item for international orders. This entire setup can be done without any extra extensions, just WooCommerce!
Example Two: Offer a Flat Rate of $5 for your state, USPS live rates with your east coast warehouse's address for some US states, USPS live rates with your west coast warehouse for the rest of the US states excluding Hawaii & Alaska, and then Fedex for international orders along with Hawaii & Alaska.
Common Shipping Zone Mistakes
With shipping zones, I often see two common pitfalls so I wanted to quickly address them here. The most common one is a misunderstanding on how shipping zones are matched. Only one shipping will be matched and returned at checkout, and it's based on the customer's shipping address. WooCommerce will search from the top zone to bottom one and return the first one it finds.
In my first example scenario above, you'll notice I have Free Shipping listed in the first and second zone. This is because if the first zone matches, only rates from that zone will be returned, even if other zones technically match. If we didn't include Free Shipping for both zones, then some nearby customers would have no other option but Local Pickup.
The second most common mistake I see is people forgetting to ensure all locations they ship to will have a matching zone. Utilizing the default "Locations not covered by your other zones" zone when possible will help avoid this pitfall. Though sometimes that isn't possible, in which case be sure to double check every valid location will have a match.
Shipping Classes
Shipping Classes are a pretty simple concept, and something you won't really need to understand until a bit later in the article. I want to go ahead and get this out of the way though so you'll know what I'm talking about later on 🙂
Shipping classes can be used to group products of similar type and are used by some shipping methods, such as Flat Rate Shipping, to provide different rates to different classes of product.
Think of shipping classes like product categories in a way, except they are used for administrative purposes like tax classes. You can create shipping classes and assign them to products and variations. Then when configuring some of the more complex shipping methods and extensions, you can use shipping classes to create rules for special groupings of products.
Shipping Methods
Now that we've taken a look at the foundation of shipping rates in WooCommerce, shipping zones, let's go over the available shipping methods that you can add into the zones. This isn't a complete listing of every option, but I've found that the below options will cover 99% of all shipping configuration needs, no matter how simple or complex.
Live API Rates
There's not much more to talk about when in comes to what Live API rates are than what was already covered in the previous article. So I don't want to repeat any of that. Instead, let's take a look at some of the options you have when using Live Rates.
Origin Location
When you add a live rates shipping method into a shipping zone, the settings will ask you to input an origin location – sometimes just the zip code. This location is used when the plugin requests rates with the external API. I'm mentioning this setting because 1) It's required and often forgotten, and 2) the fact it's located in the shipping method itself, inside of a shipping zone, allows for some nice flexibility.
If you look at the second example from the Shipping Zones section above, you'll notice there are two different USPS Shipping methods in the first and second zones. The methods themselves have exactly the same settings configured, except for the origin location / zip code setting. We utilized shipping zones and duplicated this method for the sole purpose of switching out the location our packages will be sent from. This allows us to get the appropriate shipping rates based on which warehouse our items will be sent from to the customer.
Parcel Packing Method
Nearly all live rate shipping methods have a setting called "Parcel Packing Method". This is the most important option, and I often see it mis-configured. There are generally always two options: Pack Items Individually & Pack Items into Boxes, and then sometimes a third option – Weight Based Rates.
When this option is set to "Pack Items Individually", it simply means that the plugin will look at the weights and dimensions of every product in the cart. Then it will request rates as if each item was going to be shipped by itself in a box that is the same size as the product. This is often not a good idea, as customers will see their shipping rates essentially double when they increase an item's quantity from 1 to 2. This is a good option though if your products are already packaged with the boxes they will be shipped in.
"Pack Items into Boxes" is often the best choice if you are looking for accurate rates. When chosen, the extension will look at the weights and dimensions of each product in the cart and attempt to pack them into the most efficient box(es). With this option, you will also need to set up which box sizes you plan on using for your store so the "box calculator" knows which boxes it can use. The shipping methods will allow you to define which box sizes you plan on using, and a couple also have pre-configured boxes that you can enable such as UPS standard box sizes.
"Weight Based" shipping is an option available by some shipping providers. It's essentially a way to request semi-accurate rates by only requiring products to have a weight entered for them, not dimensions. This is an option with some methods, like USPS, if adding shipping dimensions for all products isn't really possible/feasible for the site in question.
Box Packing Calculations
I mentioned the box calculator above, so I wanted to touch on that briefly. First, it's important to understand that the weights and dimensions you enter for products need to be the shipping weights and dimensions. For example, if you are selling a poster – it's likely going to be shipped "rolled up" rather than fully extended. There's a helpful article in the official WooCommerce documentation with more information on this. If you would prefer to not show these shipping dimensions to the user, I have a simple plugin that hides this info. You can then use custom product attributes that are visible on the product page to show the poster's actual dimensions.
The second important thing to understand with box calculations is that it won't always be perfect. If you enter in all your product dimensions correctly along with your configured box sizes, then it is possible to get the same rates returned to the customer that you will be paying for shipping labels. But it is also possible that the box packer won't choose the same combination you would prefer. The box packer has to work programmatically, simply looking at dimensions and working out what can/can't fit. Some items may be able to fit into one another, for example – if you were selling a large cooking pot and a single set of silverware in the same order. But the box packer has no way of knowing that items can fit inside each other. This is an example of the known bin-packing problem.
Price Adjustments
So what do you do when the shipping rates being returned by the shipping api always seem to be a little bit off? Well, there are a couple of options worth exploring, though I'll cover that at a later date in another article. The easiest fix to this problem is to utilize the Price Adjustment columns in the shipping method settings. Each shipping method will often have options for a flat and percentage cost increase for each particular service. This means you can increase the returned cost of USPS's "Retail Ground" by that pesky $2 that it always seems to be off. Note that you can also enter negative amounts to reduce costs.
Free Shipping
Free Shipping, this is the shipping option every customer loves to see! Definitely don't want to get into marketing in this article, but I do recommend considering what shipping rates you plan on offering from a marketing perspective. Studies show that shipping costs are often the number one reason for cart abandonment.
What adding Free Shipping to a zone does is pretty self-explanatory. It adds a shipping option that makes shipping free, well at least for the customer! However, the free shipping method in WooCommerce does have a bit more configuration options that make it more powerful than just that.
You can set a minimum order amount in the free shipping method, making it so the customer only sees the option if their cart has more than a $100 total for example. And there is also an option to only show the free shipping method at checkout if the customer uses a valid free shipping coupon. WooCommerce has a special setting on coupons called "Allow free shipping" that will enable free shipping methods with this restriction on it. I recommend reading the official documentation to learn more about setting up this method.
The most common request I see when it comes to free shipping is store owners wanting other shipping method to hide when free shipping is available. This doesn't happen by default, because many stores want to offer free shipping alongside other method like local pickup and expedited shipping. However, this can be accomplished with some custom code or by using the Conditional Shipping and Payments extension mentioned later on in this article.
Local Pickup
The Local Pickup shipping method is the simplest of them all. It's essentially a simplified version of the flat rate method, with one exception in regards to taxes. When a customer selects the local pickup option, the store's base taxes will apply regardless of the customer's address. Taxes can be configured to be applied to the customer's shipping address, however local pickup will override that and use the store's base address.
While local pickup is great for offering a simple option for customers to come to your store and pick up their items rather than having them shipped, it does fall short in a couple of areas – namely when you have multiple locations. In this case, I recommend taking a look at Local Pickup Plus. Local Pickup Plus adds quite a few helpful features like the ability for a customer to select a specific pickup location, the option for the store admin to require or restrict certain products to specific pickup locations, and special costs or discounts based on the chosen pickup location.
Flat Rates
Free Shipping and Local Pickup are two of the three shipping methods that come with WooCommerce core by default. Flat Rate is the third and the most powerful of the three. I have a post about this already published actually, so head over and give Setting up WooCommerce Flat Rate Shipping a read to learn more about what can be done with Flat Rate Shipping.
Advanced Flat Rates
Sometimes, the Flat Rate method just isn't enough. You may need more control over what sorts of rates are being offered based on variables like product weight, quantity, prices, and more. In these situations, you'll need to turn towards extensions that are built to extend the concept of flat rates to solve the more complex problems.
Table Rates
Table Rate Shipping is the go-to option when your store or your client's store has a pricing chart, always in an excel sheet, with multiple rows of conditions that lead to different shipping costs. Listing everything Table Rate can do would probably cause this article length to double in size, so I'll instead just list a couple of the options available. So here are some of the things you can do with Table Rate Shipping:
- Charge $5 for shipping if "Shipping Class A" has 1-5 products in the cart, charge $12 for 6-10 products, $20 for 11-20, and $30 for 20+. You can have different costs and conditions for each shipping class, and then one shipping class can either override the other based on priority or you can have the costs combine.
- Charge $10 per item if the cart weighs 0-10kgs, charge $5 per item if the the cart weighs 11-20kgs, and $2 per item if 21kgs+.
- Charge $5 + $5/item if the cart total is between $1-$10, $5 + $3/item if the total is between 11-50, and free shipping if cart total is above $51. However, if an item from Shipping Class B is in the cart, then abort and do not offer this shipping method to the customer.
Per Product
Per Product Shipping essentially makes it possible to configure flat rate shipping costs at the product-level. I recommend being hesitant before choosing this option, as often Table Rate is the better choice. That said, Per Product Shipping is the better choice for these three scenarios:
- If you have a large catalog and every product has unique shipping costs. I mention large because it's often better to utilize shipping classes and table rate shipping if your catalog is smaller.
- If you are running a vendor marketplace and vendors need to control their own shipping costs.
- And lastly, Per Product Shipping has a nifty setting that allows your product level defined shipping costs to add onto all existing shipping rates. For example, this will allow you to charge $5 more on top of existing live rates from USPS. Useful for that special product you have that is extra expensive to ship.
Distance Based
Distance Rate Shipping is seen less-often, but can be super useful if you plan on doing your own deliveries for nearby customers (think Pizza store). This extension using Google's Distance Matrix API which helps calculate the distance or travel time between two locations.
So with this shipping method, you can set up shipping rates using the following variables/conditions: distance, total travel time, the number items in the cart, weight of the items, and the total value of the cart.
Flat Rate Boxes
And lastly, Flat Rate Box Shipping is a a DIY version of the box packing / live rate methods. It works similar to the live API rate extensions, except there is no API and you are defining the costs yourself.
Essentially you will be adding this method into multiple shipping zones, listing what boxes you plan on using when shipping to those zones, and then inputting how much each box will cost. Then the Box Packing algorithms will do their thing and pack the items in the cart into boxes. Once the boxes are found, it will return the appropriate cost to the customer at checkout.
Shipping Rate Customizations
Alright, if you've made it this far, then congrats we are nearing the finish line! You should now have a pretty good understanding of the different types of shipping methods that can be used and configured. Let's say you've now got your shipping methods set up, and multiple shipping rates are showing in the cart.
But what happens if sometimes you need to show or hide a particular shipping rate? Or what if you have a special product that must be shipped using Expedited Delivery while the rest of the products can be shipped for Free?
For these situations, we'll take a look at two extensions that offer the ability to customize shipping rates and customer options once the rates are already showing up in the cart.
Rate Availability
Imagine you have USPS live rates set up and showing on your cart page, but you want to offer Free Shipping if only a specific product or shipping class is in the cart. How would you do that? Conditional Shipping and Payments is how! Here's a description from the extension's product page:
Use conditional logic to control the payment gateways, shipping methods and shipping countries/states available at checkout.
With Conditional Shipping and Payments, you'll have a plethora of variables to use when coming up with conditions in which certain shipping rates shouldn't be available. You can restrict shipping methods or rates based on the cart's total value, the customer's user role, the categories or shipping classes in the cart, and much more. It's even possible to hide a specific live api rate, like USPS Ground Shipping, if certain conditions are met. You can read more about the available options in this extension's documentation.
Multiple Packages
At this point, you're probably thinking what else could there possibly be! This final section goes over two helpful options that provide the ability to split the cart into multiple packages.
Advanced Shipping Packages
Advanced Shipping Packages is a really powerful tool when you have specific shipping requirements that differ based on products that are in the cart.
Multiple Shipping Packages allows you to split the cart up into, well, multiple shipping packages. The splitting up is automated based on conditions. For example, you can have all of Shipping Class A go into Package 1, and all of Shipping Class B go into Package 2. Then for each package, you can control which shipping rates are available.
This is especially useful in the situation I mentioned earlier when a specific product must be shipped with Expedited Delivery. You can split this product into it's own package and force this option to be selected. The rest of the products can then have a different shipping method selected. Another common use case I see is when a store wants to offer Free Shipping for particular products, but the rest all need to use USPS live rates.
Multiple Shipping Addresses
There is one other option when it comes to splitting the cart into multiple packages, and that is Shipping Multiple Addresses. This extension puts the cart splitting into the hands of the customer – allowing them to create multiple packages that can each be shipped to different shipping addresses with different shipping rates selected for each.
Summary
Well, you've done it! You made it to the end. You now know just about everything there is to know about shipping rates! You know about shipping zones, the foundation of shipping in WooCommerce, and shipping classes. You also know the different sorts of shipping methods that are available, and how those methods can be customized based on different conditions.
I wouldn't expect anybody to remember and absorb all of this information, but now you should have a pretty good idea of what options there are. So next time you're presented with a tricky set of shipping rules, you can come back here and piece together the different pieces you'll be needing.
“When you add a live rates shipping method into a shipping zone, the settings will ask you to input an origin location – sometimes just the zip code. This location is used when the plugin requests rates with the external API. I’m mentioning this setting because 1) It’s required and often forgotten, and 2) the fact it’s located in the shipping method itself, inside of a shipping zone, allows for some nice flexibility.”
I’m not seeing this at all. It would be nice if it was available, though.
Hmm, what shipping method / plugin? This will vary based on implementation I suppose.