Table of Contents

A shipping rules plugin for Magento adds conditional rate logic that the native platform can’t express: postcode ranges, per-SKU surcharges, stacked conditions and multiple active rate tables. Magento 2 ships with flat rate, free shipping, table rates and cart price rules, which cover most simple stores. You need a plugin when your rules outgrow those four.

Key takeaways

  • Magento 2 has four native shipping tools: flat rate, free shipping, table rates and cart price rules. Most small catalogues never need more.
  • Table rates support exactly three conditions, and only one rate table can be active at a time.
  • Magento does not support postcode ranges in table rates. This single limitation drives more plugin purchases than any other.
  • When free shipping is set in both the configuration and a cart price rule, the configuration setting wins.
  • Before you buy, write your rules out in plain English. If every one maps to a native condition, you’re buying something you already own.

If you’ve searched for a shipping rules plugin for Magento, you’ve probably already hit the wall. You wanted to charge differently for three postcode bands, or add a surcharge on bulky SKUs, or run separate rate tables for two websites, and Magento quietly refused. The admin didn’t throw an error. It just didn’t have the field you needed.

This guide covers what Magento 2 can do on its own, exactly where it stops, and how to tell whether a plugin is the right answer or whether you’re about to pay for a feature that’s already sitting in Stores > Configuration.

Everything below about native behaviour is taken from Adobe’s current Commerce documentation, verified on the date at the bottom of this page. Where something is a judgement call rather than documented behaviour, we say so.

What does a shipping rules plugin for Magento actually do?

The term covers a wide range of products, which is part of why comparing them is frustrating. Broadly, a shipping rules plugin for Magento does one or more of four things.

It extends the condition set. Native table rates let you vary a rate by weight, price or item count against a destination. A rules plugin typically adds product attributes, cart attributes, customer group, SKU, category, date windows, and combinations of all of them.

It allows multiple active rate sets. Magento permits one table rate dataset per scope at a time. Plugins usually let you define many named rules that evaluate together.

It adds rate assembly logic. Surcharges, per-item fees, handling percentages applied conditionally, minimum and maximum caps, and rules that stack or override one another in a defined priority order.

It changes what the customer sees. Custom method labels per rule, estimated delivery dates, or hiding methods that don’t apply rather than showing them greyed out.

Note what isn’t on that list: carrier connectivity. A rules plugin computes prices. It doesn’t fetch live rates from DHL or print labels. That’s a carrier integration, which is a different product entirely. Stores regularly buy one when they needed the other.

What can Magento do natively, without any plugin?

More than most people assume. Here are the four built-in tools, and what each is genuinely good at.

Flat rate

A single price, charged per order or per item, optionally restricted by country. It sounds trivial, and it is, but a surprising number of stores with one warehouse and one domestic market run on flat rate forever and never have a shipping support ticket. If your logistics cost is roughly constant per parcel, this is the correct answer and anything more is overhead.

Free shipping

Configured under Stores > Configuration > Sales > Delivery Methods > Free Shipping. The important fields are Minimum Order Amount and Include Tax to Amount.

That second field matters more than its placement suggests. Set to Yes, the qualifying total is calculated as Subtotal + Tax − Discount. Set to No, it’s Subtotal − Discount. Two stores with an identical “free over 100” promise will qualify different carts depending on this one dropdown, and neither is wrong — but you need to know which one you picked, because every other part of your storefront that mentions the threshold has to agree with it.

Table rates

The workhorse. Table rates reference an imported spreadsheet to calculate a rate from one of three conditions:

  • Weight v. Destination
  • Price v. Destination
  • Number of Items v. Destination

You export a tablerates.csv from the admin, fill it in, and import it back. An asterisk acts as a wildcard for all values in a column.

Cart price rules

Found under Marketing > Promotions > Cart Price Rules, and frequently overlooked in shipping discussions because they live in the marketing section. A cart price rule can grant free shipping conditionally. For a threshold promotion, the documented setup is:

  • In Conditions, add Cart Attribute > Subtotal, “equals or greater than”, and your threshold value.
  • In Actions, set Apply to “Percent of product price discount”, Apply to Shipping Amount to Yes, and Free Shipping to “For matching items only”.

Between table rates and cart price rules, Magento can express a genuinely wide range of commercial shipping policies without a single line of custom code.

