Skip to content

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

PropertyValue
Field IDname
LabelZone Name
TypeText
RequiredYes
Validationmax: 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

PropertyValue
Field IDpostal_codes
LabelPostal Codes
TypeArray of strings
RequiredYes
ValidationAt 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

PropertyValue
Field IDdelivery_fee
LabelDelivery Fee
TypeCurrency
Default0
RequiredNo
Validationmin: 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

PropertyValue
Field IDminimum_order_amount
LabelMinimum Order
TypeCurrency
Default0
RequiredNo
Validationmin: 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

PropertyValue
Field IDestimated_time
LabelEstimated Delivery Time
TypeNumber
UnitMinutes
Default30
RequiredNo
Validationmin: 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

PropertyValue
Field IDenabled
LabelZone Active
TypeToggle
Defaulttrue
RequiredNo

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

PropertyValue
Field IDsort_order
LabelSort Order
TypeNumber
Default0
RequiredNo

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:45

Free 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

  1. Customer selects "Delivery"
  2. Customer enters delivery address
  3. System extracts postal code
  4. System matches to zone
  5. If match:
    • Show delivery fee
    • Show minimum order (if any)
    • Show estimated time
  6. If no match:
    • Show "Delivery not available to your area"
    • Suggest pickup instead

What Customer Sees

ScenarioCustomer 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 disabledSame 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

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:

  1. Postal code not in any zone
  2. Zone containing postal code is disabled
  3. Delivery disabled globally

Solutions:

  1. Add postal code to appropriate zone
  2. Enable the zone
  3. Enable delivery in Online Ordering settings

Diagnostic Steps:

  1. Get customer's postal code
  2. Check each zone's postal code list
  3. Verify zone is enabled
  4. Verify delivery is enabled globally

Problem: Wrong delivery fee showing

Causes:

  1. Postal code in wrong zone
  2. Multiple zones contain same postal code (first match wins)
  3. Free delivery threshold applying

Solutions:

  1. Move postal code to correct zone
  2. Adjust zone sort order
  3. Check free delivery threshold settings

Problem: Delivery time estimate seems wrong

Causes:

  1. Zone estimated time incorrect
  2. Preparation time too high/low
  3. Delivery delay setting in Online Ordering

Solutions:

  1. Adjust zone's estimated time
  2. Review preparation time setting
  3. 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.