Appearance
Delivery Zones
Overview
Delivery Zones define geographic areas where you offer delivery service. Each zone can have its own delivery fee, minimum order amount, and estimated delivery time.
Key Purpose: Control where you deliver and set zone-specific pricing.
Purpose
This page lets you create and manage delivery zones that define which geographic areas your location delivers to, along with zone-specific fees, minimums, and estimated delivery times.
Key Concepts
- Delivery Zone: A named area defined by a list of postal codes, with its own delivery fee, minimum order amount, estimated delivery time, enabled state, and sort order.
- Postal Code Matching: When a customer enters a delivery address, the system extracts the postal code and checks it against all enabled zones in sort order; the first match determines the zone's settings.
- Zone Priority (Sort Order): If a postal code appears in multiple zones, the zone with the lowest sort order wins. This allows overlapping zones with different pricing tiers.
- Zone-Level Minimum: Each zone can have its own minimum order amount that overrides the global minimum set in online ordering settings.
- Estimated Delivery Time: A per-zone estimate (in minutes) that is added to the location's preparation time to calculate the total delivery time shown to customers.
Actions
Create Delivery Zone
Add a new zone with a name, list of postal codes, delivery fee, minimum order amount, and estimated delivery time. The zone is enabled by default and assigned a sort order.
Edit Delivery Zone
Update any zone field including postal codes, fees, minimums, or estimated time. Changes take effect immediately for new orders.
Enable / Disable Zone
Toggle a zone on or off without deleting it. Disabled zones are skipped during postal code matching, so their postal codes are treated as undeliverable.
Location
- Backoffice Route:
/pickup-and-delivery/delivery-zones - Backend Controller:
app/Http/Controllers/Api/BackOffice/DeliveryZoneController.php - Vue Component:
src/views/pickup-and-delivery/online-ordering/forms/DeliverySettings.vue
Fields
Zone Name
| Property | Value |
|---|---|
| Field ID | name |
| Label | Zone Name |
| Type | Text |
| Required | Yes |
| Validation | max: 100 characters |
Description: Internal name for the delivery zone. Not shown to customers.
Examples:
- "City Center"
- "Suburbs - North"
- "Industrial Area"
- "Zone 1 - 0-3km"
Postal Codes
| Property | Value |
|---|---|
| Field ID | postal_codes |
| Label | Postal Codes |
| Type | Array of strings |
| Required | Yes |
| Validation | At least one postal code |
Description: List of postal codes included in this zone. Customer's delivery address postal code is matched against these.
Business Logic:
- Exact match required
- Customer enters address → System extracts postal code → Matches to zone
- If postal code in multiple zones, first match wins (by zone order)
- If no match, delivery unavailable
Format Examples:
- Netherlands: "1012", "1013", "1014"
- Belgium: "1000", "1050", "1060"
- Germany: "10115", "10117"
Customer Impact:
- Online Ordering: Customer enters address → If postal code matches zone → Delivery available with zone's fee
- No Match: "Sorry, we don't deliver to your area"
Delivery Fee
| Property | Value |
|---|---|
| Field ID | delivery_fee |
| Label | Delivery Fee |
| Type | Currency |
| Default | 0 |
| Required | No |
| Validation | min: 0 |
Description: Fee charged for deliveries to this zone. Added to order total at checkout.
Business Logic:
- Added to subtotal at checkout
- Shown separately on receipt
- Can be €0 for free delivery zones
Customer Impact:
- Online Ordering: "Delivery fee: €X.XX" shown at checkout
- Order Confirmation: Fee itemized on receipt
Examples:
- Zone 1 (0-3km): €2.50
- Zone 2 (3-5km): €4.00
- Zone 3 (5-10km): €6.50
Minimum Order Amount
| Property | Value |
|---|---|
| Field ID | minimum_order_amount |
| Label | Minimum Order |
| Type | Currency |
| Default | 0 |
| Required | No |
| Validation | min: 0 |
Description: Minimum order value required for delivery to this zone. Overrides the global minimum order setting.
Business Logic:
- Checked at checkout
- If order subtotal < zone minimum → Error shown
- Zone minimum takes precedence over global minimum
Customer Impact:
- Online Ordering: "Minimum order for delivery to your area is €X.XX"
- Cart: "Add €Y.YY more for delivery"
Examples:
- Close zones: €10 minimum
- Far zones: €25 minimum (worth the trip)
Estimated Delivery Time
| Property | Value |
|---|---|
| Field ID | estimated_time |
| Label | Estimated Delivery Time |
| Type | Number |
| Unit | Minutes |
| Default | 30 |
| Required | No |
| Validation | min: 0 |
Description: Estimated time for delivery to this zone. Added to preparation time for total delivery estimate.
Business Logic:
- Total delivery time = Prep time + Zone estimated time
- Shown to customer as estimate
- Does not affect capacity calculations
Customer Impact:
- Online Ordering: "Estimated delivery: X-Y minutes"
- Order Confirmation: Estimated arrival time shown
Examples:
- Zone 1 (nearby): 15 minutes
- Zone 2 (medium): 25 minutes
- Zone 3 (far): 40 minutes
Zone Enabled
| Property | Value |
|---|---|
| Field ID | enabled |
| Label | Zone Active |
| Type | Toggle |
| Default | true |
| Required | No |
Description: Enable or disable this delivery zone without deleting it.
Customer Impact:
- Disabled: Postal codes in this zone treated as "no delivery available"
- Enabled: Normal delivery available
Use Cases:
- Temporarily disable far zones during busy periods
- Seasonal zone adjustments
- Testing new zones
Sort Order
| Property | Value |
|---|---|
| Field ID | sort_order |
| Label | Sort Order |
| Type | Number |
| Default | 0 |
| Required | No |
Description: Order in which zones are checked for postal code matching. Lower numbers checked first.
Business Logic:
- If postal code exists in multiple zones, first match (lowest sort order) wins
- Useful for overlapping zones with different pricing
Business Logic
Zone Matching Algorithm
Customer enters delivery address
│
▼
Extract postal code from address
│
▼
For each zone (sorted by sort_order):
│
├── Is zone enabled? No → Skip
│
├── Is postal code in zone? No → Next zone
│
└── Match found!
│
▼
Return zone settings:
- Delivery fee
- Minimum order
- Estimated time
│
▼
No match found → "Delivery not available"Delivery Time Calculation
Preparation Time (from Online Ordering settings)
+
Zone Estimated Time
=
Total Estimated Delivery Time
Example:
- Prep time: 20 minutes
- Zone time: 25 minutes
- Total: 45 minutes
- If ordered at 12:00, estimated delivery: 12:45Free Delivery Threshold
Some merchants offer free delivery above a certain order value:
If order subtotal >= Free Delivery Threshold:
Delivery fee = €0
Else:
Delivery fee = Zone delivery fee
Note: This is configured in Online Ordering settings,
not per-zone. Zone fee is the base fee before threshold.Customer Impact
Online Ordering Flow
- Customer selects "Delivery"
- Customer enters delivery address
- System extracts postal code
- System matches to zone
- If match:
- Show delivery fee
- Show minimum order (if any)
- Show estimated time
- If no match:
- Show "Delivery not available to your area"
- Suggest pickup instead
What Customer Sees
| Scenario | Customer Message |
|---|---|
| In zone, meets minimum | "Delivery fee: €X.XX" |
| In zone, below minimum | "Minimum order €X.XX for delivery" |
| Not in any zone | "Sorry, we don't deliver to your area" |
| Zone disabled | Same as "not in any zone" |
Relations
Depends On
- Locations: Zones are per-location
- Online Ordering: Must be enabled with delivery
Affects
- Online Ordering: Determines delivery availability
- Checkout: Adds delivery fee to total
- Order Confirmation: Shows delivery estimate
Related Features
Business Rules
- Postal code matching requires an exact match; partial matches or wildcard patterns are not supported.
- Zones are checked in sort order (lowest first); if a postal code appears in multiple zones, the first enabled match wins and its fee, minimum, and estimated time are applied.
- A zone's minimum order amount overrides the global minimum order amount configured in the online ordering settings.
- Disabled zones are completely skipped during matching; their postal codes are treated as if they do not exist, so customers in those areas see "delivery not available."
- The total estimated delivery time shown to customers is calculated as: location preparation time + zone estimated delivery time.
FAQs
- Can the same postal code be in multiple zones? Yes, but only the first matching zone (by sort order) is used. This can be useful for tiered pricing where you want a "premium" zone checked before a "standard" zone.
- What format should postal codes be in? Postal codes must match exactly as entered by the customer. Use the format standard for your country (e.g., "1012" for Netherlands, "10115" for Germany).
- Does disabling a zone delete it? No. Disabling a zone preserves all its settings. You can re-enable it at any time and all postal codes, fees, and settings will be restored.
- Can I offer free delivery for a specific zone? Yes. Set the delivery fee to 0 for that zone. You can also use the free delivery threshold in online ordering settings to waive fees above a certain order amount.
- How do I handle peak hours when I cannot deliver far? Disable the far-distance zones during busy periods and re-enable them when capacity allows. This is a manual toggle per zone.
Troubleshooting
Problem: "Delivery not available to your area"
Causes:
- Postal code not in any zone
- Zone containing postal code is disabled
- Delivery disabled globally
Solutions:
- Add postal code to appropriate zone
- Enable the zone
- Enable delivery in Online Ordering settings
Diagnostic Steps:
- Get customer's postal code
- Check each zone's postal code list
- Verify zone is enabled
- Verify delivery is enabled globally
Problem: Wrong delivery fee showing
Causes:
- Postal code in wrong zone
- Multiple zones contain same postal code (first match wins)
- Free delivery threshold applying
Solutions:
- Move postal code to correct zone
- Adjust zone sort order
- Check free delivery threshold settings
Problem: Delivery time estimate seems wrong
Causes:
- Zone estimated time incorrect
- Preparation time too high/low
- Delivery delay setting in Online Ordering
Solutions:
- Adjust zone's estimated time
- Review preparation time setting
- Check delivery delay setting
Examples
Small City Restaurant
json
{
"zones": [
{
"name": "City Center",
"postal_codes": ["1000", "1010", "1020"],
"delivery_fee": 2.50,
"minimum_order_amount": 15,
"estimated_time": 20,
"enabled": true,
"sort_order": 1
},
{
"name": "Suburbs",
"postal_codes": ["1100", "1110", "1120", "1200", "1210"],
"delivery_fee": 4.50,
"minimum_order_amount": 25,
"estimated_time": 35,
"enabled": true,
"sort_order": 2
}
]
}Large City with Many Zones
json
{
"zones": [
{
"name": "Zone A - Walking Distance",
"postal_codes": ["10001", "10002", "10003"],
"delivery_fee": 0,
"minimum_order_amount": 10,
"estimated_time": 15,
"sort_order": 1
},
{
"name": "Zone B - 0-2km",
"postal_codes": ["10004", "10005", "10006", "10007"],
"delivery_fee": 2.00,
"minimum_order_amount": 15,
"estimated_time": 20,
"sort_order": 2
},
{
"name": "Zone C - 2-5km",
"postal_codes": ["10010", "10011", "10012", "10013", "10014", "10015"],
"delivery_fee": 4.00,
"minimum_order_amount": 20,
"estimated_time": 30,
"sort_order": 3
},
{
"name": "Zone D - 5-10km",
"postal_codes": ["10020", "10021", "10022", "10023", "10024", "10025", "10026", "10027", "10028", "10029"],
"delivery_fee": 6.00,
"minimum_order_amount": 30,
"estimated_time": 45,
"sort_order": 4
}
]
}Peak Hours Zone Restriction
Disable far zones during busy periods:
json
{
"zones": [
{
"name": "Close - Always Available",
"postal_codes": ["1000", "1001", "1002"],
"delivery_fee": 2.50,
"enabled": true
},
{
"name": "Far - Off-Peak Only",
"postal_codes": ["2000", "2001", "2002"],
"delivery_fee": 5.00,
"enabled": false // Disable during lunch/dinner rush
}
]
}Merchant manually toggles "Far" zone based on kitchen capacity.