Use Table Rate Shipping to charge for delivery using rules you define, such as weight bands, item counts, or shipping classes. This guide shows you how to set up a method, choose how its rules calculate, and check the resulting charge.
Before you begin
↑ Back to top- Set up the shipping zone for the customer destinations you want to serve.
- Write down the charges you want to offer and a few sample carts with their expected shipping prices.
- Enter product weights for weight rules, and length, width, and height for volume rules. Use the units in WooCommerce > Settings > Products.
- If different products need different rules, create shipping classes and assign them to the products or variations.
- Test changes on a staging site before using them for customer orders.
Installation
↑ Back to topTo start using a product from WooCommerce.com, you can use the โAdd to storeโ functionality on the order confirmation page or the My subscriptions section in your account.
- Navigate to My subscriptions.
- Find the Add to store button next to the product youโre planning to install.
- Follow the instructions on the screen, and the product will be automatically added to your store.
Alternative options and more information at:
Managing WooCommerce.com subscriptions.
Set up your first table rate
↑ Back to top- Go to WooCommerce > Settings > Shipping > Shipping zones and edit the matching zone.
- Select Add shipping method, choose Table rates, and select Continue. Open the added method to configure it.
- Enter a Method Title, such as Standard delivery. Choose the shipping tax settings described below. Leave handling fees and cost limits blank while testing your first rule.
- Choose Per order for Calculation Type.
- Select Add Shipping Rate. Choose Any class if the Shipping Class column is visible, set Condition to None, and enter 5 in Cost. Leave other costs at zero and Break/Abort unchecked. Enter Delivery in Label.
- Select Save changes. Make sure the method is enabled in its shipping zone.
- Add a physical product to the cart and enter an address in that zone. With no handling fees or shipping tax, the Delivery option should cost 5 in your store currency.
Once this simple rule works, replace it with the rules you need. The worked examples below include settings and expected charges.
How the calculation works
↑ Back to topA shipping zone selects the available methods for a destination. A Table Rate method then checks its rows against the products being shipped. Each row combines a class, a condition and range, and one or more costs. The calculation type decides whether it checks the package together or separates it into items, lines, or shipping classes.
The examples assume WooCommerce sends the cart as one shipping package. Extensions that split a cart into packages can cause the method and its fees to be calculated separately for each package.
Choose a calculation type
↑ Back to top- Per order: Totals for the products in the shipping package. Each matching row can offer a separate shipping option. One matching row offers a charge of 4.
- Calculated rates per item: Each product unit, then multiplied by its quantity. Matching row costs are combined. Three units cost 12.
- Calculated rates per line item: Each cart line, including its quantity. Matching row costs are combined across lines. Two lines cost 8, even if one line contains two units.
- Calculated rates per shipping class: Products grouped by their assigned shipping class. Matching class costs are combined. Three units in one class cost 4. Two classes matching that same row cost 8.
For the comparison above, the cart contains two canvas totes and one mug on separate lines, all in the same shipping class. Only one unconditional row matches; all other costs and fees are zero. Changing the calculation type changes the result even though the row stays the same.
With Calculated rates per item, Price conditions and percentage charges use the combined value of the units on a cart line. For example, three units priced at $20 with a 10% charge produce $18 shipping: 10% of $60, multiplied by three. Test quantities greater than one before using these rules.
For a percentage charged once on each cart line, use Calculated rates per line item. The same example then costs $6 to ship. This also changes fixed costs from once per unit to once per cart line, so check every rule before switching an existing method. Use the calculation type specified in each worked example below.
Method settings and fees
↑ Back to top- Method Title: the checkout name used when a row-specific Label does not apply.
- Tax Status: select Taxable if WooCommerce should calculate shipping tax, or None if this method should not be taxed. Applicable tax rates and the customerโs tax situation also affect the result.
- Tax included in shipping costs: choose whether the costs you enter already include tax. This is separate from the Taxes in Min-Max setting used for price thresholds.
- Handling Fee: a fixed fee applied once to the methodโs result for the package.
- Maximum Shipping Cost: sets an upper limit on the shipping charge. If you also use an order Handling Fee with per-item or per-line calculations, check the maximum-cost limitation below. Check tax separately when comparing the charge with the displayed checkout total.
- Handling Fee Per Order/Item/Line/Class: the label changes with Calculation Type. This additional fee can be a fixed amount or a percentage.
- Minimum/Maximum Cost Per Order/Item/Line/Class: limits the relevant calculated cost. Test quantities as well as individual products; the per-item minimum and maximum are applied after the lineโs quantity multiplication.

