Implement advanced relational inventory

The Menu entity describes a menu that a restaurant offers to its customers. A Menu entity must be defined within a Restaurant entity through the Restaurant's menuId property.

Other objects that define the menu (such as description, image, add-ons, and nutrition information) include MenuItem and MenuItemOffer, as well as the optional objects MenuSection, Availability, and MenuItemOption.

You can use MenuSection objects to organize multiple MenuItem objects into logical categories. This approach is useful for restaurants that have multiple menus (like breakfast, lunch, and dinner). Add each menu as a separate MenuSection.

Use case Best practice
Use case 1: Basic menu Use MenuItem, MenuItemOffer, and MenuSection (optional)

The following example matches the "Basic menu" use case with two menu sections ("All day food" and "Drinks"), each containing two menu items:

JSON

{
  "@type": "Menu",
  "name": "Coffee Shop A",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "All day food",
  "menuItemId": ["1", "2"]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Mediterranean Bagel",
  "description": "rocket, scrambled egg, tomato relish, bacon ***Gluten free bagel available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-mediterranean-bagel",
  "menuItemId": "1",
  "price": 17.60,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "2",
  "name": "Club Empire Bagel",
  "description": "grilled chicken, bacon, rocket, tomato relish ***Gluten Free Bagels Available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "428",
  "sku": "offer-club-empire-bagel",
  "menuItemId": "2",
  "price": 18.90,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 2
  },
  "name": "Drinks",
  "menuItemId": ["3", "4"]
} {
  "@type": "MenuItem",
  "@id": "3",
  "name": "Cold Brew Coffee",
  "description": "67% less acid & refreshingly good",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "456",
  "sku": "offer-cold-brew-coffee",
  "menuItemId": "3",
  "price": 8.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "4",
  "name": "English Breakfast Tea",
  "description": "Not Coffee. Try our tea",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "4432",
  "sku": "offer-english-breakfast-tea",
  "menuItemId": "4",
  "price": 5.50,
  "priceCurrency": "AUD"
}

Time-limited menu

MenuItemOffer objects combined with Availability can be used to create time-limited menu items and menu item options. Use Availability objects to create time-limited menu sections instead.

Use case Best practice
Use case 1: Time-limited menu section Use Availability to specify the section's availabilityStarts and availabilityEnds time.
Use case 2: Time-limited menu item Use the menuItemId of a MenuItemOffer to specify which MenuItem the offer is linked to. Use Availability to specify the offer's availabilityStarts, availabilityEnds and availabilityDaycode> time.
Use case 3: Multi-offer menu item Use MenuItemOffers menuItemId property and set the availabilityId property to specify the time during which the price is valid.

JSON

A basic menu with "All day food", "Lunch", and "Drinks" sections.

The menu has three sections. The "Lunch (Available 11:30am - 2:30pm)" section, is only available from 11:30 AM-2:30 PM, as described in the Availability object.

{
  "@type": "Menu",
  "name": "Coffee Shop A",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "All day food",
  "menuItemId": ["1", "2"]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Mediterranean Bagel",
  "description": "rocket, scrambled egg, tomato relish, bacon ***Gluten free bagel available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-mediterranean-bagel",
  "menuItemId": "1",
  "price": 17.60,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "2",
  "name": "Club Empire Bagel",
  "description": "grilled chicken, bacon, rocket, tomato relish ***Gluten Free Bagels Available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "428",
  "sku": "offer-club-empire-bagel",
  "menuItemId": "2",
  "price": 18.90,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 3
  },
  "name": "Drinks",
  "menuItemId": ["3", "4"]
} {
  "@type": "MenuItem",
  "@id": "3",
  "name": "Cold Brew Coffee",
  "description": "67% less acid & refreshingly good",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "3",
  "sku": "offer-cold-brew-coffee",
  "menuItemId": "3",
  "price": 8.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "4",
  "name": "English Breakfast Tea",
  "description": "Not Coffee. Try our tea",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "4",
  "sku": "offer-english-breakfast-tea",
  "menuItemId": "4",
  "price": 5.50,
  "priceCurrency": "AUD"
} {
  "@type": "Availability",
  "@id": "85343705",
  "availabilityStarts": "11:30",
  "availabilityEnds": "14:30"
} {
  "@type": "MenuSection",
  "@id": "53",
  "menuId": {
    "@id": "1535",
    "displayOrder": 2
  },
  "name": "Lunch (Available 11:30am - 2:30pm)",
  "menuItemId": ["5", "6"],
  "availabilityId": ["85343705"]
} {
  "@type": "MenuItem",
  "@id": "5",
  "name": "Bibimbap",
  "description": "pulled pork, julienned carrot, cucumber, spring onions, brown rice, pureed kimchi, fried free-range egg.",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "53",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "753",
  "sku": "offer-bibimbap",
  "menuItemId": "5",
  "price": 24.80,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "6",
  "name": "The Big Chicken",
  "description": "WA free range handmade chicken burger, lettuce, avocado, bacon, tomato relish on charcoal brioche bun, sweet potato wedges and house made aioli (vegetarian option – spiced lentil burger, just ask us in the notes)",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "53",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "856",
  "sku": "offer-big-chicken",
  "menuItemId": "6",
  "price": 25.60,
  "priceCurrency": "AUD"
}

JSON

A basic menu with "All day food", "Lunch", and "Drinks" sections.

The menu has three sections. The "Lunch (Available 11:30am - 2:30pm)" section, is only available from 11:30 AM-2:30 PM, as described in the Availability object. The menu item "Bibimbap" is only available from 12:00 PM-1:00 PM, as described by Availability referenced in corresponding MenuItemOffer object.

