Skip to content

Online Ordering Setup

Overview

Online Ordering allows customers to place pickup and delivery orders through a web-based ordering system. This is the primary channel for remote orders.

Key Purpose: Enable customers to order food online for pickup or delivery.

Purpose

This page lets you enable and configure the online ordering channel for a location, including pickup/delivery toggles, preparation times, scheduling options, and order acceptance controls.

Key Concepts

  • Online Ordering Setting: A nested settings object stored on the location record that controls all online ordering behavior including enabled state, prep time, delays, scheduling, and snooze status.
  • Snooze: A temporary pause mechanism with options to snooze for 20, 40, or 60 minutes, for the rest of the business day, or indefinitely ("don't accept"). The snoozed_until field stores either a Unix timestamp or the string value for permanent pause.
  • Subscription: Enabling online ordering triggers a Stripe subscription for the location. The system handles new subscriptions, retries for incomplete payments, and cancellations automatically.
  • Landing Page Image: An optional image uploaded for the online ordering landing page, processed through Cloudflare Images and stored as both a content ID and a Cloudflare image ID.
  • Custom Scheduled Orders: When enabled, orders placed far in advance (beyond hours_in_advance threshold) are held and sent to the kitchen only minutes_before_pickup_delivery_time before the scheduled time.

Actions

Configure Online Ordering

Update the full online ordering settings for a location, including enabling/disabling pickup and delivery, setting preparation times, configuring scheduling options, and uploading a landing page image. Saving triggers a subscription if not already active and fires a ReloadMenu event.

Snooze Orders

Temporarily pause order acceptance using preset durations (20, 40, or 60 minutes), pause for the rest of the business day, resume accepting orders, or stop accepting indefinitely. The snooze state is stored on the location and propagated to the ordering frontend.

View Settings

Retrieve the current online ordering configuration for a location. If no settings exist yet, default settings are automatically initialized.

Location

  • Backoffice Route: /online/online-ordering (nav: Online → Online Ordering)
  • Backend Controller: app/Http/Controllers/Api/BackOffice/OnlineOrderingController.php
  • Vue Component: src/views/online/online-ordering/OnlineOrdering.vue
  • Online Ordering App: zestidoo-online-ordering-testing-3

Fields

Enable Online Ordering

PropertyValue
Field IDenabled
LabelEnable Online Ordering
TypeToggle
Defaultfalse
RequiredNo

Description: Master switch to enable/disable online ordering for this location.

Customer Impact:

  • Enabled: Customers can access ordering page
  • Disabled: Ordering page shows "Online ordering not available"

Accepting Orders

PropertyValue
Field IDaccepting_orders
LabelAccepting Orders
TypeToggle
Defaulttrue
RequiredNo

Description: Temporarily pause orders without disabling the entire system. Useful during unexpected busy periods or emergencies.

Customer Impact:

  • On: Normal ordering available
  • Off: "We're not accepting orders right now" message

Use Cases:

  • Kitchen emergency
  • Unexpected rush
  • Staff shortage
  • Equipment failure

Enable Pickup

PropertyValue
Field IDtakeout.enabled
LabelEnable Pickup
TypeToggle
Defaulttrue
RequiredNo

Description: Allow customers to place pickup orders. Stored as takeout.enabled in the online ordering settings object.

Customer Impact:

  • Enabled: "Pickup" option shown at checkout
  • Disabled: Only delivery available (if enabled)

Enable Delivery

PropertyValue
Field IDdelivery.enabled
LabelEnable Delivery
TypeToggle
Defaultfalse
RequiredNo
Depends OnRequires at least one Delivery Zone configured

Description: Allow customers to place delivery orders. Stored as delivery.enabled in the online ordering settings object. Default is false (unlike pickup which defaults to true).

Customer Impact:

  • Enabled: "Delivery" option shown at checkout
  • Disabled: Only pickup available (if enabled)

Note: Even if enabled, delivery only works if customer's address is in a configured delivery zone.


Minimum Order Amount

PropertyValue
Field IDminimum_order_amount.enabled (toggle) + minimum_order_amount.amount (currency)
LabelMinimum Order Amount
TypeToggle + Currency
Defaultenabled: false, amount: 10
RequiredNo
Validationmin: 0

Description: Minimum order value required to place an order. Has a separate toggle (minimum_order_amount.enabled) and value (minimum_order_amount.amount). Orders below this amount are blocked at checkout when enabled.

Customer Impact:

  • Below minimum: "Minimum order amount is €X.XX" error
  • Cart shows how much more needed: "Add €Y.YY more to order"

Business Logic:

  • Checked at checkout, not during browsing
  • Applies to subtotal before delivery fees
  • Delivery zones can have their own minimums (override this)

Preparation Time

