Skip to content

Delivery Settings

Overview

Delivery Settings control whether a location accepts delivery orders and how delivery is priced and bounded. They are not a standalone page: they are the Delivery Settings section inside the Online Ordering configuration screen, stored as part of the location's online ordering settings object.

Key Purpose: Configure the delivery region, delivery fee, and delivery minimum order amount for a location.

Purpose

This section lets you configure the delivery-related parts of online ordering for a location:

  • The delivery region (postal codes, a radius, or a driving-route distance) that defines where you deliver.
  • The delivery fee model (free, flat charge, or free over a threshold), plus optional per-postal-code custom fees and distance-based pricing.
  • The delivery minimum order amount required before a delivery order can be placed.

Whether delivery is enabled at all (the delivery.enabled toggle), delivery preparation delay (delivery.delay), delivery cutoffs (delivery.same_day_cutoff / delivery.next_day_cutoff), and future-day scheduling (schedule_order_for_future_days.delivery) live in the broader Online Ordering settings — see Online Ordering.

Key Concepts

  • Delivery Region (delivery_region): Defines the geographic area you serve. The type is one of three modes — Postal Code, Radius, or Distance (route distance). Customers outside this area cannot have orders delivered from the location.
  • Delivery Fee Type (delivery_fee.type): One of three models — Free delivery, Charge delivery fee for all orders, or Free delivery for orders over a certain amount.
  • Custom Fees by Postal Code (delivery_fee.custom_fees): Per-postal-code fee overrides, available only when the region type is Postal Code and the fee type is not Free delivery.
  • Distance-Based Pricing (delivery_fee.distance_pricing_enabled): Optional pricing by driving distance, available when the region type is Radius or Distance and the fee type is not Free delivery. Can be tiered (per-distance-band fees) or flat_rate (price per km).
  • Delivery Minimum Order Amount (minimum_order_amount): A minimum order value required before a delivery order is eligible.

Actions

Set the Delivery Region

Choose Postal Code, Radius, or Distance. For Radius, enter the area radius in km (delivery_region.radius). For Distance, enter the driving-route distance in km (delivery_region.max_distance). For Postal Code, add the postal codes you deliver to (delivery_region.postal_codes).

Set the Delivery Fee

Pick the delivery fee type. If it is not Free delivery, enter the base fee (delivery_fee.fee). For Free delivery for orders over a certain amount, also enter the order amount that qualifies for free delivery (delivery_fee.minimum_order_amount_for_free_delivery). Optionally configure custom per-postal-code fees (Postal Code region) or distance-based pricing (Radius / Distance region).

Set the Delivery Minimum Order Amount

Toggle minimum_order_amount.enabled on and enter the required amount (minimum_order_amount.amount).

Location

  • Backoffice Route: /online/online-ordering (nav: Online → Online Ordering, section Delivery Settings, id="DeliverySettings")
  • Backend Controller: app/Http/Controllers/Api/BackOffice/OnlineOrderingController.php (show / update)
  • Save Endpoint: PUT /back-office/online-ordering/{locationId} — the route group sits inside the /back-office prefix, and is gated by the edit-online-ordering permission (the matching read is GET /back-office/online-ordering/{locationId} with view-online-ordering). Validated by app/Http/Requests/BackOffice/OnlineOrdering/StoreOnlineOrderingRequest.php
  • Vue Component: src/views/online/online-ordering/forms/DeliverySettings.vue (mounted inside src/views/online/online-ordering/OnlineOrdering.vue)

Fields

Delivery Region Type

PropertyValue
Field IDdelivery_region.type
LabelDelivery Region
TypeChoice (Postal Code / Radius / Distance)
DefaultRadius
Validationrequired, must be a valid DeliveryRegionOptions value

Description: Defines how the delivery coverage area is determined. Distance is shown in the UI as "Route" (driving-route distance).


Radius

PropertyValue
Field IDdelivery_region.radius
LabelI deliver within an area of
TypeNumber (km)
Default10
Validationrequired when region type is Radius, numeric

Description: Straight-line radius of the delivery area, in km. Used when region type is Radius.


Max Distance

PropertyValue
Field IDdelivery_region.max_distance
LabelI deliver within a driving route distance of
TypeNumber (km)
Default10
Validationrequired when region type is Distance, numeric, min: 1

Description: Maximum driving-route distance, in km. Used when region type is Distance. The UI notes it "uses real driving route distance to determine if delivery is available."


Postal Codes

PropertyValue
Field IDdelivery_region.postal_codes
LabelPostal codes you deliver to
TypeList of strings
Default[] (empty)
Validationrequired when region type is Postal Code; each entry is a required string

Description: The postal codes the location delivers to. The UI hints "3 - 10 Characters code" and enforces a minimum of 4 digits per entry, numeric only.


