---
id: 12887
title: "How to Set Up WooCommerce Shipping Zones for Egypt and the Gulf"
slug: "woocommerce-shipping-zones-egypt-gulf"
lang: "en"
url: "https://heshamsaad.com/en/woocommerce-shipping-zones-egypt-gulf/"
markdown_url: "https://heshamsaad.com/en/woocommerce-shipping-zones-egypt-gulf.md"
translations: {"ar":"https://heshamsaad.com/ar/woocommerce-shipping-zones-egypt-gulf/"}
description: "Set up WooCommerce shipping zones for Egypt and the Gulf: zone order, flat rate formulas, free shipping rules, shipping classes and cash on delivery tips."
author: "Safya"
date_published: "2026-10-10T05:48:13Z"
date_modified: "2026-10-10T05:48:13Z"
categories: ["WooCommerce"]
tags: ["Cash on Delivery","Shipping Zones","WooCommerce Egypt","WooCommerce Saudi Arabia","WooCommerce Shipping"]
featured_image: "https://heshamsaad.com/wp-content/uploads/2026/10/woocommerce-shipping-zones-egypt-gulf.jpg"
word_count: 2667
reading_time_min: 13
content_sha256: "196905a4b8ac1b0e818b95236017a84df24fcdc367648abd2027df594110b5cc"
---

# How to Set Up WooCommerce Shipping Zones for Egypt and the Gulf

Shipping is where many new WooCommerce stores in Egypt, Saudi Arabia and the Gulf quietly lose orders. The products are ready, the payment gateway works, and then a customer in Alexandria or Jeddah reaches checkout and sees a shipping price that makes no sense, or worse, a message saying no shipping options are available. Most of the time the cause is the same: WooCommerce shipping zones that were set up in a hurry. This guide walks through how zones, methods and shipping classes actually work in WooCommerce core, and how I set them up for stores that sell inside Egypt and across the Gulf.

Everything here is based on the official WooCommerce documentation and the WooCommerce source code on GitHub. I will not quote courier prices or delivery times, because those change often and differ by contract. Instead, you will get a structure you can fill with your own numbers.

## How shipping works in WooCommerce core

WooCommerce builds shipping out of three pieces that work together. Once you understand how they relate, most shipping problems become easy to diagnose.

- Shipping zones: geographical areas you ship to. A zone can be a whole country, a list of countries, a state or province, a continent, or a set of postcodes.
- Shipping methods: the options a customer can pick inside a zone, such as Flat Rate, Free Shipping or Local Pickup.
- Shipping classes: labels you attach to products (for example, Bulky or Small) so a method like Flat Rate can charge different amounts for different product types.

The official documentation is clear on one point that trips people up: shipping classes cannot offer rates to customers by themselves. They only group products. The actual price always comes from a shipping method inside a zone.

You manage all of this from WooCommerce > Settings > Shipping. Before you start, the docs recommend checking the shipping location setting under WooCommerce > Settings > General, so WooCommerce knows which countries you sell and ship to.

## Planning WooCommerce shipping zones for Egypt and the Gulf

Before touching any settings, sit down with a sheet of paper (or a spreadsheet) and answer a few questions. Which areas does your courier cover at one price? Where does the price go up? Do you deliver yourself inside your city? Do you ship outside your country at all?

The answers become your zones. Here is the rule that matters most, taken straight from the WooCommerce docs:

- Each customer matches only one shipping zone.
- WooCommerce checks zones from the top of the list to the bottom and picks the first one that matches the customer's address.
- Customers only see the methods you added to the zone they matched.

That is why the order of your zones matters so much. The docs say to sort them from the smallest geographical area to the largest: city or postcode first, then state or province, then country, then wider regions.

### What WooCommerce knows about Egyptian and Gulf addresses

This part is specific to our region and it changes how you build zones. I checked the address data that ships with WooCommerce (the `states.php` file in the WooCommerce repository on GitHub):

- Egypt has a full list of governorates built in, such as Cairo, Giza, Alexandria, Aswan and Asyut. That means you can build zones per governorate without any extra plugin.
- Kuwait and Bahrain are listed with an empty state list, so the checkout does not ask for a state there.
- Saudi Arabia, the UAE, Qatar and Oman do not have a state list in that file at the time of writing.

In practice, this means a store in Egypt can price Cairo and Giza differently from Upper Egypt using standard zones. A store in Saudi Arabia that wants different prices for Riyadh and other cities cannot do it by region in core, because there are no regions to pick. The options are postcode based zones (only reliable if your customers actually type postcodes), or an extension that handles city based rates.

### A sample zone plan

Here is a plan I often start from for an Egyptian store that also ships to the Gulf. Your names and groupings will differ, but the order is what counts.

