The order total looks wrong and you are not sure why. A customer in another state was charged local delivery. Someone abroad got free shipping that was meant only for your home country. Tax appears on the cart page but vanishes at checkout, or is added twice to prices that already included it. Sometimes checkout simply says “There are no shipping options available.” (the wording differs a little between the classic and block checkout).
None of this usually means WooCommerce is broken. Tax and shipping are rule systems, and the rules are applied exactly as configured, in a particular order. When a total looks wrong, one rule is almost always matching where you did not expect it to. This post explains how WooCommerce picks a shipping method and a tax rate, so you can find the rule that is misfiring.
One honest caution before we start: this is about how the software behaves, not tax advice. Which tax applies to which product, and what your invoices must show, are questions for your accountant or tax adviser.
How WooCommerce chooses a shipping cost
Shipping is set under WooCommerce > Settings > Shipping. It works in three layers.
- Zones. A zone is a set of places: countries, states, or postcodes. WooCommerce checks the customer’s shipping address against your zones from the top of the list down, and uses the first zone that matches. It does not combine zones. Any address that matches none of them falls into “Locations not covered by your other zones”.
- Methods. Each zone has its own methods, such as Flat rate, Free shipping and Local pickup, plus any added by courier plugins. The customer is offered every enabled method in the matched zone.
- Classes. Shipping classes, set on each product, let a flat rate charge different amounts for different kinds of item, for example bulky goods.
The usual shipping mistakes
- Zones in the wrong order. If a broad zone such as your whole country sits above a narrower one such as your own city or a set of postcodes, the broad zone wins and the narrow one is never used. Drag the more specific zones to the top.
- A gap in coverage. If an address matches no zone and the “not covered” zone has no methods, the customer sees no shipping options and cannot check out.
- Free shipping without conditions. Free shipping can require a minimum order amount, a coupon, or either. If it is set to require nothing, it is available to everyone in that zone. Also check whether the minimum is counted before or after coupon discounts; there is a setting for this.
- Shipping classes not assigned. A class only changes the cost if the product actually has it. Products without a class use the “No shipping class cost” field. Check the calculation type too: charging per class adds a cost for each class in the cart, while charging per order uses only the most expensive class.
- Selling and shipping locations. Under WooCommerce > Settings > General, the selling and shipping location settings can stop certain countries from appearing at all, which looks like a shipping fault.
Why the numbers sometimes do not change
WooCommerce caches calculated shipping rates for each cart. If you change a rule and test with the same cart, you may keep seeing the old figure. Under WooCommerce > Settings > Shipping > Shipping options there is a debug mode that bypasses this cache while you test; switch it off afterwards. Test in a private window with a fresh cart.
How WooCommerce chooses a tax rate
Tax is switched on under WooCommerce > Settings > General with the option to enable tax rates and calculations. A Tax tab then appears. Several settings there change totals dramatically:
- Prices entered with tax. If you type product prices that already include tax, set this to yes. If it is set to no while your prices include tax, WooCommerce adds tax on top, and customers pay it twice.
- Calculate tax based on. The customer’s shipping address, their billing address, or your shop base address. Choosing the wrong one is a common reason a customer in another region is charged the local rate.
- Shipping tax class. Decides whether and how shipping charges are taxed.
- Display prices in the shop and during checkout. These change only what is shown, including or excluding tax. They do not change what is charged, but a mismatch between the two makes it look as if tax appears and disappears.
Rates themselves live in tables: Standard rates, plus Reduced rate and Zero rate by default, and any classes you add. Each row can match a country, a state, postcodes and cities. Only one matching row is used per priority level, so two rows with the same priority do not stack; give a second rate a different priority if it should apply on top, and use the compound setting only when a tax must be charged on top of another tax. Each row also has a Shipping checkbox that says whether that rate applies to shipping costs.
Common tax mistakes
- A product assigned to the wrong tax class, so it picks up the standard rate instead of a reduced or zero one.
- Rate rows with a typo in the state or postcode, so they never match and the customer is charged nothing.
- No address yet. Until the customer enters an address, WooCommerce uses the “Default customer location” setting under General. If that is “No location by default”, the cart may show no tax until the checkout address is filled in, which customers sometimes read as a price change.
- A tax plugin or automated tax service and manual rate tables both active, so two systems are adding tax.
A note on GST for stores in India
Indian GST adds a wrinkle that WooCommerce’s basic tables do not handle by themselves. Within one state, GST is charged as CGST plus SGST. Between states, it is charged as IGST. WooCommerce does not know these rules; it only knows the rows you enter.
Stores usually handle this in one of two ways. Some create rate rows by state, so that the seller’s own state gets two rows (one labelled CGST, one SGST, given different priorities so that both apply) and other states get one row labelled IGST. Others use a GST plugin that does this and also produces invoices. Either way, the rates themselves, which products fall into which rate, and what a GST invoice must contain (such as GSTIN details) should come from your chartered accountant. A setup that charges the right total but labels it wrongly can still be a problem for your filings.
Whichever method you use, test it with an address in your own state and one in a different state, and check that the labels and amounts on the order and invoice are what your accountant expects.
Stores selling abroad
If you sell to the USA, UK or Europe, tax rules depend on where the buyer is and on your own registration status, and they change. US sales tax varies by state and locality, which is why many stores use an automated tax service rather than typing rates by hand. Again, get the rules from an adviser; this post can only help you check that WooCommerce applies what you have set.
A testing routine that finds the faulty rule
- Take a backup, or export your tax tables (there is an export option on each rate table) so you can put them back.
- Write down the exact address, products and quantities that produce the wrong total.
- In a private window, add those products and enter that address on the cart page shipping calculator.
- Note which shipping zone should match, then check the zone list order to see which one actually matches first.
- Note the tax class on each product, then find the row in that class’s table that should match the address.
- Change one rule at a time, with shipping debug mode on, and retest.
- Place a real low-value order with a test payment method, and check the order screen and email, not just the cart.
If totals go wrong only after you install or update a plugin, such as a courier rate plugin, a multi-currency plugin or a checkout editor, that plugin is the first suspect. A copy of the store on a staging site is the safest place to test it.
When the checkout itself is failing
Wrong totals are different from a checkout that will not complete. If customers see errors when they press the order button, or the page reloads without placing the order, see our guide to WooCommerce checkout errors. If orders are going through but you cannot find them afterwards, our post on missing WooCommerce orders covers that. For the broader list of WordPress problems, our WordPress errors hub is the starting point.
Keeping totals correct
- After any change to products, zones or tax tables, run a few test carts with addresses in different regions.
- Keep a short written note of your intended rules: which zones exist, which products use which class, which rate applies where. When something breaks, you can compare the screen with the note.
- Review the setup with your accountant whenever tax rules or your registration change.
- Avoid running two tax systems, or two shipping rate plugins, side by side.
If you want someone to go through it with you
Tax and shipping setups grow messy over time, especially on stores with many products and several regions. If you would like us to check yours, send a screenshot of the wrong total and the address used. We will work on a copy of the store, find the rule that is misfiring, and explain what we changed. Our WooCommerce support service describes how that works; the tax decisions themselves stay with you and your adviser.
Next in this series: WordPress Pages 404 but Homepage Works? Fix Permalinks