PropertyValue
Field IDaverage_prep_time (Location setting)
LabelAverage Preparation Time
TypeNumber
UnitMinutes
SourceLocation record (read-only on the Online Ordering page)

Description: Average time needed to prepare an order. This is a location-level setting (the average_prep_time property on the Location record), not an Online Ordering field — it is not part of the online ordering settings object or StoreOnlineOrderingRequest. It is shown read-only on the Online Ordering page; set it under Settings → Locations. It affects the earliest available pickup/delivery time, and each channel can add a delay on top of it (see Pickup Delay / Delivery Delay).

Business Logic:

  • Earliest time = Now + Preparation Time + Channel Delay
  • For pickup: Earliest = Now + Prep Time + Pickup Delay
  • For delivery: Earliest = Now + Prep Time + Delivery Delay

Customer Impact:

  • If prep time is 20 min and it's 12:00, earliest pickup is 12:20
  • Longer prep time = later earliest available slot

Examples:

  • Fast food: 10-15 minutes
  • Casual dining: 20-30 minutes
  • Fine dining: 45-60 minutes

Pickup Delay

PropertyValue
Field IDtakeout.delay
LabelAdditional Pickup Time
TypeNumber
UnitMinutes
Default0
RequiredNo
Validationmin: 0

Description: Additional time added to preparation time for pickup orders. Use for buffer time.

Business Logic:

  • Pickup earliest = Now + Prep Time + Pickup Delay
  • Gives kitchen extra buffer for pickup orders

Delivery Delay

PropertyValue
Field IDdelivery.delay
LabelAdditional Delivery Time
TypeNumber
UnitMinutes
Default0
RequiredNo
Validationmin: 0

Description: Additional time added to preparation time for delivery orders. Accounts for delivery travel time.

Business Logic:

  • Delivery earliest = Now + Prep Time + Delivery Delay
  • Should account for average delivery distance

Note: Delivery zones can have their own estimated times that override this.


Scheduled Orders (Pickup)

PropertyValue
Field IDschedule_order_for_future_days.takeout.enabled
LabelAllow Scheduled Pickup Orders
TypeToggle
Defaulttrue
RequiredNo

Description: Allow customers to schedule pickup orders for future times/dates.


Scheduled Pickup Days Ahead

PropertyValue
Field IDschedule_order_for_future_days.takeout.days_in_advance
LabelPickup Days in Advance
TypeNumber
UnitDays
Default30
RequiredYes (if scheduled pickup enabled)
Validationmax: 365

Description: How many days in advance customers can schedule pickup orders.


Scheduled Orders (Delivery)

PropertyValue
Field IDschedule_order_for_future_days.delivery.enabled
LabelAllow Scheduled Delivery Orders
TypeToggle
Defaultfalse
RequiredNo

Description: Allow customers to schedule delivery orders for future times/dates.


Scheduled Delivery Days Ahead

PropertyValue
Field IDschedule_order_for_future_days.delivery.days_in_advance
LabelDelivery Days in Advance
TypeNumber
UnitDays
Default30
RequiredYes (if scheduled delivery enabled)
Validationmax: 365

Description: How many days in advance customers can schedule delivery orders.


Custom Scheduled Orders

PropertyValue
Field IDcustom_scheduled_orders
LabelCustom Scheduled Order Handling
TypeToggle
Defaultfalse
RequiredNo

Description: Enable custom timing for when scheduled orders are sent to the kitchen.

Business Logic:

  • Disabled: Orders sent to kitchen immediately
  • Enabled: Orders sent based on hours_in_advance and minutes_before_pickup_delivery_time

Hours in Advance

PropertyValue
Field IDhours_in_advance
LabelHours in Advance Threshold
TypeNumber
UnitHours
DefaultNone (no default; only present/required when custom_scheduled_orders is enabled)
RequiredYes (if custom scheduled enabled), min: 1
Depends Oncustom_scheduled_orders must be true

Description: If order is placed more than X hours before pickup/delivery time, use delayed sending.

Business Logic:

  • Order placed > X hours ahead → Send to kitchen at (pickup time - minutes_before)
  • Order placed < X hours ahead → Send to kitchen immediately

Minutes Before Pickup/Delivery

PropertyValue
Field IDminutes_before_pickup_delivery_time
LabelSend to Kitchen Before
TypeNumber
UnitMinutes
DefaultNone (no default; only present/required when custom_scheduled_orders is enabled)
RequiredYes (if custom scheduled enabled), min: 1
Depends Oncustom_scheduled_orders must be true

Description: For orders placed far in advance, send to kitchen this many minutes before pickup/delivery time.

Example:

  • Customer orders at 8:00 AM for 6:00 PM pickup (10 hours ahead)
  • hours_in_advance = 6 hours
  • minutes_before_pickup_delivery_time = 60 minutes
  • Order sent to kitchen at 5:00 PM (60 min before pickup)

