Documentation
Your menu list, and what costing needs from it
The four fields a menu entry holds, why a plate cost stays withheld until price and currency agree, and why your menu is never matched against a competitor menu.
Last reviewed against the product on .
The menu page holds the list of dishes you sell. Each entry carries four fields and nothing else, and every recipe on this site hangs off one of them.
What one entry holds
| Field | Required | What is checked |
|---|---|---|
| Name | Yes | Trimmed, between two and 120 characters |
| Description | No | Trimmed, up to 1,000 characters |
| Price | No | A number of zero or more |
| Currency | No | Exactly three characters, stored in upper case |
Measured from the add-item validation in app/app/menu/actions.ts.
Only the name is required, so an entry can exist with no price at all. That is deliberate: a dish you have not priced yet is still a dish, and the list is more useful complete than tidy.
Price and currency decide whether costing can finish
A plate cost is only shown when it can be compared with something. The comparison is against the price on the entry, in the currency on the entry, so both have to be there.
| Requirement | Where it is set |
|---|---|
| A price on the entry | This page |
| A currency on the entry | This page |
| Every ingredient matched to an imported purchase | Menu costing |
| All ingredient costs in one currency | Your imported files |
| That currency is the one on the entry | Both |
Measured from the comparable-total check in app/app/menu-costing/page.tsx.
Miss any one of these and the dish still appears, with its ingredients listed and its total withheld. The page says so rather than showing a partial figure, because a plate cost missing one ingredient looks exactly like a plate cost.
Nothing here edits or removes an entry
The page has one form and that form inserts. There is no edit control and no delete control, so a misspelled name is corrected by adding a second entry and living with the first. Nothing stops two entries sharing a name either.
Where the recipes live
Recipes are not on this page. They are built in menu costing, one ingredient at a time against the item names your supplier files carried. The walkthrough is cost a recipe from a supplier invoice.
What this page does not tell you
There is also no course or category, no ordering beyond newest first, no availability or seasonal dates, and no portion or serving size. Cost and margin are not here at all. The currency is checked for length and nothing more, so three characters that are not a real currency code are accepted exactly as typed, and everything downstream treats them as a currency of their own.