| Zone (in this order) | Regions | Methods |
|---|---|---|
| Greater Cairo | Cairo and Giza governorates | Flat Rate, Free Shipping over a set amount, Local Pickup |
| Delta and Canal | Alexandria, Delta and Canal governorates | Flat Rate, Free Shipping over a higher amount |
| Rest of Egypt | Egypt (whole country) | Flat Rate at a higher price |
| Gulf | Saudi Arabia, UAE, Kuwait, Qatar, Bahrain, Oman | Flat Rate or carrier rates |

Notice that Rest of Egypt sits below the governorate zones. If you put the whole country first, every Egyptian customer would match it and your Greater Cairo prices would never show. WooCommerce now helps with this: the docs note that starting in WooCommerce 11.1 the zones table shows an inline warning when a broader zone earlier in the list already covers the same region as a narrower one below it.

## Setting up a zone step by step

Following the official steps, adding a zone looks like this:

1. Go to WooCommerce > Settings > Shipping > Shipping zones.
2. Click Add zone.
3. Give it a clear name. Customers do not see zone names, so name it for yourself and your team.
4. Pick the zone regions: countries, states or governorates, or continents.
5. Optionally click Limit to specific zip/postcodes and enter one code per line.
6. Add one or more shipping methods to the zone.
7. Click Save changes, then drag the zone into the right position in the list.

### Using postcodes the right way

The postcode field accepts single codes, numeric ranges written with three dots (for example `90210...99000`), and wildcards with an asterisk (for example `902*` matches every code starting with 902). The docs also warn that wildcards inside ranges are not supported.

My honest advice for most stores in our region: only rely on postcodes if your checkout makes the postcode field required and your customers actually know their codes. Many customers leave it empty or guess. A zone that depends on a field nobody fills in will simply never match.

### The Rest of the world zone

Every store has a default zone called Rest of the world. It catches any customer who did not match one of your zones. Adding methods to it is optional. If it has no methods, customers outside your zones are told that no shipping is available, which is exactly what you want if you only sell locally.

There is also a useful trick from the docs: if you want to exclude a region, create a zone for that region with no shipping methods in it. Customers from there will match it first and see no options, instead of falling through to a wider zone.

## Choosing shipping methods

WooCommerce core includes three shipping methods. Each one is added inside a zone, so the same method can have different settings in different zones.

### Flat Rate

Flat Rate is the workhorse. You give it a name that customers see at checkout, a tax status, and a cost. The cost does not have to be a plain number. The official docs describe a small formula system:

- `[qty]` is the number of products in the cart.
- `[fee percent="10"]` charges a percentage of the cost of the products being shipped.
- `min_fee` and `max_fee` set a floor and a ceiling for that percentage.

A few examples of what you can type into the cost field:

```
50
50 + ( 10 * [qty] )
30 + [fee percent="5" min_fee="20" max_fee="150"]
```

The first is a fixed price per order. The second adds a fixed amount per item, which suits heavier products. The third charges a base amount plus a percentage of the order, with limits so small orders and large orders both get a fair price. Replace the numbers with your own courier costs in your store currency.

### Free Shipping

Free Shipping is not automatic. You add it to a zone and choose what it requires: no requirement, a valid free shipping coupon, a minimum order amount, a minimum amount or a coupon, or a minimum amount and a coupon. When you use a minimum amount, there is a checkbox that decides whether the minimum is checked before or after coupon discounts.

A common setup for Greater Cairo is Flat Rate plus Free Shipping with a minimum order amount. Customers below the threshold see the flat rate. Customers above it see both options and pick the free one.

### Local Pickup

Local Pickup lets customers collect orders themselves. You can leave its cost empty or set a small handling fee. The docs note one detail worth knowing: by default, local pickup uses your store address to calculate taxes, not the customer's address. If you use the block based checkout, local pickup has its own settings page with pickup locations, so check which checkout your store runs before following an older tutorial.

## Shipping classes for bulky and fragile products

If you sell both small items and bulky ones, a single flat rate will either overcharge the small orders or lose money on the big ones. Shipping classes fix that.

1. Go to WooCommerce > Settings > Shipping > Classes and add classes such as Bulky and Small.
2. Edit each product, open the Shipping tab, and pick its class. Each product can have only one class, and variations can have their own.
3. Open the Flat Rate method in each zone. A cost field now appears for every class, plus one for products with no class.
4. Choose the calculation type: Per class charges each class in the cart separately, while Per order charges only the most expensive class.

The class cost is added on top of the main cost field. If you want prices based only on classes, set the main cost to zero, as the docs suggest. You can also bulk edit products to assign classes, which saves a lot of time on a large catalogue.

| Calculation type | What the customer pays | Good for |
|---|---|---|
| Per class | The sum of each class in the cart | Items that ship in separate boxes |
| Per order | Only the highest class cost | Orders packed together in one parcel |

## Cash on delivery and shipping methods