Where do native Magento shipping rules break down?

Here are the hard limits, in roughly the order stores hit them.

Postcode ranges are not supported. In table rates you may use an asterisk to allow all codes within a region or state, or specify a single code for a specific location. There’s no “SW1 to SW19” syntax. If your carrier prices by postcode band — and UK, Australian and most Gulf carriers do — you are looking at one CSV row per postcode, or a plugin. This is the single most common trigger for buying one.

Only one set of table rate data can be active at a time. You cannot run a weight-based table for heavy goods and a price-based table for everything else. You pick one condition type and one dataset per scope.

Three conditions, and that’s the list. No product attribute conditions, no category conditions, no customer group conditions inside table rates. Customer group logic has to move to cart price rules, which can’t set a rate — only discount one.

The CSV is fussy, and fails quietly. The Country column must contain a valid three-character code. Values in the Weight (and above) column accept a maximum of four decimal places; more than that causes the import to fail outright. Rows must be sorted with specific locations above wildcard locations, so absolute values are processed before wildcards. Get the sort order wrong and your rates will be subtly incorrect rather than visibly broken, which is worse.

Free shipping has a precedence rule people forget. When both the configuration setting and a cart price rule could apply to the same order, the configuration setting takes precedence over the cart rule. If you have a 50 threshold in configuration and a 75 cart rule for a specific customer group, the configuration wins and your segmentation silently does nothing.

Cart price rules depend on cron. Price rules are processed with other system rules, and processing frequency depends on your cron configuration. A rule that looks saved and active in the admin may not be live on the storefront yet.

Coupon conditions tied to checkout options resolve late. If a coupon rule has conditions specifying shipping or payment methods, those conditions can only be met in checkout after the shopper has selected that method. The coupon then applies at the last step. Customers read this as “my code didn’t work” and contact support.

How do you decide between native config and a shipping rules plugin?

Do this before you look at a single product page. Write every shipping rule your business actually has, in plain sentences, the way you’d explain them to a new warehouse hire. Then map each one.

Your ruleNative Magento?Which tool
One price per parcel, domestic onlyYesFlat rate
Free over a cart valueYesFree shipping config
Free over a value, for one customer group onlyYesCart price rule
Rate varies by weight band and countryYesTable rates (Weight v. Destination)
Rate varies by order value and countryYesTable rates (Price v. Destination)
Rate varies by postcode bandNoPlugin, or one row per code
Weight bands for some products, value bands for othersNoPlugin
Surcharge on specific SKUs or a “bulky” attributeNoPlugin
Different rate tables per website or store viewPartlyScope config, then plugin
Live rates and labels from a named carrierNoCarrier integration, not a rules plugin

If every line comes back “yes”, stop. You don’t need to buy anything, and adding a plugin to a store that doesn’t need one costs you a dependency on every future upgrade.

If two or more lines come back “no”, a plugin is probably cheaper than the alternative, which is custom development.

If exactly one line comes back “no”, think about whether the rule is worth the dependency. Sometimes the right move is to change the commercial policy rather than the software. A postcode band that exists because of one awkward carrier contract may be easier to renegotiate than to encode.

What should you look for in a shipping rules plugin for Magento?

Once you’ve decided you need one, these are the questions that predict whether you’ll be happy in two years.

Does it state current version compatibility explicitly? Adobe Commerce 2.4.9 is tested with PHP 8.5. 2.4.8 runs on PHP 8.4 and 8.3; 2.4.7 on 8.3 and 8.2. A plugin whose latest release targets an older line will need work before it installs on a current store. Check the release date, not just the marketing copy.

Does it compute rates server-side? Some cheaper products apply their logic in the frontend only. The rate the shopper sees and the rate written to the order then diverge, which surfaces as revenue leakage months later. The rule logic must run in the rate collection, not in a template.

How does it handle rule priority? With more than a handful of rules, two will eventually match the same cart. You want an explicit, documented priority or stacking model, not whichever rule happens to be found first.

Is it compatible with your checkout? If you’re on Hyvä, or a one-step checkout extension, ask directly. Shipping rate display is one of the areas where checkout replacements and rate plugins conflict most often.

Can you export and version your rules? Rules are business logic. If they only exist as rows in an admin grid with no export, you have no way to review a change or roll one back.