Payment Methods (Checkout)

Online-ordering payment methods are configured under Online Ordering settings → Checkout → Payment methods. Card / Bancontact are the standard online payment methods. One additional, deferred-payment method can be enabled:

Invoice (Pay by Invoice)

PropertyValue
Field IDpayment_methods.invoice_enabled
LabelInvoice
TypeToggle
DefaultOff
AvailabilityMplus locations only (the option is hidden for non-Mplus tenants)

Description: Lets business (B2B) customers choose Invoice at checkout instead of paying online. Those orders are submitted to the POS as unpaid/open and are billed later from the Invoice Collection page (see the Invoice Collection feature).

Business Logic:

  • When enabled, an Invoice option appears at online-ordering checkout for the location.
  • Invoice orders are not charged online; the merchant bills the customer afterwards via Invoice Collection (issued through Stripe).
  • Only shown for Mplus tenants.

Note: Cash on Delivery (COD) is not currently available in production, so it is not offered at checkout.


Business Logic

Order Flow

Customer places order


Validate order:
├── Check business hours
├── Check capacity
├── Check minimum order
├── Check delivery zone (if delivery)
├── Check item availability
└── Check payment


Calculate times:
├── order_prep_time = earliest slot available
├── order_date = order_prep_time + prep_time
└── sent_at = when to send to kitchen


Process payment


Create transaction


Send to KDS (based on sent_at)

Time Calculation

Current Time: 12:00
Prep Time: 20 min
Pickup Delay: 5 min
Delivery Delay: 15 min

Pickup earliest: 12:00 + 20 + 5 = 12:25
Delivery earliest: 12:00 + 20 + 15 = 12:35

With 15-min slots:
Pickup slots: 12:30, 12:45, 13:00...
Delivery slots: 12:45, 13:00, 13:15...

Customer Impact

Online Ordering Experience

  1. Landing Page: Shows location info, menu preview
  2. Menu: Browse categories and items
  3. Item Detail: Select modifiers, add to cart
  4. Cart: Review order, apply promo codes
  5. Checkout: Choose pickup/delivery, select time, enter details
  6. Payment: Complete payment
  7. Confirmation: Order number, estimated time

What Settings Affect

SettingCustomer Sees
Enabled = false"Online ordering not available"
Accepting = false"Not accepting orders right now"
Pickup disabledNo pickup option
Delivery disabledNo delivery option
Minimum order"Add €X more to order"
Prep timeEarliest available time
Scheduled days in advanceCalendar date range

Relations

Depends On

  • Locations: Online ordering is per-location
  • Business Hours: Available times within hours
  • Menus: What items are available
  • Delivery Zones: Where delivery is available

Affects

  • Order Capacity: Orders consume capacity
  • Transactions: Orders create transactions
  • KDS: Orders sent to kitchen
  • Inventory: Stock decremented

Business Rules

  • Saving online ordering settings automatically creates a Stripe subscription for the location if one does not already exist; incomplete subscriptions are retried before creating new ones.
  • The snooze feature uses the location's timezone to calculate expiry; "rest of business day" sets the snooze until the start of the next day, while "don't accept" stores a permanent flag rather than a timestamp.
  • Delivery zones can override the global minimum order amount; the zone-specific minimum takes precedence when a customer's postal code matches a configured zone.
  • The earliest available time slot is calculated as: current time + average preparation time + channel-specific delay (pickup delay or delivery delay).
  • Updating online ordering settings fires a ReloadMenu event scoped to the Online Ordering channel, ensuring the customer-facing ordering app reflects changes immediately.

