WooCommerce Shipping Plugins Compared by Price

WooCommerce Shipping Plugins Compared for US Stores

Most WooCommerce shipping plugins solve one of two problems, and you need to know which one you have before you spend anything: quoting a real carrier price at checkout, or buying and printing the label afterwards. WooCommerce 11.1.2 already handles flat rates, free-shipping thresholds and local pickup on its own under WooCommerce → Settings → Shipping, so if your rates are a flat $8 under 5 lb, you do not need a plugin at all.

Where stores lose money is the middle case: real carrier rates at checkout, quoted from weights and dimensions you never filled in. That setup overcharges some customers into abandoning the cart and undercharges others out of your margin, and no plugin on this page fixes it for you.

This page is about products and prices

If the question you actually have is which method to use — flat rate, table rate, live carrier rates or pickup — then WooCommerce shipping methods compared for US stores works through that decision with your own order data. This page picks up where that one stops: current licence prices, where each free tier ends, and the label platforms that sit after checkout rather than at it.

What WooCommerce core shipping already does for free

Open WooCommerce → Settings → Shipping → Shipping zones. A zone is a list of regions plus the methods available in it, and core ships three: Flat rate, Free shipping and Local pickup. Most stores never outgrow them.

Flat rate is more capable than its name suggests. The cost field takes a small formula with placeholders, so a zone can charge a base plus a per-item amount, and shipping classes can override it:

# Flat rate cost field: $6 base, plus $1.50 per item in the cart
6.00 + ( 1.50 * [qty] )

# Base plus 2% of the cart, useful for insured goods
6.00 + [fee percent="2" min_fee="1.00"]

Free shipping can require a minimum order amount, a coupon, or both, and you choose whether the minimum is calculated before or after discounts — a detail that matters the first time someone stacks a 30% coupon to cross your $75 threshold. Local pickup gets its own rate and can be taxed at your store’s address rather than the customer’s.

What core will not do: ask USPS or UPS what a parcel actually costs, work out how your items fit into boxes, or buy a label. Those three gaps are the only honest reasons to install anything below.

Answer this before you shop

Do you need a price at checkout, a label after checkout, or both? Rate plugins (Flexible Shipping, Table Rate, carrier live-rate plugins) run at checkout and never touch a label. Fulfillment platforms (ShipStation, Shippo) buy labels and never touch your checkout. Stores routinely pay for one and complain it does not do the other.

How I judged these WooCommerce shipping plugins

These are documented behaviours, published prices and WordPress.org install counts, not benchmark scores. Weight them for your own store:

Where the number comes from. A rule you wrote, or a live API call to a carrier. Rules are instant and always available. Live rates are accurate and can time out, leaving a customer at a checkout with no shipping options at all.
Box packing. The single biggest source of wrong live rates. Without it, most plugins quote each item as its own parcel, so a six-pack of mugs is quoted as six shipments. This is a paid feature almost everywhere.
Who holds the carrier contract. Your own negotiated account, or the vendor’s aggregated rates. Aggregated rates are usually cheaper at low volume and worse once you ship enough to negotiate.
Price shape, not headline price. A $99 annual licence and a $17 monthly subscription with per-label overages are different commitments. So is a licence that lapses into no updates versus one that stops working.
What it cannot do, stated plainly. Every option here has a hole. The expensive mistake is buying the one whose hole is the thing you needed.

Prices, versions and install counts were checked on 5 October 2026 against each vendor’s own pricing page and WordPress.org listing.

WooCommerce shipping plugins compared

On a narrow screen this table stacks into one card per option rather than scrolling sideways.

