Skip to content

Business Hours

Overview

Business Hours define when a location is open for business. They control when customers can place orders and when orders can be scheduled.

Key Purpose: Define operating hours for each location and channel.

Purpose

This page lets you configure the weekly opening and closing times for each location, including channel-specific hours for online ordering, pickup, delivery, and QR ordering.

Key Concepts

  • Time Ranges: One or more opening/closing periods per day, stored as arrays of from/to pairs in HH:mm format allowing split shifts (e.g., lunch and dinner).
  • Channel-Specific Hours: Separate schedules for in-house, online ordering, pickup, delivery, and QR ordering that can differ from the main business hours.
  • Day Toggle: Each day of the week has an is_available flag; disabled days block all ordering for that day.
  • Timezone Awareness: All hours are interpreted in the location's configured timezone, which the backend resolves via TimezoneService.
  • Last Order Calculation: The system subtracts preparation time (and delivery delay for delivery orders) from the closing time to determine the latest time a customer can place an order.

Actions

Set Weekly Schedule

Toggle days open or closed and define one or more time ranges per day for regular business hours.

Configure Channel-Specific Hours

Override the default schedule for online ordering, pickup, delivery, or QR ordering so each channel can operate on its own timetable.

Add Split Shifts

Create multiple time ranges within a single day (e.g., 11:00-14:30 and 17:00-22:00) to represent breaks between service periods.

Location

  • Backoffice Route: /settings/locations/:id/hours
  • Backend Model: app/RawModels/Location.php (getBusinessHours method)
  • Vue Component: src/views/settings/Locations/forms/LocationBusinessHours.vue

Concepts

Regular Business Hours

Standard weekly schedule (Monday-Sunday) with opening and closing times.

Channel-Specific Hours

Different hours for different channels:

  • In-House: Dine-in hours
  • Online Ordering: Pickup/delivery hours
  • QR Ordering: Table ordering hours

Restricted Dates

Specific dates with modified hours or closures (holidays, special events).


Fields

Day Enabled

PropertyValue
Field ID{day}.is_available
LabelOpen on
TypeToggle
Defaulttrue (Mon-Sat), false (Sun)
RequiredNo

Description: Whether the location is open on this day of the week.

Days: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

Customer Impact:

  • Disabled Day: No ordering available for that day
  • Online Ordering: Day not selectable in date picker

Opening Time

PropertyValue
Field ID{day}.times[].from
LabelOpens At
TypeTime
RequiredYes (if day enabled)
ValidationHH:mm format

Description: Time when the location opens on this day.

Business Logic:

  • Earliest time customers can schedule orders
  • Orders before this time not available

Examples:

  • "09:00" - 9 AM
  • "11:30" - 11:30 AM
  • "06:00" - 6 AM (early opening)

Closing Time

PropertyValue
Field ID{day}.times[].to
LabelCloses At
TypeTime
RequiredYes (if day enabled)
ValidationHH:mm format, must be after opening

Description: Time when the location closes on this day.

Business Logic:

  • Latest time customers can schedule orders
  • Preparation time considered (order must complete before closing)
  • Last order time = Closing - Prep Time

Examples:

  • "22:00" - 10 PM
  • "23:30" - 11:30 PM
  • "02:00" - 2 AM (next day, for late-night)

Multiple Time Ranges

PropertyValue
Field ID{day}.times
LabelTime Ranges
TypeArray of time ranges
RequiredAt least one if day enabled

Description: A day can have multiple opening periods (e.g., lunch and dinner with break).

Business Logic:

  • Each range has from and to
  • Gap between ranges = closed period
  • Orders only available within ranges

Customer Impact:

  • Online Ordering: Only times within ranges selectable
  • Gap Period: "Currently closed, opens at X"

Example:

json
{
  "Monday": {
    "is_available": true,
    "times": [
      { "from": "11:00", "to": "14:30" },
      { "from": "17:00", "to": "22:00" }
    ]
  }
}

This means: Open 11:00-14:30 (lunch), Closed 14:30-17:00, Open 17:00-22:00 (dinner)


Channel-Specific Hours

Online Ordering Hours

PropertyValue
Field IDonline_ordering_hours
LabelOnline Ordering Hours
TypeSchedule
RequiredNo
DefaultSame as business hours

Description: Specific hours when online ordering is available. Can be different from in-house hours.

Use Cases:

  • Accept online orders before store opens (prep time)
  • Stop online orders before closing (kitchen closes early)
  • Different hours for delivery vs pickup