FAQs

  • What is the difference between "Enabled" and "Accepting Orders"? "Enabled" is the master switch that controls whether the online ordering page is accessible at all. "Accepting Orders" is a temporary toggle to pause orders without taking the entire system offline.

  • How does snoozing work? Snoozing temporarily pauses order acceptance for a chosen duration (20, 40, or 60 minutes), the rest of the business day, or indefinitely. The snooze automatically expires when its timer runs out.

  • Do I need a payment provider before enabling online ordering? Yes. A connected payment provider and a Stripe subscription are required. The system attempts to create a subscription automatically when you save settings.

  • Can I have different preparation times for pickup and delivery? The base preparation time is a location-level setting (average_prep_time) shared by both channels, but you can add separate pickup delay (takeout.delay) and delivery delay (delivery.delay) values that extend the earliest available time slot for each channel independently.

  • "Where do I find Online Ordering settings in the back office?" Go to Online → Online Ordering. You must first select a location; settings are configured per location.

  • "How do I set my preparation time? I don't see it on the Online Ordering page." The base preparation time is a location-level setting, not an Online Ordering field. Set it under Settings → Locations ("Average preparation time"); the Online Ordering page shows it read-only and lets you add per-channel delays on top. On the Online Ordering / Pickup / Delivery cards you can choose "Use default preparation time" or "Add Delay" to extend the earliest slot for that channel.

  • "What are the snooze options and how long do they last?" Snooze choices are 20, 40, or 60 minutes, "For the rest of the day," "Do not accept" (indefinite pause), or "Accept online orders" (resume). Timed snoozes expire automatically; "rest of the day" lasts until the next day; "Do not accept" stays paused until you resume. Snooze uses the location's timezone.

  • "Can I have separate same-day and next-day cut-off times for pickup and delivery?" Yes. Pickup and delivery each have independent Same-day cut-off and Next-day cut-off toggles with a time. After the same-day cut-off, same-day ordering closes and customers must pick a later day; the next-day cut-off works the same for next-day ordering.

  • "When are pickup/delivery orders sent to my POS?" Under Receiving Orders → Send to POS you choose "Receive orders based on pickup and delivery time" (default — tickets sent based on prep time before the order is due) or "Receive orders when the order is placed" (sent immediately, even for future-scheduled orders).

  • "How is the order reference shown to staff and customers?" Under Receiving Orders → Order reference, pick Order number (unique tracking ID), Queue number (simple pickup number that resets daily), or Both. The default is Both.

  • "Can I require a different minimum order for pickup vs delivery?" Yes. There's a general Minimum order amount (toggle + amount) and a separate Pickup minimum order amount under Pickup Settings. Delivery can also have its own minimum via Delivery settings.

  • "What delivery fee models are available?" Three types: Free delivery, Charge a delivery fee for all orders, or Free delivery for orders over a certain amount. You can add custom fees by postal code, and optional route-distance pricing (tiered or flat rate per km).

  • "How do I define my delivery area?" Under Delivery Settings → Delivery Region, choose Radius (e.g. 10 km), Distance (driving-route distance), or Postal Code (list the exact postal codes you deliver to). Customers outside the region can't place delivery orders.

  • "How do I connect my own custom domain for ordering?" Add a subdomain (e.g. order.yourdomain.com — apex/root domains aren't supported), then add the CNAME record (routing) and the TXT record at _upvendo-verify.<domain> (ownership), and click Verify Domain. DNS can take 5-15 minutes; if you use Cloudflare DNS, set the CNAME proxy to OFF (grey cloud).

  • "How do I temporarily close a location but still take future orders?" Use Temporary Closure and set a reopening date ("Closed until"). Customers can still order, but only for dates on or after the reopening date. This is separate from snooze, which fully pauses acceptance.

  • "How do I let business customers pay by invoice instead of paying online?" Under Checkout → Payment methods, enable Invoice payment. This option only appears for Mplus tenants, and only customers whose account email is registered as a business in your POS can use it; those orders are billed later rather than charged online.

  • "What customer details can I require at checkout?" Under Checkout → Customer Information: Full name (require first and last, or only first) and Contact details (require email and phone, or only email). Defaults are first+last name and email+phone.


Troubleshooting

Problem: "Online ordering not available"

Causes:

  1. Online ordering disabled
  2. Location disabled
  3. No menu assigned

Solutions:

  1. Enable online ordering toggle
  2. Enable location in Settings
  3. Assign menu to location

Problem: No time slots available

Causes:

  1. Outside business hours
  2. Capacity limits reached
  3. All slots booked

Solutions:

  1. Check business hours configuration
  2. Increase capacity limits
  3. Wait for slots to free up

Problem: Delivery not showing

Causes:

  1. Delivery disabled
  2. No delivery zones configured
  3. Customer outside all zones

Solutions:

  1. Enable delivery toggle
  2. Configure delivery zones
  3. Add customer's postal code to a zone

Examples

Note: These examples show the relevant fields of the online_ordering_setting object only (not the full object). The base preparation time is the location-level average_prep_time, not part of this object.

Quick Service Restaurant

json
{
  "takeout": { "enabled": true, "delay": 0 },
  "delivery": { "enabled": true, "delay": 10 },
  "minimum_order_amount": { "enabled": true, "amount": 10 },
  "schedule_order_for_future_days": {
    "takeout": { "enabled": true, "days_in_advance": 3 },
    "delivery": { "enabled": true, "days_in_advance": 3 }
  },
  "custom_scheduled_orders": false
}

Fine Dining (Pickup Only)

json
{
  "takeout": { "enabled": true, "delay": 15 },
  "delivery": { "enabled": false, "delay": 0 },
  "minimum_order_amount": { "enabled": true, "amount": 50 },
  "schedule_order_for_future_days": {
    "takeout": { "enabled": true, "days_in_advance": 7 },
    "delivery": { "enabled": false, "days_in_advance": 30 }
  },
  "custom_scheduled_orders": true,
  "hours_in_advance": 24,
  "minutes_before_pickup_delivery_time": 60
}