Verify shipping tax
↑ Back to topCheck the shipping charge and its tax separately. For example, on a test store with a 10% tax rate that applies to shipping at both the storeโs base location and the customerโs address, these Per order settings produce the following results. Product prices and checkout totals are displayed excluding tax:
- Tax Status: None; Cost 10: shipping 10, shipping tax 0.
- Taxable; Cost 10 entered exclusive of tax: shipping 10, shipping tax 1.
- Taxable; Cost 11 entered inclusive of tax: shipping 10, shipping tax 1.
With products worth 60 before tax, product tax of 6, shipping of 10, and shipping tax of 1, the checkout total is 77. A store that displays prices including tax may present those amounts differently.
Inclusive costs use the storeโs base shipping tax rates when adjusting the entered amount. If base and customer rates differ, or the customer is tax-exempt, the result can differ from this example. Check the actual tax location, rate, shipping checkbox, and display settings in your store. See setting up taxes for the WooCommerce tax settings.
Add and arrange rate rows
↑ Back to topSelect Add Shipping Rate to add a row. Use the row controls to duplicate or delete selected rows, and drag rows into the order in which you want them checked. Save changes after editing.
Shipping class
↑ Back to topAny class matches products regardless of their class; No class matches products without an assigned class. A named class matches that class. If no shipping classes exist, the class controls are not shown. An Any class row can match alongside a named-class row, so check for unintended extra charges.
Condition
↑ Back to top- None: No numeric condition; class matching still applies.
- Price: The product value for the selected calculation type, using the discount and tax comparison settings.
- Weight: Product weight in the storeโs weight unit. Quantities are included for order, line, and class calculations.
- Volume: Length ร width ร height, in the storeโs dimension unit cubed. For example, 10 ร 10 ร 10 cm is 1,000 cmยณ per unit. Quantities are included for order, line, and class calculations. This is not a carrierโs dimensional-weight formula or a box-packing calculation.
- Item count: Number of units for the selected calculation type. Per-item calculations check a count of 1 for each unit.
- Item count (same class): Number of units sharing the productโs shipping class in the package. Available when shipping classes exist.
MinโMax
↑ Back to topBoth endpoints are included. A row with Min 0 and Max 2 matches exactly 2. Leave Min blank for no lower limit, or Max blank for no upper limit. A row with both blank has no numeric limit. Avoid overlaps unless you want multiple matches, and check for gaps at the precision your product data uses.
For example, bands of 0โ2 kg and 2.01โ5 kg are suitable for weights recorded to two decimal places. A weight of 2.005 kg falls between those bands. If your products use finer precision, design and test the ranges for that precision.
Cost columns
↑ Back to top- Cost: A fixed row cost. In per-item mode, the resulting unit charge is multiplied by quantity.
- Cost per qty: An amount multiplied by the unit count. Hidden in per-item mode; use Cost there.
- [weight unit] cost: An amount multiplied by weight in your configured unit, such as kg.
- % cost: A percentage of the product value used by the calculation. Enter 10 for 10%.
The cost columns add together. For a Per order rule with Cost 3, Cost per qty 2, kg cost 1, and % cost 10, a package of three items worth 60 and weighing 6 kg costs 3 + (2 ร 3) + (1 ร 6) + (10% ร 60) = 21, before handling fees and shipping tax.
Break
↑ Back to topPer order: a matching Break row replaces previously matched options and stops later rows from being checked. Without Break, matching rows can offer separate options.
Per item or per line: matching row costs add until a Break row is reached for that item or line. Break does not remove costs already added for it.
Per shipping class: after a row with Break matches a class, processing stops before the next row. Row order matters when using this to charge for the highest-cost class only; see the merging example.
Abort
↑ Back to topA matching Abort row removes this Table Rate method from the available options for the package. Use it to prevent this method from being offered for an excluded condition. You can enter an optional abort reason. Abort does not disable other shipping methods in the zone.
Labels and zero-cost shipping
↑ Back to topIn Per order mode, the Label names the option created by that row. Use a clear label such as Standard delivery or Free shipping. In the calculated item, line, and class modes, the combined option uses Method Title.
For a genuinely free option, make sure all applicable costs and handling fees are zero; a zero in Cost alone does not cancel the other cost columns or fees.
Use shipping classes
↑ Back to topCreate classes under WooCommerce > Settings > Shipping > Classes, then assign them in the productโs Shipping settings. Check variation-level assignments where applicable. Classes group products; they do not set a price by themselves.
Class priorities for Per order
↑ Back to topPer order chooses one class to represent a mixed package. In Class Priorities, a lower number has higher priority. Give classes distinct priorities when one must take precedence, then test mixed-class and unclassified products. This chooses a class for matching; it does not automatically choose the cheapest or most expensive rate.
Shipping zones and additional methods
↑ Back to topUse separate methods when customers should choose between services such as standard and express. Give each method its own title and rules. Configure the correct zone for each destination; a rate in another zone is not a fallback for a gap in the current table.
Worked examples
↑ Back to topThese examples use USD, kilograms, centimetres, one shipping package, Tax Status: None, no handling fees, and no minimum or maximum cost limits unless stated. Prices shown are shipping charges. Use your own carrier charges and store units; each example is a separate configuration.
Charge by total weight
↑ Back to topChoose Per order. Add these two rows with Any class, Condition Weight, Break and Abort unchecked, all other cost columns zero, and Label Delivery:
| Min (kg) | Max (kg) | Cost |
|---|---|---|
| 0 | 2 | 5 |
| 2.01 | 5 | 8 |