{
  "@type": "Menu",
  "name": "Coffee Shop A",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "All day food",
  "menuItemId": ["1", "2"]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Mediterranean Bagel",
  "description": "rocket, scrambled egg, tomato relish, bacon ***Gluten free bagel available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-mediterranean-bagel",
  "menuItemId": "1",
  "price": 17.60,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "2",
  "name": "Club Empire Bagel",
  "description": "grilled chicken, bacon, rocket, tomato relish ***Gluten Free Bagels Available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "428",
  "sku": "offer-club-empire-bagel",
  "menuItemId": "2",
  "price": 18.90,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 3
  },
  "name": "Drinks",
  "menuItemId": ["3", "4"]
} {
  "@type": "MenuItem",
  "@id": "3",
  "name": "Cold Brew Coffee",
  "description": "67% less acid & refreshingly good",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "3",
  "sku": "offer-cold-brew-coffee",
  "menuItemId": "3",
  "price": 8.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "4",
  "name": "English Breakfast Tea",
  "description": "Not Coffee. Try our tea",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "4",
  "sku": "offer-english-breakfast-tea",
  "menuItemId": "4",
  "price": 5.50,
  "priceCurrency": "AUD"
} {
  "@type": "Availability",
  "@id": "85343705",
  "availabilityStarts": "11:30",
  "availabilityEnds": "14:30"
} {
  "@type": "MenuSection",
  "@id": "53",
  "menuId": {
    "@id": "1535",
    "displayOrder": 2
  },
  "name": "Lunch (Available 11:30am - 2:30pm)",
  "menuItemId": ["5", "6"],
  "availabilityId": ["85343705"]
} {
  "@type": "MenuItem",
  "@id": "5",
  "name": "Bibimbap",
  "description": "pulled pork, julienned carrot, cucumber, spring onions, brown rice, pureed kimchi, fried free-range egg.",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "53",
    "displayOrder": 1
  }
} {
  "@type": "Availability",
  "@id": "54767",
  "availabilityStarts": "12:00",
  "availabilityEnds": "13:00"
} {
  "@type": "MenuItemOffer",
  "@id": "753",
  "sku": "offer-bibimbap",
  "menuItemId": "5",
  "price": 24.80,
  "priceCurrency": "AUD",
  "availabilityId": ["54767"]
} {
  "@type": "MenuItem",
  "@id": "6",
  "name": "The Big Chicken",
  "description": "WA free range handmade chicken burger, lettuce, avocado, bacon, tomato relish on charcoal brioche bun, sweet potato wedges and house made aioli (vegetarian option – spiced lentil burger, just ask us in the notes)",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png",
  "parentMenuSectionId": {
    "@id": "53",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "856",
  "sku": "offer-big-chicken",
  "menuItemId": "6",
  "price": 25.60,
  "priceCurrency": "AUD"
}

JSON

MenuItems with offers that vary by price and time.

The menu has two sections. The menu item "Pasta" has two corresponding MenuItemOffer objects (one for lunch price, one for dinner price). The lunch price for pasta is $7.49, and its dinner price is $10.49.

{
  "@type": "Menu",
  "name": "Dine-In Menu",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "Main",
  "description": "Main course",
  "image": "http://www.provider.com/somerestaurant/main_dishes.jpg",
  "menuItemId": ["1", "2"]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Pizza",
  "description": "Pizza",
  "image": "http://www.provider.com/somerestaurant/menuitem/1",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 1
  }
} {
  "@type": "Availability",
  "@id": "morning_availability",
  "availabilityStarts": "08:00",
  "availabilityEnds": "18:00"
} {
  "@type": "Availability",
  "@id": "evening_availability",
  "availabilityStarts": "18:00",
  "availabilityEnds": "21:00"
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-pizza",
  "menuItemId": "1",
  "price": 7.49,
  "priceCurrency": "USD",
  "availabilityId": ["morning_availability"]
} //Starts at 8:00AM, ends at 6:00PM, last order at 5:59:59PM
{
  "@type": "MenuItem",
  "@id": "2",
  "name": "Pasta",
  "description": "Pasta",
  "image": "http://www.provider.com/somerestaurant/menuitem/2",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOffer",
  "@id": "5472",
  "sku": "offer-pasta-lunch",
  "menuItemId": "2",
  "price": 7.49,
  "priceCurrency": "USD",
  "availabilityId": ["morning_availability"]
} //Starts at 8:00AM, ends at 6:00PM, last order at 5:59:59PM
{
  "@type": "MenuItemOffer",
  "@id": "174",
  "sku": "offer-pasta-dinner",
  "menuItemId": "2",
  "price": 10.49,
  "priceCurrency": "USD",
  "availabilityId": ["evening_availability"]
} //Starts at 6:00PM, ends at 9:00PM, last order at 8:59:59PM
{
  "@type": "MenuSection",
  "@id": "753",
  "menuId": {
    "@id": "1535",
    "displayOrder": 2
  },
  "name": "Soups & Salads",
  "description": "Salads and a few choices of soup",
  "image": "https://www.provider.com/somerestaurant/soup_and_salad_dishes.jpg",
  "menuItemId": ["3"]
} {
  "@type": "MenuItem",
  "@id": "3",
  "name": "Pea Soup",
  "description": "Creamy pea soup topped with melted cheese and sourdough croutons.",
  "parentMenuSectionId": {
    "@id": "1535",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOffer",
  "@id": "9763",
  "sku": "offer-pea-soup",
  "menuItemId": "3",
  "price": 3.49,
  "priceCurrency": "USD"
} //Starts at 8:00AM, ends at 6:00PM, last order at 5:59:59PM

Customization using add-ons

Menu items can have additional add-on options. Define add-ons for a MenuItem by referencing MenuSection objects with menuAddOnId. Those MenuSection objects must contain the menu items used for your add-ons.

You can provide default add-on MenuItem objects using the defaultOptionId property of the add-on MenuSection object.

Use case Best practice
Use case 1: Basic add-ons Use an add-on MenuSection object's eligibleQuantityMin and eligibleQuantityMax properties to specify the minimum and maximum number of add-on items that can be selected in the add-on section.
Use case 2: Default add-ons Use an add-on MenuSection object's defaultOptionId to provide default add-on options.
Use case 3: Combo/package meals Use MenuSection objects to describe choices that a user can make when selecting a dish/combo.

JSON

In this example, the "Cappuccino" menu item is customizable with a straw option.

There's one extra add-on option available for the "Mediterranean Bagel" item in the "All day food" menu section as well as two egg add-on options.

The "Club Bagel" item in the same menu section has the same extras add-ons available, plus an "Egg Options" add-on option of scrambled egg.

In the drinks section, there's one item available with a "Milk" add-on option and a "Straw Option" add-on option.

{
  "@type": "Menu",
  "name": "Coffee Shop A",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "All day food",
  "menuItemId": ["1", "12"]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Mediterranean Bagel",
  "description": "rocket, scrambled egg, tomato relish, bacon ***Gluten free bagel available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-mediterranean-bagel",
  "menuItemId": "1",
  "price": 17.60,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "362",
  "name": "Extras",
  "menuItemId": ["2"],
  "parentMenuItemId": [{
    "@id": "1",
    "displayOrder": 1
  }]
} {
  "@type": "MenuItem",
  "@id": "2",
  "name": "Chorizo"
} {
  "@type": "MenuItemOffer",
  "@id": "74",
  "sku": "offer-addon-chorizo",
  "menuItemId": "2",
  "price": 6.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "5374",
  "name": "Egg Options",
  "menuItemId": ["8", "9"],
  "parentMenuItemId": [{
    "@id": "1",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 2
} {
  "@type": "MenuItem",
  "@id": "8",
  "name": "No Extra Egg"
} {
  "@type": "MenuItemOffer",
  "@id": "4527",
  "sku": "offer-addon-no-egg",
  "menuItemId": "8",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "9",
  "name": "Extra Egg - Fried"
} {
  "@type": "MenuItemOffer",
  "@id": "99",
  "sku": "offer-addon-fried-egg",
  "menuItemId": "9",
  "price": 3.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "12",
  "name": "Club Bagel",
  "description": "grilled chicken, bacon, rocket, tomato relish ***Gluten Free Bagels Available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "428",
  "sku": "offer-club-empire-bagel",
  "menuItemId": "12",
  "price": 18.90,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "3865",
  "name": "Extras",
  "menuItemId": ["2", "13"],
  "parentMenuItemId": [{
    "@id": "12",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 0,
  "eligibleQuantityMax": 2
} {
  "@type": "MenuItem",
  "@id": "13",
  "name": "Free Range Bacon"
} {
  "@type": "MenuItemOffer",
  "@id": "832",
  "sku": "offer-addon-bacon",
  "menuItemId": "13",
  "price": 6.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "5428",
  "name": "Egg Options",
  "menuItemId": ["8", "9", "14"],
  "parentMenuItemId": [{
    "@id": "12",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 2
} {
  "@type": "MenuItem",
  "@id": "14",
  "name": "Scrambled Egg"
} {
  "@type": "MenuItemOffer",
  "@id": "546",
  "sku": "offer-scrambled-egg",
  "menuItemId": "14",
  "price": 3.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "531",
  "menuId": {
    "@id": "1535",
    "displayOrder": 2
  },
  "name": "Lunch (Available 11:30am - 2:30pm)",
  "menuItemId": ["15"]
} {
  "@type": "MenuItem",
  "@id": "15",
  "name": "Bibimbap",
  "description": "pulled pork, julienned carrot, cucumber, spring onions, brown rice, pureed kimchi, fried free-range egg.",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "753",
  "sku": "offer-bibimbap",
  "menuItemId": "15",
  "price": 24.80,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 3
  },
  "name": "Drinks",
  "menuItemId": ["17"]
} {
  "@type": "MenuItem",
  "@id": "17",
  "name": "Cappuccino",
  "description": "Milk Foam over a cup of espresso, topped with chocolate powder art",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "1743",
  "sku": "offer-cappucino",
  "menuItemId": "17",
  "price": 6.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "4527",
  "name": "Milk",
  "menuItemId": ["18"],
  "parentMenuItemId": [{
    "@id": "17",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "18",
  "name": "Skim"
} {
  "@type": "MenuItemOffer",
  "@id": "4588",
  "sku": "offer-addon-skim-milk",
  "menuItemId": "18",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "5427",
  "name": "Straw Option",
  "menuItemId": ["22"],
  "parentMenuItemId": [{
    "@id": "17",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "22",
  "name": "Plastic Straw"
} {
  "@type": "MenuItemOffer",
  "@id": "4587",
  "sku": "offer-addon-plastic-straw",
  "menuItemId": "22",
  "price": 0.05,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
}

JSON

In this example, the "Club Bagel" menu item is preselected with chorizo and scrambled egg option. Chorizo and Chili Sauce are the default "Extras" add-ons and scrambled egg is its default "Egg Option" add-on.

{
  "@type": "Menu",
  "name": "Coffee Shop A",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "All day food",
  "menuItemId": ["1", "12"]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Mediterranean Bagel",
  "description": "rocket, scrambled egg, tomato relish, bacon ***Gluten free bagel available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-mediterranean-bagel",
  "menuItemId": "1",
  "price": 17.60,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "362",
  "name": "Extras",
  "menuItemId": ["2"],
  "parentMenuItemId": [{
    "@id": "1",
    "displayOrder": 1
  }]
} {
  "@type": "MenuItem",
  "@id": "2",
  "name": "Chorizo"
} {
  "@type": "MenuItemOffer",
  "@id": "74",
  "sku": "offer-addon-chorizo",
  "menuItemId": "2",
  "price": 6.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "5374",
  "name": "Egg Options",
  "menuItemId": ["8", "9"],
  "parentMenuItemId": [{
    "@id": "1",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 2
} {
  "@type": "MenuItem",
  "@id": "8",
  "name": "No Extra Egg"
} {
  "@type": "MenuItemOffer",
  "@id": "4527",
  "sku": "offer-addon-no-egg",
  "menuItemId": "8",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "9",
  "name": "Extra Egg - Fried"
} {
  "@type": "MenuItemOffer",
  "@id": "99",
  "sku": "offer-addon-fried-egg",
  "menuItemId": "9",
  "price": 3.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "12",
  "name": "Club Bagel",
  "description": "grilled chicken, bacon, rocket, tomato relish ***Gluten Free Bagels Available***",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "428",
  "sku": "offer-club-empire-bagel",
  "menuItemId": "12",
  "price": 18.90,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "3865",
  "name": "Extras",
  "menuItemId": ["2", "13", "25"],
  "parentMenuItemId": [{
    "@id": "12",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 0,
  "eligibleQuantityMax": 2,
  "defaultItemId": ["2", "25"]
} {
  "@type": "MenuItem",
  "@id": "13",
  "name": "Free Range Bacon"
} {
  "@type": "MenuItemOffer",
  "@id": "832",
  "sku": "offer-addon-bacon",
  "menuItemId": "13",
  "price": 6.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "25",
  "name": "Chili Sauce"
} {
  "@type": "MenuItemOffer",
  "@id": "7337",
  "sku": "offer-addon-chili-sauce",
  "menuItemId": "25",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "5428",
  "name": "Egg Options",
  "menuItemId": ["8", "9", "14"],
  "parentMenuItemId": [{
    "@id": "12",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 2,
  "defaultItemId": ["14"]
} {
  "@type": "MenuItem",
  "@id": "14",
  "name": "Scrambled Egg"
} {
  "@type": "MenuItemOffer",
  "@id": "546",
  "sku": "offer-scrambled-egg",
  "menuItemId": "14",
  "price": 3.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 3
  },
  "name": "Drinks",
  "menuItemId": ["17"]
} {
  "@type": "MenuItem",
  "@id": "17",
  "name": "Cappuccino",
  "description": "Milk Foam over a cup of espresso, topped with chocolate powder art",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "1743",
  "sku": "offer-cappucino",
  "menuItemId": "17",
  "price": 6.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "4527",
  "name": "Milk",
  "menuItemId": ["18"],
  "parentMenuItemId": [{
    "@id": "17",
    "displayOrder": 1
  }, {
    "@id": "24",
    "displayOrder": 2
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "18",
  "name": "Skim"
} {
  "@type": "MenuItemOffer",
  "@id": "4588",
  "sku": "offer-addon-skim-milk",
  "menuItemId": "18",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "5427",
  "name": "Straw Option",
  "menuItemId": ["22"],
  "parentMenuItemId": [{
    "@id": "17",
    "displayOrder": 1
  }, {
    "@id": "24",
    "displayOrder": 2
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "22",
  "name": "Plastic Straw"
} {
  "@type": "MenuItemOffer",
  "@id": "4587",
  "sku": "offer-addon-plastic-straw",
  "menuItemId": "22",
  "price": 0.05,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
}

JSON

This example contains a combo meal that consists of a burger, fries, and a drink. Each food item is customizable with different toppings and add-ons.

Combo meal item has 1 burger, 1 fries, and 1 drink as a requirement for the user to choose. There are 2 burger options and each have 2 add-on sections: "Recipe" (two menu items, user must choose 0-1 options) and "Extras" (three menu items, user must choose 0-3 options).

{
  "@type": "Menu",
  "name": "FastFood B",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "Combo Meals",
  "menuItemId": ["1"]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Burger Combo ABox",
  "description": "1 Burger, 1 Fries, 1 Drink",
  "image": "https://www.gstatic.com/mobilesdk/170329_assistant/assistant_color_28dp.png"
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-burger-combo-a",
  "menuItemId": "1",
  "price": 16.95,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "362",
  "name": "Burger",
  "menuItemId": ["2", "3"],
  "parentMenuItemId": [{
    "@id": "1",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "2",
  "name": "Fillet Burger"
} {
  "@type": "MenuItemOffer",
  "@id": "74",
  "sku": "offer-burger-fillet",
  "menuItemId": "2",
  "price": 0.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "3",
  "name": "Zinger filler Burger"
} {
  "@type": "MenuItemOffer",
  "@id": "42",
  "sku": "offer-burger-zinger-filler",
  "menuItemId": "3",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 1
} {
  "@type": "MenuSection",
  "@id": "5374",
  "name": "Recipe",
  "menuItemId": ["13", "25"],
  "parentMenuItemId": [{
    "@id": "2",
    "displayOrder": 1
  }, {
    "@id": "3",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 0,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "13",
  "name": "Lettuce"
} {
  "@type": "MenuItemOffer",
  "@id": "832",
  "sku": "offer-lettuce",
  "menuItemId": "13",
  "price": 0.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "25",
  "name": "Mayo"
} {
  "@type": "MenuItemOffer",
  "@id": "7337",
  "sku": "offer-mayo",
  "menuItemId": "25",
  "price": 0.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "3865",
  "name": "Extras",
  "menuItemId": ["22", "23", "24"],
  "parentMenuItemId": [{
    "@id": "2",
    "displayOrder": 1
  },
  {
    "@id": "3",
    "displayOrder": 1
  }],
  "eligibleQuantityMin": 0,
  "eligibleQuantityMax": 3
} {
  "@type": "MenuItem",
  "@id": "22",
  "name": "Bacon Slice"
} {
  "@type": "MenuItemOffer",
  "@id": "4588",
  "sku": "offer-extra-bacon-slice",
  "menuItemId": "22",
  "price": 0.50,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 10
} {
  "@type": "MenuItem",
  "@id": "23",
  "name": "Cheese Slice"
} {
  "@type": "MenuItemOffer",
  "@id": "53865",
  "sku": "offer-extra-cheese-slice",
  "menuItemId": "23",
  "price": 0.50,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 10
} {
  "@type": "MenuItem",
  "@id": "24",
  "name": "Coleslaw"
} {
  "@type": "MenuItemOffer",
  "@id": "3",
  "sku": "offer-extra-coleslaw",
  "menuItemId": "24",
  "price": 0.30,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 10
} {
  "@type": "MenuSection",
  "@id": "5428",
  "name": "Fries",
  "menuItemId": ["14"],
  "parentMenuItemId": [{
    "@id": "1",
    "displayOrder": 2
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "14",
  "name": "Regular Fries"
} {
  "@type": "MenuItemOffer",
  "@id": "546",
  "sku": "offer-fries",
  "menuItemId": "14",
  "price": 0.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "27",
  "name": "Drinks",
  "menuItemId": ["17", "18"],
  "parentMenuItemId": [{
    "@id": "1",
    "displayOrder": 3
  }],
  "eligibleQuantityMin": 1,
  "eligibleQuantityMax": 1
} {
  "@type": "MenuItem",
  "@id": "17",
  "name": "Regular Pepsi Max"
} {
  "@type": "MenuItemOffer",
  "@id": "1743",
  "sku": "offer-pepsi-max",
  "menuItemId": "17",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 2
} {
  "@type": "MenuItem",
  "@id": "18",
  "name": "Regular Pepsi"
} {
  "@type": "MenuItemOffer",
  "@id": "4587",
  "sku": "offer-pepsi",
  "menuItemId": "18",
  "price": 0.00,
  "priceCurrency": "AUD",
  "eligibleQuantityMax": 2
}

Customization using menu item options

You can provide various options for a MenuItem by referencing it in the menuItemId property of a MenuItemOption.

For example, if pizza is available in different sizes, you can create a MenuItemOption for each size and reference the pizza menu item in the menuItemId property for each MenuItemOption.

Use case Best practice
Use case 1: Pizza with different sizes Use MenuItemOption and MenuItemOffer
Use case 2: Customizable pizza with different toppings and sizes Use MenuItemOption and MenuItemOffer to change the topping prices based on the pizza size.
Use case 3: Customizable pizza with differences between left and right sides Use the value property of a MenuItemOption to specify the side of a pizza. Use the price and priceCurrency properties of MenuItemOffer to specify the price per pizza side.

JSON

The pizza has 3 different sizes and requires user selection. The price of each size is different.

Hawaiian Pizza costs $10.00 for a small, $15.00 for a medium, and $20.00 for a large pizza.

{
  "@type": "Menu",
  "name": "A's Pizza",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "Pizza Option",
  "menuItemId": ["18930213"]
} {
  "@type": "MenuItem",
  "@id": "18930213",
  "name": "Hawaiian Pizza",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOption",
  "@id": "56177944",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Small"
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-hawaiian-pizza-small",
  "menuItemOptionId": "56177944",
  "price": 10.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "865324",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Medium"
} {
  "@type": "MenuItemOffer",
  "@id": "1473685",
  "sku": "offer-hawaiian-pizza-medium",
  "menuItemOptionId": "865324",
  "price": 15.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "91598",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Large"
} {
  "@type": "MenuItemOffer",
  "@id": "836365",
  "sku": "offer-hawaiian-pizza-large",
  "menuItemOptionId": "91598",
  "price": 20.00,
  "priceCurrency": "AUD"
}

JSON

Pizza toppings prices vary by the size of the pizza.

A Pepperoni Pizza costs $10.00 for a small, $15.00 for a medium, and $20.00 for a large. Beef Salami topping is $1.00 on a small, $1.50 on a medium, and $2.00 on a large small.

{
  "@type": "Menu",
  "name": "A's Pizza",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "Pizza Option",
  "menuItemId": ["18930213"]
} {
  "@type": "MenuItem",
  "@id": "18930213",
  "name": "Pepperoni Pizza",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOption",
  "@id": "56177944",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Small"
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-pepperoni-pizza-small",
  "menuItemOptionId": "56177944",
  "price": 10.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "865324",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Medium"
} {
  "@type": "MenuItemOffer",
  "@id": "1473685",
  "sku": "offer-pepperoni-pizza-medium",
  "menuItemOptionId": "865324",
  "price": 15.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "91598",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Large"
} {
  "@type": "MenuItemOffer",
  "@id": "836365",
  "sku": "pepperoni-pizza-large",
  "menuItemOptionId": "91598",
  "price": 20.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 2
  },
  "name": "Choice of toppings",
  "menuItemId": ["1"],
  "parentMenuItemId": [{
    "@id": "18930213",
    "displayOrder": 1
  }]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Beef Salami",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOption",
  "@id": "5427",
  "menuItemId": {
    "@id": "1"
  },
  "applicableParentOptionValue": "Small"
} {
  "@type": "MenuItemOffer",
  "@id": "546",
  "sku": "offer-beef-salami-small",
  "menuItemOptionId": "5427",
  "price": 1.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "346",
  "menuItemId": {
    "@id": "1"
  },
  "applicableParentOptionValue": "Medium"
} {
  "@type": "MenuItemOffer",
  "@id": "2354",
  "sku": "offer-beef-salami-medium",
  "menuItemOptionId": "346",
  "price": 1.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "24",
  "menuItemId": {
    "@id": "1"
  },
  "applicableParentOptionValue": "Large"
} {
  "@type": "MenuItemOffer",
  "@id": "243",
  "sku": "offer-beef-salami-large",
  "menuItemOptionId": "24",
  "price": 2.00,
  "priceCurrency": "AUD"
}

JSON

Pizza toppings can be added to the left half, right half, or the whole pizza. Prices vary by the size of pizza, as well as by where toppings apply.

A small Pepperoni Pizza is $10.00 for a small, $15.00 for a medium, and $20.00 for a large. The pizza has 2 toppings (Beef Salami and Mozzarella), and each topping for the left and right sides of a small pizza cost $1.00 per side, but $0.50 instead for the whole small pizza. Toppings cost $1.50 per side for the left and right sides of a medium pizza, but $1.00 instead for the whole medium pizza. Toppings cost $2.00 per side for the left and right sides of a large pizza, but $1.50 instead for the whole large pizza.

{
  "@type": "Menu",
  "name": "A's Pizza",
  "@id": "1535"
} {
  "@type": "MenuSection",
  "@id": "27",
  "menuId": {
    "@id": "1535",
    "displayOrder": 1
  },
  "name": "Pizza Option",
  "menuItemId": ["18930213"]
} {
  "@type": "MenuItem",
  "@id": "18930213",
  "name": "Pepperoni Pizza",
  "parentMenuSectionId": {
    "@id": "27",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOption",
  "@id": "56177944",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Small"
} {
  "@type": "MenuItemOffer",
  "@id": "6680262",
  "sku": "offer-pepperoni-pizza-small",
  "menuItemOptionId": "56177944",
  "price": 10.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "865324",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Medium"
} {
  "@type": "MenuItemOffer",
  "@id": "1473685",
  "sku": "offer-pepperoni-pizza-medium",
  "menuItemOptionId": "865324",
  "price": 15.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "91598",
  "menuItemId": {
    "@id": "18930213"
  },
  "applicableParentOptionValue": "Large"
} {
  "@type": "MenuItemOffer",
  "@id": "836365",
  "sku": "pepperoni-pizza-large",
  "menuItemOptionId": "91598",
  "price": 20.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuSection",
  "@id": "4371",
  "menuId": {
    "@id": "1535",
    "displayOrder": 2
  },
  "name": "Choice of toppings",
  "menuItemId": ["1", "2"],
  "parentMenuItemId": [{
    "@id": "18930213",
    "displayOrder": 1
  }]
} {
  "@type": "MenuItem",
  "@id": "1",
  "name": "Beef Salami",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 1
  }
} {
  "@type": "MenuItemOption",
  "@id": "434",
  "menuItemId": {
    "@id": "1"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_LEFT"
} {
  "@type": "MenuItemOffer",
  "@id": "546",
  "sku": "offer-beef-salami-left-small",
  "menuItemOptionId": "434",
  "price": 1.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "111",
  "menuItemId": {
    "@id": "1"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_RIGHT"
} {
  "@type": "MenuItemOffer",
  "@id": "37",
  "sku": "offer-beef-salami-right-small",
  "menuItemOptionId": "111",
  "price": 1.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "5427",
  "menuItemId": {
    "@id": "1"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_WHOLE"
} {
  "@type": "MenuItemOffer",
  "@id": "356",
  "sku": "offer-beef-salami-whole-small",
  "menuItemOptionId": "5427",
  "price": 0.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "3",
  "menuItemId": {
    "@id": "1"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_LEFT"
} {
  "@type": "MenuItemOffer",
  "@id": "764",
  "sku": "offer-beef-salami-left-medium",
  "menuItemOptionId": "3",
  "price": 1.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "4",
  "menuItemId": {
    "@id": "1"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_RIGHT"
} {
  "@type": "MenuItemOffer",
  "@id": "476",
  "sku": "offer-beef-salami-right-medium",
  "menuItemOptionId": "4",
  "price": 1.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "346",
  "menuItemId": {
    "@id": "1"
  },
  "applicableParentOptionValue": "Medium",
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_WHOLE"
} {
  "@type": "MenuItemOffer",
  "@id": "2354",
  "sku": "offer-beef-salami-whole-medium",
  "menuItemOptionId": "346",
  "price": 1.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "5",
  "menuItemId": {
    "@id": "1"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_LEFT"
} {
  "@type": "MenuItemOffer",
  "@id": "56",
  "sku": "offer-beef-salami-left-large",
  "menuItemOptionId": "5",
  "price": 2.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "6",
  "menuItemId": {
    "@id": "1"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_RIGHT"
} {
  "@type": "MenuItemOffer",
  "@id": "35",
  "sku": "offer-beef-salami-right-large",
  "menuItemOptionId": "6",
  "price": 2.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "24",
  "menuItemId": {
    "@id": "1"
  },
  "applicableParentOptionValue": "Large",
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_WHOLE"
} {
  "@type": "MenuItemOffer",
  "@id": "243",
  "sku": "offer-beef-salami-whole-large",
  "menuItemOptionId": "24",
  "price": 1.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItem",
  "@id": "2",
  "name": "Mozzarella",
  "parentMenuSectionId": {
    "@id": "4371",
    "displayOrder": 2
  }
} {
  "@type": "MenuItemOption",
  "@id": "544",
  "menuItemId": {
    "@id": "2"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_LEFT"
} {
  "@type": "MenuItemOffer",
  "@id": "5643",
  "sku": "offer-mozzarella-left-small",
  "menuItemOptionId": "544",
  "price": 1.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "432",
  "menuItemId": {
    "@id": "2"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_RIGHT"
} {
  "@type": "MenuItemOffer",
  "@id": "426",
  "sku": "offer-mozzarella-right-small",
  "menuItemOptionId": "432",
  "price": 1.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "5432",
  "menuItemId": {
    "@id": "2"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_WHOLE"
} {
  "@type": "MenuItemOffer",
  "@id": "7546",
  "sku": "offer-mozzarella-whole-small",
  "menuItemOptionId": "5432",
  "price": 0.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "54",
  "menuItemId": {
    "@id": "2"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_LEFT"
} {
  "@type": "MenuItemOffer",
  "@id": "5465",
  "sku": "offer-mozzarella-left-medium",
  "menuItemOptionId": "54",
  "price": 1.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "543",
  "menuItemId": {
    "@id": "2"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_RIGHT"
} {
  "@type": "MenuItemOffer",
  "@id": "76",
  "sku": "offer-mozzarella-right-medium",
  "menuItemOptionId": "543",
  "price": 1.50,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "3346",
  "menuItemId": {
    "@id": "2"
  },
  "applicableParentOptionValue": "Medium",
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_WHOLE"
} {
  "@type": "MenuItemOffer",
  "@id": "34",
  "sku": "offer-mozzarella-whole-medium",
  "menuItemOptionId": "3346",
  "price": 1.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "325",
  "menuItemId": {
    "@id": "2"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_LEFT"
} {
  "@type": "MenuItemOffer",
  "@id": "5536",
  "sku": "offer-mozzarella-left-large",
  "menuItemOptionId": "325",
  "price": 2.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "4576",
  "menuItemId": {
    "@id": "2"
  },
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_RIGHT"
} {
  "@type": "MenuItemOffer",
  "@id": "545",
  "sku": "offer-mozzarella-right-large",
  "menuItemOptionId": "4576",
  "price": 2.00,
  "priceCurrency": "AUD"
} {
  "@type": "MenuItemOption",
  "@id": "90",
  "menuItemId": {
    "@id": "2"
  },
  "applicableParentOptionValue": "Large",
  "optionType": "PIZZA_SIDE",
  "value": "PIZZA_SIDE_WHOLE"
} {
  "@type": "MenuItemOffer",
  "@id": "744",
  "sku": "offer-mozzarella-whole-large",
  "menuItemOptionId": "90",
  "price": 1.50,
  "priceCurrency": "AUD"
}

Service

The Service entity defines the delivery of a food ordering Action from a restaurant, such as the service type. The hours of service, area served, and fees are described in the ServiceArea, ServiceHours, OperationHours, and Fee entities.

One Restaurant can define multiple Service objects (for example, if a restaurant supports both delivery and takeout services), but one Service should be uniquely connected to a single Restaurant by the Service's serviceType property.

Use case Best practice
Use case 1: Basic delivery service Use opens and closes properties in ServiceHours and OperationHours to specify the start and end time in which a user can fulfill (complete) an order and place an order, respectively. To specify the delivery lead time (the estimated time of pickup/delivery), use the leadTimeMin and leadTimeMax properties of ServiceHours.

JSON

The following sample Service accepts orders everyday from 8 AM-6 PM (latest order can be placed at 5:59:59pm) from Feburary 1st 2016 to March 1st 2016, and delivers with a minimum wait time of 1 hour and maximum wait time for 90 minutes. The delivery service is provided in the zipcode 94041 in the US. There is a $5 delivery charge for the user.

{
  "@type": "Service",
  "@id": "10824/delivery",
  "serviceType": "DELIVERY",
  "menuId": "10824",
  "restaurantId": "10824"
} {
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "postalCode": 94041,
  "addressCountry": "US"
} {
  "@type": "OperationHours",
  "@id": "10824/deliveryOh",
  "serviceId": "10824/delivery",
  "validFrom": "2016-02-01T00:00:00-07:00",
  "validThrough": "2016-03-01T00:00:00-07:00",
  "opens": "T08:00",
  "closes": "T18:00"
} {
  "@type": "ServiceHours",
  "@id": "613741/delivery",
  "orderType": "ASAP",
  "serviceId": "10824/delivery",
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "Fee",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 5.0
}

Delivery and pickup hours

The examples below outline how to define the delivery and pickup hours of a service.

Use case Best practice
Use case 1: Delivery hours configuration Use the leadTimeMin and leadTimeMax properties of ServiceHours for ASAP orders. Use OperationHours for order ahead orders. Use the isSpecialHour property of ServiceHours and OperationHours for special holiday delivery and ordering window hours
Use case 2: Pickup hours configuration Use the leadTimeMin and leadTimeMax properties of ServiceHours for ASAP orders. Use OperationHours for order ahead orders. Use the isSpecialHour property of ServiceHours and OperationHours for special holiday pickup and ordering window hours.

JSON

The restaurant accepts ASAP and orders in advance for delivery services. It also supports special holiday delivery hours.

In this example, users can place online orders anytime. Weekday delivery hours are from 9 AM to 11 PM. Weekend delivery hours are from 9 AM to 9 PM. On December 24, 2019 specifically, delivery hours are from 9 AM to 4 PM. The service delivers with a minimum wait time of 1 hour and maximum wait time of 90 minutes.

Users can place orders from 6 days in advance (8640 minutes) to 1 hour in advance for any day, including December 24, 2019. Users may only place delivery orders in advance in increments of 15 min (for example, 8:00 PM, 8:15 PM, 8:30 PM). The delivery service is provided in a polygon area described in the code, and there's a $5 delivery charge for the user.

{
  "@type": "Service",
  "@id": "10824/delivery",
  "serviceType": "DELIVERY",
  "menuId": "10824",
  "restaurantId": "10824"
} {
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "polygon": ["-20.728777 116.804256 -20.736323 116.8161 -20.722997 116.86468 -20.725406 116.871547 -20.736323 116.873607 -20.7474 116.816444 -20.756871 116.819877 -20.757673 116.788291 -20.740497 116.786403"]
} {
  "@type": "OperationHours",
  "@id": "427/deliveryOh",
  "serviceId": "10824/delivery",
  "opens": "T00:00",
  "closes": "T23:59",
  "isSpecialHour": false
} {
  "@type": "ServiceHours",
  "@id": "613741/delivery",
  "orderType": "ASAP",
  "serviceId": "10824/delivery",
  "operationHoursId":["427/deliveryOh"],
  "opens": "T09:00",
  "closes": "T23:00",
  "dayOfWeek": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"],
  "leadTimeMin": 60,
  "leadTimeMax": 90,
  "isSpecialHour": false
} {
  "@type": "ServiceHours",
  "@id": "3654/delivery",
  "orderType": "ADVANCE",
  "serviceId": "10824/delivery",
  "operationHoursId":["427/deliveryOh"],
  "opens": "T09:00",
  "closes": "T23:00",
  "dayOfWeek": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"],
  "advanceBookingRequirementMin": 60,
  "advanceBookingRequirementMax": 8640,
  "advanceBookingSlotInterval": "PT15M",
  "isSpecialHour":false
} {
  "@type": "ServiceHours",
  "@id": "4694/delivery",
  "orderType": "ASAP",
  "serviceId": "10824/delivery",
  "operationHoursId":["427/deliveryOh"],
  "opens": "T09:00",
  "closes": "T21:00",
  "dayOfWeek": ["SATURDAY", "SUNDAY"],
  "leadTimeMin": 60,
  "leadTimeMax": 90,
  "isSpecialHour": false
} {
  "@type": "ServiceHours",
  "@id": "6479/delivery",
  "orderType": "ADVANCE",
  "serviceId": "10824/delivery",
  "operationHoursId":["427/deliveryOh"],
  "opens": "T09:00",
  "closes": "T21:00",
  "dayOfWeek": ["SATURDAY", "SUNDAY"],
  "advanceBookingRequirementMin": 60,
  "advanceBookingRequirementMax": 8640,
  "advanceBookingSlotInterval": "PT15M",
  "isSpecialHour":false
} {
  "@type": "ServiceHours",
  "@id": "3754/delivery",
  "orderType": "ASAP",
  "serviceId": "10824/delivery",
  "validFrom": "2019-12-24T00:00:00+10:00",
  "validThrough": "2019-12-24T23:59:59+10:00",
  "opens": "T09:00",
  "closes": "T16:00",
  "leadTimeMin": 60,
  "leadTimeMax": 90,
  "isSpecialHour": true
} {
  "@type": "Fee",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 5.00
}

JSON

The restaurant accepts ASAP and orders in advance for pickup services. It also supports special holiday pickup hours.

In this example, users can start ordering online 2 hours before service hour starts. Weekday pickup hours are from 9 AM to 11 PM. Weekend pickup hours are from 9 AM to 9 PM. On December 24, 2019 specifically, pickup hours are from 9 AM to 4 PM. Pickup has a minimum wait time of 30 minutes and maximum wait time of 1 hour.

Users can place orders from 2 days in advance (2880 minutes) to 30 minutes in advance for any day, including December 24, 2019. Users may only place pickup orders in advance in increments of 15 min (for example, 8:00 PM, 8:15 PM, 8:30 PM). There is no pickup charge for the user.

{
  "@type": "Service",
  "@id": "10824/takeout",
  "serviceType": "TAKEOUT",
  "menuId": "10824",
  "restaurantId": "10824"
} {
  "@type": "OperationHours",
  "@id": "427/takeoutOh",
  "serviceId": "10824/takeout",
  "opens": "T07:00",
  "closes": "T23:00",
  "dayOfWeek": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"]
} {
  "@type": "OperationHours",
  "@id": "2652/takeoutOh",
  "serviceId": "10824/takeout",
  "opens": "T07:00",
  "closes": "T21:00",
  "dayOfWeek": ["SATURDAY", "SUNDAY"]
} {
  "@type": "ServiceHours",
  "@id": "613741/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "operationHoursId":["427/takeoutOh"],
  "opens": "T09:00",
  "closes": "T23:00",
  "dayOfWeek": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"],
  "leadTimeMin": 30,
  "leadTimeMax": 60,
  "isSpecialHour": false
} {
  "@type": "ServiceHours",
  "@id": "3654/takeout",
  "orderType": "ADVANCE",
  "serviceId": "10824/takeout",
  "operationHoursId":["427/takeoutOh", "2652/takeoutOh"],
  "opens": "T09:00",
  "closes": "T23:00",
  "dayOfWeek": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"],
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 2880,
  "advanceBookingSlotInterval": "PT15M",
  "isSpecialHour": false
} {
  "@type": "ServiceHours",
  "@id": "4694/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "operationHoursId": ["2652/takeoutOh"],
  "opens": "T09:00",
  "closes": "T21:00",
  "dayOfWeek": ["SATURDAY", "SUNDAY"],
  "leadTimeMin": 30,
  "leadTimeMax": 60,
  "isSpecialHour": false
} {
  "@type": "ServiceHours",
  "@id": "6479/takeout",
  "orderType": "ADVANCE",
  "serviceId": "10824/takeout",
  "operationHoursId": ["427/takeoutOh", "2652/takeoutOh"],
  "opens": "T09:00",
  "closes": "T21:00",
  "dayOfWeek": ["SATURDAY", "SUNDAY"],
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 2880,
  "advanceBookingSlotInterval": "PT15M",
  "isSpecialHour": false
} {
  "@type": "ServiceHours",
  "@id": "3754/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "validFrom": "2019-12-24T00:00:00+10:00",
  "validThrough": "2019-12-24T23:59:59+10:00",
  "opens": "T09:00",
  "closes": "T16:00",
  "leadTimeMin": 30,
  "leadTimeMax": 60,
  "isSpecialHour": true
}

Holiday and special hours

You can use the isSpecialHour property of ServiceHours and OperationHours to override existing service hours and/or operation hours. This approach lets you define regular hours of operation once, and selectively override it for holidays and special events.

There are two separate time windows that you must specify for service fulfillment: the ordering window (OperationHours, specifies when users can place an order) and the fulfillment window (ServiceHours, specifies when the order can be fulfilled).

Use case Best practice
Use case 1: Open for same-day orders but closed for advanced orders To specify the dates for which the special hours are valid, use the validFrom and validThrough properties of the ServiceHours and OperationHours entities (with isSpecialHour property set to "true").

JSON

This example specifies that the service is open for same-day orders on Christmas day but is closed for orders in advance scheduled for that day. The restaurant accepts ASAP and orders in advance for pickup services.

Regular pickup hours (including both order and service hours) are from 9 AM to 9 PM and Christmas Eve of 2017 pickup hours are from 9 AM to 4 PM. Pickup has a minimum wait time of 1 hour and maximum wait time of 90 minutes. Users can place orders from 2 days in advance (2880 minutes) to 30 minutes in advance for any day, but cannot place an order on closed days/hours (like Christmas day, July 4th, and after 4pm on Christmas Eve). Users can only place pickup orders in advance in increments of 15 min (for example, 2:00 PM, 2:15 PM, 2:30 PM).

There is no pickup charge for the user. This example supports the following scenarios:

  • Users can make an order on December 25th for same day delivery.
  • Users can make an advance order on December 25th for delivery scheduled for December 27th.
  • Users cannot make an order in advance on December 22nd for delivery scheduled on December 25th.
  • Users can neither make an advance nor ASAP order on July 4th.
{
  "@type": "Service",
  "@id": "10824/takeout",
  "serviceType": "TAKEOUT",
  "menuId": "10824",
  "restaurantId": "10824"
} {
  "@type": "OperationHours",
  "@id": "427/takeoutOh",
  "serviceId": "10824/takeout",
  "opens": "T09:00",
  "closes": "T21:00"
} {
  "@type": "ServiceHours",
  "@id": "613741/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "opens": "T09:00",
  "closes": "T21:00",
  "isSpecialHour": false,
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "ServiceHours",
  "@id": "37/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "operationHoursId": "427/takeoutOh",
  "opens": "T09:00",
  "closes": "T16:00",
  "validFrom": "2017-12-24T00:00:00-07:00",
  "validThrough": "2017-12-24T23:59:59-07:00",
  "isSpecialHour": true,
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "ServiceHours",
  "@id": "358/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "operationHoursId": "427/takeoutOh",
  "opens": "T00:00",
  "closes": "T00:00",
  "validFrom": "2017-12-25T00:00:00-07:00",
  "validThrough": "2017-12-25T23:59:59-07:00",
  "isSpecialHour": true,
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "ServiceHours",
  "@id": "4356/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "operationHoursId": "427/takeoutOh",
  "opens": "T00:00",
  "closes": "T00:00",
  "validFrom": "2017-07-04T00:00:00-07:00",
  "validThrough": "2017-07-04T23:59:59-07:00",
  "isSpecialHour": true,
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "ServiceHours",
  "@id": "3654/takeout",
  "orderType": "ADVANCE",
  "serviceId": "10824/takeout",
  "opens": "T09:00",
  "closes": "T21:00",
  "isSpecialHour": false,
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 2880,
  "advanceBookingSlotInterval": "PT15M"
} {
  "@type": "ServiceHours",
  "@id": "54/takeout",
  "orderType": "ADVANCE",
  "serviceId": "10824/takeout",
  "opens": "T00:00",
  "closes": "T00:00",
  "validFrom": "2017-12-24T00:00:00-07:00",
  "validThrough": "2017-12-24T23:59:59-07:00",
  "isSpecialHour": true,
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 2880,
  "advanceBookingSlotInterval": "PT15M"
} {
  "@type": "ServiceHours",
  "@id": "5436/takeout",
  "orderType": "ADVANCE",
  "serviceId": "10824/takeout",
  "opens": "T00:00",
  "closes": "T00:00",
  "validFrom": "2017-12-25T00:00:00-07:00",
  "validThrough": "2017-12-25T23:59:59-07:00",
  "isSpecialHour": true,
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 2880,
  "advanceBookingSlotInterval": "PT15M"
} {
  "@type": "ServiceHours",
  "@id": "345/takeout",
  "orderType": "ADVANCE",
  "serviceId": "10824/takeout",
  "opens": "T00:00",
  "closes": "T00:00",
  "validFrom": "2017-07-04T00:00:00-07:00",
  "validThrough": "2017-07-04T23:59:59-07:00",
  "isSpecialHour": true,
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 2880,
  "advanceBookingSlotInterval": "PT15M"
}

Delivery and pickup fees

The examples below outline how to define the delivery and pickup fees for a service.

Use case Best practice
Use case 1: Delivery fee configuration Use the Fee entity to define the types of delivery charges.
Use case 2: Service fee configuration for pickup services Use the Fee entity to define the types of pickup service charges.

JSON

The restaurant supports different types of delivery fees.

In this example, there is free delivery with a minimum $30.00 order, fixed delivery fee of $5.00 without minimum order, and a 3% of percentage fee from total cart amount. Delivery hours (including both order and service hours) are from 9 AM to 11 PM. Delivery has a minimum wait time of 1 hour and maximum wait time of 90 minutes.

Users can place orders from 6 days in advance (8640 minutes) to 30 minutes in advance for any day. Users can only place delivery orders in advance in increments of 15 min (for example, 2:00 PM, 2:15 PM, 2:30 PM). The area eligible for delivery is specified in the ServiceArea entity.

{
  "@type": "Service",
  "@id": "10824/delivery",
  "serviceType": "DELIVERY",
  "menuId": "10824",
  "restaurantId": "10824"
} {
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "polygon": ["-20.728777 116.804256 -20.736323 116.8161 -20.722997 116.86468 -20.725406 116.871547 -20.736323 116.873607 -20.7474 116.816444 -20.756871 116.819877 -20.757673 116.788291 -20.740497 116.786403"]
} {
  "@type": "OperationHours",
  "@id": "427/deliveryOh",
  "serviceId": "10824/delivery",
  "opens": "T09:00",
  "closes": "T23:00"
} {
  "@type": "ServiceHours",
  "@id": "613741/delivery",
  "orderType": "ASAP",
  "serviceId": "10824/delivery",
  "opens": "T09:00",
  "closes": "T23:00",
  "isSpecialHour": false,
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "ServiceHours",
  "@id": "3654/delivery",
  "orderType": "ADVANCE",
  "serviceId": "10824/delivery",
  "opens": "T09:00",
  "closes": "T23:00",
  "isSpecialHour": false,
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 8640,
  "advanceBookingSlotInterval": "PT15M"
} {
  "@type": "Fee",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "AUD",
  "price": 0.00,
  "eligibleTransactionVolumeMin": 30
} {
  "@type": "Fee",
  "@id": "4326",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "AUD",
  "price": 5.00,
  "eligibleTransactionVolumeMax": 29.99
} {
  "@type": "Fee",
  "@id": "5432",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "AUD",
  "percentageOfCart": 3.00
}

JSON

The restaurant supports different types of service fees.

In this example, there is free service fee with a minimum $30.00 order, fixed service fee of $1.00 without minimum order, and a 2% of service fee from total cart amount. Pickup hours (including both order and service hours) are from 9 AM to 11 PM. Pickup has a minimum wait time of 1 hour and maximum wait time of 90 minutes.

Users can only place delivery orders in advance in increments of 15 min (for example, 2:00 PM, 2:15 PM, 2:30 PM).

{
  "@type": "Service",
  "@id": "10824/takeout",
  "serviceType": "TAKEOUT",
  "menuId": "10824",
  "restaurantId": "10824"
} {
  "@type": "OperationHours",
  "@id": "427/takeoutOh",
  "serviceId": "10824/takeout",
  "opens": "T09:00",
  "closes": "T23:00"
} {
  "@type": "ServiceHours",
  "@id": "613741/takeout",
  "orderType": "ASAP",
  "serviceId": "10824/takeout",
  "opens": "T09:00",
  "closes": "T23:00",
  "isSpecialHour": false,
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "ServiceHours",
  "@id": "3654/takeout",
  "orderType": "ADVANCE",
  "serviceId": "10824/takeout",
  "opens": "T09:00",
  "closes": "T23:00",
  "isSpecialHour": false,
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 8640,
  "advanceBookingSlotInterval": "PT15M"
} {
  "@type": "Fee",
  "@id": "28427",
  "serviceId": "10824/takeout",
  "feeType": "SERVICE",
  "priceCurrency": "AUD",
  "price": 0.00,
  "percentageOfCart": 2.00,
  "eligibleTransactionVolumeMin": 30
} {
  "@type": "Fee",
  "@id": "4326",
  "serviceId": "10824/takeout",
  "feeType": "SERVICE",
  "priceCurrency": "AUD",
  "price": 1.00,
  "percentageOfCart": 2.00,
  "eligibleTransactionVolumeMax": 29.99
}

Dynamic delivery fees

The examples below outline how to define the fees for a delivery service that depend on different factors, such as region, time of day, and number of items.

Use case Best practice
Use case 1: Delivery fee by region and distance Use the eligibleRegion property of Fee to specify the region and the price and priceCurrency properties to specify the price.
Use case 2: Delivery fee by time Use the validFrom and validThrough properties of Fee to specify the time during which the delivery fee is valid.
Use case 3: Free delivery above and order amount Use the eligibleTransactionVolumeMin and eligibleTransactionVolumeMax properties of Fee to specify the minimum and maximum cart value associated with the delivery price.

JSON

The following sample Service charges a delivery fee of $5.00 in the 94087 ZIP code, and a $2.00 fee for other regions.

{
  "@type": "Fee",
  "@id": "4326",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 5.00,
  "eligibleRegion": "28427"
} {
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "postalCode": 94087,
  "addressCountry": "US"
} {
  "@type": "Fee",
  "@id": "5432",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 2.00
}

JSON

The following sample Service charges a delivery fee of $20 from January 1st 2017 to Feburary 1st 2017, and a $10 at any other time.

{
  "@type": "Fee",
  "@id": "4326",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 10.00
} {
  "@type": "Fee",
  "@id": "5432",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 20.00,
  "validFrom": "2017-01-01T00:00:00-07:00",
  "validThrough": "2017-02-01T00:00:00-07:00"
}

JSON

The following Service charges a delivery fee of $10 for orders up to $100, and no delivery fee otherwise.

{
  "@type": "Fee",
  "@id": "4326",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 10.00,
  "eligibleTransactionVolumeMax": 99.99
} {
  "@type": "Fee",
  "@id": "5432",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "USD",
  "price": 0.00,
  "eligibleTransactionVolumeMin": 100
}

Delivery service areas

The examples below outline how to define the available service areas of a delivery service.

Use case Best practice
Use case 1: Service area definition

Use ServiceArea to define the geographical region in which food can be delivered.

Use case 2: You have a Polygon service area.
Use case 3: You have one service area, but you don't service a smaller area within it.
Use case 4: You have multiple service areas. Create multiple ServiceArea entities to represent your service areas.

JSON

The restaurant supports delivery services to different service areas. The service areas can be defined by polygon shape, ZIP code, or circles.

{
  "@type": "Service",
  "@id": "10824/delivery",
  "serviceType": "DELIVERY",
  "menuId": "10824",
  "restaurantId": "10824"
} {
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "polygon": ["-20.728777 116.804256 -20.736323 116.8161 -20.722997 116.86468 -20.725406 116.871547 -20.736323 116.873607 -20.7474 116.816444 -20.756871 116.819877 -20.757673 116.788291 -20.740497 116.786403"]
} {
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "postalCode": 6714,
  "addressCountry": "AU"
} {
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "geoMidpointLatitude": -20.733575,
  "geoMidpointLongitude": 116.844931,
  "geoRadius": 1000
} {
  "@type": "OperationHours",
  "@id": "427/deliveryOh",
  "serviceId": "10824/delivery",
  "opens": "T09:00",
  "closes": "T23:00"
} {
  "@type": "ServiceHours",
  "@id": "613741/delivery",
  "orderType": "ASAP",
  "serviceId": "10824/delivery",
  "opens": "T09:00",
  "closes": "T23:00",
  "isSpecialHour": false,
  "leadTimeMin": 60,
  "leadTimeMax": 90
} {
  "@type": "ServiceHours",
  "@id": "3654/delivery",
  "orderType": "ADVANCE",
  "serviceId": "10824/delivery",
  "opens": "T09:00",
  "closes": "T23:00",
  "isSpecialHour": false,
  "advanceBookingRequirementMin": 30,
  "advanceBookingRequirementMax": 8640,
  "advanceBookingSlotInterval": "PT15M"
} {
  "@type": "Fee",
  "@id": "4326",
  "serviceId": "10824/delivery",
  "feeType": "DELIVERY",
  "priceCurrency": "AUD",
  "price": 5.00
}

JSON

{
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "polygon": ["37.806000 -122.425592 37.775849 -122.419043 37.795547 -122.394046 37.808747 -122.412619"]
}

JSON

Pass a list containing strings that represent the polygon loops. Include areas excluded in the polygon property of ServiceArea. Food Ordering interprets overlapping areas as excluded areas.

{
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "polygon": ["37.771535 -122.506881 37.764289 -122.506669 37.766497 -122.453058", "37.791707 -122.447987 37.746676 -122.449433 37.736150 -122.505944 37.780924 -122.509729"]
}

JSON

{
  "@type": "ServiceArea",
  "@id": "28427",
  "serviceId": "10824/delivery",
  "polygon": ["37.785847 -122.484851 37.772757 -122.483983 37.774442 -122.458563 37.786876 -122.459474"]
} {
  "@type": "ServiceArea",
  "@id": "4356",
  "serviceId": "10824/delivery",
  "polygon": ["37.774804 -122.454774 37.766224 -122.452881 37.769087 -122.436043 37.773087 -122.437417"]
}

Deleting and disabling entities

You can remove entities from your service that you no longer want Google to expose to users. This process is useful if you need to inform Google that a restaurant or service has permanently or temporarily closed.

Remove entities

To remove an entity, delete it from your feeds; this has an SLA of 2 hours. To reintroduce an entity, add it back in your feeds.

Remove service entities temporarily

You can also temporarily disable a Service entity for either a specific or an undefined time period.

Disabling one for a specific time period is useful if you want to enable users to place orders in advance but disable immediate orders within a given time period (such as during a holiday).

Disabling a Service entity for an undefined time period is useful if you want to disable users from placing both orders in advance and immediate orders until some unspecified future date.

Temporarily disabling a service involves updating the feed files directly as you would with a permanent removal. Your changes are reflected when Google Cloud Storage or Amazon S3 retrieves your updated files.

Use the techniques below to remove a Service for a temporary time period:

  • To temporarily remove a Service entity for a specific time period that is known ahead of time (for example, holiday hours), use the OperationHours and ServiceHours entities.

    For example, if you want to disable a Service entity for a period of time, first reference the Service entity you are temporarily disabling in the OperationHours and ServiceHours entities. Set the isSpecialHour property to "true", and the opens and closes property times to "00:00".

  • To temporarily remove a Service entity for an undefined time period, set its isDisabled property to "true". To re-enable, remove the property from your entity or set the value to "false".

    Note that you should only use the isDisabled property when you don't know when the service will be re-established. For example, use it for unexpected events and don't use it for holidays).