Appearance
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/topairs 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_availableflag; 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
| Property | Value |
|---|---|
| Field ID | {day}.is_available |
| Label | Open on |
| Type | Toggle |
| Default | true (Mon-Sat), false (Sun) |
| Required | No |
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
| Property | Value |
|---|---|
| Field ID | {day}.times[].from |
| Label | Opens At |
| Type | Time |
| Required | Yes (if day enabled) |
| Validation | HH: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
| Property | Value |
|---|---|
| Field ID | {day}.times[].to |
| Label | Closes At |
| Type | Time |
| Required | Yes (if day enabled) |
| Validation | HH: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
| Property | Value |
|---|---|
| Field ID | {day}.times |
| Label | Time Ranges |
| Type | Array of time ranges |
| Required | At 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
fromandto - 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
| Property | Value |
|---|---|
| Field ID | online_ordering_hours |
| Label | Online Ordering Hours |
| Type | Schedule |
| Required | No |
| Default | Same 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
| Property | Value |
|---|---|
| Field ID | pickup_hours |
| Label | Pickup Hours |
| Type | Schedule |
| Required | No |
| Default | Same as online ordering hours |
Description: Hours when pickup orders can be scheduled.
Delivery Hours
| Property | Value |
|---|---|
| Field ID | delivery_hours |
| Label | Delivery Hours |
| Type | Schedule |
| Required | No |
| Default | Same 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
| Property | Value |
|---|---|
| Field ID | qr_ordering_hours |
| Label | QR/Table Ordering Hours |
| Type | Schedule |
| Required | No |
| Default | Same 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 slotsLast 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:25Customer Impact
Online Ordering
| Scenario | Customer Sees |
|---|---|
| Currently open | Normal ordering available |
| Currently closed | "We're closed. Opens at X" |
| Closed day | Day not selectable |
| Between ranges | "Closed until X" |
| Near closing | Limited 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
Related Features
Business Rules
- Each day must have at least one time range with a valid
fromandtopair 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
TimezoneServiceduring 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:
- Wrong timezone configured
- Business hours not set correctly
- Day marked as closed
- Between time ranges (lunch break)
Solutions:
- Verify timezone matches location
- Check business hours configuration
- Enable the day
- Check if multiple time ranges configured
Problem: Can't schedule orders for certain times
Causes:
- Outside business hours
- Preparation time buffer
- Capacity limits reached
- Channel-specific hours different
Solutions:
- Extend business hours
- Reduce preparation time
- Increase capacity limits
- Check channel-specific hours
Problem: Orders available on day that should be closed
Causes:
- Day not marked as closed
- Restricted date not configured
- Cache not updated
Solutions:
- Disable the day in business hours
- Add restricted date
- Clear cache
Problem: Different hours needed for different services
Causes:
- Need different hours for delivery vs pickup
- Kitchen closes before store
Solutions:
- Configure channel-specific hours
- Set online ordering hours separately
- 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" }] }
}