How do I build my menu and share it with customers?
Build your menu with photos, allergen and dietary badges, choice steps, reusable choices, VAT rates, serving times, set menus and deals — then share it as a live, searchable page.
You build your menu on the Menu page in the dashboard sidebar, and customers see it as a tidy read-only page on their phones — no ordering, just a beautiful live menu.
Menu management needs the Pro plan or above, or the Order & Pay product — without either, the page shows "Menu management is available on Pro and Complete" alongside the product route. Staff need menu permissions to make changes: by default Hosts can only view, while Managers and above can add and edit.
Already have a menu somewhere — photographed, a PDF, on your website, or in a spreadsheet? The Import menu button at the top of the page reads it in for you, and shows you every dish to check before anything is added. See importing your menu.
Build your menu
- Open Menu in the sidebar and click Add category first — every dish must live in a category. Give it a Category Name and a Display order number (lower numbers appear first). You can also add a short Description (optional, up to 200 characters) that shows under the category heading — for example, "Adult breakfasts include toast and an Americano" — and an optional Default VAT rate for new dishes (see "VAT defaults" below). The form also has a Hide from customer menus switch: a hidden category never shows on your public menu, ordering or TV screens (your dashboard always shows it, with a small eye-off marker in the category list). Customers only ever see a hidden category when something deliberately offers it: a special pre-order date that uses it as its menu (see pre-ordering), an event whose linked menu picks it (see events), or a shareable menu that includes it (see "Shareable menus" below) — that's how a Christmas menu stays private until it's needed. There's also an Available for pre-orders switch (on by default): turn it off to keep the whole category — and every dish in it — off the pre-order list, on the customer pre-order page and staff phone entry alike, while it still shows on your ordinary menus; a special pre-order date that picks the category as its menu still serves it.
- Click Add a dish. Fill in the Name, pick the Category, and add a Description (optional).
- Tick any Dietary boxes that apply — Vegetarian, Vegan, Gluten-free or Dairy-free. Each tick shows as a small colour-coded badge next to the dish on your menu (V, VG, GF or DF — customers tap a badge to see its full name). Typing markers like "(v)" in the description no longer does anything — use the tick-boxes.
- Set the Price (£). If the dish's price varies by size or options, switch on Show as "From" price — your menu then shows "From £12.00" instead of a set price. A price of £0.00 shows as Free on your menu.
- Add an Image (optional): paste a URL or click Choose image to pick from your image library or upload a new photo (JPG, PNG or WebP, up to 5 MB — a guided crop frames it square, 800×800 recommended). A thumbnail preview appears so you can check it.
- Leave Available switched on, then click Add dish — or Add another dish to save it and keep the form open for the next one. The form remembers the category you're working in, so entering a whole category of dishes is quick.
To change a dish later, open it, edit and click Save changes. You can't delete a category while it still contains dishes — move or delete the dishes first. If deleting a dish would leave its category empty, the delete confirmation offers a tick-box — "This leaves the section empty — remove the section too?" — so you can clear both in one go; leave it unticked (the default) and the empty section stays. Empty sections never show on your public menu either way. If a live set menu or deal points at the section, the confirmation says so — with no dishes in it the deal simply isn't offered until dishes return. Deleting a dish or section that a promotion's scope or a loyalty reward's menu link points at also warns you first, naming what's affected — "Delete anyway" proceeds, and the promotion then stops matching until its dishes are re-picked. Replacing your whole menu via the menu import shows the same warning, listing every affected promotion and reward before anything is wiped.
Give a dish choices (sizes, sauces and more)
Some dishes come in versions — a choice of size, wings or ribs, a pick of sauces. Open the dish and use its Choices section to set them up:
- Click Add a choice step. Each step is a question customers will answer, like "Choose your size" — give it a prompt and add its options. Prompts and option names can be up to 60 characters, with up to 30 options per step and up to 10 steps per dish.
- If an option costs extra, give it a +£ amount on top of the dish's base price. For example, a Ribs & Wings platter at £12.00 with a Large option at +£4.00 makes a large platter £16.00. Options with no amount are free choices.
- Switch on Customers must pick for steps that always need an answer (like a size); leave it off for optional ones (like extra sauces). How many can they pick? offers three modes: Just one, Up to N (they can pick fewer) and Exactly N (no more, no fewer — "pick your 2 patties"). An optional "Exactly N" step means customers can skip it entirely or pick exactly that many — the editor spells this out under the step, and customer screens hold the button shut until the count is met. (A step can also let guests take the same option more than once — see "Let guests pick the same item more than once" below.)
- As soon as a dish has a priced choice, your menu automatically shows it as From £12.00 — you don't need to touch the "From" price switch yourself.
- Building a similar dish? Copy choices from another dish pulls in an existing dish's steps so you don't retype them. Copies are independent — and every copied option arrives marked available, even if it happened to be sold out on the source dish at that moment (sold out is a live-service fact, not part of the choices).
- Naming options after real dishes — say a set-meal-style "pick a side" step? Pick from menu (next to "Add an option") fills the option's name from one of your dishes and suggests that dish's price as the extra cost. You can change both, and they aren't connected afterwards — changing the dish's price later never changes the option.
If a single option runs out mid-service (say, the ribs), mark just that option sold out — the dish and its other choices stay available.
Your public menu shows each dish's steps as a quiet "Choices:" line under the description — for example, "Choices: Choose your size · Wings or ribs · Pick your sauce" — so customers know what they'll be asked at the venue. The menu itself stays a browse-only page: no ordering, no option prices listed there. Your own dashboard's dish rows show the same "Choices:" prompts at a glance, so you can see which dishes already carry a step without opening them.
Let guests pick the same item more than once
Sometimes the right answer is three of the same thing — ten wings across six sauces, four hash browns on one builder breakfast. Open the choice step and switch on Allow the same item more than once: guests then get − and + buttons against each option instead of one-tap picks, with the running count stated plainly as they go and a line telling them they can have the same item more than once. Each extra one adds the option's +£ again — three hash browns at +£1 each add £3.
With repeats on, How many can they pick? counts the total number of items rather than different options, so it can be bigger than the list itself — "up to 10 items from these 6 options" is exactly the point (totals can go up to 50). If one option shouldn't hog the lot, set Most of any single item — a per-option cap ("no more than 3 of each"). The editor's Guests will see line previews the rule in plain English before you save, and switching repeats back off simply clamps the numbers to the list size again.
Wherever the order travels next — the kitchen and bar screens, the printed day sheet, receipts and confirmation emails — repeated picks show once with a count, like "Hash brown ×3", never three identical lines.
Reusable choices — build a step once, share it across dishes
A bar menu makes the problem obvious: 40 spirits, one "Choose your mixer" question. Rather than copying it 40 times, build it once as a reusable choice — the Menu page's Reusable choices tab. (If you knew these as "choice sets", it's the same thing renamed.)
- Click New reusable choice, give it a Set name (your label — e.g. "Mixers"; customers see the prompt, not the name) and build the step exactly as you would on a dish: prompt, options, prices, must-pick rules — repeat picks included. Reusable choices follow the same limits as dish steps.
- Attach it to a dish from the dish's own Choices section — Add a shared set lists your reusable choices with how many dishes each is used by. It appears on the dish as a highlighted read-only card; you can reorder it among the dish's own steps or remove it, but you can't edit its contents from the dish — a reusable choice means the same thing on every dish. A dish that genuinely needs a different list should get its own reusable choice (or its own step) instead.
- To cover a whole category in one go, use the Apply to a category button: pick the category, untick any exceptions, and click Apply to these dishes. This is a one-off — it adds the reusable choice to the ticked dishes in that category as it is right now. Dishes you add to the category later do NOT get it automatically; add it from the dish editor or run the apply again (already-covered dishes are simply skipped).
The point of a reusable choice is that editing it updates every dish using it — add a new mixer once and all 40 spirits offer it. Because that's powerful, saving an edit first tells you its reach ("This will change 41 dishes") before anything happens, and each one shows Used by N dishes with the list one click away. A reusable choice that's still on dishes can't be deleted — remove it from those dishes first. If one gains a priced option, every dish using it switches to a From price automatically, exactly as if you'd priced the option on the dish itself.
Allergens, alcohol and VAT on a dish
Each dish's edit form also carries three compliance fields (added for at-table ordering, but you can fill them in any time):
- Allergens — tick every allergen the dish contains from the standard UK list of 14 (celery, cereals containing gluten, crustaceans, eggs, fish, lupin, milk, molluscs, mustard, peanuts, sesame, soya, sulphur dioxide and sulphites, tree nuts). Each tick shows as a small colour-coded badge on the dish's card carrying the allergen's standard symbol (a wheat ear for gluten, a milk bottle, a crab, and so on) — customers hover or tap a badge to see the allergen's name, and dishes ordered through Order & Pay also list them in writing ("Contains: gluten, milk"). Allergen information is your venue's legal responsibility — ResoFlow shows exactly what you tick and can't check your recipes, so keep it accurate and review it whenever a recipe or supplier changes. Nothing stops you saving a dish without allergen details, but filling them in is strongly advised.
- Contains alcohol — marks the dish for 18+ age checks when customers order and pay from their phones with Order & Pay. You can also set it while importing your menu: the review screen pre-ticks it for dishes that read as alcoholic drinks (always flagged for you to check, never silently), and each section header has a Mark all as contains alcohol button for a whole drinks section.
- VAT rate (optional) — the dish's VAT rate (20% standard, 5% reduced or 0% zero-rated), used to break down the VAT included on customer Order & Pay receipts and on pre-order payment emails, and in VAT-ready sales exports. VAT only ever appears when your VAT number is set on Settings → Payouts & Stripe (available on every paid plan) — venues that aren't VAT registered never show it. Ask your accountant if you're unsure.
VAT defaults — set the rate once, not dish by dish
Most venues charge the same one or two VAT rates across the whole menu, so there are two optional defaults that fill the rate in for you:
- Per category — a category's edit form has a Default VAT rate for new dishes. New dishes you add to that category start with this rate when you leave the dish's own VAT rate "Not set" — the dish form pre-fills it and says where it came from, so you always see exactly what will be saved and can change it for the odd exception.
- Venue-wide — the same Default VAT rate for new dishes exists for your whole venue on Settings → Payouts & Stripe, in the VAT receipt details card. It applies when the dish's category has no default of its own; a category default always wins over the venue default.
Defaults apply to new dishes only — the rate is stamped onto each dish as its own VAT rate at the moment you add it, and setting or changing a default never changes dishes you've already added. To set a rate on existing dishes, edit the category and click Apply {rate}% to all N existing dishes — after a confirmation, it sets that rate on every dish currently in the category, including dishes that already had a different rate. Dishes keep their rate even if you later change or clear the default.
Serving times on a category
A category can carry serving times — a lunch section served weekdays 12–3, a breakfast page that ends at 11. Set them in the category's own edit form: its Serving times block takes day pills plus a start and end time per window, with several windows allowed (up to 21; an end at or before the start runs overnight, so 21:00 to 02:00 covers a late bar). The category list marks timed sections with their hours, and the same windows are also editable on Settings → Order & Pay → Serving times, where the per-category ordering switches live (see Order & Pay).
Out of hours the category is never hidden: it stays on your customer menus with its serving times shown against its name — "Served Mon–Fri 12:00–15:00" — so customers can still read tonight's dinner menu at breakfast. It just can't be ordered: at-table ordering won't take its dishes outside the window, and a pre-ordering party can't pick its dishes for a booking that falls outside the window either — both say why in plain words rather than failing silently. A category with no serving times is simply available whenever ordering is, exactly as before.
Set menus & deals (Complete)
The Menu page has a second view — switch from Menu to Set menus & deals at the top. Here you bundle existing dishes into one price: a course-based set menu ("3 courses for £25"), a simple bundle ("burger + any drink £15") or a pick-several deal ("any 3 for £15" — set a slot's Customer picks count above 1) — one engine covers all three. For the pick-several kind there's a shortcut: the tab's Build-your-own deal button pre-shapes a pick-any-3, whole-category deal for you — choose the section and the price and it's ready to save. (The dish editor points the same way: if you find yourself building a "pick any 3 from these sections" dish out of choice steps, what you're really building is a set menu & deal — use the template instead.) When a customer picks several from one slot they can choose the same dish more than once by default (three of the same small plate is a legitimate "any 3"); switch on Each pick must be a different dish in the deal's editor to require variety — the customer's picker then greys out a dish already chosen in that slot, and a deal that applies automatically only ever counts each dish once per slot. Each deal also chooses where it shows on the ordering menu: At the top of the menu (the default), Inside a category, At the top AND in its category (the same deal's card in both places — customers pay the same wherever they tap it), or Hidden — applies by itself. A deal placed in a category announces itself as a compact chip just under that category's heading — the deal's name and price, one chip per deal — with its card inside the section and a small "Part of …" marker on each dish in the deal; the category's name itself is never changed.
Every visible deal also has an Apply automatically switch, on by default: while it's on, a customer whose basket contains dishes that fill the deal gets the deal price even if they never tapped the card — always in the customer's favour, folding the dearest qualifying dishes into the bundle. Switch it off and the deal only applies when a customer taps the card and picks their dishes. A hidden deal never appears on the menu at all and always applies by itself — that's its whole point (it has no switch). For example, with "3 cocktails for £15" and four cocktails at £8, £7, £6 and £5 in the basket, the £8 + £7 + £6 become the £15 bundle and the £5 one stays full price — the customer pays £20 and the basket names the deal with the saving shown. An automatic apply only ever happens when it makes the order cheaper, and it applies again each time the basket qualifies again. Set menus & deals are part of Order & Pay, so they need the Complete plan or the Order & Pay product; customers choose their dishes step by step when ordering at the table.
- Click New deal and give it a Name, an optional customer-facing Description and one Bundle price (£) — the price customers pay instead of the chosen dishes' individual prices (from £0.30 up to £2,000).
- Add up to 6 slots — one per course or choice ("Starter", "Main", "Any drink"). Each slot works one of two ways:
- Hand-picked dishes (the default) — pick its dishes from your real menu (searchable, grouped by category, up to 40 per slot). Picks are references, never copies — a dish's price, dietary badges, allergens, choice steps and VAT rate all ride along automatically, and renaming a dish updates the deal too. A hand-picked slot needs at least one dish before you can save.
- A whole category — the slot offers whatever is in the category you choose, kept up to date automatically: the perfect shape for "any 3 small plates for £15". The editor always shows the slot's current dishes, so you can check what's in the deal at any time. Because membership is automatic, a dish you add to that category later joins the deal on its own — the dish's save screen tells you so at that moment, names the deal and its price, and offers a tick-box to keep the dish out. Dishes kept out are listed on the slot ("Kept out of the deal") where you can let them back in, and you can keep further dishes out from the slot too. Category slots don't carry supplements, and if the category is emptied or deleted the deal simply stops being offered until you fix it — nothing breaks.
- Give any dish an optional Supplement £ — "+£4.00 for the steak" — charged on top of the bundle price when a customer picks it. A chosen dish's own priced choice steps also add on top, exactly as à la carte.
- Set Availability windows if the deal only runs at certain times — day pills plus start and end times, just like serving times (an end at or before the start runs overnight; no windows means the deal is available whenever Order & Pay is on).
- Leave Live on and save. The live/pause toggle on the list stops a deal instantly whenever you need to.
A few rules worth knowing: a sold-out dish drops out of its pick-lists automatically, and if a slot ends up with no available dishes the whole deal stops being offered until you fix it (deleting a dish a deal references does the same). Automatic promotions never apply to set menus & deals — an offer that applies by itself only ever discounts individually priced dishes. A promo code the customer types CAN come off deal prices while the Promo codes can be used on deal prices toggle (Settings → Order & Pay, on by default) is on — switch it off and typed codes leave deal prices alone too; a code limited to certain items never touches a deal either way (see How do promotions, deals, rewards and gift cards work together?). And if you've set dish VAT rates, customer receipts, the daily sales email and the per-item sales CSV all split the bundle price across the chosen dishes' rates automatically (in the CSV, a deal whose dishes span more than one rate appears as one row per rate — for example "Steak Night (20% VAT portion)" and "Steak Night (0% VAT portion)" — each showing how many deals were sold and that portion's exact sales, VAT and net figures; if any chosen dish has no rate set, the deal's VAT cells stay blank rather than guessing).
One deal, several prices — priced by how many they pick (Complete)
Some menus print the same offer at more than one size — "3 small plates £14.99 · 5 for £19.99 · 7 for £25", or a set menu at 1/2/3-course prices. That's one deal with a price ladder, not several deals. In the deal's editor, switch on Priced by how many they pick: the single bundle price steps aside ("Set by the tiers below") and you list tiers instead — each tier is a number and its price, Add another tier takes you up to six. What the numbers count depends on the deal's shape:
- One slot (a pick-several deal): the tiers count dishes picked from that slot. Customers pick a number that matches a price — the picker shows the choice plainly ("Pick 3, 5 or 7") with a running count, and the price shown is always the matched tier's. A number in between can't be added; instead of showing a wrong total, the picker says what reaches the next price.
- Several slots (a courses set menu): the tiers count courses. Every course becomes optional — a customer who doesn't want a starter taps Skip this course — and the number of courses they keep sets the price.
On the customer's menu a tiered deal prints its whole ladder ("3 for £14.99 · 5 for £19.99 · 7 for £25") on its card and on its category chip — never just the smallest price. The order line, the customer's receipt and your sales figures all use the matched tier's price, with any supplements and priced choice steps added on top exactly as on a single-price deal.
Three rules worth knowing:
- Bigger tiers must cost more. Each tier's count and its price must both go up — a ladder where 5 costs the same as (or less than) 3 is refused when you save, and the menu importer refuses to draft one from a photo for the same reason: it's a money-losing typo, not a real menu shape.
- A tiered deal never applies automatically. With several prices there's no single tier a basket could honestly be folded into, so the Apply automatically switch doesn't appear on a tiered deal — customers choose the deal, and their number, themselves.
- A tiered deal can't be hidden. The Hidden — applies by itself placement only works through automatic applying, which a tiered deal never does, so the editor won't let you combine the two.
Availability windows work exactly as on any other deal — a lunchtime-only "3/5/7 plates" deal is fine, and outside its times the card shows its times and can't be started. And when the menu importer reads a printed offer with several pick-count prices, it proposes it as one tiered deal with the full ladder shown for you to accept — see How do I import my menu?.
Mark a dish sold out
Flip the Available switch on the dish's row (or inside its edit form). When it's off, the public menu greys the dish out and shows a Sold out badge next to the price (the price stays visible) — handy mid-service when something runs out. Flip it back on when it returns.
Dish stock counts — sold out by itself when the portions run out
If you'd rather not watch the fridge yourself, ResoFlow can count portions down for you. The master switch lives in Settings — the Dish stock counts card on Settings → Menu & stock. It starts switched off — turn on Track dish stock there and each dish row on the Menu page gains a small stock line where you set its Usual per day number ("we do twelve of these a night"). As the dish sells, the number counts down, and at zero it shows as sold out on your customer menus — the public menu, TV screens, event and shareable menus, and at-table ordering — and can't be added to new pre-orders, until the next service day. Dishes without a number are simply not tracked and behave exactly as before.
The count is one honest number however the dish sells: an Order & Pay table order, a pre-order from a booked party and a dish inside a set menu all draw from the same day's count — and a pre-ordering party's portions are held for them, so a busy walk-in night can never sell food already promised to a booking. If a booking with a pre-order cancels or moves to another date, its portions go back on sale (or move with it) automatically.
On each row you can also correct Left today to whatever is actually in the kitchen, or tap None left today to mark the dish sold out for the rest of the day in one go. Changing counts is a floor job: anyone who can edit the menu can do it, and there's a separate Set and change dish stock counts permission so you can hand it to front-of-house staff without giving them price editing (Hosts have it by default).
Counts reset to each dish's usual number automatically at the start of each service day. Prefer to set them by hand? Switch off Reset automatically each day on the same settings card — then a day only has counts once you set them. Either way, the card's Reset today's counts button starts the day again on demand (portions already promised to pre-ordering parties are kept). While stock is on, the Menu page itself shows a one-line summary of where things stand — whether counts reset overnight or are set by hand, and how many dishes have none left today — with a Change in Settings link straight to the card. Stock tracking comes with menu management (Pro plan and above, or the Order & Pay product), and while the switch is off nothing stock-related appears anywhere.
Shareable menus — a link for any slice of your menu
The Menu page's Shareable menus tab lets you build named menus from your existing categories, each with its own link you can share anywhere — an Instagram bio, a printed QR (the QR codes page prints one per shareable menu — see How do I create and print QR codes for my venue?), a festive flyer. Click New shareable menu, give it a Menu name (that name is the page title customers see), pick the categories it should include, and save. Each menu's row then has Copy link and Open buttons, plus a live/pause switch — a paused menu keeps its link but shows a friendly "This menu isn't available right now" message instead.
Hidden categories are pickable here on purpose: they aren't on your everyday menu, but they ARE shown on a shareable menu that includes them — so a Sunday-lunch or festive menu can live at its own link without ever appearing on your main menu page. The shared page is browse-only (no ordering), shows sold-out dishes greyed out with their badge exactly like your main menu, and carries the same allergen notice at the bottom. Deleting a shareable menu never touches your categories or dishes — only the link stops working. Shareable menus come with menu management (Pro plan and above, or the Order & Pay product) — there's no separate switch or extra cost.
Switching your public menu off
Settings → Restaurant profile → Show my menu on my public pages turns your whole public menu off and on. It starts switched on, and it works on every plan — nothing about switching a feature off is ever tied to what you're paying for.
While it's off, customers don't see a Menu tab or a menu card on your venue page, the menu widget on your own website goes quiet, and anyone opening your menu link is told the menu isn't available online right now and to ask a member of staff.
Switching it off also stops Order & Pay at the table, because your menu page and the at-table ordering screen are the same page. Nothing is cancelled: your printed table QR codes stay exactly as they are and simply do nothing while the menu is off — switch it back on and every code you've already printed works as before, with no reprinting.
Your dashboard Menu page is unaffected, so you can keep building and editing while it's off.
Share the menu with customers
- Table QR codes — the best route. Settings → Public booking → QR codes generates a code per table; customers scan and see the menu with a "Table X" badge (*Available on Pro plan and above*, or with the Order & Pay product).
- Confirmation and reminder emails — switch on Show menu link for those templates in Settings → Communications → Email templates. The option only appears once you have menu items.
- Shareable menus — a named slice of the menu at its own link (see the section above).
- Event menus — an event can link the full menu or picked categories, adding a "View menu" button to its event page and ticket emails (see events).
The menu page opens with your venue header — cover photo, logo and name, the same treatment as your venue hub page — which scrolls away so the menu itself takes over; the sticky bar then carries your name, a category bar that jumps to a section when tapped and highlights the section customers are reading as they scroll, and the search icon.
Customers can also search your menu: a search icon in the menu header opens a live filter over dish names, descriptions and category names — handy on long menus. If nothing matches, customers see "No dishes match" with a one-tap way to clear the search. Dietary and allergen words work too: typing vegan, vegetarian, gluten free or dairy free shows the dishes you've ticked with that dietary badge (plus any dish whose name or description mentions the word), while typing an allergen name — nuts, milk, gluten, sesame and so on — shows the dishes that DON'T list that allergen, under a "Showing dishes without …" header. Dishes with no allergen boxes ticked still appear in those results, so keeping your allergen ticks accurate is what makes the filter useful — the search is a convenience, never a safety guarantee, and your own allergen advice to customers still applies.
Every public menu page with dishes on it also carries a small allergen notice at the bottom: it tells customers that allergen and dish information comes from your venue, asks them to tell you about any allergy or intolerance before ordering, and warns that cross-contamination can occur. The notice always shows and can't be switched off — allergen accuracy stays your venue's responsibility, and the notice points customers to raise allergies with you directly.
Related: How do I import my menu instead of typing it in? · How do I create and print QR codes for my venue? · How do I edit the emails customers receive? · How do I add my logo, colours and images?