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
| Screen | Answers |
|---|---|
| Menu (here) | "What is in this dish, and can I eat it?" |
| Classifications | "Where shall I order from?" |
The four tabs
| Tab | Holds | Where it surfaces |
|---|---|---|
| Ingredients | What dishes are made of. | Customers add and remove them when ordering. |
| Ingredient categories | Groups of ingredients. | Keeps a long ingredient list navigable when a restaurant is building a dish. |
| Allergens | What a customer must be warned about. | Dish pages and allergen warnings. |
| Attributes | Properties — 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:
| Field | Rules |
|---|---|
| Name | Required, at most 80 characters, and unique within its list. |
| Icon | A shipped illustration, a Font Awesome glyph, or an image from the media library. |
| Category | Ingredients only — which category it is filed under. |
| Active | On 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.
| List | Counted as "in use" |
|---|---|
| Ingredient | Dishes built from it across the platform. |
| Ingredient category | Ingredients filed under it. Move them first. |
| Allergen / attribute | Dishes carrying it. |
Retire with the Active switch instead. It is reversible; deleting is not.
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.