| Package weight | Expected shipping |
|---|---|
| 1.99 kg or exactly 2 kg | $5 |
| 2.01 kg or exactly 5 kg | $8 |
| 5.01 kg | This method is unavailable: no row matches. |
If you want to accept heavier packages, add the appropriate band or leave the last Max blank. Do not extend the range without deciding what those packages should cost. If a carrier charges per kg, use the kg cost column; a fixed weight band and a per-kg charge serve different purposes.
Charge a base amount plus a cost per unit
↑ Back to topChoose Calculated rates per line item. Add one Any class row with Condition None, Cost 3, and Cost per qty 2. Leave the remaining costs at zero. A line containing three totes costs 3 + (2 ร 3) = $9. A second cart line starts another base charge.
If you instead need a simple charge of $3 for every unit, choose Calculated rates per item and set Cost to 3. Three units then cost $9, whether they are on one line or several.
Add costs for different shipping classes
↑ Back to topChoose Calculated rates per shipping class. Assign the totes to Standard parcel and the mug to Bulky parcel. Add these rows with Condition None, no other costs, and Break/Abort unchecked:
| Shipping Class | Cost |
|---|---|
| Standard parcel | 4 |
| Bulky parcel | 9 |
Two totes and one mug cost $4 + $9 = $13. Increasing the tote quantity does not add another flat class charge. Adding Cost per qty would change that result.
Multiple rows for the same class can also add together. For example, matching rows costing 5 and 8 total 13 in a per-line calculation when neither has Break. Add an Any class row only when its charge is intended to combine with the class-specific rows.
Charge only for the highest-cost class
↑ Back to topKeep Calculated rates per shipping class. Put Bulky parcel, Cost 9, first and Standard parcel, Cost 4, second. Set Condition None and select Break on both rows; leave other costs zero.
| Cart | Expected shipping |
|---|---|
| Standard parcel products only | $4 |
| Bulky parcel products only | $9 |
| Both classes | $9 |
The first matching class row stops later rows. Reversing these two rows would charge the mixed cart $4. Use this approach only when one class charge should cover the whole package. It does not inspect your carrierโs packing requirements or choose the highest cost automatically.
Merging charges versus packing products
↑ Back to topThe example above combines the shipping charge. It does not combine physical parcels, choose a warehouse, or purchase a shipping label. If fulfillment tools split the cart into packages, verify the charge for every package.
Compare prices after discounts and tax
↑ Back to topFor a Price condition, Discounts in Min-Max controls whether thresholds use the discounted value. Taxes in Min-Max controls whether product tax is included in that value. Neither setting decides whether shipping itself is taxable.
- Edit the Table Rate method in its shipping zone.
- Select Discounts in Min-Max to compare against the discounted price, or leave it unchecked to compare against the price before discounts.
- Select Taxes in Min-Max to include product tax in the comparison, or leave it unchecked to exclude it.
- Save changes and test carts on both sides of the threshold, including a cart with a coupon.