Example:

  • Store hours: 10:00 - 22:00
  • Online ordering: 10:30 - 21:00 (stop orders 1 hour before close)

Pickup Hours

PropertyValue
Field IDpickup_hours
LabelPickup Hours
TypeSchedule
RequiredNo
DefaultSame as online ordering hours

Description: Hours when pickup orders can be scheduled.


Delivery Hours

PropertyValue
Field IDdelivery_hours
LabelDelivery Hours
TypeSchedule
RequiredNo
DefaultSame as online ordering hours

Description: Hours when delivery orders can be scheduled. Often shorter than pickup.

Example:

  • Pickup: 10:00 - 21:30
  • Delivery: 11:00 - 20:30 (delivery stops earlier)

QR Ordering Hours

PropertyValue
Field IDqr_ordering_hours
LabelQR/Table Ordering Hours
TypeSchedule
RequiredNo
DefaultSame as business hours

Description: Hours when QR table ordering is available.


Business Logic

Current Status Calculation

Get current time in location's timezone


Is today's day enabled?
├── No → CLOSED

└── Yes → Check time ranges


        Is current time within any range?
        ├── Yes → OPEN

        └── No → Is there a later range today?
                ├── Yes → CLOSED (opens at X)

                └── No → CLOSED (opens tomorrow at X)

Available Time Slots

For requested date:


Get business hours for that day


For each time range:
    Generate slots based on time_slot_duration
    Filter out:
    - Past times (if today)
    - Times outside business hours
    - Times with no capacity


Return available slots

Last Order Time

Closing Time: 22:00
Preparation Time: 20 minutes
Delivery Delay: 15 minutes

Last Pickup Order: 22:00 - 20 min = 21:40
Last Delivery Order: 22:00 - 20 min - 15 min = 21:25

Customer sees:
- Pickup available until 21:40
- Delivery available until 21:25

Customer Impact

Online Ordering

ScenarioCustomer Sees
Currently openNormal ordering available
Currently closed"We're closed. Opens at X"
Closed dayDay not selectable
Between ranges"Closed until X"
Near closingLimited time slots available

Kiosk

  • Kiosk may show "Closed" screen outside hours
  • Or continue operating (for in-store only)
  • Depends on kiosk configuration

Scheduling

  • Date picker shows only open days
  • Time picker shows only available times
  • Respects preparation time buffer

Relations

Depends On

  • Locations: Hours are per-location
  • Timezone: Hours interpreted in location's timezone

Affects

  • Online Ordering: Available times
  • Order Capacity: Slots only within hours
  • Delivery Zones: Delivery only during delivery hours
  • Kiosk: May affect kiosk availability

Business Rules

  • Each day must have at least one time range with a valid from and to pair if the day is enabled; closing time must be after opening time (or interpreted as next-day for times past midnight like "02:00").
  • Channel-specific hours (online ordering, pickup, delivery, QR) default to the main business hours when not explicitly set.
  • Restricted dates always take priority over regular business hours; the system checks restricted dates first before falling back to the weekly schedule.
  • The last order time is calculated by subtracting the item preparation time (and delivery delay for delivery orders) from the closing time, so customers cannot place orders too close to close.
  • Business hours are stored per location and evaluated in the location's timezone, which is resolved by the backend TimezoneService during location setup.

FAQs

  • "Can I set different hours for delivery and pickup?" Yes, configure separate delivery hours and pickup hours under channel-specific hours; each channel operates independently.
  • "What happens if closing time is past midnight (e.g., 02:00)?" The system interprets times like "02:00" as 2 AM the next day, so late-night service is fully supported.
  • "Do I need to set online ordering hours separately?" No, if you leave them blank they default to your main business hours; only set them when you want the online channel to differ.
  • "How do split shifts affect customers?" Customers see a "Currently closed, opens at X" message during the gap between time ranges, and only times within active ranges are selectable.
  • "What if I change the timezone of my location?" Business hours are re-interpreted in the new timezone immediately; verify your schedule still makes sense after a timezone change.

Troubleshooting

Problem: "We're closed" showing during open hours

Causes:

  1. Wrong timezone configured
  2. Business hours not set correctly
  3. Day marked as closed
  4. Between time ranges (lunch break)

Solutions:

  1. Verify timezone matches location
  2. Check business hours configuration
  3. Enable the day
  4. Check if multiple time ranges configured

Problem: Can't schedule orders for certain times