In Egypt and much of the Gulf, cash on delivery is still a big share of orders, so it has to work well with your shipping setup. The WooCommerce Cash on Delivery settings include an option called Enable for shipping methods. You can use it to offer cash on delivery only with the methods where your courier actually collects cash, and hide it for Gulf shipping if your international carrier does not collect.

The docs also explain how cash orders behave: WooCommerce sets them to Processing until payment is collected, and you should confirm the money arrived before marking the order Completed. Build that into your team's daily routine with the courier's settlement report. For card and wallet options, see my guide to [online payment options for stores in Egypt and Saudi Arabia](https://heshamsaad.com/en/woocommerce-payment-gateways-egypt-saudi/), which pairs well with this one.

## When core shipping is not enough

Core WooCommerce covers a lot, but some stores outgrow it. Signs you need more:

- You need rates by weight bands or by number of items with many tiers. The official Table Rate Shipping extension handles rules like these.
- You want live rates or label printing from a specific courier. Many regional couriers offer their own WooCommerce plugins; check that any plugin is actively maintained and supports your WooCommerce version before installing it.
- You need city level pricing in a country with no state list in WooCommerce, such as Saudi Arabia.

Before adding any plugin, test it on a staging copy. Shipping plugins touch the cart and checkout, which are the two pages you can least afford to break. If you would rather have someone build it properly, my team offers [custom WooCommerce and WordPress development](https://heshamsaad.com/en/wordpress-development/) for exactly this kind of work.

## Testing your setup before going live

Do not trust a shipping setup you have not tested as a customer. Here is the checklist I run on every store:

1. Add a small item to the cart and check out with an address in each zone. Confirm the right methods and prices appear.
2. Repeat with a bulky item and a mixed cart to test shipping classes and the calculation type.
3. Test an order just below and just above your free shipping threshold, with and without a coupon.
4. Try an address outside all your zones and confirm the message is what you expect.
5. Check the Arabic version of the checkout. Method names and the no shipping message should read well in Arabic, and the layout should not break. If it does, my notes on [right-to-left layout problems in WordPress](https://heshamsaad.com/en/fix-wordpress-rtl-issues/) cover the usual causes.
6. Check on a phone. Most of your customers in the region will check out on mobile.

Also review how your theme shows the shipping options. Some themes hide method descriptions or squeeze the list on small screens. If you are still choosing a theme, this [roundup of store themes built for Arabic shoppers](https://heshamsaad.com/en/woocommerce-themes-arabic-stores/) is a good starting point.

## Common mistakes I see on regional stores

- Whole country zone at the top. It swallows every governorate zone below it.
- Method names customers cannot understand. Name methods by what the customer gets, for example Delivery in 2 to 4 days, not Flat Rate 2.
- Free shipping that never appears. Usually the minimum amount is checked after a coupon discount, or the method was added to the wrong zone.
- Required postcode fields nobody can fill. If customers do not know their postcode, they abandon the checkout or type random numbers.
- Prices never updated. Courier prices change. Put a reminder in your calendar to review shipping costs every few months.

## Frequently asked questions

### Can I charge different shipping prices for Cairo and Upper Egypt?

Yes. WooCommerce includes Egypt's governorates, so you can create one zone for Cairo and Giza and another for the rest of the country. Just make sure the smaller zone sits above the country wide zone in the list.

### Can I set different prices for Riyadh and Jeddah with core WooCommerce?

Not by region, because WooCommerce does not ship a state list for Saudi Arabia. You can use postcode based zones if your customers enter postcodes, or use an extension that supports city based rates.

### Why does my checkout say no shipping options are available?

The customer matched a zone with no methods, or matched no zone and Rest of the world has no methods. Check the zone order and the address the customer entered.

### Can I offer cash on delivery inside my country only?

Yes. In the Cash on Delivery settings, use Enable for shipping methods and pick only the methods used for local delivery.

## Wrapping up

A clean shipping setup is mostly planning: decide your areas, put the smallest zones first, keep method names clear, and test as a real customer. Once that is in place, you can add classes, free shipping rules or carrier plugins without creating a mess. If you want a second pair of eyes on your store, book a [free consultation](https://heshamsaad.com/en/free-consultation/) and we will go through it together.

## References

- [WooCommerce: Setting up Shipping Zones](https://woocommerce.com/document/setting-up-shipping-zones/)
- [WooCommerce: Flat Rate Shipping](https://woocommerce.com/document/flat-rate-shipping/)
- [WooCommerce: Free Shipping](https://woocommerce.com/document/free-shipping/)
- [WooCommerce: Local Pickup](https://woocommerce.com/document/local-pickup/)
- [WooCommerce: Product Shipping Classes](https://woocommerce.com/document/product-shipping-classes/)
- [WooCommerce: Cash on Delivery](https://woocommerce.com/document/cash-on-delivery/)
- [WooCommerce: Table Rate Shipping](https://woocommerce.com/document/table-rate-shipping/)
- [WooCommerce on GitHub: states.php address data](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/i18n/states.php)