Delivery Fee Type

PropertyValue
Field IDdelivery_fee.type
LabelDelivery Fee
TypeChoice (DeliveryFeeTypes)
DefaultFree delivery
Validationrequired, must be a valid DeliveryFeeTypes value

Description: The delivery fee model. Valid values (from the DeliveryFeeTypes enum):

  • Free delivery
  • Charge delivery fee for all orders
  • Free delivery for orders over a certain amount

Delivery Fee

PropertyValue
Field IDdelivery_fee.fee
LabelDelivery fee for all other orders
TypeCurrency (€)
Default0
Validationrequired and numeric when fee type is not Free delivery

Description: The base delivery fee charged. Not required when the fee type is Free delivery.


Minimum Order Amount for Free Delivery

PropertyValue
Field IDdelivery_fee.minimum_order_amount_for_free_delivery
LabelThe total order amount needs to be over … to qualify for free delivery
TypeCurrency (€)
Default0
Validationrequired and numeric only when fee type is Free delivery for orders over a certain amount

Description: The order amount at or above which delivery becomes free. Below it, delivery_fee.fee is charged.


Custom Fees by Postal Code

PropertyValue
Field IDdelivery_fee.custom_fees
LabelCustom Fees by Postal Code
TypeArray of { postal_code, fee }
Default[] (empty)
Validationnullable array; each entry requires a numeric fee and a string postal_code

Description: Per-postal-code fee overrides. Shown only when the region type is Postal Code and the fee type is not Free delivery. Postal codes selectable here come from delivery_region.postal_codes.


Distance Pricing Enabled

PropertyValue
Field IDdelivery_fee.distance_pricing_enabled
LabelRoute Distance-Based Pricing
TypeToggle
Defaultfalse
Validationnullable boolean

Description: Enables fee calculation based on driving distance. Shown only when the region type is Radius or Distance and the fee type is not Free delivery.


Distance Pricing Type

PropertyValue
Field IDdelivery_fee.distance_pricing_type
LabelTiered / Flat Rate
TypeChoice (tiered / flat_rate)
Defaulttiered
Validationnullable string, must be tiered or flat_rate

Description: How distance-based pricing is computed when distance_pricing_enabled is true.


Distance Fees (Tiered)

PropertyValue
Field IDdelivery_fee.distance_fees
LabelRules
TypeArray of { max_km, fee }
Default[] (empty)
Validationnullable array (when distance pricing is tiered); each tier requires max_km (numeric, > 0) and fee (numeric, min: 0)

Description: Per-distance-band fees, e.g. "for routes up to X km, charge €Y". Tiers must increase in distance. If no rule matches, the default delivery_fee.fee is used.


Flat Rate per km

PropertyValue
Field IDdelivery_fee.flat_rate_per_km
LabelPrice per km
TypeCurrency (€ / km)
Default0
Validationrequired, numeric, min: 0 when distance pricing type is flat_rate

Description: Price per km of driving route distance. The fee is the rate multiplied by the route distance rounded up to the nearest km (e.g. €1.50/km over 3.2 km = 4 × €1.50 = €6.00).


Delivery Minimum Order Amount Enabled

PropertyValue
Field IDminimum_order_amount.enabled
LabelDelivery minimum order amount
TypeToggle
Defaultfalse
Validationrequired boolean

Description: When on, a minimum order value is required before a delivery order is eligible.


Delivery Minimum Order Amount

PropertyValue
Field IDminimum_order_amount.amount
LabelMinimum order amount
TypeCurrency (€)
Default10
Validationrequired and numeric when minimum_order_amount.enabled is true

Description: The minimum order value required for delivery when the toggle is enabled.


Business Rules

  • The delivery fee type comes from the DeliveryFeeTypes enum and is exactly one of: Free delivery, Charge delivery fee for all orders, or Free delivery for orders over a certain amount.
  • When the fee type is Free delivery, no fee fields are required; delivery_fee.fee, custom fees, and distance-based pricing are all hidden/skipped.
  • delivery_fee.minimum_order_amount_for_free_delivery is required only when the fee type is Free delivery for orders over a certain amount. Above that threshold the order qualifies for free delivery; below it the base delivery_fee.fee applies.
  • Custom per-postal-code fees (delivery_fee.custom_fees) are only available when delivery_region.type is Postal Code and the fee type is not Free delivery; the selectable postal codes are those configured in delivery_region.postal_codes.
  • Distance-based pricing (delivery_fee.distance_pricing_enabled) is only available when delivery_region.type is Radius or Distance and the fee type is not Free delivery. It is either tiered (per-band fees in distance_fees) or flat_rate (price per km in flat_rate_per_km). For tiered pricing, if no rule matches, the default delivery_fee.fee is used.
  • Tiered distance rules must be in increasing distance order: each tier's max_km must be greater than the previous tier's max_km, and fees cannot be negative.
  • The delivery region type determines which region field is required: Radius requires delivery_region.radius, Distance requires delivery_region.max_distance (min 1), and Postal Code requires at least one entry in delivery_region.postal_codes.
  • The delivery minimum order amount (minimum_order_amount.amount) is only required when minimum_order_amount.enabled is true.
  • This minimum_order_amount is the delivery minimum and is separate from the pickup minimum (pickup_minimum_order_amount); see Online Ordering.