OptionRates at checkoutBuys labelsPriceWhere it falls short
WooCommerce core 11.1.2Flat rate with formulas, free shipping, local pickup, per-class overridesNo$0No carrier rates, no weight or dimension tables, one flat cost per class per zone
WooCommerce Shipping 2.4.2
70,000+ installs
Live rates from USPS, UPS, DHL and FedExYes — discounted labels, return labels, USPS SCAN forms, tracking$02 out of 5 stars from 18 reviews. Needs a WordPress.com account connection. US origin and USD stores only
Flexible Shipping 6.13.1
100,000+ installs, 4.9/5 from 705 reviews
Table rates on weight and cart total, unlimited methods and rulesNoFree; PRO $99/yr for 1 site, $321.75/yr for 5. 30-day money-back guaranteeNo carrier API at all. Shipping-class conditions, dimensional weight, user-role and time-based rules are all PRO
Table Rate Shipping (WooCommerce.com)Rate tables on location, price, weight, class or item count, calculated per order, item, line or classNo$119/yr, or $190.40 for two years. 30-day money-back guarantee$20/yr more than Flexible Shipping PRO for a comparable rules engine, and still no carrier rates
Shipping Live Rates for USPS 3.6.0 (Octolize)
2,000+ installs, 4.7/5 from 29 reviews
Live USPS rates — 8 domestic and 6 international services, with fixed fallback ratesNoFree; PRO adds box packing, handling fees, alternate origin, multi-currencyOne carrier only. 2,000 installs is a thin track record. Box packing — the thing that makes rates correct — is the paid tier
ShipStationNoYes — multi-carrier, batch labels, multi-channel ordersStarter $14.99/mo, Standard $29.99/mo, Premium $349.99/mo. 30-day trial, no cardNothing appears at your checkout. The bill scales with monthly shipment volume, so confirm your tier against your own order count
ShippoNoYes — multi-carrier labels and trackingStarter free up to 30 labels/mo (5¢/label on your own carrier accounts); Pro $17/mo or $205/yr up to 10,000 labels, then $0.08/labelAlso a fulfillment tool, not a checkout rate engine. The free tier’s 30 labels is one busy week for most stores
Checked 5 October 2026. All WordPress.org plugins listed here are tested up to WordPress 7.1.2.

WooCommerce Shipping: free labels, with a rating you should read first

This is Woo’s own plugin, version 2.4.2, 70,000+ active installs, and it is the only free option here that does both jobs: live rates from USPS, UPS, DHL and FedEx at checkout, and discounted labels you buy from the order screen. It also handles the fiddly parts of fulfillment — split shipments when stock arrives in waves, return labels, USPS SCAN forms so the carrier scans one sheet instead of forty parcels, and address verification at checkout.

Weakness worth naming, and it is a big one: the WordPress.org rating sits at 2 out of 5 stars across 18 reviews. That is a small sample, so do not read it as a verdict, but do read the reviews themselves before you build your fulfillment process on it. Two hard constraints also rule it out for some stores: it requires connecting a WordPress.com account, and it currently supports stores shipping from US territories in US dollars. If you sell in CAD from Toronto, this plugin is not for you.

Because it quotes live rates, it will also fail the way every live-rate integration fails: when the carrier API is slow or your products have no weights, a customer reaches checkout and sees no shipping methods. Always leave a flat-rate method in the same zone as a fallback. Costing a few dollars is survivable; a checkout with no way to proceed is not.

Flexible Shipping vs Table Rate Shipping: the rules engine decision

Neither of these calls a carrier. Both let you write the rate table you would otherwise keep in a spreadsheet, and for a store with predictable parcels that is more useful than a live rate, because it is instant, never times out, and you control the margin.

Flexible Shipping is the one to try first because its free version is genuinely usable: unlimited methods, unlimited cost rules, and conditions on cart weight and cart total with minimum and maximum thresholds. That covers the classic “$7 up to 2 lb, $12 up to 10 lb, free over $75” table completely, at no cost, with 100,000+ installs and a 4.9 rating from 705 reviews behind it.

You hit the PRO paywall at a specific and predictable point: conditions on shipping class, on item quantity, on dimensions or volumetric weight, on user role, or on day and time. If your rate depends on which products are in the cart rather than how heavy the cart is, you are buying PRO at $99/yr for one site, with a 30-day money-back guarantee. The multi-site ladder runs $158.40 for two sites, $222.75 for three and $321.75 for five, and the seven-plugin Flexible Shipping bundle is $139/yr for one site if you also want their carrier integrations.

Woo’s own Table Rate Shipping extension is $119/yr with the same 30-day guarantee, and its distinguishing features are rate tables per zone with four calculation types — per order, per item, per line item, or per class — plus CSV import and export. That CSV support is the genuine reason to pick it: if your rates come from a supplier spreadsheet with four hundred rows, importing beats retyping. Otherwise you are paying $20 more a year for a comparable rules engine with a smaller public review record.

Per-class calculation is the one that surprises people

A cart holding one item from three different shipping classes, calculated “per class”, produces three charges added together. Customers read that as a bug and email you about it. Decide deliberately whether a mixed cart should be charged once at the highest class rate or once per class, then place a test order with exactly that mix before you launch.

Live carrier rates: box packing is where the money leaks