What happens on an uninstall? Ask what the store does if the plugin is disabled mid-season. The honest answer is usually “those methods disappear from checkout”, which is worth knowing before Black Friday rather than during it.

How do you set up table rate shipping step by step?

If you’ve concluded native is enough, here’s the documented flow.

Step 1: configure the defaults. Go to Stores > Settings > Configuration, open Sales > Delivery Methods, and expand Table Rates. Set Enabled to Yes. Enter the Title shown during checkout (the default is “Best Way”) and a Method Name that appears as a label next to the calculated rate. Choose your Condition from the three options.

If your catalogue includes virtual products, decide on Include Virtual Products in Price Calculation. Virtual products have no weight, so they can’t change a Weight v. Destination result, but they will change a Price v. Destination or item-count result.

Set the handling fee if you charge one: Calculate Handling Fee as Fixed or Percent, then the rate. Enter a fixed fee as a decimal such as 4.90. Enter a percentage as a decimal too — six percent is entered as .06, not 6. This trips up almost everyone the first time.

Set Ship to Applicable Countries, decide whether to Show Method if Not Applicable, and set the Sort Order, where 0 appears first.

Step 2: prepare the data. Set the Store View scope at the top left, then click Export CSV and open the file in a spreadsheet. Fill in your rates, remembering the four rules that will otherwise bite you: three-character country codes, asterisks as wildcards, specific rows sorted above wildcard rows, and no more than four decimal places in the weight column.

Step 3: import. Back in the Table Rates section, set the Store View to the right scope, choose your file for Import, and save the configuration.

Step 4: verify. Run several test orders to different addresses and confirm the shipping and handling rates calculate correctly. Do this with addresses that sit exactly on your band boundaries, because off-by-one errors at band edges are the most common table rate defect.

How do you build a free shipping threshold rule correctly?

Two routes, and the choice has consequences.

Route one, configuration. Set Minimum Order Amount under Free Shipping. Simple, global, and it takes precedence over cart rules. Use it when the threshold is a single store-wide promise.

Route two, cart price rule. Use the Conditions and Actions settings described earlier. Use it when the threshold varies by customer group, website, date window or coupon.

If you need route two to work, be careful with route one. Adobe’s own guidance for combining free shipping with table rates is to set the Minimum Order Amount so high that it is never met, which prevents the configuration from firing and leaves the price rule in control. It’s a blunt technique, but it’s the documented one.

At carrier level there’s a third layer. Carrier configurations such as UPS have their own Free Method setting, an Enable Free Shipping Threshold toggle, and a Free Shipping Amount Threshold value. If free shipping isn’t appearing despite correct configuration, this is usually where the problem is hiding.

What are the most common shipping rule mistakes we see?

Thresholds that disagree across the site. The banner says 50, the cart says 50, and the rule counts tax so the real figure is 46 or 54 depending on the basket. Pick your Include Tax to Amount setting first, then write the copy.

Rules built on price in a multi-currency store. A price-based table rate in a store selling in three currencies needs its bands checked per currency, not converted once and forgotten.

No test for the “no method available” case. Set Show Method if Not Applicable deliberately. A checkout with zero shipping methods and no explanation is a guaranteed abandoned cart, and it’s much easier to notice in testing than in analytics.

Stacking a rules plugin on top of unfinished native config. Plugins layer on the native rate collection. If your table rate data is wrong, the plugin inherits the problem.

Forgetting cron. Covered above, but worth repeating, because “the rule isn’t working” and “the rule hasn’t been processed yet” look identical from the admin.

How do shipping rules interact with checkout performance?

Every shipping method registered in your store is asked for a rate each time the quote is recalculated — on address entry, on quantity change, on coupon application. Native methods are cheap because they’re local arithmetic. Live carrier lookups are expensive because they’re network calls.

A rules plugin sits in the cheap category, so in principle it shouldn’t hurt. In practice, two things do. The first is rule count: a plugin evaluating two hundred rules against every cart line on every quote refresh will show up in your checkout timings. The second is plugins that make their own external calls for delivery date estimates.

If checkout feels slow after adding one, profile the rate collection before blaming the frontend. Our Magento performance optimization playbook covers how to isolate this, and how page speed affects bounce rate explains why it’s worth the effort commercially.

