If you run a local WooCommerce store, you may want to deliver only to certain areas. That doesn’t automatically mean you need a map plugin.

WooCommerce has built-in shipping zones. They let you define delivery areas by country, state or province, and ZIP/postcode, then assign shipping methods and prices to each one. Customers see only the options that match their shipping address.
There is one limitation to know up front: WooCommerce has no map editor. You can’t click points on a map and draw a boundary. You define areas with address-based rules instead.
That works well for a policy like “We deliver to these postcodes.” It doesn’t fit a policy like “We deliver within 10 miles of our store.” This guide covers both.
Can you draw delivery zones in WooCommerce without a map plugin?
Not literally. What you can do is build a zone from:
- Countries
- States or provinces
- Individual ZIP codes or postcodes
- Numeric postcode ranges
- Postcode wildcards
So the real question isn’t “how do I draw the zone?” It’s “how does my business define its delivery area?”
- By area (postcodes, cities, regions): use WooCommerce shipping zones.
- By distance (miles or km from your store): use a distance-based shipping method. More on that below.
How shipping zones work
A shipping zone is a geographical area where you offer particular shipping methods. A local store might set up:
| Zone | Area | Delivery price |
|---|---|---|
| Local | Selected postcodes | $5 |
| Nearby | A second group of postcodes | $8 |
| Wider area | Whole state or province | $12 |
(Prices and areas are examples. Use your own.)
When a customer enters a shipping address, WooCommerce checks your zones from the top of the list down and uses the first one that matches. Each customer matches only one zone. That’s why the order of your zones matters, which we’ll cover in Step 5.
Step 1: Write down your delivery rules first
Before you open WooCommerce, decide which of these describes your policy:
- Specific postcodes: one postcode-based zone.
- A whole state or province: a region-based zone.
- Different prices for different areas: separate zones, each with its own rate.
- Pricing by distance from your store: skip to the radius section.
Ten minutes of planning here saves a lot of fixing later.
Step 2: Check your shipping locations
Go to WooCommerce → Settings → General and check the Shipping location(s) setting. If it doesn’t include the countries you deliver to, your zones won’t work as expected.
Step 3: Create the zone and limit it to postcodes
- Go to WooCommerce → Settings → Shipping → Shipping zones.
- Click Add zone.
- Enter a descriptive Zone name, such as “Local Delivery”. Avoid “Zone 1”. You won’t remember what it means in six months.
- Select the Zone regions (countries, states/provinces, or continents).
- Click Limit to specific zip/postcodes and enter one code per line.
You can enter three kinds of values:
text
02108
02109
02110
Individual postcodes, as above.
text
90210…99000
A numeric range.
text
CB23*
CB2*
Wildcards. CB23* matches CB23 1EX. CB2* matches both CB2 3AA and CB23 1EX. Wildcards are the recommended option for postcodes that contain letters, such as UK postcodes. Note that you can’t use wildcards inside numeric ranges.

Be careful with broad patterns. A wildcard like CB2* is convenient, but it also captures CB23, CB24, and anything else starting with those characters. Check what a pattern covers before you publish it. If your delivery area is a handful of scattered postcodes, exact codes are safer than a big range.
Postal systems differ by country: ZIP codes in the US, postcodes in the UK and Australia, postal codes elsewhere. The matching rules above work the same way, but the format of the values you enter will differ.
Step 4: Add a shipping method
A zone only defines where. Customers also need a how.
- Click Edit on the zone.
- Click Add shipping method.
- Choose Flat Rate, Free Shipping, or Local Pickup, then click Continue.
For simple local delivery, Flat Rate is usually enough. For example: Title: Local Delivery, Cost: 5.00. Save your changes.
For different prices in different areas, create a separate zone for each price. If 30 postcodes share the same price, put all 30 in one zone rather than creating 30 zones. When the price changes, you update one method instead of dozens.
Step 5: Put specific zones above broad ones
This is the most common cause of “WooCommerce is showing the wrong price.”
Suppose you have a local zone, a state zone, and a country zone. A customer in your city technically matches all three. Because WooCommerce uses the first match, order your zones from smallest area to largest:
text
Local city postcodes
↓
State / province
↓
Country
↓
Rest of the world
To reorder, drag the handle on the left of each zone, then click Save changes.
From WooCommerce 11.1, the zones table also shows an inline warning when a broader zone listed earlier already covers the same region, which means the narrower zone below it can never be matched. If you see that warning, move the narrower zone up.
Step 6: Handle areas you don’t serve
You don’t need a complicated exclusion system.
- The default Rest of the world zone applies to any address that doesn’t match another zone. Adding shipping methods to it is optional.
- If an address lands in a zone that has no shipping methods, the customer is told that no shipping is available.
- To exclude a specific region while still using Rest of the world, create a zone for that region and add no methods to it.
Step 7: Test it like a customer
A setup can look right in the WordPress admin and still behave differently at checkout. Add a product to the cart, use the Calculate Shipping link, and try at least three addresses:
- An address in your local zone. Expect the local rate.
- An address in your nearby or regional zone. Expect that zone’s rate.
- An address you don’t serve. Expect no shipping available.

