{"id":355103,"date":"2026-08-25T04:34:18","date_gmt":"2026-08-25T04:34:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/advanced-shipping-rules-table-rate-conditional-weight-based-shipping\/"},"modified":"2026-09-12T12:50:55","modified_gmt":"2026-09-12T12:50:55","slug":"wpactpro-shipping-rate-builder","status":"publish","type":"plugin","link":"https:\/\/cor.wordpress.org\/plugins\/wpactpro-shipping-rate-builder\/","author":18340638,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.1","stable_tag":"1.9.1","tested":"7.1.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Advanced Shipping Rate Builder \u2013 Table Rate, Conditional & Weight Based Shipping","header_author":"actpro","header_description":"Table rate, conditional and weight based shipping rules for WooCommerce. Visual rule builder, rate simulator and free-shipping progress bar.","assets_banners_color":"8a6ea7","last_updated":"2026-09-12 12:50:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/wpactpro-shipping-rate-builder\/","header_author_uri":"https:\/\/profiles.wordpress.org\/actpro\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":202,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"actpro","date":"2026-08-25 04:34:00","revision":3664547},"1.9.0":{"tag":"1.9.0","author":"actpro","date":"2026-09-12 12:23:16","revision":3692674},"1.9.1":{"tag":"1.9.1","author":"actpro","date":"2026-09-12 12:50:55","revision":3692694}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3664547,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3664547,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3664547,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3664547,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0","1.9.0","1.9.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3664547,"resolution":"1","location":"assets","locale":"","width":3118,"height":1480},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3664547,"resolution":"2","location":"assets","locale":"","width":3116,"height":1516},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3664547,"resolution":"3","location":"assets","locale":"","width":1514,"height":1394},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3664547,"resolution":"4","location":"assets","locale":"","width":1358,"height":1396},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3664547,"resolution":"5","location":"assets","locale":"","width":2740,"height":994},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3664547,"resolution":"6","location":"assets","locale":"","width":2566,"height":970},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3664547,"resolution":"7","location":"assets","locale":"","width":3106,"height":1542},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3664547,"resolution":"8","location":"assets","locale":"","width":2352,"height":838},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3664547,"resolution":"9","location":"assets","locale":"","width":2258,"height":774}},"screenshots":{"1":"Settings \u2014 show every matching rate and let the customer pick, or apply only the highest rule","2":"Rule builder \u2014 WHERE \/ WHEN \/ THEN \/ SHOW AS, with a live plain-language summary of the rule","3":"Free shipping over an amount \u2014 set the threshold and the rate becomes free above it","4":"Category surcharge \u2014 charge extra when the cart contains the products or categories you choose","5":"Cart \u2014 the free-shipping progress bar tells shoppers exactly how much more to add","6":"Checkout \u2014 your rule's label and rate, as the customer sees them","7":"Simulator \u2014 every rule run against a test cart, showing which matched and why the rest did not","8":"Conditions \u2014 stack cart subtotal, weight, item count, products, categories and shipping classes","9":"Operators \u2014 includes or excludes, at least or at most, so one condition covers either direction"}},"plugin_section":[],"plugin_tags":[146193,174850,30113,50882,5023],"plugin_category":[],"plugin_contributors":[192344,78154],"plugin_business_model":[],"class_list":["post-355103","plugin","type-plugin","status-publish","hentry","plugin_tags-conditional-shipping","plugin_tags-flat-rate-shipping","plugin_tags-table-rate-shipping","plugin_tags-weight-based-shipping","plugin_tags-woocommerce-shipping","plugin_contributors-actpro","plugin_contributors-freemius","plugin_committers-actpro"],"banners":{"banner":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/banner-772x250.png?rev=3664547","banner_2x":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/banner-1544x500.png?rev=3664547","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/icon-128x128.png?rev=3664547","icon_2x":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/icon-256x256.png?rev=3664547","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-1.png?rev=3664547","caption":"Settings \u2014 show every matching rate and let the customer pick, or apply only the highest rule"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-2.png?rev=3664547","caption":"Rule builder \u2014 WHERE \/ WHEN \/ THEN \/ SHOW AS, with a live plain-language summary of the rule"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-3.png?rev=3664547","caption":"Free shipping over an amount \u2014 set the threshold and the rate becomes free above it"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-4.png?rev=3664547","caption":"Category surcharge \u2014 charge extra when the cart contains the products or categories you choose"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-5.png?rev=3664547","caption":"Cart \u2014 the free-shipping progress bar tells shoppers exactly how much more to add"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-6.png?rev=3664547","caption":"Checkout \u2014 your rule's label and rate, as the customer sees them"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-7.png?rev=3664547","caption":"Simulator \u2014 every rule run against a test cart, showing which matched and why the rest did not"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-8.png?rev=3664547","caption":"Conditions \u2014 stack cart subtotal, weight, item count, products, categories and shipping classes"},{"src":"https:\/\/ps.w.org\/wpactpro-shipping-rate-builder\/assets\/screenshot-9.png?rev=3664547","caption":"Operators \u2014 includes or excludes, at least or at most, so one condition covers either direction"}],"raw_content":"<!--section=description-->\n<p><strong>Advanced Shipping Rate Builder<\/strong> is a table rate shipping plugin for WooCommerce. It lets you build exactly the rates your store needs \u2014 table rate shipping, conditional shipping, weight based shipping, flat rate shipping and free shipping \u2014 and <em>see<\/em> what customers will pay before they do.<\/p>\n\n<p><a href=\"https:\/\/demo.wpactpro.com\/advanced-shipping-rate-builder\/\"><strong>Try the live demo<\/strong><\/a> \u2014 a full WooCommerce store with the plugin installed. No signup, nothing to install.<\/p>\n\n<p>Set up <strong>table rate shipping<\/strong> by cart total, weight or item count. Add <strong>conditional shipping<\/strong> rules that only apply to certain products, categories or shipping classes. Charge <strong>weight based shipping<\/strong> per kilogram, a flat rate per order, a cost per item, or a percentage of the order. All from one visual rule builder, with no code.<\/p>\n\n<p>Every rule reads as a sentence: <strong>WHERE<\/strong> (which WooCommerce zones) \u2192 <strong>WHEN<\/strong> (conditions) \u2192 <strong>THEN<\/strong> (what to charge) \u2192 <strong>SHOW AS<\/strong> (the label at checkout). A live plain-language summary restates the whole rule as you edit, and the built-in <strong>Simulator<\/strong> runs any test cart through the real engine, showing which rules matched, which were skipped and exactly why.<\/p>\n\n<h4>Why merchants choose it<\/h4>\n\n<p>Most shipping plugins make you guess. This one shows you the answer before your customer sees it: a live checkout preview while you edit, and a simulator that runs your real rules against any test cart. \"Why didn't my rule apply?\" stops being a support ticket.<\/p>\n\n<h4>Shipping scenarios you can build<\/h4>\n\n<ul>\n<li><strong>Free shipping over an amount<\/strong> \u2014 free once the cart reaches $50, with a progress bar telling shoppers how much more to add<\/li>\n<li><strong>Weight based shipping<\/strong> \u2014 $5 up to 5 kg, $9 to 20 kg, $15 above, as a proper weight table<\/li>\n<li><strong>Flat rate shipping per order<\/strong> \u2014 one price for everything, or one price per item<\/li>\n<li><strong>Bulky item shipping<\/strong> \u2014 a higher rate whenever the cart contains a shipping class or category you choose<\/li>\n<li><strong>Conditional shipping by product<\/strong> \u2014 a rate that only appears when a specific product is in the cart<\/li>\n<li><strong>Percentage-based shipping<\/strong> \u2014 charge shipping as a percentage of the order subtotal<\/li>\n<li><strong>Tiered shipping rates<\/strong> \u2014 add an amount for every extra 5 kg, 10 items or $100 of subtotal<\/li>\n<li><strong>Local pickup or courier choice<\/strong> \u2014 offer several rates at once and let the customer choose<\/li>\n<li><strong>One rate only<\/strong> \u2014 hide the other shipping methods when your rule applies<\/li>\n<\/ul>\n\n<h4>Build rates from<\/h4>\n\n<ul>\n<li>Flat cost, cost per item, cost per weight, or percentage of the cart subtotal<\/li>\n<li>Tiered extras \u2014 add amounts per quantity, weight or subtotal range (up to 5 tiers)<\/li>\n<li>A free-shipping threshold on any rule (\"free when the cart total reaches \u2026\")<\/li>\n<\/ul>\n\n<h4>Target rules by<\/h4>\n\n<ul>\n<li>Your existing <strong>WooCommerce shipping zones<\/strong> \u2014 no duplicate location setup, ever<\/li>\n<li>Cart subtotal, cart weight, item quantity<\/li>\n<li>Products, product categories, shipping classes<\/li>\n<\/ul>\n\n<h4>Merchant-friendly by design<\/h4>\n\n<ul>\n<li><strong>Goal-first creation<\/strong> \u2014 pick what you want (\"free shipping over an amount\", \"weight-based rate\", \u2026) and get a working rule to adjust<\/li>\n<li><strong>Rule simulator<\/strong> \u2014 answer \"why didn't my rule apply?\" in seconds, not support tickets<\/li>\n<li><strong>Free-shipping progress bar<\/strong> on cart and checkout (\"Add \u20ac12.50 more for free shipping\"), classic and block carts alike<\/li>\n<li>Clear resolution: show all matching rates (customer picks) or highest-priority only \u2014 stated in plain words on the dashboard<\/li>\n<li>Rules never break checkout: a misconfigured rule is skipped and flagged in the dashboard, never fatal<\/li>\n<\/ul>\n\n<h4>Lightweight &amp; modern<\/h4>\n\n<ul>\n<li>Rules live in one indexed table \u2014 no post-meta bloat, one query per checkout calculation<\/li>\n<li>Zero frontend assets unless the progress bar is shown<\/li>\n<li>HPOS compatible, works with classic and Block cart\/checkout<\/li>\n<li>REST API and WP-CLI (<code>wp wpactpro-sr rules \u2026<\/code>) included<\/li>\n<\/ul>\n\n<h4>Free vs Pro<\/h4>\n\n<p><strong>Everything in the free plugin<\/strong>, with no limits on how many rules you create:<\/p>\n\n<ul>\n<li>Cost types: flat rate, per item, per weight, percentage of subtotal<\/li>\n<li>Tiered rates by quantity, weight or subtotal \u2014 up to 5 tiers per rule<\/li>\n<li>Free-shipping threshold on any rule, and the free-shipping progress bar<\/li>\n<li>Conditions: cart subtotal, cart weight, item quantity, cart contains product, cart contains category, cart contains shipping class<\/li>\n<li>Targeting by your existing WooCommerce shipping zones<\/li>\n<li>The visual rule builder, the plain-language rule summary and the live checkout preview<\/li>\n<li>The Simulator, showing which rules matched a test cart and why the rest did not<\/li>\n<li>Hide other shipping methods, rule priority and resolution modes<\/li>\n<li>REST API, WP-CLI, HPOS and Block cart\/checkout support<\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/wpactpro.com\/shipping-rate-builder\/\"><strong>Advanced Shipping Rate Builder Pro<\/strong><\/a> adds eleven more conditions and five workflow features:<\/p>\n\n<ul>\n<li><strong>Destination postcode<\/strong> and <strong>destination city<\/strong> \u2014 charge differently inside a single zone, so \"\u00a35 to mainland UK, \u00a315 to the Highlands\" no longer needs a second shipping zone. Same wildcard (<code>CB2*<\/code>) and range (<code>90210...99000<\/code>) syntax as WooCommerce zones.<\/li>\n<li><strong>Dimensional weight<\/strong>, <strong>cart volume<\/strong> and <strong>longest side in cart<\/strong> \u2014 price bulky-but-light parcels the way couriers actually bill them.<\/li>\n<li><strong>Customer role<\/strong> \u2014 wholesale and B2B shipping rates.<\/li>\n<li><strong>Specific customer<\/strong> \u2014 one named account's own negotiated rate.<\/li>\n<li><strong>Date range<\/strong>, <strong>day of week<\/strong> and <strong>time of day<\/strong> \u2014 seasonal, holiday and cut-off-time rates.<\/li>\n<li><strong>Coupon applied<\/strong> \u2014 a shipping rate that responds to a promotion.<\/li>\n<li><strong>OR condition groups<\/strong> \u2014 one rule that matches several different carts.<\/li>\n<li><strong>Shipping decisions log<\/strong> \u2014 open any order and see which rule set the rate, and why every other rule did not apply. Answers \"why was I charged this?\" without reproducing the cart.<\/li>\n<li><strong>Shadow mode<\/strong> \u2014 run a price change against real traffic, recorded but charging nobody, before it reaches a customer.<\/li>\n<li><strong>Surcharge rules<\/strong> \u2014 add a handling fee on top of every rate instead of competing with them as another option.<\/li>\n<li><strong>Rule warnings<\/strong> \u2014 told when a rule can never apply because another always wins first, or when it targets a shipping zone that has been deleted.<\/li>\n<\/ul>\n\n<p>Every rule you build in the free version keeps working if a licence lapses \u2014 you can still edit, simplify and delete them.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate <strong>WooCommerce<\/strong> first \u2014 this plugin extends it and will not activate without it.<\/li>\n<li>Upload the plugin through <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, or install it from the WordPress plugin directory.<\/li>\n<li>Activate it through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Go to <strong>WooCommerce \u2192 Shipping Rate Builder<\/strong> and pick a goal to create your first rule.<\/li>\n<\/ol>\n\n<p>No shipping zone setup is required. Rules use the WooCommerce shipping zones you already have, so your countries, states and postcodes stay where you configured them.<\/p>\n\n<h4>Building from source<\/h4>\n\n<p>The admin interface in <code>build\/<\/code> is compiled from the React source in <code>client\/<\/code>, both of which ship with the plugin. To rebuild it:<\/p>\n\n<pre><code>npm install &amp;&amp; npm run build\n<\/code><\/pre>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20there%20a%20demo%20i%20can%20try%20before%20installing%3F\"><h3>Is there a demo I can try before installing?<\/h3><\/dt>\n<dd><p>Yes \u2014 there is a <a href=\"https:\/\/demo.wpactpro.com\/advanced-shipping-rate-builder\/\">live demo store<\/a> with the plugin already set up. You can build rules, run the Simulator and see rates at checkout without installing anything.<\/p><\/dd>\n<dt id=\"can%20i%20set%20up%20table%20rate%20shipping%20in%20woocommerce%3F\"><h3>Can I set up table rate shipping in WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Build a table rate by adding tiers to any rule \u2014 different prices for each cart total, weight or quantity range (for example 0\u20135 kg, 5\u201320 kg, 20 kg and up). Tiers can add a flat amount once, or multiply per item, per kilogram or per unit of subtotal.<\/p><\/dd>\n<dt id=\"does%20it%20support%20weight%20based%20shipping%3F\"><h3>Does it support weight based shipping?<\/h3><\/dt>\n<dd><p>Yes. Charge a cost per weight unit, add weight-range tiers, or use cart weight as a condition so a rule only applies above or below a given weight. The weight unit follows your WooCommerce settings.<\/p><\/dd>\n<dt id=\"how%20do%20i%20create%20conditional%20shipping%20rules%3F\"><h3>How do I create conditional shipping rules?<\/h3><\/dt>\n<dd><p>Add conditions to a rule and it only applies when they all match. You can condition on cart subtotal, cart weight, item quantity, and whether the cart contains particular products, product categories or shipping classes.<\/p><\/dd>\n<dt id=\"how%20do%20i%20offer%20free%20shipping%20over%20a%20certain%20amount%3F\"><h3>How do I offer free shipping over a certain amount?<\/h3><\/dt>\n<dd><p>Set a free-shipping threshold on any rule \u2014 \"free when the cart total reaches \u2026\". Turn on the progress bar and shoppers see \"Add $12.50 more for free shipping\" on the cart and checkout, updating live as they shop.<\/p><\/dd>\n<dt id=\"can%20i%20hide%20other%20shipping%20methods%20when%20my%20rule%20applies%3F\"><h3>Can I hide other shipping methods when my rule applies?<\/h3><\/dt>\n<dd><p>Yes. Any rule can hide the other shipping methods a customer would otherwise see, so a matching rate becomes the only option. It never leaves a customer with no shipping option at all \u2014 if no rate from this plugin applies, the others stay.<\/p><\/dd>\n<dt id=\"how%20does%20this%20relate%20to%20woocommerce%20shipping%20zones%3F\"><h3>How does this relate to WooCommerce shipping zones?<\/h3><\/dt>\n<dd><p>Rules target your existing zones (\"All zones\" or a selection). Destination matching \u2014 countries, states, postcodes \u2014 stays in WooCommerce where you already configured it. This plugin never re-implements geography.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20several%20rules%20match%20the%20same%20cart%3F\"><h3>What happens when several rules match the same cart?<\/h3><\/dt>\n<dd><p>Your choice, stated on the dashboard: show every matching rate so the customer picks (default), or apply only the highest rule in your list. The Simulator always shows the final outcome.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20cart%20and%20checkout%20blocks%3F\"><h3>Does it work with the Cart and Checkout Blocks?<\/h3><\/dt>\n<dd><p>Yes \u2014 rates flow through the Store API automatically, and the progress bar renders on block carts with live updates. The classic cart and checkout are equally supported.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20store%20down%3F\"><h3>Will it slow my store down?<\/h3><\/dt>\n<dd><p>No. Rules load in a single indexed query, results are object-cached, and the frontend ships zero JavaScript\/CSS unless the progress bar is actually displayed.<\/p><\/dd>\n<dt id=\"can%20i%20charge%20different%20shipping%20rates%20per%20product%20or%20category%3F\"><h3>Can I charge different shipping rates per product or category?<\/h3><\/dt>\n<dd><p>Yes. Condition a rule on the cart containing particular products, product categories or shipping classes, then set the rate for that rule. A common setup is a shipping class for bulky items with its own higher rate.<\/p><\/dd>\n<dt id=\"can%20i%20offer%20multiple%20shipping%20rates%20for%20one%20order%3F\"><h3>Can I offer multiple shipping rates for one order?<\/h3><\/dt>\n<dd><p>Yes. By default every matching rule offers its rate and the customer picks at checkout. Switch to highest-priority-only if you would rather present a single option.<\/p><\/dd>\n<dt id=\"does%20it%20replace%20the%20woocommerce%20flat%20rate%20shipping%20method%3F\"><h3>Does it replace the WooCommerce flat rate shipping method?<\/h3><\/dt>\n<dd><p>No, it sits alongside it. Your existing flat rate, free shipping and local pickup methods keep working. If you want a rule to be the only option a customer sees, turn on \"hide other shipping methods\" for that rule.<\/p><\/dd>\n<dt id=\"can%20i%20set%20a%20maximum%20or%20minimum%20order%20weight%20for%20shipping%3F\"><h3>Can I set a maximum or minimum order weight for shipping?<\/h3><\/dt>\n<dd><p>Yes. Use cart weight as a condition \u2014 \"at least\" or \"at most\" a given weight \u2014 so a rule only offers its rate inside that range. Carts outside it simply do not get that rate.<\/p><\/dd>\n<dt id=\"can%20i%20set%20shipping%20rates%20by%20postcode%20or%20zip%20code%3F\"><h3>Can I set shipping rates by postcode or ZIP code?<\/h3><\/dt>\n<dd><p>Yes, with Pro. The destination postcode condition matches the customer's postcode using the same wildcard (<code>CB2*<\/code>) and range (<code>90210...99000<\/code>) syntax as WooCommerce shipping zones, so you can charge more for remote areas without building a second zone for them. There is a destination city condition too.<\/p><\/dd>\n<dt id=\"can%20i%20charge%20different%20shipping%20rates%20per%20country%3F\"><h3>Can I charge different shipping rates per country?<\/h3><\/dt>\n<dd><p>Yes. Countries live in your WooCommerce shipping zones, and every rule targets those zones \u2014 so a rule aimed at your \"Europe\" zone charges its rate only to European customers. You never re-enter countries in this plugin.<\/p><\/dd>\n<dt id=\"can%20i%20set%20up%20wholesale%20or%20b2b%20shipping%20rates%3F\"><h3>Can I set up wholesale or B2B shipping rates?<\/h3><\/dt>\n<dd><p>Yes, with Pro. The customer role condition applies a rule only to customers in the roles you choose, so wholesale accounts get their own rates while retail customers see yours. For a single negotiated contract price, the specific customer condition targets one named account.<\/p><\/dd>\n<dt id=\"does%20it%20support%20dimensional%20or%20volumetric%20weight%20shipping%3F\"><h3>Does it support dimensional or volumetric weight shipping?<\/h3><\/dt>\n<dd><p>Yes, with Pro. Dimensional weight, cart volume and longest side in cart let you price bulky-but-light parcels the way couriers actually bill them, using your products' existing WooCommerce dimensions.<\/p><\/dd>\n<dt id=\"why%20didn%27t%20my%20shipping%20rule%20apply%3F\"><h3>Why didn't my shipping rule apply?<\/h3><\/dt>\n<dd><p>Open the Simulator, enter the cart that behaved unexpectedly, and it lists every rule with the exact condition that failed. The most common causes are a rule that is inactive, a zone that does not cover the address, and a higher-priority rule winning first. Pro also records the same breakdown on every real order.<\/p><\/dd>\n<dt id=\"can%20i%20manage%20rules%20from%20the%20command%20line%3F\"><h3>Can I manage rules from the command line?<\/h3><\/dt>\n<dd><p>Yes: <code>wp wpactpro-sr rules list|create|delete<\/code>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.1 - 2026-09-12<\/h4>\n\n<ul>\n<li>Update readme.txt.<\/li>\n<\/ul>\n\n<h4>1.9.0 - 2026-09-12<\/h4>\n\n<ul>\n<li>New: <strong>Stale zone warnings<\/strong> (Pro) \u2014 flags rules that target shipping zones which no longer exist, or that are limited to selected zones with none selected.<\/li>\n<li>Deleting a zone in WooCommerce tells you nothing about the rules that pointed at it. They stay active, stay correct on their own terms, and never fire again. Now the Rules screen says so.<\/li>\n<li>A rule that still works but carries one stale reference is explained rather than marked dead \u2014 a false warning is worse than none.<\/li>\n<li>New: <strong>Surcharge rules<\/strong> (Pro) \u2014 mark a rule as a surcharge and its cost is added to every rate that applies, rather than competing with them as another option.<\/li>\n<li>Base rate plus handling fee is now one shipping price built from two rules. Standard \u00a35 and Express \u00a315 with a \u00a32 handling surcharge give \u00a37 and \u00a317 \u2014 two choices, not a single \u00a322 rate.<\/li>\n<li>A surcharge with nothing to attach to charges nobody: it is part of a price, so with no price there is nothing to add to.<\/li>\n<li>New: <strong>Specific customer<\/strong> condition (Pro) \u2014 give one named account its own negotiated rate. Customer role covers \"all wholesale buyers pay this\"; this covers the case a role cannot express, without inventing a role per customer.<\/li>\n<li>Guests match no specific-customer rule under either comparison, so an \"everyone except Acme\" rule never fires on a shopper who is not signed in.<\/li>\n<li>The Simulator gains a customer field whenever a rule reads one.<\/li>\n<li>New: <strong>Shadow mode<\/strong> (Pro) \u2014 a third rule status. The rule is evaluated and recorded on every checkout but never charges anyone, so you can try a pricing change against real traffic before it reaches a customer.<\/li>\n<li>Shadow rules show in the Simulator and the shipping decisions log with what they <em>would<\/em> have charged.<\/li>\n<li>A shadow rule never blocks a live rule, and is never reported as unreachable \u2014 it is not meant to fire.<\/li>\n<li>New: <strong>Unreachable rule detection<\/strong> (Pro) \u2014 warns when a rule can never apply because a rule above it matches every cart and always wins first. A silent failure until now: the rule below stays active, stays correct, and never runs.<\/li>\n<li>Shown only under <em>Only the highest rule applies<\/em>, since with every matching rate shown no rule is shadowed.<\/li>\n<li>The warning names the rule doing the shadowing, so you know whether to reorder or narrow it.<\/li>\n<li>New: <strong>Shipping decisions log<\/strong> (Pro) \u2014 open any order and see which rule set the shipping rate, what it cost, and for every rule that did not apply, exactly which condition failed.<\/li>\n<li>Answers \"why was this customer charged this?\" from the order screen itself, instead of asking you to rebuild the cart in the Simulator and hope it matches.<\/li>\n<li>Records which rule the customer actually chose \u2014 not just which ones matched \u2014 so it stays accurate when you offer several rates and they pick one.<\/li>\n<li>Stored as order data: removed when the order is deleted, and covered by WooCommerce's own personal-data erasure.<\/li>\n<li>New: Destination postcode and destination city conditions (Pro) \u2014 charge differently inside a single shipping zone without building a second zone just to hold one postcode.<\/li>\n<li>Postcode patterns use exactly the same syntax as WooCommerce shipping zones: an exact postcode, a wildcard such as CB2*, or a range such as 90210...99000. Separate several with commas.<\/li>\n<li>Until a shopper has entered an address, a destination rule matches nothing \u2014 including \"does not include\" rules, so an \"everywhere except\" rule never fires on a blank address and quotes the wrong price.<\/li>\n<li>The Simulator gains postcode and city inputs whenever a rule reads them, so destination rules can be tested before going live.<\/li>\n<li>New: Dimensional weight, cart volume and longest-side conditions (Pro) \u2014 price bulky-but-light items the way couriers actually charge for them.<\/li>\n<li>New: Dimensional weight divisor setting under Settings \u2192 Units, so the divisor matches your courier contract (5000 for cm\/kg, 139 for in\/lb).<\/li>\n<li>If any item in the cart has no dimensions set, these three conditions are skipped rather than pricing the order on incomplete measurements, and the Simulator names the product that needs dimensions.<\/li>\n<li>Fix: the <strong>Plugins<\/strong> screen row had no Settings link. It now has one, ahead of Deactivate.<\/li>\n<\/ul>\n\n<h4>1.1.0 - 2026-08-26<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Rule engine with zone-aware shipping method \u2014 table rate, conditional, weight based and free shipping rules.<\/li>\n<li>Visual rule builder: WHERE \/ WHEN \/ THEN \/ SHOW AS, with a live plain-language summary and 10 goal templates.<\/li>\n<li>Rules dashboard with drag-to-reorder priority, live checkout preview and global save.<\/li>\n<li>Simulator \u2014 run any test cart through the real engine and see which rules matched, which were skipped and why.<\/li>\n<li>Condition groups: a rule can match on any of several groups \u2014 for example, \"cart weight over 10 kg\" OR \"contains the Fragile category\" \u2014 instead of only every condition at once. Adding a second group is a Pro feature; everything else here is free.<\/li>\n<li>Tiered extras (up to 5 tiers per rule) by quantity, weight or subtotal range.<\/li>\n<li>Free-shipping progress bar on cart and checkout, classic and block alike.<\/li>\n<li>Conditions on cart subtotal, cart weight, item quantity, products, product categories and shipping classes.<\/li>\n<li>Extension API: add-ons can register condition types, resolution modes and lookup sources, and the builder renders text, dropdown, multi-select, date and time conditions straight from their schema.<\/li>\n<li>REST API and WP-CLI (<code>wp wpactpro-sr rules \u2026<\/code>).<\/li>\n<li>HPOS compatible; works with the classic and Block cart\/checkout.<\/li>\n<\/ul>","raw_excerpt":"Table rate shipping for WooCommerce. Conditional, weight based and flat rate shipping rules, a visual builder, cart simulator and free shipping bar.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/355103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=355103"}],"author":[{"embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/actpro"}],"wp:attachment":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=355103"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=355103"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=355103"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=355103"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=355103"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=355103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}