Menu

The shared vocabulary every dish is built from — ingredients, allergens and attributes — and how to build the lists.

Admin → Menu

Why you own these lists

Restaurants describe their dishes using words you define. That is what makes "vegetarian" mean the same thing at every venue, and what lets a customer with a nut allergy trust a filter across the whole platform.

If each restaurant invented its own labels you would have six spellings of the same word and a filter that finds one of them.

This screen and its sibling

ScreenAnswers
Menu (here)"What is in this dish, and can I eat it?"
Classifications"Where shall I order from?"

The four tabs

TabHoldsWhere it surfaces
IngredientsWhat dishes are made of.Customers add and remove them when ordering.
Ingredient categoriesGroups of ingredients.Keeps a long ingredient list navigable when a restaurant is building a dish.
AllergensWhat a customer must be warned about.Dish pages and allergen warnings.
AttributesProperties — vegetarian, vegan, spicy, halal.The dietary filters customers browse by.

The hierarchy

One relationship, and it is the reason the second tab exists: every ingredient belongs to an ingredient category. Allergens and attributes are flat lists with no parent.

Only active categories are offered when filing an ingredient, so retiring a category stops it being chosen again without disturbing anything already under it.

Adding an entry

Every tab works the same way — + Add ingredient, + Add allergen, + Add attribute, + Add category — and opens the same shape of dialog:

FieldRules
NameRequired, at most 80 characters, and unique within its list.
IconA shipped illustration, a Font Awesome glyph, or an image from the media library.
CategoryIngredients only — which category it is filed under.
ActiveOn by default. Off retires it.

Rows are arranged by dragging the grip, and that order is the order restaurants see when building a dish. Put your commonest ingredients at the top and you save every venue on the platform a scroll.

Removing an entry

One rule across every list: a row something still points at is never deleted. The attempt is refused with a count, and the In use column shows that number in advance.

ListCounted as "in use"
IngredientDishes built from it across the platform.
Ingredient categoryIngredients filed under it. Move them first.
Allergen / attributeDishes carrying it.

Retire with the Active switch instead. It is reversible; deleting is not.

Get allergens right before restaurants build menus. Match the list to the rules where you trade. Adding an allergen later does not label existing dishes — every restaurant would have to revisit its whole menu, and most will not. That leaves dishes looking allergen-free because nobody was ever asked.

Attributes are what customers filter by

An attribute is only useful if restaurants apply it. Keep the list short enough that they will: four attributes used on every dish beat twenty used on none.

The attribute existing here is half the job — the filter also has to be switched on in Search.

When it doesn't work

A dish shows no allergens

It means nobody recorded any — not that there are none. That distinction matters, and it is worth saying to your restaurants in writing.

I cannot delete an entry

Something still uses it; the message says how many. Retire it instead.

A restaurant asks for an ingredient that is missing

Add it here and everyone gets it. Adding one-offs for a single venue defeats the point of a shared vocabulary.

A dietary filter finds nothing

The attribute exists but no restaurant has applied it. Filters read what restaurants tagged.

A category is not offered when filing an ingredient

Only active categories are offered — retiring one deliberately stops new use.