FAQs

  • What delivery fee options are there? Three: free delivery, a flat charge on all orders, or free delivery only when the order is over a set amount (otherwise the base fee applies).
  • How do I decide where I deliver? Choose a delivery region type. Radius covers a straight-line area, Distance (shown as "Route") uses real driving-route distance, and Postal Code lets you list exact postal codes you serve.
  • Can I charge different fees in different areas? Yes. With a Postal Code region you can set custom fees per postal code. With a Radius or Distance region you can enable distance-based pricing, either tiered bands or a flat price per km.
  • How does the free-delivery-over-amount option work? You set a qualifying order amount. Orders at or above it ship free; orders below it are charged the base delivery fee.
  • How is the per-km flat rate calculated? The route distance is rounded up to the nearest km and multiplied by the per-km rate (e.g. €1.50/km over 3.2 km = 4 × €1.50 = €6.00).
  • Is the delivery minimum separate from the pickup minimum? Yes. The delivery minimum is minimum_order_amount; pickup has its own pickup_minimum_order_amount.
  • Where do I turn delivery on or set delivery prep time and cutoffs? Those are in the broader Online Ordering settings (delivery.enabled, delivery.delay, delivery.same_day_cutoff / next_day_cutoff), not in this section — see Online Ordering.

Relations

Depends On

  • Locations: Delivery settings are stored on the location's online ordering settings object.
  • Online Ordering: Delivery enable/disable, prep delay, cutoffs, and future-day scheduling live there.

Affects

  • Online Ordering storefront: Region, fee, and minimum determine delivery availability and pricing at checkout (storefront behavior not verified here).

Examples

The delivery settings are stored as part of the online ordering settings object. The shapes below match StoreOnlineOrderingRequest validation and the Constants::$DEFAULT_ONLINE_ORDERING_SETTING defaults.

Default (Free Delivery, Radius Region)

json
{
  "delivery_region": {
    "type": "Radius",
    "postal_codes": [],
    "radius": 10,
    "max_distance": 10
  },
  "delivery_fee": {
    "type": "Free delivery",
    "minimum_order_amount_for_free_delivery": 0,
    "fee": 0,
    "distance_pricing_enabled": false,
    "distance_pricing_type": "tiered",
    "distance_fees": [],
    "flat_rate_per_km": 0
  },
  "minimum_order_amount": {
    "enabled": false,
    "amount": 10
  }
}

Flat Charge on All Orders + Delivery Minimum

json
{
  "delivery_region": {
    "type": "Radius",
    "radius": 8
  },
  "delivery_fee": {
    "type": "Charge delivery fee for all orders",
    "fee": 3.5
  },
  "minimum_order_amount": {
    "enabled": true,
    "amount": 15
  }
}

Free Delivery Over a Threshold

json
{
  "delivery_fee": {
    "type": "Free delivery for orders over a certain amount",
    "minimum_order_amount_for_free_delivery": 25,
    "fee": 3.5
  }
}

Postal-Code Region with Custom Fees

json
{
  "delivery_region": {
    "type": "Postal Code",
    "postal_codes": ["1012", "1013"]
  },
  "delivery_fee": {
    "type": "Charge delivery fee for all orders",
    "fee": 4.5,
    "custom_fees": [
      { "postal_code": "1012", "fee": 3 },
      { "postal_code": "1013", "fee": 6 }
    ]
  }
}

Distance Region with Tiered Distance Pricing

json
{
  "delivery_region": {
    "type": "Distance",
    "max_distance": 12
  },
  "delivery_fee": {
    "type": "Charge delivery fee for all orders",
    "fee": 5,
    "distance_pricing_enabled": true,
    "distance_pricing_type": "tiered",
    "distance_fees": [
      { "max_km": 5, "fee": 3 },
      { "max_km": 10, "fee": 5 }
    ]
  }
}

Distance Region with Flat Rate per km

json
{
  "delivery_region": {
    "type": "Distance",
    "max_distance": 12
  },
  "delivery_fee": {
    "type": "Charge delivery fee for all orders",
    "fee": 5,
    "distance_pricing_enabled": true,
    "distance_pricing_type": "flat_rate",
    "flat_rate_per_km": 1.5
  }
}