Skip to content

Menu Management

Overview

Menus are collections of categories and items that can be assigned to locations and channels. A business can have multiple menus for different purposes (lunch, dinner, catering, etc.).

Key Purpose: Organize and assign menu content to locations and channels.

Purpose

This page lets you create, edit, publish, and manage menus that define which categories and items are available at each location and ordering channel.

Key Concepts

  • Menu: A named collection of display groups (containing categories and items) assigned to a location, with a status (Draft, Published, Archive) and channel visibility settings.
  • Menu Status: Menus follow a lifecycle of Draft, Published, and Archive. New menus are automatically set to Published on creation.
  • Channel Visibility: Each menu specifies which channels it is visible on (Online Ordering, Kiosk, etc.). Changing visibility is blocked if the menu is actively used by a kiosk device profile.
  • Display Groups: Menus contain display groups that define which categories and items appear. Display groups are synced when a menu is created or updated.
  • Menu Name Uniqueness: Menu names must be unique per location; attempting to create or rename a menu to a name already in use at the same location returns a 400 error.

Actions

Create Menu

Add a new menu with a name, location, channel visibility, and display groups. The menu is automatically set to Published status and its display groups are synced.

Edit Menu

Update a menu's name, visibility, or display groups. Changes dispatch a MenuUpdated event (for Uber Eats sync) and a ReloadMenu event for all ordering channels.

Duplicate Menu

Create a copy of an existing menu including all its display groups. Each display group is duplicated and linked to the new menu.

Publish / Draft / Archive Menu

Change a menu's status. Setting a menu to Draft or Archive is blocked if the menu is currently assigned to any kiosk device profile with active devices. Publishing makes the menu available on its configured channels.

Delete Menu

Remove a menu and all its associated display groups permanently.

Location

  • Backoffice Route: /menus
  • Backend Controller: app/Http/Controllers/Api/MenuController.php
  • Vue Component: src/views/menus/index.vue

Concepts

A named collection containing categories and their items.

Linking a menu to a location and/or channel.

Time-based rules for when a menu is active.


Fields

PropertyValue
Field IDname
LabelMenu Name
TypeText
RequiredYes
Validationmax: 100 characters

Description: Name of the menu for internal reference and display.

Examples:

  • "Main Menu"
  • "Lunch Menu"
  • "Dinner Menu"
  • "Weekend Brunch"
  • "Catering Menu"
  • "Kids Menu"

PropertyValue
Field IDdescription
LabelDescription
TypeTextarea
RequiredNo
Validationmax: 300 characters

Description: Optional description of the menu.

Examples:

  • "Our full menu available all day"
  • "Special lunch offerings, available 11am-3pm"

Categories

PropertyValue
Field IDcategory_ids
LabelCategories
TypeMulti-select (sortable)
RequiredYes

Description: Categories included in this menu, in display order.

Business Logic:

  • Categories can be in multiple menus
  • Order determines display sequence
  • Items inherit from categories

Assigned Locations

PropertyValue
Field IDlocation_ids
LabelLocations
TypeMulti-select
RequiredNo
DefaultAll locations

Description: Which locations use this menu.

Business Logic:

  • Empty = available at all locations
  • Specific locations = only those locations

Default Menu

PropertyValue
Field IDis_default
LabelDefault Menu
TypeToggle
Defaultfalse

Description: Whether this is the default menu for assigned locations.

Business Logic:

  • Default menu shown when no schedule matches
  • Only one default per location

PropertyValue
Field IDactive
LabelActive
TypeToggle
Defaulttrue

Description: Whether this menu is currently active.


Availability Type

PropertyValue
Field IDavailability_type
LabelAvailability
TypeSelect
Optionsalways, scheduled
Defaultalways

Description: When this menu is available.

Options:

  • Always: Menu available during all business hours
  • Scheduled: Menu available during specific times

Schedule

PropertyValue
Field IDschedule
LabelSchedule
TypeWeekly Schedule
RequiredYes (if scheduled)
Depends Onavailability_type = scheduled

Description: Days and times when this menu is available.

