Appearance
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. Thetypeis one of three modes —Postal Code,Radius, orDistance(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, orFree 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 isPostal Codeand the fee type is notFree delivery. - Distance-Based Pricing (
delivery_fee.distance_pricing_enabled): Optional pricing by driving distance, available when the region type isRadiusorDistanceand the fee type is notFree delivery. Can betiered(per-distance-band fees) orflat_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-officeprefix, and is gated by theedit-online-orderingpermission (the matching read isGET /back-office/online-ordering/{locationId}withview-online-ordering). Validated byapp/Http/Requests/BackOffice/OnlineOrdering/StoreOnlineOrderingRequest.php - Vue Component:
src/views/online/online-ordering/forms/DeliverySettings.vue(mounted insidesrc/views/online/online-ordering/OnlineOrdering.vue)
Fields
Delivery Region Type
| Property | Value |
|---|---|
| Field ID | delivery_region.type |
| Label | Delivery Region |
| Type | Choice (Postal Code / Radius / Distance) |
| Default | Radius |
| Validation | required, 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
| Property | Value |
|---|---|
| Field ID | delivery_region.radius |
| Label | I deliver within an area of |
| Type | Number (km) |
| Default | 10 |
| Validation | required when region type is Radius, numeric |
Description: Straight-line radius of the delivery area, in km. Used when region type is Radius.
Max Distance
| Property | Value |
|---|---|
| Field ID | delivery_region.max_distance |
| Label | I deliver within a driving route distance of |
| Type | Number (km) |
| Default | 10 |
| Validation | required 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
| Property | Value |
|---|---|
| Field ID | delivery_region.postal_codes |
| Label | Postal codes you deliver to |
| Type | List of strings |
| Default | [] (empty) |
| Validation | required 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
| Property | Value |
|---|---|
| Field ID | delivery_fee.type |
| Label | Delivery Fee |
| Type | Choice (DeliveryFeeTypes) |
| Default | Free delivery |
| Validation | required, must be a valid DeliveryFeeTypes value |
Description: The delivery fee model. Valid values (from the DeliveryFeeTypes enum):
Free deliveryCharge delivery fee for all ordersFree delivery for orders over a certain amount
Delivery Fee
| Property | Value |
|---|---|
| Field ID | delivery_fee.fee |
| Label | Delivery fee for all other orders |
| Type | Currency (€) |
| Default | 0 |
| Validation | required 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
| Property | Value |
|---|---|
| Field ID | delivery_fee.minimum_order_amount_for_free_delivery |
| Label | The total order amount needs to be over … to qualify for free delivery |
| Type | Currency (€) |
| Default | 0 |
| Validation | required 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
| Property | Value |
|---|---|
| Field ID | delivery_fee.custom_fees |
| Label | Custom Fees by Postal Code |
| Type | Array of { postal_code, fee } |
| Default | [] (empty) |
| Validation | nullable 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
| Property | Value |
|---|---|
| Field ID | delivery_fee.distance_pricing_enabled |
| Label | Route Distance-Based Pricing |
| Type | Toggle |
| Default | false |
| Validation | nullable 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
| Property | Value |
|---|---|
| Field ID | delivery_fee.distance_pricing_type |
| Label | Tiered / Flat Rate |
| Type | Choice (tiered / flat_rate) |
| Default | tiered |
| Validation | nullable string, must be tiered or flat_rate |
Description: How distance-based pricing is computed when distance_pricing_enabled is true.
Distance Fees (Tiered)
| Property | Value |
|---|---|
| Field ID | delivery_fee.distance_fees |
| Label | Rules |
| Type | Array of { max_km, fee } |
| Default | [] (empty) |
| Validation | nullable 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
| Property | Value |
|---|---|
| Field ID | delivery_fee.flat_rate_per_km |
| Label | Price per km |
| Type | Currency (€ / km) |
| Default | 0 |
| Validation | required, 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
| Property | Value |
|---|---|
| Field ID | minimum_order_amount.enabled |
| Label | Delivery minimum order amount |
| Type | Toggle |
| Default | false |
| Validation | required boolean |
Description: When on, a minimum order value is required before a delivery order is eligible.
Delivery Minimum Order Amount
| Property | Value |
|---|---|
| Field ID | minimum_order_amount.amount |
| Label | Minimum order amount |
| Type | Currency (€) |
| Default | 10 |
| Validation | required 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
DeliveryFeeTypesenum and is exactly one of:Free delivery,Charge delivery fee for all orders, orFree 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_deliveryis required only when the fee type isFree delivery for orders over a certain amount. Above that threshold the order qualifies for free delivery; below it the basedelivery_fee.feeapplies.- Custom per-postal-code fees (
delivery_fee.custom_fees) are only available whendelivery_region.typeisPostal Codeand the fee type is notFree delivery; the selectable postal codes are those configured indelivery_region.postal_codes. - Distance-based pricing (
delivery_fee.distance_pricing_enabled) is only available whendelivery_region.typeisRadiusorDistanceand the fee type is notFree delivery. It is eithertiered(per-band fees indistance_fees) orflat_rate(price per km inflat_rate_per_km). For tiered pricing, if no rule matches, the defaultdelivery_fee.feeis used. - Tiered distance rules must be in increasing distance order: each tier's
max_kmmust be greater than the previous tier'smax_km, and fees cannot be negative. - The delivery region type determines which region field is required:
Radiusrequiresdelivery_region.radius,Distancerequiresdelivery_region.max_distance(min 1), andPostal Coderequires at least one entry indelivery_region.postal_codes. - The delivery minimum order amount (
minimum_order_amount.amount) is only required whenminimum_order_amount.enabledis true. - This
minimum_order_amountis 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.
Radiuscovers a straight-line area,Distance(shown as "Route") uses real driving-route distance, andPostal Codelets you list exact postal codes you serve. - Can I charge different fees in different areas? Yes. With a
Postal Coderegion you can set custom fees per postal code. With aRadiusorDistanceregion 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 ownpickup_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).
Related Features
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
}
}