Loading tutorials…
Loading tutorials…
Tax and shipping is where most Woo stores ship broken. Wrong sales-tax rates trigger audits; wrong shipping rates cost 5-15% of completed checkouts. This walks the full configuration including automated tax via WooCommerce Tax and zone-based rate tables.
Who this is forWooCommerce owners who are launching or who have hit one of three problems: customers complaining about shipping prices, sales-tax filings that don't reconcile with WooCommerce totals, or international orders failing at checkout. If you sell across multiple US states or internationally, this is non-optional.
What you'll need
Step 1
WooCommerce → Settings → General. Your store address is the origin point for shipping rate calculations AND the default tax-nexus location. Get this right before anything else.
WordPress Admin → WooCommerce → Settings → General. Fill in the store address with the physical location you ship from. If you have multiple warehouses, use the primary one — multi-origin shipping requires a separate plugin.
Set "Selling location(s)" — choose between "Sell to all countries" or "Sell to specific countries." If you only ship to the US, set this to "Specific countries" → US. Restricting the country list at checkout prevents 90% of fraud attempts and address-validation errors.
Set "Shipping location(s)" — usually mirrors selling locations, but you can also "Disable shipping & shipping calculations" for digital-only stores.
Set "Default customer location" — recommend "Geolocate (with page caching support)." This pre-fills shipping country at checkout and lets you display accurate shipping previews on product pages.
Save. Everything else (tax zones, shipping zones) depends on this base configuration.
Step 2
WooCommerce → Settings → General → "Enable tax rates and calculations" → ON. Then choose: manual rates (free, works for simple cases) or automated via WooCommerce Tax / TaxJar.
In WooCommerce → Settings → General → "Enable tax rates and calculations" checkbox → save. A new "Tax" tab appears in WooCommerce → Settings.
Decision: manual or automated.
Manual: free, works if you have 1-3 nexus locations and stable rates (e.g., a single US state, or a country with one VAT rate). You will enter rates in tax-rate tables and update them yourself when rates change.
Automated via WooCommerce Tax: free for low-volume, $19/mo for higher volume. Automatically applies the correct rate for every US ZIP + most international VAT. Includes nexus tracking. Recommended for most multi-state US sellers.
Automated via TaxJar (paid plugin, $19-99/mo): same automation as WooCommerce Tax but adds automated state filing (TaxJar files your sales tax returns for you). Worth it once your tax-filing time exceeds 4 hours/month.
For most stores doing $50K+/year across multiple states, the math strongly favors automated.
Step 3
WooCommerce → Settings → Tax → Standard Rates. Add one row per nexus location. Match the column order: Country Code, State Code, ZIP/Postcode, City, Rate %, Tax Name, Priority, Compound, Shipping.
WooCommerce → Settings → Tax → "Standard rates" sub-tab. Click "Insert row."
For US states with nexus, add one row per state with Country=US, State=2-letter code, Rate=combined state+local (e.g., 8.25 for California average), Tax Name="Sales Tax."
For ZIP-level precision, use multiple rows with different ZIP ranges (e.g., ZIP "9*" for California 9xxxx ZIPs). This gets messy fast for 5+ states — which is why automated tax exists.
For VAT: add one row per EU country with Country=DE/FR/etc., Rate=standard VAT %, Tax Name="VAT", Compound=unchecked.
Use "Reduced rate" or "Zero rate" sub-tabs for categories that have lower rates (e.g., children's clothing in the UK is 0%). Assign categories to those rates in Products → Categories → edit category → Tax class.
Save. Test by placing an order from each nexus state — tax should appear at checkout matching the rate row.
Step 4
WooCommerce → Settings → Shipping → Shipping zones. Create one zone per pricing logic (e.g., "Domestic US," "Canada," "Europe," "Rest of world"). Each zone has its own methods.
WooCommerce → Settings → Shipping → "Add shipping zone."
Name the zone (e.g., "Domestic US"). Add regions (Country=US, or specific states for granular control).
Add shipping methods inside the zone: "Flat rate," "Free shipping," "Local pickup," and (with plugin) live carrier rates from UPS/USPS/FedEx.
For Flat Rate: set the cost. For weight-based or quantity-based pricing, use the "[qty]" or "[fee percent=\"10\" min_fee=\"4\"]" syntax in the cost field — this is a Woo-specific micro-language that most owners miss.
For Free Shipping: set the minimum amount (e.g., $50). This is one of the highest-leverage settings in WooCommerce — free shipping over $X lifts AOV 8-15% on most stores.
Order matters: methods at the top show first to the customer. Put "Free shipping" first if available so it is the first option shoppers see.
Repeat for each zone you fulfill. A typical US-based store has 3-4 zones: Domestic US, Canada, Europe, Rest of World.
Step 5
For weight-variable products, hard-coded flat rates either over- or under-charge. Live rates via UPS/USPS/FedEx plugins return real-time shipping cost based on weight, dimensions, and destination.
Install a carrier-rate plugin: "USPS Shipping for WooCommerce" (free + paid versions), "WooCommerce Shipping" (the official WooCommerce-by-Automattic plugin with discounted USPS + UPS rates), or a multi-carrier plugin like ShipStation.
In each product, set the weight, length, width, and height. Without dimensions, live rate plugins fall back to flat estimates.
In the shipping zone, add the carrier-rate method. Configure: services to offer (Priority, Ground, Express), markup % (add 5-10% to cover handling), and box sizes.
For "Free shipping at $50," put it ABOVE the carrier-rate method in zone order. When threshold hits, customers see free shipping selected by default.
Live rates are slower than flat rates (200-500ms API call at checkout). On Blocks Checkout this is fine. On Classic Checkout with a slow host, it may delay checkout — consider caching via the plugin settings.
Step 6
Run test orders to: (a) your store state, (b) a non-nexus US state, (c) Canada, (d) a major EU country. Verify tax and shipping appear correctly on each.
Add a $1 test product (or use a low-AOV real product, refund after).
Test 1 — same state as your store: tax should appear with the correct combined rate, shipping should be domestic.
Test 2 — non-nexus US state: tax should be $0, shipping should be domestic. If you see tax on a non-nexus state, you have nexus misconfigured.
Test 3 — Canadian address: tax should be GST/HST if you have Canada nexus, otherwise $0. Shipping should be Canada-zone rates.
Test 4 — EU country: tax should be VAT-inclusive (price stays the same, VAT shown on receipt). Shipping should be EU-zone rates.
Document the expected behavior for each scenario. Customer-support tickets later will be much easier to triage when you have a reference table.
Step 7
TaxJar AutoFile files your sales tax returns automatically. WooCommerce Tax does NOT file for you — it only calculates. Decide if you want filing automated.
In TaxJar dashboard → AutoFile → enable for each state you have nexus in. TaxJar pulls your WooCommerce transaction data via the plugin and files the return on the state's schedule (monthly, quarterly, annual).
Pricing: ~$30 per state per filing on top of the TaxJar Plus plan. For a multi-state seller, this is $200-400/year per state — far cheaper than a CPA filing manually.
Critical: nexus must be configured correctly BEFORE enabling AutoFile. If TaxJar thinks you have nexus in a state where you do not, it will register you with that state's revenue department on first filing.
If you use WooCommerce Tax (not TaxJar), you still need to file manually — log in to each state's tax portal monthly/quarterly and remit. Set calendar reminders.
Common mistakes
Charging tax on non-nexus states
What goes wrong: You collect tax in 50 US states. Customers in non-nexus states pay tax that you owe back to them (or remit incorrectly to states where you should not be). At minimum a refund and CRM mess; at worst, registering with 49 state revenue departments unnecessarily.
How to avoid: WooCommerce → Settings → Tax → Standard rates → remove every state where you do not have physical or economic nexus. Use automated tax if you cannot maintain this list manually.
Wrong tax-inclusive setting for region
What goes wrong: US shoppers see a price like '$50' on the product page, then '$54.25' at checkout — surprises them, kills CR. EU shoppers see '$50' that does not include VAT, breaks consumer protection law in most EU countries.
How to avoid: Settings → Tax → 'Prices entered with tax': set to NO for US-based stores, YES for EU/UK stores. Settings → Tax → 'Display prices in the shop': set to 'Excluding tax' for US, 'Including tax' for EU.
No free-shipping threshold
What goes wrong: Every shipping cost is a surprise at checkout. Shipping-shock abandonment rate sits at 25-35%. AOV stagnates because there is no incentive to add another product.
How to avoid: Add a Free Shipping method to your domestic zone with a minimum at 1.2-1.5x your AOV. Promote it via a cart-drawer message: "Add $X for free shipping."
Wrong shipping zone order
What goes wrong: A "Rest of World" zone above "Domestic US" matches every order including US, so domestic customers see international rates. Domestic CR collapses.
How to avoid: WooCommerce → Settings → Shipping → drag the most specific zone (Domestic US) to the top. "Rest of World" should always be last.
Live carrier rates with no product dimensions
What goes wrong: USPS/UPS plugins return estimated rates when dimensions are missing — often wildly wrong. You over-quote shipping on small items, lose conversions; or under-quote on big items, eat the cost on every order.
How to avoid: Every product needs Weight, Length, Width, Height filled in. Use a Woo bulk-editor (built-in or via plugin) to backfill 100+ products at once.
Manual tax with 5+ nexus states
What goes wrong: Sales tax rates change quarterly in many US states (local sales tax adjustments). Manual tables go stale. You either over-collect (refund mess) or under-collect (state tax bill plus penalty). Reconciliation takes 5+ hours/month.
How to avoid: Switch to WooCommerce Tax (free for low volume, $19/mo for higher) or TaxJar. The automation pays for itself in reclaimed time within 30 days.
Recap
Done — what's next
How to set up WooCommerce payment gateways (Stripe, PayPal, Apple Pay)
Read the next tutorial
Hand it off
Tax and shipping is a one-time setup that protects you for years. Done wrong, it produces audit risk and customer-service noise every week. A WooCommerce specialist will configure nexus, zones, and automated tax in 2-3 sessions — typically $200-400 total at $14-16/hr.
See specialist rates
No — only states where you have nexus. Nexus is physical (warehouse, employee, inventory) OR economic (typically $100K/year OR 200 transactions/year, varies by state). Most small Woo stores have nexus in only 1-3 states. Once you hit economic nexus in a state, you must register there within 30 days.
WooCommerce Tax (by Automattic, free for low volume) calculates tax automatically for every US ZIP + most international VAT. You still file manually. TaxJar adds AutoFile — it actually submits your sales tax returns to each state's revenue department on the right schedule. For 5+ filing states, TaxJar saves more in time than it costs.
Yes if possible — surprise shipping costs at checkout cause 25-35% of cart abandonment. Use a plugin like 'Shipping Calculator on Product Page' or enable Woo's cart-drawer shipping estimator. Even a rough estimate ('Ships to US from $7') reduces shipping-shock abandonment.
If you ship to EU/UK and your annual sales there are over the thresholds (€10K for EU IOSS, no threshold for UK VAT), you must register for VAT and collect at the point of sale. WooCommerce Tax handles the calculation; you still need to register manually (IOSS for EU, HMRC for UK) and file quarterly. TaxJar can automate this.
Three usual culprits: (1) the customer's address is not in any of your shipping zones — add a 'Rest of World' fallback zone with at least one method. (2) Products have no weight/dimensions and you're using carrier rates. (3) A Free Shipping method is matching at $0 threshold — check Settings → Shipping → your zone.
For products under $30 AOV, yes — return shipping cost is usually less than the conversion-rate lift from a no-risk return policy. For products over $100 AOV, optional with restocking fee. For consumables/customized products, no returns — but state the policy clearly. WooCommerce does not handle returns natively; install a plugin like 'AfterShip Returns' or 'WooCommerce Return Refund Exchange.'
WooCommerce
Most Woo owners install the Stripe plugin, see 'Connected,' and assume Apple Pay just works. Then mobile CR sits at 28% because the Payment Request Button never registered the domain. Here is the full gateway setup including Blocks Checkout compatibility.
WooCommerce
Customer says 'checkout did not work.' You test and it seems fine. The order is stuck in 'Pending payment' or never created at all. This is the diagnostic sequence Woo specialists run — payment, webhook, plugin conflict, theme override, Blocks vs Classic.
WooCommerce
Most WooCommerce stores load at PageSpeed 25-45 on mobile. Each second of load time costs roughly 7% of conversions. This is the systematic checklist a Woo speed specialist runs — plugin audit, caching, HPOS migration, asset optimization, and database cleanup.
WooCommerce
DIY WooCommerce is a great idea — until your plugin count crosses 30, your checkout breaks intermittently, and PageSpeed sits at 35. This is the honest framework: when the cost of self-managing exceeds the cost of hiring, and how to tell which side you're on.
WordPress
Installing Yoast or RankMath is step two. Step one is making sure WordPress itself is configured for SEO — permalinks, indexable content rules, taxonomy hygiene. Skip this and the SEO plugin is putting lipstick on a leak.