A carrier API answers one question: what does it cost to move a parcel of this weight and these dimensions from A to B. Your cart is not a parcel. Something has to decide how six items become two boxes, and that step is what separates a free live-rate plugin from a correct one.

Without box packing, the common default is per-item quoting: each line in the cart is priced as its own shipment and the totals are summed. For a single-item order the rate is right. For a six-mug order it can be two or three times what you will actually pay, and the customer leaves. Shipping Live Rates for USPS 3.6.0 is free, rated 4.7 from 29 reviews, and does eight domestic and six international USPS services — but its automated box packing, custom box definitions and handling fees are all in the PRO tier. Price the paid tier into the decision from the start rather than discovering it after your first multi-item order.

Find the products with no weight before you enable live rates

Live rates on a catalogue with missing weights produce either a quote of zero or no methods at all. Count the offenders first with WP-CLI:

wp db query "
SELECT COUNT(*) AS products_without_weight
FROM wp_posts p
LEFT JOIN wp_postmeta m
  ON m.post_id = p.ID AND m.meta_key = '_weight'
WHERE p.post_type IN ('product','product_variation')
  AND p.post_status = 'publish'
  AND ( m.meta_value IS NULL OR m.meta_value = '' );
"

Swap wp_ for your real table prefix. Anything above zero needs fixing before a carrier plugin can give an honest answer, and variations matter as much as parent products — a variable t-shirt with weights only on the parent will quote wrong for every size.

Log what the rate engine actually returned

When a customer reports “no shipping options”, you need to see the package WooCommerce built and the rates that came back. Drop this in wp-content/mu-plugins/:

<?php
// wp-content/mu-plugins/wpf-shipping-debug.php
// Log the package and the rates each shipping method returned.

add_filter( 'woocommerce_package_rates', function ( $rates, $package ) {
	if ( ! defined( 'WP_DEBUG_LOG' ) || ! WP_DEBUG_LOG ) {
		return $rates;
	}

	$weight = 0.0;
	$items  = 0;

	foreach ( $package['contents'] as $item ) {
		$weight += (float) $item['data']->get_weight() * (int) $item['quantity'];
		$items  += (int) $item['quantity'];
	}

	$lines = [];
	foreach ( $rates as $id => $rate ) {
		$lines[] = $id . ' = ' . wc_format_decimal( $rate->get_cost(), 2 );
	}

	error_log( sprintf(
		'[wpf-shipping] %s %s | %d items | %s %s | rates: %s',
		$package['destination']['postcode'],
		$package['destination']['country'],
		$items,
		$weight,
		get_option( 'woocommerce_weight_unit' ),
		$lines ? implode( ', ', $lines ) : 'NONE RETURNED'
	) );

	return $rates;
}, 999, 2 );

Enable WP_DEBUG_LOG first, then add one product to a cart and run through to the shipping step. NONE RETURNED with a sensible weight means the carrier call failed or the zone has no method; NONE RETURNED with a weight of 0 means your product data is the problem. If you have not set logging up before, enabling WordPress debugging and reading the error log safely walks through it without exposing notices to visitors. Remove the file when you are done — it writes a line on every rate calculation.

One gotcha when you test any of this: WooCommerce caches calculated rates against a hash of the cart contents in the customer session, so your own browser can keep showing the previous rates after you change a setting. Empty the cart or use a private window before you conclude a change did nothing.

ShipStation and Shippo: fulfillment, not checkout rates

These two sit after the order, and they get recommended in answer to questions they do not answer. Neither puts a rate on your checkout page. What they do is pull orders in, pick the cheapest carrier, print labels in batches, and push tracking numbers back.

ShipStation starts at $14.99/mo for Starter and $29.99/mo for Standard, with Premium at $349.99/mo and a 30-day trial that does not ask for a card. Pricing is tiered by monthly shipment volume, so check your own order count against the current tier table rather than trusting a headline figure. It earns its keep when you ship from several sales channels at once and batching is the bottleneck.

Shippo has a genuine free tier: up to 30 labels a month, with a 5¢ per-label fee if you bring your own carrier accounts. Pro is $17/mo, or $205 billed annually, covering up to 10,000 labels a month with per-label fees waived on your own accounts, and $0.08 per label beyond that. For a store shipping a handful of parcels a week, that free tier is the cheapest honest answer on this page.

One operational note that catches people: both tools push tracking numbers back into WooCommerce, which fires a customer email. If your transactional mail is going out through wp_mail() on a shared host, those notifications are the ones most likely to land in spam — the same problem covered in WooCommerce SMTP plugins for order emails.

