Practical WordPress guide

Hide Paid Shipping When Free Shipping Is Available for WooCommerce: safe setup, failure cases, and rollback

A plain-language guide for nontechnical site owners. It separates what the parent plugin really knows from what a helper plugin should never guess.

Reviewed July 22, 2026Official-source links includedNo invented performance claims

Direct answer

Filter each WooCommerce shipping package after its rates have been calculated. If that package contains a valid Free Shipping rate, keep Free Shipping and Local Pickup and remove its other rates. If Free Shipping is absent, return the package unchanged. Evaluate multiple packages separately. Do not create a free rate, merge packages, change costs, choose a default rate, or write cart and order data. A safe implementation also returns every original rate when any rate is malformed or uncertain. Turning the setting off should restore WooCommerce's native rate list immediately.

Hide Paid Shipping When Free Shipping Is Available for WooCommerce implements that narrow rule. Free provides the package-local filter and always keeps Free Shipping and Local Pickup. Pro adds a bounded list of up to ten other configured shipping choices to keep and is available for $39 per year for one site with a 14-day no-card trial.

Choose the smallest suitable approach

Approach What it changes Main tradeoff
Focused setting Rates shown in a package that already has Free Shipping One narrow rule with a clear rollback
Code snippet The same package-rate filter in code you maintain Theme changes, copied snippets, and future compatibility become your responsibility
Broad shipping suite Conditions by products, roles, locations, totals, or coupons More settings and a larger support surface than this one job needs

The pain appears in public support threads. One merchant asked how to hide paid shipping after the free-shipping minimum is reached. Another said that showing paid and free methods together confuses customers and wanted Free Shipping plus Local Pickup. A third reported Local Pickup disappearing when Free Shipping hid other methods.

These are individual cases. They document a repeated problem shape, but they do not prove that every store needs the change or that a particular plugin will sell.

Let WooCommerce own shipping eligibility

WooCommerce should still decide:

  • which shipping zone matches the address;
  • whether a Free Shipping condition is satisfied;
  • which methods and rates exist;
  • each rate's cost, tax, and label;
  • how separate shipping packages are formed;
  • which available method the customer selects.

The official WooCommerce guide for hiding other shipping methods when Free Shipping is available demonstrates the same general direction with code.

A focused tool removes the need to maintain that snippet. It should not become a second shipping engine.

Filter one package at a time

WooCommerce calculates rates per package and exposes the package through woocommerce_package_rates. The current WooCommerce shipping source shows the package calculation path.

A safe decision sequence is:

  1. Confirm the setting is enabled.
  2. Confirm the incoming value is an array of valid WooCommerce shipping-rate objects.
  3. Read each method ID without changing the rate object.
  4. If any rate is uncertain, return the complete original package.
  5. If no free_shipping method exists, return the complete original package.
  6. If Free Shipping exists, keep all free_shipping and local_pickup rates.
  7. Keep only exact additional Pro rate IDs that match the current package.
  8. Preserve the original array keys and object identities.

This sequence matters. Partial filtering after an uncertain rate could remove the only usable delivery choice.

Turn on the rule and verify it

  1. Configure Free Shipping and Local Pickup in WooCommerce > Settings > Shipping.
  2. Open WooCommerce > Hide Paid Shipping.
  3. Select Hide paid shipping when Free Shipping is available.
  4. Save the setting.
  5. Add products to a test cart without meeting the Free Shipping condition.
  6. Confirm the normal paid choices remain.
  7. Change the cart so Free Shipping becomes available.
  8. Confirm Free Shipping remains.
  9. Confirm Local Pickup remains when it belongs to the package.
  10. Confirm the other paid rates disappear from that package.
  11. Turn the setting off and confirm all native choices return.

Use a test address that matches the same zone as the intended customer. A cart tested against another zone proves little.

Diagnose unexpected results

Symptom Check first Safe expected behavior
Paid rates still show Whether Free Shipping exists in that exact package Packages without Free Shipping stay unchanged
Free Shipping does not appear Zone, address, threshold, and coupon requirements The plugin never creates a free rate
Local Pickup does not appear Whether the matched zone has standard Local Pickup enabled Standard local_pickup is always kept when present
One package behaves differently Whether the order is split into multiple packages Each package receives an independent decision
A third-party method disappears Its exact WooCommerce rate ID Pro can keep a listed exact rate; Free does not guess
No rates appear Disable the plugin and retest the shipping configuration Uncertain input should return unchanged

