Most US stores running under a few hundred orders a month should charge flat rate shipping with a free-shipping threshold, and nothing else. The WooCommerce shipping methods that look more sophisticated — table rates, live USPS and UPS quotes, per-class rules — only pay for themselves when your parcels vary enough in weight or destination that a single number is losing you real money on every third order.
This is a comparison of the four options you actually choose between in WooCommerce 11.1, with the free-version limits of each plugin spelled out. I have left prices out where I could not confirm them from a first-party source; install counts, versions and free-versus-paid feature splits below come from the plugin pages on WordPress.org as of 5 September 2026.
The four things I judged each option on
- Does the free version solve the actual case? A plugin that gates the one rule you need behind PRO is a paid plugin, and I have said so where that happens.
- How many moving parts sit between the cart and a number? A carrier API, an account, credentials and a box-packing guess are four places a checkout can fail.
- Maintenance signal. Last update, tested-up-to version, install base and review count. A shipping plugin that goes quiet for a year is a liability.
- What the customer sees when it breaks. This is the one people skip. Some failures show a wrong price; others show no shipping options at all, which reads to the buyer as a broken store.
WooCommerce shipping methods compared at a glance
WooCommerce ships with flat rate, free shipping and local pickup built in. Everything else in this table is a plugin decision on top of those.
| Method | Best for | Setup effort | Ongoing cost | Main weakness |
|---|---|---|---|---|
| Flat rate (core) | Uniform products, one region, under ~300 orders/month | Minutes | None | You eat the loss on heavy or far-away orders |
| Free shipping threshold (core) | Raising average order value | Minutes | Margin you choose to give up | Threshold set too low quietly kills margin |
| Table rate (plugin) | Weight or cart-value bands, mixed catalogues | An hour, plus testing | Free or one-off/annual licence | Rule sets get unmaintainable past ~15 rows |
| Live carrier rates (plugin) | Heavy, bulky or wide-ranging parcels | Half a day, plus carrier account | Per label, plus any PRO licence | API downtime or bad dimensions can leave the customer with no options |
| Local pickup / delivery (core + plugin) | Food, florists, furniture, anything within a drive | Minutes for pickup, longer for scheduled delivery | None to modest | Scheduling and driver assignment need separate plugins |
Flat rate: the default that carries most small US stores
Go to WooCommerce → Settings → Shipping → Shipping zones, add a zone for the United States, and add a Flat rate method to it. The cost field is not just a number — it takes a small expression language, and most store owners never find out.
# A base charge plus a per-item charge
8.95 + ( 2.50 * [qty] )
# A percentage of the cart, floored and capped
[fee percent="7" min_fee="5.95" max_fee="24.95"]
The [qty] placeholder is the item count in the package and [cost] is the package subtotal, so [fee] with a min_fee and max_fee gets you a crude weight proxy without installing anything. If you have set up shipping classes under Shipping → Classes, the Flat rate settings screen grows a cost field per class, plus a choice between charging per class and charging once for the most expensive class in the cart. That covers more cases than people expect.
Where it breaks: the moment your catalogue contains both a 4 oz enamel pin and a 12 lb cast iron pan. One flat number is either overcharging the pin buyer out of the cart or losing you eight dollars on every pan. If you can see that split in your own order history, move to table rates.
Table rate shipping: two free plugins, two different ceilings
Table rate means a grid of rules: if the cart weighs between X and Y, charge Z. Two free plugins dominate this on WordPress.org, and the interesting part is where each one stops being free.
Flexible Shipping by Octolize
Version 6.12.1, 100,000+ active installs, tested against WordPress 7.1, 4.9 out of 5 across 704 reviews, last updated in mid-August 2026. That is about as healthy as a free shipping plugin gets. The free version gives you unlimited methods and unlimited cost rules based on cart weight and cart total, including free shipping above an amount, across as many zones as you like.
What is not free is worth reading before you install: shipping class rules, item-count and quantity rules, dimensional weight, user-role rates, day-and-time rules and conditional logic all sit in PRO. If your rate table is “under 1 lb, 1–5 lb, over 5 lb”, the free version is genuinely enough. If your plan was “charge per shipping class”, you are buying a licence, and you should price that in now rather than after you have built half the table.
Table Rate Shipping for WooCommerce
10,000+ active installs, tested against WordPress 7.1, 4.6 out of 5 across 73 reviews. Free rules run on shipping weight and total price, with an asterisk to mean “no upper limit” on the last band. Country, state, ZIP code, shipping class and item-count conditions are Pro-only.
Practically, the two free versions solve the same problem, and Flexible Shipping has ten times the install base and a much larger review pool behind it. I would start there and only look elsewhere if its interface annoys you. Whichever you pick, build the rules on a staging copy — this is exactly the kind of change where you want to test the site properly before it goes live, because a rate table with a gap in it produces no shipping options at all for carts that fall into the gap.
Test the gaps, not the middle. Every table rate setup I have seen fail failed at a boundary: a cart weighing exactly 5.00 lb when one rule ends at 5 and the next starts at 5.01. Put a real product in the cart at each boundary value and confirm a rate appears. Then add a catch-all last row with no upper bound so nothing can ever fall through.
Live carrier rates: the most accurate and the most fragile
Live rates ask USPS, UPS or FedEx what a specific parcel costs to a specific ZIP code at checkout. When it works it is the fairest pricing you can offer. It also introduces a network call into your checkout, which is a meaningful decision, not a settings toggle.
The official WooCommerce Shipping plugin is free with 70,000+ active installs, tested to WordPress 7.1, and covers USPS, UPS, DHL and FedEx. Its pitch is that you compare live label rates and buy discounted labels from the WooCommerce dashboard without opening carrier accounts yourself — you pay per label. For a US store that is currently walking parcels to the post office, this is usually the first thing to try.
If you want live USPS rates shown to the customer in the cart, Shipping Live Rates for USPS for WooCommerce (version 3.5.3, 2,000+ installs, 4.6 out of 5 from 27 reviews) does that, but read the requirement carefully: you need your own USPS account and API credentials. It quotes Priority Mail, Priority Mail Express, Ground Advantage, Media Mail and the international services. The free version does not do multi-box packing — the automatic box-packing algorithm, custom box definitions, handling fees and custom origin addresses are all PRO. That matters more than it sounds. Without box packing, a three-item cart is quoted as though it ships in one guessed box, and the quote drifts from what you actually pay.
Two things to accept before you go live with carrier rates. First, every product needs a real weight and real dimensions, or the quotes are fiction. Second, decide now what happens when the API is slow or down. Configure a flat rate method in the same zone as a fallback so the customer always sees something. And if a rate stops appearing after an update, a shipping plugin is one of the likelier candidates in a conflict — the process for that is the same as any other, and it is worth isolating the conflict methodically rather than switching plugins off at random on a live store.
Local pickup and local delivery
Local pickup is a core WooCommerce shipping method — add it to your zone, set a cost of zero or a small handling charge, and it appears at checkout. For a bakery, a florist or a furniture store, this is often the highest-margin option on the page and takes two minutes to enable.
Local delivery is two separate problems, and store owners routinely buy a plugin for one and discover they still have the other:
- Letting the customer pick a slot. Delivery and Pickup Date Time for WooCommerce by CodeRockz is the established free option here — version 1.3.88, 5,000+ installs, 4.9 out of 5 from 281 reviews, tested against WordPress 7.1 and WooCommerce 11.0.1. Free covers date selection, delivery days and days off, and basic time slots; calendar views, multiple pickup locations, delivery fees and Google Calendar sync are Pro.
- Getting the parcel to the door and tracking who has it. That is driver assignment, not scheduling, and the date-picker plugins do not do it.
For the second problem, Delivery Manager for WooCommerce adds a Delivery Person user role, lets you assign an order to a driver, and gives that driver a mobile-friendly area under My Account to mark orders Out for Delivery and Delivered, writing order notes as the status changes. It is HPOS and Blocks compatible. Disclosure: I build and maintain this plugin.
Judged by the same criteria as everything else above, it has a real weakness you should weigh: it is at version 1.1.0 with fewer than 10 active installs, no reviews yet, and a tested-up-to of WordPress 7.0 rather than 7.1. That is a young plugin. If you need a battle-tested driver dispatch system for a fleet, buy a mature commercial one. If you are one shop with two drivers and you want the assignment and status trail inside WooCommerce instead of in a group chat, it does that job and it is free — but test it on staging first, as you would with any plugin at that install count.
Set it up in this order
- Set your store address under WooCommerce → Settings → General. Carrier quotes originate from it.
- Enter weights and dimensions on every physical product. Skip this and nothing downstream is trustworthy.
- Build zones from narrowest to widest: a local ZIP-code zone, then a state or region zone, then the United States, then “Locations not covered by your other zones”. WooCommerce matches top to bottom and stops at the first zone that fits the address, so a broad zone sitting above a narrow one makes the narrow one dead.
- Add a flat rate to every zone first, as the floor. Then layer table rates or live rates on top.
- Place a real test order to each zone, including one to the fallback zone.
Once free shipping kicks in you usually want the paid options to disappear rather than sit next to it. WooCommerce does not do that on its own; this filter does, and it is a fair bit safer than the copy-paste snippets that hardcode rate IDs:
add_filter( 'woocommerce_package_rates', function ( $rates ) {
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->get_method_id() ) {
$free[ $rate_id ] = $rate;
}
}
return ! empty( $free ) ? $free : $rates;
}, 100 );
Put that in a site-specific plugin or a code snippets plugin, never in a theme you will later update. One gotcha when you test it: WooCommerce caches calculated rates against a hash of the cart contents in the customer session, so your own browser may keep showing yesterday’s rates. Empty the cart or use a private window before you conclude the filter did nothing.
What each option really costs you
Licence fees are the small number. The real costs are these:
- Flat rate: free, and the cost is silent margin leakage on your heaviest and furthest orders. Quantify it once — pull thirty recent orders, compare what you charged with what the label cost — before you assume you need something more complex.
- Table rate: free to start, and the cost is your attention. Rate tables rot. Carrier prices change, your product mix changes, and nobody revisits the table.
- Live rates: the cost is added checkout latency, an external dependency, and PRO features for anything beyond a single-box quote. It also raises your PHP baseline — the USPS plugin above wants PHP 7.4 or newer and WooCommerce 11.1 needs the same, so if you are still on an older build it is worth checking and updating PHP safely before you add carrier integrations.
- Local delivery: cheap in software, expensive in process. Someone has to own the route every day.
Shipping plugins touch the checkout, which makes them the worst possible thing to update carelessly on a Friday afternoon. The same discipline you would apply anywhere else applies here: staging first, one plugin at a time, and a plan for updating plugins without breaking the site.
Frequently asked questions
Which WooCommerce shipping method should a brand new US store start with?
Flat rate plus a free shipping threshold, in a single United States zone, with local pickup added if you have a physical location. It takes ten minutes and costs nothing. Revisit it once you have a hundred orders of real label costs to compare against.
Why is no shipping option showing at checkout?
Almost always one of four things: the customer’s address falls outside every zone you defined and you have no fallback zone; a table rate has a gap at the exact cart weight; a product is missing a weight so the carrier API refused to quote; or the product is marked Virtual, in which case WooCommerce correctly skips shipping entirely. Check them in that order.
Do I need a paid table rate plugin?
Only if your rules depend on shipping class, item count, dimensional weight, user role, or time of day. Rules based on cart weight or cart total are available in the free versions of both plugins covered above.
Can I run flat rate and live carrier rates at the same time?
Yes, and for live rates you should. Adding both to the same zone means the customer sees a working option even when the carrier API times out. The customer picks whichever they prefer, which also tells you something about how price-sensitive your buyers are.
The short version
Start at flat rate and stay there until your own order data proves it is costing you money. Move to free table rates when weight bands would fix that, and only take on live carrier rates when your parcels genuinely vary enough to justify a network call inside your checkout. The most expensive WooCommerce shipping setup is the sophisticated one nobody maintains.

Leave a Reply to This Post