Causes:

  1. Outside business hours
  2. Preparation time buffer
  3. Capacity limits reached
  4. Channel-specific hours different

Solutions:

  1. Extend business hours
  2. Reduce preparation time
  3. Increase capacity limits
  4. Check channel-specific hours

Problem: Orders available on day that should be closed

Causes:

  1. Day not marked as closed
  2. Restricted date not configured
  3. Cache not updated

Solutions:

  1. Disable the day in business hours
  2. Add restricted date
  3. Clear cache

Problem: Different hours needed for different services

Causes:

  • Need different hours for delivery vs pickup
  • Kitchen closes before store

Solutions:

  1. Configure channel-specific hours
  2. Set online ordering hours separately
  3. Use delivery hours and pickup hours

Examples

Standard Restaurant (Lunch & Dinner)

json
{
  "Monday": {
    "is_available": true,
    "times": [
      { "from": "11:30", "to": "14:30" },
      { "from": "17:30", "to": "22:00" }
    ]
  },
  "Tuesday": {
    "is_available": true,
    "times": [
      { "from": "11:30", "to": "14:30" },
      { "from": "17:30", "to": "22:00" }
    ]
  },
  "Wednesday": {
    "is_available": true,
    "times": [
      { "from": "11:30", "to": "14:30" },
      { "from": "17:30", "to": "22:00" }
    ]
  },
  "Thursday": {
    "is_available": true,
    "times": [
      { "from": "11:30", "to": "14:30" },
      { "from": "17:30", "to": "22:00" }
    ]
  },
  "Friday": {
    "is_available": true,
    "times": [
      { "from": "11:30", "to": "14:30" },
      { "from": "17:30", "to": "23:00" }
    ]
  },
  "Saturday": {
    "is_available": true,
    "times": [
      { "from": "17:00", "to": "23:00" }
    ]
  },
  "Sunday": {
    "is_available": false,
    "times": []
  }
}

Fast Food (Continuous Hours)

json
{
  "Monday": { "is_available": true, "times": [{ "from": "10:00", "to": "22:00" }] },
  "Tuesday": { "is_available": true, "times": [{ "from": "10:00", "to": "22:00" }] },
  "Wednesday": { "is_available": true, "times": [{ "from": "10:00", "to": "22:00" }] },
  "Thursday": { "is_available": true, "times": [{ "from": "10:00", "to": "22:00" }] },
  "Friday": { "is_available": true, "times": [{ "from": "10:00", "to": "23:00" }] },
  "Saturday": { "is_available": true, "times": [{ "from": "10:00", "to": "23:00" }] },
  "Sunday": { "is_available": true, "times": [{ "from": "11:00", "to": "21:00" }] }
}

Late Night (Past Midnight)

json
{
  "Friday": {
    "is_available": true,
    "times": [
      { "from": "11:00", "to": "02:00" }
    ]
  },
  "Saturday": {
    "is_available": true,
    "times": [
      { "from": "11:00", "to": "02:00" }
    ]
  }
}

Note: "02:00" means 2 AM the next day.

Different Online vs In-Store Hours

json
{
  "business_hours": {
    "Monday": { "is_available": true, "times": [{ "from": "09:00", "to": "22:00" }] }
  },
  "online_ordering_hours": {
    "Monday": { "is_available": true, "times": [{ "from": "10:00", "to": "21:00" }] }
  },
  "delivery_hours": {
    "Monday": { "is_available": true, "times": [{ "from": "11:00", "to": "20:30" }] }
  }
}
  • Store open: 9 AM - 10 PM
  • Online ordering: 10 AM - 9 PM
  • Delivery: 11 AM - 8:30 PM

Café with Breakfast/Lunch Only

json
{
  "Monday": { "is_available": true, "times": [{ "from": "07:00", "to": "16:00" }] },
  "Tuesday": { "is_available": true, "times": [{ "from": "07:00", "to": "16:00" }] },
  "Wednesday": { "is_available": true, "times": [{ "from": "07:00", "to": "16:00" }] },
  "Thursday": { "is_available": true, "times": [{ "from": "07:00", "to": "16:00" }] },
  "Friday": { "is_available": true, "times": [{ "from": "07:00", "to": "16:00" }] },
  "Saturday": { "is_available": true, "times": [{ "from": "08:00", "to": "15:00" }] },
  "Sunday": { "is_available": true, "times": [{ "from": "09:00", "to": "14:00" }] }
}