Structure:

json
{
  "Monday": { "enabled": true, "from": "11:00", "to": "15:00" },
  "Tuesday": { "enabled": true, "from": "11:00", "to": "15:00" },
  ...
}

Valid From

PropertyValue
Field IDvalid_from
LabelStart Date
TypeDate
RequiredNo

Description: Date when menu becomes available.

Use Cases:

  • Seasonal menus
  • Promotional menus
  • New menu launches

Valid Until

PropertyValue
Field IDvalid_until
LabelEnd Date
TypeDate
RequiredNo

Description: Date when menu expires.


Channel-Specific Menus

Online Ordering Menu

PropertyValue
Field IDonline_ordering_menu_id
LabelOnline Ordering Menu
TypeSelect
ScopeLocation setting

Description: Menu used for online ordering at this location.


Kiosk Menu

PropertyValue
Field IDkiosk_menu_id
LabelKiosk Menu
TypeSelect
ScopeDevice setting

Description: Menu displayed on specific kiosk.


In-House Menu

PropertyValue
Field IDin_house_menu_id
LabelIn-House Menu
TypeSelect
ScopeLocation setting

Description: Menu for dine-in/QR ordering.


Business Logic

Customer opens ordering channel


Get location's menus


Filter by channel (online, kiosk, in-house)


Filter by current date (valid_from/valid_until)


Filter by current time (schedule)


Multiple menus match?
├── Yes → Use priority/default
└── No match → Use default menu


Display selected menu

When multiple menus could apply:

  1. Scheduled menu matching current time
  2. Default menu for location
  3. First active menu

Category Inheritance

Menu contains Categories


Categories contain Items


Items have Modifiers


Full menu structure displayed

Customer Impact

Online Ordering

  • Menu determines available items
  • Scheduled menus change automatically
  • Categories shown in menu order

Kiosk

  • Assigned menu displayed
  • Can differ from online menu
  • Updates when menu changes
  • Automatic based on time
  • Customer sees appropriate menu
  • No manual intervention needed

Relations

Depends On

  • Categories: Menus contain categories
  • Locations: Menus assigned to locations

Affects

  • Online Ordering: Which items available
  • Kiosk: Which items displayed
  • Reports: Sales by menu

Business Rules

  • Menu names must be unique per location; creating or renaming a menu to a name already used at the same location is rejected with a 400 error.
  • New menus are automatically set to "Published" status on creation; there is no draft-first workflow unless the merchant explicitly changes the status afterward.
  • A menu cannot be set to Draft or Archive if it is currently assigned to a kiosk device profile that has active devices; the system returns a 400 error to prevent breaking live kiosks.
  • When a menu is deleted, all display groups associated with that menu are also deleted automatically.
  • Updating a menu dispatches both a MenuUpdated event (for Uber Eats integration sync) and a ReloadMenu event so all ordering channels reflect the change immediately.

FAQs

  • Can I have different menus for online ordering and kiosk? Yes. Each location can assign different menus to different channels (online ordering, kiosk, in-house) through device profiles and location settings.
  • What happens when I duplicate a menu? A new menu is created with all display groups copied. Each display group is duplicated independently and linked to the new menu, so changes to the copy do not affect the original.
  • Can a menu be assigned to multiple locations? Menus are created per location. To use the same menu structure at another location, duplicate it and assign it there.
  • What is the difference between Draft and Archive? Both statuses hide the menu from customers, but Draft indicates work-in-progress while Archive indicates a menu that is no longer needed. Neither can be set if the menu is actively used by kiosk devices.
  • Does publishing a menu make it immediately visible to customers? Yes, publishing sets the menu status to "Published" and it becomes available on all configured channels for the assigned location right away.

Troubleshooting

Problem: Menu not showing

Causes:

  1. Menu not active
  2. Menu not assigned to location
  3. Outside schedule/date range
  4. No categories in menu

Solutions:

  1. Activate menu
  2. Assign to location
  3. Check schedule settings
  4. Add categories

Problem: Wrong menu displaying