Test on mobile too. If a result is wrong, check the zone order first, then the postcode entered, then the method assigned to the zone.
What if you need a true delivery radius?
This is where postcode zones stop being the right tool.
Say your policy is:
- Free delivery within 5 miles
- $10 from 5 to 10 miles
- No delivery beyond 10 miles
You could try to approximate that with postcodes, but it wouldn’t be a real radius. A postcode isn’t a circle around your store, and two addresses in the same postcode can be different distances away. Don’t stretch postcode ranges to imitate a circle.
If distance decides your price, use a method that actually calculates distance.
WooCommerce Distance Rate Shipping
Distance Rate Shipping is a WooCommerce extension that charges shipping based on the distance from your shipping origin to the customer’s address. Rules can also use travel time, item count, weight, or cart total.
What you need:
- The extension, version 1.7.0 or higher
- A Google Cloud project with the Routes API (and Maps Embed API) enabled
- A Google API key
- A payment method on the Google Cloud account, because Google charges for API use beyond its free allowance
The legacy Distance Matrix API is being deprecated, so set API Type to Routes API under WooCommerce → Settings → Shipping → Distance rate.
Then add Distance Rate as a shipping method inside the relevant shipping zone, set your shipping origin address, and create rules. Each rule has a Condition (such as distance), a Min and Max, and a Base Cost. Leave Min or Max blank for no limit.
Two details trip people up:
- Ranges can’t overlap. Use 0–4.9 and 5–9.9, not 0–5 and 5–10.
- Rules run top to bottom and costs from matching rules add together, unless a matching rule uses Break (stop checking further rules) or Abort (disable this method, so no rate is offered).
WooCommerce also publishes focused guides for the two most common setups: offering free local delivery and charging for longer distances and limiting the method to a maximum distance.
If you also want customers to see or pick an area on a map, that’s a different need again, and a dedicated map or delivery-area plugin is the right tool.
Which setup should you use?
| Your delivery rule | Best option |
|---|---|
| Specific ZIP codes or postcodes | Shipping zone |
| A state, province, or country | Shipping zone |
| Several postcode groups with different prices | Multiple shipping zones |
| Free delivery in selected areas | Shipping zone + Free Shipping |
| Exact distance from your store | Distance Rate Shipping |
| Different prices by distance | Distance Rate Shipping |
| Customers pick or see an area on a map | Dedicated map/delivery-area plugin |
Common mistakes
- Broad zone above a local zone. The broad one matches first. Put specific zones on top.
- Using a postcode range as a fake radius. Use distance-based shipping when distance sets the price.
- One zone per postcode. Group postcodes that share the same rules.
- Forgetting the shipping method. A zone with no method offers customers nothing.
- Broad wildcards.
CB2*also matchesCB23. Check what a pattern captures. - Skipping the checkout test. Always try real-looking addresses from every zone.
Checklist before you publish your delivery policy
- Delivery rule written down: areas or distance?
- Shipping location(s) set correctly in General settings
- Postcodes and wildcards double-checked
- Specific zones above broad zones, no zone-order warnings
- Every zone has the right method and price
- Unserved areas don’t get a delivery option by accident
- One address tested in every zone, plus one outside your area
- Cart and checkout show the expected price
- Distance rules tested at several distances, if used
- Your public delivery policy matches your WooCommerce settings
Final thoughts
You don’t need a map plugin just because your store has delivery areas. If your rule is based on postcodes, cities, states, or regions, WooCommerce’s built-in shipping zones are usually the simplest place to start.
If your rule is based on actual distance, don’t fake a radius with a long postcode list. Use a distance-based method such as Distance Rate Shipping.
Your next step: write your delivery rule in one sentence. If it names areas, build shipping zones today. If it names miles or kilometers, set up distance-based shipping. Then test an address from every zone before you tell customers where you deliver.
FAQ
Can I create delivery zones in WooCommerce without a plugin? Yes. Shipping zones are built in and can be limited by region and by ZIP/postcode.
Can I draw a circle around my store? Not with core WooCommerce. Zones use regions and postcodes, not a drawn boundary. For a true radius, use a distance-based extension.
Can I use different delivery prices for different areas? Yes. Create one zone per price and add a method with that rate to each.
Why is WooCommerce showing the wrong delivery price? Check zone order first. WooCommerce uses the first matching zone, so a broad zone above a specific one will override it.
What happens if a customer is outside my delivery area? If their address matches no zone, or matches a zone with no shipping methods, they are told shipping isn’t available.