Clear cart fragments and any full-page cache after changing shipping settings. Recalculate shipping with a complete address.

Keep a few extra methods with Pro

Pro reads the shipping methods already configured in WooCommerce zones. Its settings list each choice as zone name, method title, and exact rate ID.

You can keep up to ten choices beside Free Shipping and Local Pickup. There are no wildcards, prefixes, carrier rules, product rules, geography rules, role rules, or coupon rules.

An ID that no longer matches a current configured method is ignored. A malformed or over-limit list does not weaken the Free fallback. If Pro, the network, or the license service is unavailable, the Free package rule keeps working locally.

Classic checkout and Checkout Block

Classic checkout and WooCommerce Checkout Block both use shipping rates calculated on the server. The same package filter can therefore apply to both.

This product adds no checkout JavaScript or CSS. It does not inspect the page, rewrite the checkout DOM, force the selected method, or move rates between packages.

A third-party shipping extension remains outside the guarantee when it does not return ordinary WC_Shipping_Rate objects with stable IDs. Uncertain data stays native instead of being guessed.

Safety, privacy, and resource boundary

  • Setting writes require manage_woocommerce and a valid WordPress nonce.
  • Free stores one enabled state.
  • Pro stores at most ten exact rate IDs.
  • No shipping zone, rate object, cost, tax, cart, order, customer, or product is written.
  • No personal data or checkout contents are sent to StoreFixKit.
  • Checkout makes no StoreFixKit, carrier, or third-party request.
  • There is no custom table, cron event, queue, telemetry, frontend script, or stylesheet.
  • The runtime performs bounded option reads and bounded passes over one package's rates.

The license and update service is used only from authenticated Pro administration actions, not from the storefront decision path.

Roll back without repairing store data

  1. Turn off the setting and retest the same cart and address.
  2. Deactivate Pro if an additional preserved choice is involved.
  3. Deactivate Free and recalculate shipping.
  4. Confirm WooCommerce's complete native rate list returns.
  5. If a version rollback is needed, install the previous deterministic ZIP and repeat the test.

The plugin does not migrate shipping data, so rollback means removing its read-time filter.

Default uninstall preserves its settings for accidental recovery. Defining STOREFIXKIT_DELETE_DATA as true before deletion removes only this product's owned options. It does not delete WooCommerce zones, methods, carts, orders, customers, or products.

Common mistakes

  1. Expecting the plugin to create Free Shipping. Configure the rate and its condition in WooCommerce first.
  2. Applying one global decision to an order with multiple packages. Judge each package separately.
  3. Removing Local Pickup together with paid delivery. Keep standard Local Pickup automatically.
  4. Copying a broad conditional-shipping snippet when the requirement is one package-local rule.
  5. Treating a third-party pickup method as standard local_pickup. Check its exact configured rate and use a bounded Pro choice when available.
  6. Testing with an incomplete address or the wrong shipping zone.

Market evidence boundary

The WooCommerce Marketplace lists Hide Paid Shipping Methods for WooCommerce at $29 per year. It sells the exact broad outcome of hiding paid methods when free delivery is available. That is evidence that a paid category exists. It is not evidence of StoreFixKit sales, conversion, or future revenue.

A direct WordPress.org incumbent in the captured research reported 20,000 active installs, while a narrower alternative reported 200. Those counts belong to those plugins. They cannot be converted into StoreFixKit users, buyers, or revenue.

The captured WooCommerce API reported 7,000,000 active installs. That describes the parent ecosystem's scale, not demand for this specific rule.

Actual validation must measure legitimate installs, successful setup, trial starts, paid conversions, refunds, renewals, and support load after release.

Frequently asked questions

Does this create or enable Free Shipping?

No. WooCommerce must already provide Free Shipping in the current package.

Will Local Pickup stay available?

Standard WooCommerce Local Pickup stays when it exists in the package. A differently identified third-party pickup method may need an exact Pro keep choice.

Does it support WooCommerce Checkout Block?

Yes when the block uses WooCommerce's server-calculated package rates. No checkout DOM rewrite or frontend asset is involved.

Can I hide rates by product, role, country, coupon, or subtotal?

No. This release performs one visible rule and does not include a condition builder.

What happens after deactivation?

WooCommerce receives the complete incoming rate list again on the next shipping calculation.

Focused plugin

Use the one-job implementation.

Hide paid delivery choices only when Free Shipping is available in the same WooCommerce package, while always keeping Free Shipping and Local Pickup and leaving uncertain rate data unchanged.