For example, choose Per order and add two Any class Price rows: Min 0 / Max 49.99 / Cost 5, and Min 50 / Max blank / Cost 0. Set every other cost and fee to zero. Use the labels Delivery and Free shipping.
- A $60 cart with a $20 discount costs $0 to ship when Discounts in Min-Max is unchecked. With it checked, the $40 discounted value is used and shipping costs $5. Both comparisons exclude tax.
- A $48 cart ($52.80 including tax) costs $5 to ship when Taxes in Min-Max is unchecked. With it checked, the tax-inclusive value is used and shipping costs $0.
The 49.99/50 bands assume prices at two-decimal currency precision. Check the precision and rounding used by your store. No custom code is needed for these comparison settings.
Import and export rates as CSV
↑ Back to top- Select Export Rates (CSV) below an existing table and keep an unchanged copy as a backup.
- Edit the exported CSV using its existing column headings. Preserve its structure and review class IDs before using it in another site.
- Open the destination Table Rate method and select Import Rates. Choose your CSV.
- Select Replace existing Table Rates with imported data. only when you intend to replace the destination rows. Leave it unchecked to add rows.
- Complete the import, return to the table, and check row values and order. Check method settings separately, then test the resulting charges.
The CSV contains rate rows. It does not copy the shipping zone, Method Title, Calculation Type, tax settings, handling fees, cost limits, or class priorities. Set those separately in the destination method. Imported rows belong to the method whose Import Rates screen you opened. The importer creates new row IDs and uses that destination method, rather than the row and method IDs in the exported file. Importing into another method does not update the source table.
- rate_class: Shipping-class ID; 0 for No class; blank for Any class. IDs can differ between sites.
- rate_condition: Condition value, such as weight, price, volume, items, or items_in_class; blank for None.
- rate_min / rate_max: Condition limits; blank means no limit on that side.
- rate_cost: Cost.
- rate_cost_per_item: Cost per qty.
- rate_cost_per_weight_unit: Cost per weight unit.
- rate_cost_percent: % cost.
- rate_label: Per order row label.
- rate_priority: Break: 1 checked, 0 unchecked.
- rate_order: Row order, starting at 0.
- rate_abort / rate_abort_reason: Abort flag (1/0) and optional reason.
- rate_id / shipping_method_id: Identifiers included in the export. Use the import screen for the destination method rather than changing database records.
Test your shipping rates
↑ Back to top- Prepare sample products with known quantities, prices, weights, dimensions, and shipping classes. Check the actual variation data when testing variable products.
- Enter a complete shipping address in the intended zone. Confirm that the expected Table Rate method is enabled there.
- Write down the expected calculation, including all matching rows, quantity or weight multipliers, handling fees, cost limits, and applicable shipping tax.
- Check a cart below, at, and above each boundary. Include the smallest and largest order you intend to accept and one cart that should not match.
- Test mixed classes and products with No class. A match for one line does not prove the other lines were charged.
- For Price conditions, repeat the test with and without a coupon and with the intended tax comparison settings.
- Change the cart quantity or destination and confirm the shipping result updates. Repeat in a fresh customer session, and check each package if another extension splits the shipment.
The test passes when the expected option and charge appear for every intended cart, and the method is unavailable for the carts you meant to exclude. Check other methods too: an unavailable Table Rate method does not mean the customer has no other shipping option.
Troubleshooting
↑ Back to topThe method is missing at cart or checkout
↑ Back to top- Check the destination: confirm which shipping zone matches the full address and that this method is enabled in it.
- Check a matching row: compare the cart with the rowโs class, condition, Min, and Max. Check product weights/dimensions and the store units.
- Check exclusions: look for a matching Abort row. Check whether another shipping or role restriction hides the method.
- Retest: change quantity or address, then use a fresh customer session. If it still fails, test the same minimal rule on staging and record the address region, product data, rule values, and result for support.
The price is too high, too low, or shown more than once
↑ Back to top- Check Calculation Type first: a Cost of 4 can mean 4 per package, unit, cart line, or class.
- Check every matching row: Any class can match alongside a named class; inclusive endpoints can make two ranges overlap.
- Check extra charges: all non-zero cost columns add together. Include quantity, weight, percentage costs, both handling-fee settings, and minimum/maximum limits.
- Check Break and row order: calculated rows may add; Per order rows may offer separate options. Use the relevant example above to compare results.
- Check tax and packages: distinguish the shipping charge from its tax, and check whether another extension split the order into multiple packages.
A maximum shipping cost increases the charge
↑ Back to topWith Calculated rates per item or Calculated rates per line item, combining an order Handling Fee with Maximum Shipping Cost can increase the charge. For example, two charges of 4 plus a handling fee of 3 total 11, but setting the maximum to 12 can charge 12 instead. Test the combination on a staging site before using it for customer orders. If the result differs from your expected total, contact support with your rule settings and example cart.
Mixed products are missing a shipping charge
↑ Back to topIn calculated modes, a matching line or class can produce a rate even if another product has no matching charge. Check every productโs class, including No class, and every relevant row. Add the intended rule for the uncovered products, or use an explicit Abort rule when this method must be unavailable for them. Retest the mixed cart and each class on its own.
A coupon or tax changes the threshold unexpectedly
↑ Back to topCompare the product subtotal, discounted subtotal, and product tax with the rowโs Price range. Check Discounts in Min-Max and Taxes in Min-Max independently. Then repeat the threshold example. Changing shipping Tax Status will not correct a price-comparison setting.
Customers see different shipping options
↑ Back to topCompare the same cart and complete shipping address in both sessions. Check role-based shipping restrictions and other conditional-shipping tools if installed. Test changes on staging; do not remove access rules from the live store just to diagnose the difference.
An import adds duplicates or produces the wrong charge
↑ Back to topCheck whether you appended rows or selected Replace existing Table Rates with imported data. If you see โNo valid table rates found in the CSV file,โ check that the file contains at least one complete data row as well as the column headings. A header-only file is rejected before existing rows are replaced. Compare the imported table with your backup, including row order, class IDs, Break/Abort flags, and blank limits. Then check the destination methodโs Calculation Type, fees, and tax settings: the CSV does not copy those settings. Correct the table through the methodโs settings and test again. Do not delete shipping records directly from the database.
Shipping from more than one origin
↑ Back to topTable Rate Shipping uses your configured destination zones and rules; it does not select an origin warehouse or fetch a live carrier quote. A manually entered table is not proof that a service supports a particular origin, currency, or multi-warehouse workflow. Confirm those requirements with the carrier or fulfillment extension, then test every origin and package used by your store.
Questions and support
↑ Back to topSomething missing from this documentation? Still have questions and need assistance?
- If you have a question about a specific extension or theme youโd like to purchase, contact us to get answers.
- If you already purchased this product and need some assistance, get in touch with a Happiness Engineer via our support page and select this product’s name from the Product dropdown.
