Table Rate Shipping for WooCommerce
Shipping rates from a table of rules by weight, price, item count and shipping class, per order, per item or per class.
- Block cart and checkout
- Classic cart and checkout
- High-performance order storage
- WooCommerce 9 – 11
- WordPress 6.6 – 7.1
- PHP 7.4+
What Table Rate Shipping does
Flat rate is too blunt once you sell heavy and light things, cheap and expensive things, or anything that needs a courier. Table Rate Shipping adds a shipping method to your WooCommerce shipping zones whose cost comes from a table you write: "up to 5 lbs costs $6, 5 to 50 lbs costs $6 plus $0.50 a pound, over 50 lbs we don't ship", "bulky items cost $25", "free over $100".
Add it to as many zones as you like, each with its own table, title and tax status. It works on the block checkout and the classic checkout.
Table Rate Shipping features
Rows
- Match on weight, cart price, item count, or always
- Min and max for each row, inclusive; leave one empty for no limit
- Limit a row to a shipping class, to items with no shipping class, or let it apply to any class
- Each row costs: a fixed amount + an amount per item + an amount per weight unit + a percentage of the price
- Tick "No shipping" on a row to hide the method when it matches, for weight limits or classes you can't send to a zone
- Drag to reorder, duplicate, remove
How the table is applied
- Per order: the whole package is matched against the rows. A row for a shipping class matches when the cart has that class and measures only those items.
- Per shipping class: each class in the cart is matched separately, then the costs are added up, or only the most expensive one is charged.
- Per item: each unit is matched separately and the costs are added up.
- When several rows match, use the first, the cheapest, the most expensive, or add them all up.
More settings
- Price used for rows: before or after coupons, with or without tax
- A cost to charge when no row matches, or hide the method
- Handling fee, fixed and as a percentage
- Minimum and maximum shipping cost
- Taxable or not
Built for setting up quickly
- Test this table: try a cart against the rows on screen and see the cost before you save
- Import and export the table as CSV, so you can write it in a spreadsheet or copy it to another zone
- Decimal commas such as 0,5 are understood
A worked example: weight bands with free shipping over $100
Most rate cards come down to a few bands. Say you ship anything under 5 lbs for $6, charge $6 plus 50 cents a pound up to 50 lbs, give free shipping on orders over $100, and cannot ship anything heavier than 50 lbs at all. In Table Rate Shipping that is four rows, matched per order with "Use the first matching row":
| Row | Condition | Min | Max | Cost | Result |
|---|---|---|---|---|---|
| 1 | Price | 100 | 0 | Free shipping on orders of $100 or more | |
| 2 | Weight | 0 | 5 | 6 | Light parcels cost $6 |
| 3 | Weight | 5 | 50 | 6 + 0.50 per lb | A 20 lb order costs $16 |
| 4 | Weight | 50 | No shipping | The method disappears; customers see your other methods |
Row 1 sits first so a $120 order is free however much it weighs. Switch the table to per shipping class and you can add a row for a bulky class at $25 that is charged on top of, or instead of, the weight bands. Before you save, type a test cart into "Test this table" and the screen shows which row matched and what it would charge.
How it compares with other table rate shipping plugins
Every table rate plugin, including the official WooCommerce extension, lets you write rows by weight, price and item count. The differences are in how long the table takes to get right and what happens after you buy.
Table Rate Shipping is built around getting the table right the first time: a cart tester on the settings screen shows what a cart would pay before you save, tables import and export as CSV so you can write them in a spreadsheet or copy them between zones, and decimal commas are accepted for stores that write 0,50. Per order, per class and per item modes, a no-shipping row, handling fees and minimum and maximum costs are all included rather than split across tiers.
The code is GPL and not obfuscated, so your developer can read and extend it, and it is tested on both the block checkout and the classic checkout against the WooCommerce release that is current on the day. If you are moving from another table rate plugin, the CSV import means the table itself takes minutes to move; the support page tells you what to send if a row does not behave the same way.
How to set up Table Rate Shipping in WooCommerce
- 1
Upload the plugin to
/wp-content/plugins/or install the zip from Plugins > Add New > Upload Plugin. - 2
Activate it.
- 3
Go to WooCommerce > Settings > Shipping, open a zone, click "Add shipping method" and choose "Table rate".
- 4
Click Edit on the new method to write its table. Until it has rows, the method stays hidden at checkout.
Questions about Table Rate Shipping
Which weight unit is used?
The one under WooCommerce > Settings > Products. The table headings show it.
Does weight include the quantity?
Yes. Weight is the product weight multiplied by the quantity, added up over the package. In per item mode each unit is matched on its own weight.
What happens with virtual products?
They don't need shipping, so WooCommerce leaves them out of the package and they don't count towards weight, price or items.
How do I write bands that don't overlap?
Min and max are inclusive, and with "Use the first matching row" the first row wins at a shared boundary. So "0 to 5" followed by "5 to 20" charges the first row at exactly 5.
How do I stop shipping heavy orders?
Add a last row with condition Weight, min set to your limit, and tick "No shipping". The method disappears for heavier orders, and customers see your other methods.
How do I offer free shipping over an amount?
Add a first row with condition Price, min 100 and a cost of 0, and keep "Use the first matching row".
What is the CSV format?
One row per line: class, condition, min, max, cost, item_cost, weight_cost, percent, no_shipping. Class is a shipping class slug, "any" or "none". Condition is always, weight, price or items. Use "Export rows" to see an example.
What happens to my tables if I delete the plugin?
They are kept, so reinstalling restores them. They are removed only when WooCommerce's own "remove all data" option (WC_REMOVE_ALL_DATA) is on.
Table Rate Shipping changelog
- 1.0.0
- Initial release.
More shipping plugins
Conditional Payments & Shipping
Show or hide payment methods and shipping options at checkout based on cart, product, customer, location and date rules.
View plugin
Order Delivery Date
Let customers choose a delivery date and time slot at checkout. Set delivery days, lead time, a daily cut-off and closed dates.
View plugin
Free Shipping Bar
"Add $12.00 more to get free shipping!" A live progress bar on the cart, checkout and mini cart that nudges customers to the free shipping threshold.
View plugin