Local delivery and pickup is a separate problem

If you deliver in your own van or let people collect from the shop, carrier rates are irrelevant and a rules engine is close to it. What you need is a delivery date and time slot at checkout, a radius or postcode check, and a driver list — none of which the plugins above provide.

Core’s Local pickup method covers the simplest version at no cost, and it can tax at your shop address rather than the customer’s, which matters for the sales tax setup on a store with one physical location. Once you need driver assignment, you are into dedicated territory: Delivery Manager for WooCommerce adds a Delivery Person role, order assignment and a mobile driver view. Disclosure: I build and maintain that plugin, so judge it by the same criteria as everything else here — and by those criteria its weakness is its install base: under ten active installs and no reviews, so you would be an early adopter rather than the thousandth person to hit a given bug. Local Delivery Drivers for WooCommerce is the established free alternative with 800+ installs behind it. The full comparison, including the date-picker plugins, is in WooCommerce local delivery and pickup plugins compared.

Which one should you pick?

  • Uniform products, predictable parcels: core Flat rate with a formula, plus a free-shipping threshold. Spend nothing, and revisit when your rates stop matching your invoices.
  • Rates that depend on weight or cart total: Flexible Shipping, free. It does this completely and you will not need the paid tier.
  • Rates that depend on shipping class, dimensions or user role: Flexible Shipping PRO at $99/yr. Choose Table Rate Shipping at $119/yr instead if you need CSV import for a large existing rate table.
  • US store, USD, wants live rates and cheap labels in one free plugin: WooCommerce Shipping — read its reviews first, and keep a flat-rate fallback method in every zone.
  • USPS only, want to start free: Shipping Live Rates for USPS, budgeting for PRO as soon as orders contain more than one item.
  • Label buying is the bottleneck: Shippo’s free tier under 30 labels a month, ShipStation once batching across channels is the daily job.

Whatever you install, place three test orders before you trust it: one single light item, one heavy multi-item cart, and one to the furthest zone you serve. Then compare each quote against what the carrier actually charged you. Every shipping setup I have seen bleed money bled it on the second of those three.

Live rates add an outbound API call to the checkout request, so they make your checkout slower in a place you cannot cache. If your shipping step already feels sluggish, the cause is usually the host rather than the plugin — WooCommerce hosting requirements: PHP workers and RAM covers how to tell. And a page cache that serves one customer’s calculated rates to the next is a classic failure, described in WooCommerce caching plugins: what breaks and what works.

Frequently asked questions

Do I need a shipping plugin if WooCommerce has shipping zones built in?

Not for flat rates, free-shipping thresholds or local pickup — core does all three, and Flat rate accepts a formula with a per-item component. You need a plugin when the price must come from a carrier API, when it depends on weight or dimensions in a table, or when you want to buy labels from inside wp-admin.

Why does my checkout say there are no shipping methods available?

Four causes, in the order you should check them: the customer’s address falls outside every zone you defined, the zone has a method but it is disabled, your products have no weight so a live-rate call returns nothing, or the carrier API timed out. The logging snippet above tells you which one it is in a single line. Keeping a flat-rate method in every zone means none of the four can ever block a sale outright.

Are live carrier rates more accurate than a weight table?

Only if your product weights, dimensions and box packing are all correct. A live rate built on wrong dimensions is confidently wrong, while a weight table you built from your own last fifty invoices is approximately right on every order. Stores with a narrow product range are often better served by the table.

Can I use a rate plugin and a label platform together?

Yes, and it is the normal setup for a growing store: a rules engine or carrier plugin quotes the customer at checkout, and ShipStation or Shippo buys the label afterwards. They do not conflict because they run at different moments. Just reconcile them monthly — the gap between what you charged and what you paid is a number you should be able to state.

Is shipping taxable in the US?

It depends on the state, and in several states it depends on whether shipping is stated separately from the goods. WooCommerce has a tax setting for shipping under WooCommerce → Settings → Tax, and the automated tax services handle the state-by-state rules for you. This is a question for your accountant rather than a plugin comparison, but set it deliberately rather than leaving the default.

Does a shipping plugin slow down checkout?

A rules engine costs you almost nothing — it is arithmetic against the cart. A live-rate plugin adds a third-party HTTP request that runs while the customer waits, and it runs again on every address change. Set a short timeout, enable the plugin’s rate caching if it offers it, and define fallback rates so a slow carrier degrades into a usable price instead of an empty shipping step.

Sources

Leave a Reply to This Post