Causes:

  1. Schedule overlap
  2. Wrong default menu
  3. Time zone issue

Solutions:

  1. Review menu schedules
  2. Set correct default
  3. Check location timezone

Problem: Items missing from menu

Causes:

  1. Category not in menu
  2. Item not in category
  3. Item unavailable

Solutions:

  1. Add category to menu
  2. Assign item to category
  3. Enable item availability

Problem: Menu not switching at scheduled time

Causes:

  1. Schedule not configured correctly
  2. Cache not refreshed
  3. Timezone mismatch

Solutions:

  1. Review schedule settings
  2. Clear cache
  3. Verify timezone

Examples

Single Menu (Simple)

json
{
  "name": "Main Menu",
  "description": "Our full menu",
  "category_ids": ["starters", "mains", "desserts", "drinks"],
  "location_ids": [],
  "is_default": true,
  "active": true,
  "availability_type": "always"
}

Lunch & Dinner Menus

json
{
  "menus": [
    {
      "name": "Lunch Menu",
      "category_ids": ["lunch-specials", "sandwiches", "salads", "drinks"],
      "is_default": false,
      "availability_type": "scheduled",
      "schedule": {
        "Monday": { "enabled": true, "from": "11:00", "to": "15:00" },
        "Tuesday": { "enabled": true, "from": "11:00", "to": "15:00" },
        "Wednesday": { "enabled": true, "from": "11:00", "to": "15:00" },
        "Thursday": { "enabled": true, "from": "11:00", "to": "15:00" },
        "Friday": { "enabled": true, "from": "11:00", "to": "15:00" },
        "Saturday": { "enabled": false },
        "Sunday": { "enabled": false }
      }
    },
    {
      "name": "Dinner Menu",
      "category_ids": ["starters", "mains", "steaks", "desserts", "wines", "drinks"],
      "is_default": true,
      "availability_type": "scheduled",
      "schedule": {
        "Monday": { "enabled": true, "from": "17:00", "to": "22:00" },
        "Tuesday": { "enabled": true, "from": "17:00", "to": "22:00" },
        "Wednesday": { "enabled": true, "from": "17:00", "to": "22:00" },
        "Thursday": { "enabled": true, "from": "17:00", "to": "22:00" },
        "Friday": { "enabled": true, "from": "17:00", "to": "23:00" },
        "Saturday": { "enabled": true, "from": "17:00", "to": "23:00" },
        "Sunday": { "enabled": true, "from": "17:00", "to": "21:00" }
      }
    }
  ]
}

Weekend Brunch Menu

json
{
  "name": "Weekend Brunch",
  "category_ids": ["brunch-mains", "eggs", "pancakes", "brunch-drinks"],
  "is_default": false,
  "availability_type": "scheduled",
  "schedule": {
    "Monday": { "enabled": false },
    "Tuesday": { "enabled": false },
    "Wednesday": { "enabled": false },
    "Thursday": { "enabled": false },
    "Friday": { "enabled": false },
    "Saturday": { "enabled": true, "from": "09:00", "to": "14:00" },
    "Sunday": { "enabled": true, "from": "09:00", "to": "14:00" }
  }
}

Seasonal Menu

json
{
  "name": "Summer Specials",
  "category_ids": ["summer-salads", "grilled-items", "frozen-drinks"],
  "is_default": false,
  "active": true,
  "availability_type": "always",
  "valid_from": "2024-06-01",
  "valid_until": "2024-08-31"
}

Different Menus per Channel

json
{
  "location": {
    "name": "Main Location",
    "online_ordering_menu_id": "menu-online",
    "in_house_menu_id": "menu-full"
  },
  "menus": [
    {
      "id": "menu-online",
      "name": "Online Menu",
      "description": "Streamlined menu for delivery",
      "category_ids": ["popular", "mains", "sides", "drinks"]
    },
    {
      "id": "menu-full",
      "name": "Full Menu",
      "description": "Complete dine-in menu",
      "category_ids": ["starters", "salads", "mains", "specials", "desserts", "wines", "cocktails", "drinks"]
    }
  ]
}