Menu Integration

NOTE: Work in progress.

Overview

Menu API endpoint allows you to create, update and retrieve menus. Every location has its own individual configurable menu with availablity hours. Our Menu can be broken down into three entity types:

  • Menu A collection / group(s) together into a single view with specific menu hours (e.g "Breakfest Menu", "Dinner Menu"). A store can have different fulfillment types (delivery, pick-up, table service)

  • Product Represents everything that a user might tangibly select from a store. (a drink, a burger, a desert)

  • Category A collection/group of products together into a logical section (e.g "Drinks", "Main", "Breakfast")

Examples

  • Get Menu Retrives a stores menu via GET /organizations/{organizationId}/locations/{locationId}/menu endpoint

Simple Menu Example

{
  "menus": [
    {
      "id": "51dc2ae3-876a-4da4-8858-498eb53c848f",
      "title": "Afternoon menu",
      "fulfillmentType": ["SERVICE"],
      "categoryIds": ["101", "102", "103"],
      "serviceAvailability": [
        {
          "dayOfTheWeek": "MONDAY",
          "start": "10:00",
          "end": "23:00"
        },
        {
          "dayOfTheWeek": "WEDNESDAY",
          "start": "10:00",
          "end": "23:00"
        },
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "10:00",
          "end": "23:00"
        }
      ]
    }
  ],
  "categories": [
    {
      "id": "101",
      "title": "Drinks",
      "productIds": ["1", "2", "3"]
    }
  ],
  "products": [
    {
      "id": "1",
      "title": "Bourbon",
      "description": "Fine whiskey",
      "imageUrl": "https://example.com/bourbon.png",
      "modifiers": [],
      "available": true,
      "visibility": [
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "08:00",
          "end": "23:00"
        }
      ],
      "price": {
        "amount": 25000,
        "taxIncluded": 2500
      },
      "tags": ["expensive", "Happy Hour"]
    },
    {
      "id": "2",
      "title": "Orange Juice",
      "description": "Freshly squeezed, for the light-weights",
      "imageUrl": "https://example.com/juice.png",
      "modifiers": [
        {
          "id": "1001",
          "title": "Size",
          "minSelect": 1,
          "maxSelect": 1,
          "optionIds": ["11", "12", "13"]
        }
      ],
      "available": true,
      "visibility": [
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "08:00",
          "end": "23:00"
        }
      ],
      "price": {
        "amount": 430,
        "taxIncluded": 43
      }
    },
    {
      "id": "3",
      "title": "Vanilla coke",
      "description": "Trusty ol' coca-cola",
      "imageUrl": "https://example.com/coke.png",
      "modifiers": [
        {
          "id": "1001",
          "title": "Size",
          "minSelect": 1,
          "maxSelect": 1,
          "optionIds": ["12", "13"]
        }
      ],
      "available": true,
      "visibility": [
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "08:00",
          "end": "23:00"
        }
      ],
      "price": {
        "amount": 350,
        "taxIncluded": 35
      }
    }
  ],
  "currency": "AUD",
  "timeZone": "Australia/Melbourne"
}

Sometimes you may need to show some menus/products at certain times of the day, or you may need to hide an item for any reason such as out-of-stock.

  • To show a menu at certain times edit the serviceAvailability field.
  • Omit serviceAvailability or set it to an empty array to make that item always visible.
  • Add values to serviceAvailability to show the menu only on the specified day and time.
{
  "menus": [
    // Always available
    {
      "id": "51dc2ae3-876a-4da4-8858-498eb53c848f",
      "title": "Afternoon menu",
      "fulfillmentType": ["SERVICE"],
      "categoryIds": ["101", "102", "103"],
      "serviceAvailability": [
        {
          "dayOfTheWeek": "MONDAY",
          "start": "10:00",
          "end": "23:59"
        },
      ]
    },

    // Only available on Tuesdays from 10:00 to 23:59 and Fridays from 21:30 to 23:00
    {
      "id": "51dc2ae3-876a-4da4-8858-498eb53c848f",
      "title": "Tuesdays and Friday night Service",
      "fulfilmentType": ["SERVICE"],
      "categoryIds": ["101", "102", "103"],
      "serviceAvailability": [
        {
          "dayOfTheWeek": "TUESDAY",
          "start": "10:00",
          "end": "23:59"
        },
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "21:30",
          "end": "23:00"
        },
      ]
    }
  ],
  ...
}