When should you build a custom shipping carrier instead?

There’s a third option between native config and a marketplace plugin: a custom carrier module.

This is the right answer when your rate logic is genuinely unique to your business — a rate derived from your own fulfilment system, a rate that depends on live stock location, a rate negotiated per customer account. No off-the-shelf rules engine will express that, and bending one into shape costs more than writing the real thing.

It’s the wrong answer when you’re replicating something a plugin already does. Custom code is yours to maintain across every Magento upgrade, and shipping code touches checkout, which is the least forgiving place to carry technical debt. Our view on where that line sits is in Magento extension development: when do you need it.

If you’re weighing this up, our Magento development team scopes shipping logic as a discovery exercise before any code is written, precisely because the answer is often “you don’t need custom code for this”.

What do most guides on this topic miss?

Three things, consistently.

They don’t mention the postcode range limitation. It’s the actual reason most stores need a plugin, and it’s rarely stated plainly because it’s in the detail of the table rate documentation rather than the headline feature list.

They treat free shipping as one feature. It’s three — configuration, cart price rule, and carrier-level threshold — with a precedence order between them. Most articles describe one and leave readers confused when their setup doesn’t behave.

They conflate rate rules with carrier integrations. A list of “best Magento shipping extensions” that mixes rate calculators with carrier connectors isn’t comparing like with like. Work out which problem you have first. If it’s carrier connectivity, our comparison of local delivery APIs and courier APIs is the more useful starting point, and our roundup of Magento shipping providers in the UAE covers that side for Gulf stores.

Glossary

Rate collection — the process Magento runs to ask every enabled shipping method for a price for the current quote.

Quote — the in-progress cart, including items, addresses and selected methods, before it becomes an order.

Scope — the level at which a setting applies: default, website or store view. Table rate data is scoped, which is how multi-site stores get partial separation.

Wildcard — the asterisk in table rate CSV columns, meaning “all values in this category”.

Handling fee — an extra charge added to the calculated shipping cost, configurable as a fixed amount or a percentage.

Carrier integration — a module that connects to a courier’s API for live rates, labels and tracking. Distinct from a rate rules plugin.

Frequently asked questions

Does Magento 2 support postcode ranges in shipping rules?

Not in native table rates. You can use an asterisk for all codes within a region or state, or specify a single code. Ranges require either one row per postcode or a shipping rules plugin.

Can I have more than one table rate configuration active?

No. Only one set of table rate data can be active at a time per scope. If you need parallel rate logic, that’s a plugin or a custom carrier.

Why is my free shipping cart price rule being ignored?

Most likely the configuration setting is also applying, and it takes precedence over the cart rule. Check Stores > Configuration > Sales > Delivery Methods > Free Shipping, and check the Free Method and threshold settings on the carrier itself.

Why did my table rate CSV import fail?

The two documented causes are invalid country codes — the column needs valid three-character codes — and more than four decimal places in the Weight (and above) column.

Does a shipping rules plugin give me live carrier rates?

No. Rate rules plugins compute prices from your own logic. Live rates, labels and tracking come from a carrier integration, which is a separate type of extension.

Will a shipping rules plugin work with Hyvä?

Ask the vendor directly for your specific version. Rate display is rendered in the checkout, so compatibility depends on both the plugin and your checkout implementation rather than on Magento alone.

How many shipping rules is too many?

There’s no fixed limit, but rule count affects quote recalculation time. If checkout slows measurably after adding rules, profile the rate collection before changing anything else.

Should I set the free shipping threshold with or without tax?

Either is valid. What matters is that you choose deliberately and then make every piece of storefront copy match the setting, because Include Tax to Amount changes which carts qualify.

Where to go from here

Start with the mapping exercise. Write your rules out, match them against the table above, and see how many native Magento can already express. Most stores find at least half of what they were about to buy is already configurable.

If you land on the other side of that line and the rules are genuinely beyond native config, the next decision is plugin versus custom carrier, and that one turns on how specific your logic is to your own business rather than on budget.

If you’d rather not work through it alone, talk to our team — we’ll map your rules against native capability first and tell you honestly whether you need to buy anything. You can also hire Magento developers for the implementation once the approach is settled.

Share this article f t in