Product

  • For products its the same as above but the field to edit is visibility
  • Products have another field available that can be set to false to override the visibility
{
  ...

  // Always visible
  "products": [
    {
      "id": "1",
      "title": "Bourbon",
      "description": "Fine whiskey",
      "imageUrl": "https://example.com/bourbon.png",
      "modifiers": [],
      "available": true,
      "visibility": [],
      "price": {
        "amount": 25000,
        "taxIncluded": 2500
      },
      "tags": ["expensive", "Happy Hour"]
    },

    // Always visible
    {
      "id": "2",
      "title": "Orange Juice",
      "description": "Freshly squeezed, for the light-weights",
      "imageUrl": "https://example.com/juice.png",
      "modifiers": [
        {
          "id": "1001",
          "title": "Size",
          "minSelect": 1,
          "maxSelect": 1,
          "optionIds": ["11", "12", "13"]
        }
      ],
      "available": true,
      "price": {
        "amount": 430,
        "taxIncluded": 43
      }
    },

    // Not visible
    {
      "id": "3",
      "title": "Vanilla coke",
      "description": "Trusty ol' coca-cola",
      "imageUrl": "https://example.com/coke.png",
      "modifiers": [
        {
          "id": "1001",
          "title": "Size",
          "minSelect": 1,
          "maxSelect": 1,
          "optionIds": ["12", "13"]
        }
      ],
      "available": false,
      "visibility": [],
      "price": {
        "amount": 350,
        "taxIncluded": 35
      }
    },

    // Not visible
    {
      "id": "1",
      "title": "Bourbon",
      "description": "Fine whiskey",
      "imageUrl": "https://example.com/bourbon.png",
      "modifiers": [],
      "available": false,
      "visibility": [
        {
          "dayOfTheWeek": "MONDAY",
          "start": "08:00",
          "end": "13:00"
        },
        {
          "dayOfTheWeek": "TUESDAY",
          "start": "08:00",
          "end": "13:00"
        },
        {
          "dayOfTheWeek": "WEDNESDAY",
          "start": "08:00",
          "end": "13:00"
        },
      ],
      "price": {
        "amount": 25000,
        "taxIncluded": 2500
      },
      "tags": ["expensive", "Happy Hour"]
    },

    // Visible on Mondays from 8:00 to 13:00
    {
      "id": "2",
      "title": "Orange Juice",
      "description": "Freshly squeezed, for the light-weights",
      "imageUrl": "https://example.com/juice.png",
      "modifiers": [
        {
          "id": "1001",
          "title": "Size",
          "minSelect": 1,
          "maxSelect": 1,
          "optionIds": ["11", "12", "13"]
        }
      ],
      "available": true,
       "visibility": [
        {
          "dayOfTheWeek": "MONDAY",
          "start": "08:00",
          "end": "13:00"
        },
      ],
      "price": {
        "amount": 430,
        "taxIncluded": 43
      }
    },
  ],
  ...
}

Happy hour

This is an example of an item that is only visible from 3PM to 5PM Mon-Fri

{
  "menus": [
    {
      "id": "51dc2ae3-876a-4da4-8858-498eb53c848f",
      "title": "Afternoon menu",
      "fulfillmentType": ["SERVICE"],
      "categoryIds": ["101", "102"],
      "serviceAvailability": [
        {
          "dayOfTheWeek": "MONDAY",
          "start": "10:00",
          "end": "23:00"
        },
        {
          "dayOfTheWeek": "WEDNESDAY",
          "start": "10:00",
          "end": "23:00"
        },
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "10:00",
          "end": "23:00"
        }
      ]
    },
    {
      "id": "51dc2ae3-876a-4da4-8858-498eb53c848f",
      "title": "Happy Hour",
      "fulfillmentType": ["SERVICE"],
      "categoryIds": ["101"],
      "serviceAvailability": [
        {
          "dayOfTheWeek": "MONDAY",
          "start": "15:00",
          "end": "17:00"
        },
        {
          "dayOfTheWeek": "TUESDAY",
          "start": "15:00",
          "end": "17:00"
        },
        {
          "dayOfTheWeek": "WEDNESDAY",
          "start": "15:00",
          "end": "17:00"
        },
        {
          "dayOfTheWeek": "THURSDAY",
          "start": "15:00",
          "end": "17:00"
        },
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "15:00",
          "end": "17:00"
        }
      ]
    }
  ],
  "categories": [
    {
      "id": "101",
      "title": "Drinks",
      "productIds": ["1"]
    }
  ],
  "products": [
    {
      "id": "1",
      "title": "Bourbon",
      "description": "Fine whiskey",
      "imageUrl": "https://example.com/bourbon.png",
      "modifiers": [],
      "available": true,
      "price": {
        "amount": 25000,
        "taxIncluded": 2500
      },
      "tags": ["expensive", "Happy Hour"]
    }
  ],
  "currency": "AUD",
  "timeZone": "Australia/Melbourne"
}

Price Overrides

This is an example of an item that has a sale price override.

{
  "menus": [
    {
      "id": "51dc2ae3-876a-4da4-8858-498eb53c848f",
      "title": "Afternoon menu",
      "fulfillmentType": ["SERVICE"],
      "categoryIds": ["101", "102"],
      "serviceAvailability": [
        {
          "dayOfTheWeek": "MONDAY",
          "start": "10:00",
          "end": "23:00"
        },
        {
          "dayOfTheWeek": "WEDNESDAY",
          "start": "10:00",
          "end": "23:00"
        },
        {
          "dayOfTheWeek": "FRIDAY",
          "start": "10:00",
          "end": "23:00"
        }
      ]
    }
  ],
  "categories": [
    {
      "id": "101",
      "title": "Drinks",
      "productIds": ["1"]
    }
  ],
  "products": [
    {
      "id": "1",
      "title": "Bourbon",
      "description": "Fine whiskey",
      "imageUrl": "https://example.com/bourbon.png",
      "modifiers": [],
      "priceOverrides": [
        {
          "contextType": "PRODUCT",
          "contextValue": "1",
          "price": 15000
        }
      ],
      "available": true,
      "price": {
        "amount": 25000,
        "taxIncluded": 2500
      },
      "tags": ["expensive", "Happy Hour"]
    }
  ],
  "currency": "AUD",
  "timeZone": "Australia/Melbourne"
}
  • Set Menu / Update Menu Pushing new or updated menus to a store via PUT /organizations/{organizationId}/locations/{locationId}/menu. A call to this endpoint overwrites all existing menus.

To help you with setting up store menus, please view our sample menu payloads that are provided within the Menu API reference section.

FAQ

What requirements do product images need to adhere?

  • JPEG or PNG format
  • 500px ≤ Width ≤ 500px
  • 500px ≤ Height ≤ 500px

Next steps

Once you have successfully set up your menu, see the Order integration guide.

In this article